MySQL-9.1.0 实现最基础的主从复制
目录
1 实验介绍
本次实验 使用 docker 镜像,开启三个容器,实现一主两从。
容器主机 | IP地址 | 映射主机端口 |
---|---|---|
mysql-master | 192.168.1.2 | 3306 |
mysql-slave1 | 192.168.1.3 | 3307 |
mysql-slave2 | 192.168.1.4 | 3308 |
2 实验准备
2.1 创建目录为MySQL挂载使用
使用 docker 做MySQL这一种有状态的,需要很好的保持数据的可靠性,所以得使用宿主机挂载到容器内
[root@chucong mysql_zhucong]# tree /data/ -L 3
/data/
├── master # master的目录
│ ├── conf # 配置文件存放目录
│ │ └── my.cnf # 配置文件
│ └── master-data # 存放数据的地方
├── slave1
│ ├── conf
│ │ └── my.cnf
│ └── slave1-data
└── slave2
├── conf
│ └── my.cnf
└── slave2-data
# MySQL 配置文件
[root@chucong mysql_zhucong]# cat /data/master/conf/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log_bin=mysql-bin # 开启bin-log日志,注意只有主配置文件需开启
server_id=10
#gtid_mode=ON # 开启GTID
#enforce-gtid-consistency=ON # 保证GTID的强一致性
[root@chucong mysql_zhucong]# cat /data/slave1/conf/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
server_id=20
#super_read_only=on #只读
#gtid_mode=ON # 开启GTID
#enforce-gtid-consistency=ON # 保证GTID的强一致性
[root@chucong mysql_zhucong]# cat /data/slave2/conf/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
server_id=30
#super_read_only=on #只读
#gtid_mode=ON # 开启GTID
#enforce-gtid-consistency=ON # 保证GTID的强一致性
2.2 编写 docker-compose.yml 文件
[root@chucong mysql_zhucong]# docker pull mysql:9.1.0
[root@chucong mysql_zhucong]# vim docker-compose.yml
version: '2.27.1'
services:
mysql-master:
image: mysql:9.1.0
container_name: mysql-master
environment: # 定义系统值
MYSQL_ROOT_PASSWORD: root # root密码
MYSQL_USER: repl # 创建复制用户
MYSQL_PASSWORD: root # 设置密码
ports:
- 3306:3306
volumes:
- /data/master/master-data:/var/lib/mysql # 挂载宿主机目录到容器
- /data/master/conf/my.cnf:/etc/my.cnf
restart: always
networks:
mynet1:
ipv4_address: 192.168.1.2
mysql-slave1:
image: mysql:9.1.0
container_name: mysql-slave1
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: repl
MYSQL_PASSWORD: root
ports:
- 3307:3306
volumes:
- /data/slave1/slave1-data:/var/lib/mysql # 挂载宿主机目录到容器
- /data/slave1/conf/my.cnf:/etc/my.cnf
restart: always
networks:
mynet1:
ipv4_address: 192.168.1.3
mysql-slave2:
image: mysql:9.1.0
container_name: mysql-slave2
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: repl
MYSQL_PASSWORD: root
ports:
- 3308:3306
volumes:
- /data/slave2/slave2-data:/var/lib/mysql # 挂载宿主机目录到容器
- /data/slave2/conf/my.cnf:/etc/my.cnf
restart: always
networks:
mynet1:
ipv4_address: 192.168.1.4
networks:
mynet1: # 使用自定义桥接模式
driver: bridge
ipam:
config:
- subnet: 192.168.1.0/24 # 定义网段
gateway: 192.168.1.1 # 定义网关
2.3 启动容器
[root@chucong zhucong]# docker compose up -d
# 查看容器是否运行
[root@chucong zhucong]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5776a980697 mysql:9.1.0 "docker-entrypoint.s…" 59 minutes ago Up 43 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-slave1
0bb3a700077c mysql:9.1.0 "docker-entrypoint.s…" 59 minutes ago Up 43 minutes 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql-slave2
af2f63aa00e8 mysql:9.1.0 "docker-entrypoint.s…" 59 minutes ago Up 4 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-master
3 主从复制操作
3.1 MASTER 操作指令
[root@chucong mysql_zhucong]# docker exec -it mysql-master bash
bash-5.1# mysql -uroot -proot
# 假如说没有设置变量自动创建可以手动创建,设置了可以省略以下命令
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';
# 赋予所有库所有表 repl 用户 REPLICATION SLAVE 的权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql> FLUSH PRIVILEGES;
mysql> SHOW BINARY LOG STATUS\G # 与过往版本不一样了,以前为 SHOW MASTER status\G
*************************** 1. row ***************************
File: mysql-bin.000034 # 注意此处的
Position: 198 # 还有此出处,这两行在从库操作的时候有至关重要的作用
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: d83de5a7-b723-11ef-a65b-0242c0a80104:1-2
1 row in set (0.00 sec)
3.2 SLAVE1 操作指令
[root@chucong mysql_zhucong]# docker exec -it mysql-slave1 bash
bash-5.1# mysql -uroot -proot
# 假如说没有设置变量自动创建可以手动创建,设置了可以省略以下命令
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';
# 以下这整条命令也是发生了巨大的改变,并且不需要指定端口了
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.2', # MASTER 的 IP
SOURCE_USER='repl', # 创建的用户
SOURCE_PASSWORD='root', # 密码
SOURCE_LOG_FILE='mysql-bin.000034', # 为主库使用 SHOW BINARY LOG STATUS\G 中的File值
GET_SOURCE_PUBLIC_KEY=1, # 此处注意 自动获取主服务器的公钥(适用于caching_sha2_password)
SOURCE_LOG_POS=198; # 为主库使用 SHOW BINARY LOG STATUS\G 中的Position值
# 旧版本的命令如下,可指定端口
# mysql> CHANGE MASTER TO
# -> MASTER_HOST='192.168.1.2',
# -> MASTER_PORT=3306,
# -> MASTER_USER='repl',
# -> MASTER_PASSWORD='root',
# -> MASTER_LOG_FILE='mysql-bin.000034',
# -> MASTER_LOG_POS=198;
mysql> START REPLICA; # 启动复制 9.1.0 变化的命令 以前版本为 START SLAVE;
mysql> SHOW REPLICA STATUS; # 启动复制 9.1.0 变化的命令 以前版本为 SHOW SLAVE STATUS;
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************
Replica_IO_State: Waiting for source to send event
Source_Host: 192.168.1.2
Source_User: repl
Source_Port: 3306
Connect_Retry: 60
Source_Log_File: mysql-bin.000034
Read_Source_Log_Pos: 7061047
Relay_Log_File: e5776a980697-relay-bin.000002
Relay_Log_Pos: 7061177
Relay_Source_Log_File: mysql-bin.000034
Replica_IO_Running: Yes # IO 线程YES表示已经连接成功,如果不是会显示no或者connect
Replica_SQL_Running: Yes
3.3 SLAVE2 操作指令
[root@chucong mysql_zhucong]# docker exec -it mysql-slave2 bash
bash-5.1# mysql -uroot -proot
# 假如说没有设置变量自动创建可以手动创建,设置了可以省略以下命令
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';
# 以下这整条命令也是发生了巨大的改变,并且不需要指定端口了
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.2', # MASTER 的 IP
SOURCE_USER='repl', # 创建的用户
SOURCE_PASSWORD='root', # 密码
SOURCE_LOG_FILE='mysql-bin.000034', # 为主库使用 SHOW BINARY LOG STATUS\G 中的File值
GET_SOURCE_PUBLIC_KEY=1, # 此处注意 自动获取主服务器的公钥(适用于caching_sha2_password)
SOURCE_LOG_POS=198; # 为主库使用 SHOW BINARY LOG STATUS\G 中的Position值
# 旧版本的命令如下,可指定端口
# mysql> CHANGE MASTER TO
# -> MASTER_HOST='192.168.1.2',
# -> MASTER_PORT=3306,
# -> MASTER_USER='repl',
# -> MASTER_PASSWORD='root',
# -> MASTER_LOG_FILE='mysql-bin.000034',
# -> MASTER_LOG_POS=198;
mysql> START REPLICA; # 启动复制 9.1.0 变化的命令 以前版本为 START SLAVE;
mysql> SHOW REPLICA STATUS; # 启动复制 9.1.0 变化的命令 以前版本为 SHOW SLAVE STATUS;
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************
Replica_IO_State: Waiting for source to send event
Source_Host: 192.168.1.2
Source_User: repl
Source_Port: 3306
Connect_Retry: 60
Source_Log_File: mysql-bin.000034
Read_Source_Log_Pos: 7061047
Relay_Log_File: 0bb3a700077c-relay-bin.000002
Relay_Log_Pos: 7061177
Relay_Source_Log_File: mysql-bin.000034
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
4 验证是否实现主从
4.1 导入sql脚本查看是否正常主从复制
# MASTER
[root@chucong ~]# docker cp smart_work_v3.sql mysql-master:/
Successfully copied 6.53MB to mysql-master:/
[root@chucong ~]# docker exec -it mysql-master bash
bash-5.1# ls
afs boot docker-entrypoint-initdb.d home lib64 mnt proc run smart_work_v3.sql sys usr
bin dev etc lib media opt root sbin srv tmp var
bash-5.1# mysql -uroot -proot
mysql> CREATE DATABASE shuyan; # 创建数据库
mysql> USE shuyan # 切换到数据库
Database changed
mysql> SOURCE smart_work_v3.sql # 导入sql脚本
mysql> SHOW TABLES;
+----------------------------------------+
| Tables_in_shuyan |
+----------------------------------------+
| aaa |
| abi_http_log |
| act_app_appdef |
| act_app_databasechangelog |
| act_app_databasechangeloglock |
| act_app_deployment |
| act_app_deployment_resource |
| act_cmmn_casedef |
+----------------------------------------+
4.2 检验从库是否看见复制是否成功
mysql> USE shuyan;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SHOW TABLES;
+----------------------------------------+
| Tables_in_shuyan |
+----------------------------------------+
| aaa |
| abi_http_log |
| act_app_appdef |
| act_app_databasechangelog |
| act_app_databasechangeloglock |
| act_app_deployment |
| act_app_deployment_resource |
| act_cmmn_casedef |
| act_cmmn_databasechangelog |
| act_cmmn_databasechangeloglock |
| act_cmmn_deployment |
+----------------------------------------+
原文地址:https://blog.csdn.net/weixin_68398469/article/details/144413879
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!