MySQL版本:8.0.44
Linux操作系统版本:Ubuntu 24.04 LTS
在单一服务器上安装和运行MySQL数据库,多个应用程序都访问同一台数据库服务器

优点:
缺点:
通过多台服务器协同工作来提高数据库性能、可用性和可扩展性

优点:
缺点:
主服务器(Master):主要负责写操作和简单查询操作 从服务器(Slave):主要负责复杂查询操作和备份
主库的Binlog Dump Thread:当从库连接主库时,主库创建一个Binlog Dump Thread,负责将二进制日志内容发送给从库从库的I/O Thread:接收主库的二进制日志事件并写入从库的中继日志(Relay Log)从库的SQL Thread:读取中继日志(Relay Log)中的事件并执行,实现数据同步

添加Docker官方GPG密钥是为了验证从Docker仓库下载的软件包的真实性和完整性
apt install apt-transport-https ca-certificates curl software-propertiescommon -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 1. 下载Docker官方的公钥
# 2. 存储在系统的密钥环中
# 3. APT在安装时会用这个密钥验证软件包签名Docker官方服务器位于国外,国内访问速度慢。阿里云在国内,下载速度通常能大幅提升
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/dockerce/linux/ubuntu $(lsb_release -cs) stable"可能出现的错误信息:
W: GPG error: https://mirrors.aliyun.com/docker-ce/linux/ubuntu noble
InRelease: The following signatures couldn't be verified because the public
key is not available: NO_PUBKEY 7EA0A9C3F273FCD8简单来说,这个错误的意思是:“阿里云给了我Docker的软件列表,并且说这是用7EA0A9C3F273FCD8这个钥匙签名的,但是我的钥匙串里没有这把钥匙,所以我无法确认这是不是真的Docker官方列表。” 解决方法: 把Docker官方的公钥添加到你的系统中
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8#更新APT包索引
apt update
#安装Docker
apt install docker-ce docker-ce-cli containerd.io -y# 查看状态
systemctl status docker
# 查看版本
docker version
# 设置开机自启动
root@VM-0-7-ubuntu:~# systemctl enable docker
# 查看是否开机启动
root@VM-0-7-ubuntu:~# systemctl list-unit-files|grep docker.service
docker.service enabled enabled# 停止防火墙
root@VM-0-7-ubuntu:~# systemctl stop ufw
# 查看防火墙
root@VM-0-7-ubuntu:~# systemctl status ufw
# 禁用防火墙开机自启动
systemctl disable ufwvim /etc/docker/daemon.json{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerhub.timeweb.cloud",
"https://huecker.io"
]
}



docker run \
-d \
-p 53306:3306 \
-v /org/mysql/master/conf:/etc/mysql/conf.d \
-v /org/mysql/master/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name org-mysql-master \
mysql:8.0.44docker run
-d
-p 53306:3306
-p 宿主机端口:容器端口-v /org/mysql/master/conf:/etc/mysql/conf.d
作用:数据卷挂载 - 数据库数据,容器删除后数据不会丢失
宿主机:/org/mysql/master/mysql
↓ 挂载(双向同步)
容器内:/var/lib/mysql-e MYSQL_ROOT_PASSWORD=123456
-e 环境变量名=值–name org-mysql-master
mysql:8.0.44(指定版本)
# 在配置文件中添加如下配置
root@VM-0-7-ubuntu:~# vim /org/mysql/master/conf/my.cnf# MySQL服务器节点
[mysqld]
# server-id随便设置,保证不重复即可
server-id=11253306
log-bin=binlog
binlog_format=ROW
binlog_expire_logs_seconds=864000
sync-binlog=1
#指定需要复制的数据库,默认全部
# binlog-do-db=db_name
#设置不需要复制的数据库
# binlog-ignore-db=db_name1
# binlog-ignore-db=db_name2# 重启容器,使配置⽣效
root@VM-0-7-ubuntu:~# docker restart org-mysql-master
# 进入容器
root@VM-0-7-ubuntu:~# docker exec -it org-mysql-master env LANG=C.UTF-8 /bin/bash
bash-5.1# mysql -uroot -pmysql> set password = '123456';
# 查看配置是否⽣效
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 13803306 |
+-------------+
-- 为从服务器创建访问账号并设置密码,⽤于从服务器登录主服务器
mysql> create user 'org_slave'@'%' identified with mysql_native_password by '123456';
-- 为用户赋予复制权限
mysql> grant replication slave on *.* to 'org_slave'@'%';
-- 刷新权限
mysql> flush privileges;
-- 查看master状态,记录File和Position的值,
-- 之后要在从服务器中配置中⽤到这两个值,表⽰从哪个⽇志⽂件中的哪个位置开始同步数据
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000004 | 157 | | | |
+---------------+----------+--------------+------------------+-------------------+docker run \
-d \
-p 53307:3306 \
-v /org/mysql/slave1/conf:/etc/mysql/conf.d \
-v /org/mysql/slave1/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name org-mysql-slave1 \
mysql:8.0.44# 在配置文件中添加如下配置
root@VM-0-7-ubuntu:~# vim /org/mysql/slave1/conf/my.cnf[mysqld]
# server-id随便设置,保证不重复即可
server-id=11253307
log-bin=binlog
binlog_format=ROW
binlog_expire_logs_seconds=864000
sync-binlog=1
########################### 从服务器配置 ##################################
#中继日志基本名
relay-log=relay-bin
#服务器启动时不启动复制,通过手动启动
skip-replica-start=ON
# 链式日志同步,如上图“一主多从”模式的第二种模式
# log-replica-updates=ON
# 禁用二进制日志
# skip-log-bin
###########################################################################
#指定需要复制的数据库,默认全部
# binlog-do-db=db_name
#设置不需要复制的数据库
# binlog-ignore-db=db_name1
# binlog-ignore-db=db_name2# 重启容器,使配置⽣效
root@VM-0-7-ubuntu:~# docker restart org-mysql-slave1
# 进入容器
root@VM-0-7-ubuntu:~# docker exec -it org-mysql-slave1 env LANG=C.UTF-8 /bin/bash
bash-5.1# mysql -uroot -pmysql> set password = '123456';
# 查看配置是否⽣效
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 13803307 |
+-------------+
mysql> change master to
master_host = '81.69.218.112',
master_port = 53306,
master_user = 'org_slave',
master_password = '123456',
master_log_file = 'binlog.000004',
master_log_pos = 157;# 在从服务器中启动复制
mysql> start replica;
# 查看从服务器状态
mysql> show replica status\G;
深入解析MySQL(10)——基于ShardingSphere的高性能架构详解