发布时间:2021-11-28作者:laosun阅读(1003)
准备环境
# 使用docker pull mysql:latest 拉取下来的mysql版本是:8.0.27-1debian10 # 准备2台机器 192.168.0.121 (安装master) 192.168.0.122 (安装slave) 注意:mysql 是无法使用nfs共享区的。所以如果是使用docker,映射出来的卷最好在宿主机上,别在共享区。
操作目录都是在 /usr/local/docker/mysql
先分别在两台机器的这个目录下分别创建2个文件夹。
mkdir data logs
192.168.0.121 master 机器
增加my.cnf ,这里我命名为master.cnf
master.cnf
[mysqld] max_connections = 2000 default-time_zone='+8:00' sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION #gtid: server_id = 1 #服务器id gtid_mode = on #开启gtid模式 enforce_gtid_consistency = on #强制gtid一致性,开启后对于特定create table不被支持 #binlog log_bin = mysql-binlog log_slave_updates = on binlog_format = row #强烈建议,其他格式可能造成数据不一致 # 指定同步哪个数据库 binlog-do-db=d_sun # 忽略以下数据库的同步 binlog-ignore-db=mysql binlog-ignore-db=sys binlog-ignore-db=information_schema binlog-ignore-db=performance_schema #relay log skip_slave_start = 1 default_authentication_plugin = 'mysql_native_password' #更改加密方式
增加 docker-compose.yaml
version: "3.9" services: mysql: restart: always image: mysql:latest container_name: mysql ports: - 3306:3306 command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 environment: MYSQL_ROOT_PASSWORD: root volumes: - ${PWD}/data:/var/lib/mysql - ${PWD}/logs:/var/log/mysql - ${PWD}/master.cnf:/etc/my.cnf
master机器下创建完成后,如下所示:
192.168.0.122 slave 机器
增加my.cnf ,这里我命名为slave.cnf
slave.cnf
[mysqld] max_connections = 2000 default-time_zone = '+8:00' sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION #GTID: server_id = 2 #服务器id(注意这里的servier_id不能master一样,另外每启动一台slave,都需要改动) gtid_mode = on #开启gtid模式 enforce_gtid_consistency = on #强制gtid一致性,开启后对于特定create table不被支持 #binlog log_bin =mysql-binlog log_slave_updates = on binlog_format = row #强烈建议,其他格式可能造成数据不一致 # 以下为多余配置,slave机器不需要配置,否则会导致mysql服务无法启动 # 指定同步哪个数据库 # binlog-do-db=d_sun # 忽略以下数据库的同步 # binlog-ignore-db=mysql # binlog-ignore-db=sys # binlog-ignore-db=information_schema # binlog-ignore-db=performance_schema #relay log skip_slave_start = 1 default_authentication_plugin = 'mysql_native_password' #更改加密方式 read_only = on #设置只读 super_read_only = on # 设置超级管理员也只允许读,不允许写 # mysql8.0以上版本,binlog保存时间 以秒为单位;默认2592000 30天 # mysql8.0以下版本,使用expire_logs_days,以天为单位 binlog_expire_logs_seconds=604800
增加 docker-compose.yaml
version: "3.9" services: mysql: restart: always image: mysql:latest container_name: mysql ports: - 3306:3306 command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 environment: MYSQL_ROOT_PASSWORD: root volumes: - ${PWD}/data:/var/lib/mysql - ${PWD}/logs:/var/log/mysql - ${PWD}/slave.cnf:/etc/my.cnf
slave 机器下创建完成后,如下所示:
启动
分别使用以下指令启动两台mysql服务
# 进入这个文件夹 cd /usr/local/docker/mysql # 启动mysql服务 docker-compose up -d
初始化配置,从master上创建专用于同步的账户
# 登录192.168.0.121这台master服务 # 进入docker 容器 docker exec -it mysql bash # 登录mysql mysql -u root -proot # 查看server_id是否生效 show variables like '%server_id%'; # 如果打印以下内容表示生效 +----------------+-------+ | Variable_name | Value | +----------------+-------+ | server_id | 1 | | server_id_bits | 32 | +----------------+-------+ 2 rows in set (0.00 sec)
可以使用 show master status; 查看master状态
# 创建一个专用的账户用户bin log的同步 # 账号为:slave 密码为:000000 CREATE USER 'slave'@'%' IDENTIFIED BY '000000'; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%'; flush privileges;
初始化配置, slave 服务(配置master指向)
# 启动mysql服务 docker-compose up -d # 进入docker 容器 docker exec -it mysql bash # 登录mysql mysql -u root -proot # 查看server_id是否生效 show variables like '%server_id%'; # 如果打印以下内容表示生效 +----------------+-------+ | Variable_name | Value | +----------------+-------+ | server_id | 2 | | server_id_bits | 32 | +----------------+-------+ 2 rows in set (0.00 sec)
# 查看MASTER状态 show slave status\G; # 输出Empty set, 1 warning (0.01 sec)
从节点使用备份账户连接主节点,开启备份
# 执行指令,连接主节点,开启备份 change master to master_host='192.168.0.121', master_port=3306, master_user='slave', master_password='000000', master_auto_position=1; # 启动同步 start slave; # 如果出现异常:ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository # 则可以执行重置,然后再 start slave; reset slave;
可以使用 show slave status\G; 查看状态。
如果下边的标红加粗部分(Slave_IO_Running、Slave_SQL_Running)都显示为Yes,表示主从复制一切正常。
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for source to send event Master_Host: 192.168.0.121 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-binlog.000003 Read_Master_Log_Pos: 868 Relay_Log_File: 6f4258c72724-relay-bin.000004 Relay_Log_Pos: 1089 Relay_Master_Log_File: mysql-binlog.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 868 Relay_Log_Space: 3118370 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 6a4b9321-3c9d-11ec-a45e-0242c0a84002 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: 6a4b9321-3c9d-11ec-a45e-0242c0a84002:1-8 Executed_Gtid_Set: 452bf0c3-3c9e-11ec-9fb3-0242c0a85002:1-5, 6a4b9321-3c9d-11ec-a45e-0242c0a84002:1-8 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 1 row in set, 1 warning (0.01 sec) ERROR: No query specified
测试
# 登录192.168.0.121 master 机器 # 查看目前所有的数据库 show databases; # 创建一个新的数据库 CREATE DATABASE `d_sun` CHARACTER SET 'utf8mb4'; # 登录192.168.0.122 slave机器 # 查看目前所有的数据库,可以看到d_sun这个数据库已经同步过来了。 show databases; # 剩下的表数据同步这里就不进行测试了。
记得从机器使用超级管理员账户是可以进行修改的,不要进行改动,以免影响主从复制。
版权属于: 技术客
原文地址: https://www.sunjs.com/article/detail/fec7688ad11a4fcc998704a0e8f58caa.html
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关键字: 数据库 mysql docker docker-compose