docker mysql 8.0.32 主从搭建

mysql主从安装8.0.32

复制的基本原则:

1.每个Master可以有多个Slave
2.每个Slave只有一个Master
3.每个节点server_id唯一

主从复制的注意事项:

1.同步之前必须保证主从节点具有相同的数据库和相同的表,以及相同的初始数据。
2.写操作必须保证只在主节点进行,如果对从节点修改数据是很危险的操作,将会导致错误而停止同步。
3.从节点适合只读操作
4.主从之间数据同步不是实时的,存在某一时刻数据不一致的情况。
5.主从之间的数据同步是单向异步复制。从节点复制主节点数据。
6.中途新增加表,修改表需要重新设置同步:
    1.主库上锁 flush tables with read lock;
    2.从库停止 stop slave;
    3.主库导出修改 mysqldump 库 表 -uroot -p123456 > /dum.sql
    4.从库导入修改 source dum.sql
    5.主库解锁 show master status;
              unlock tables;
    6.清空从库配置 reset slave all;
    7.从库重新配置 change master to ......
    8.从库开启同步 start slave;
docker pull mysql:8.0

1.创建容器并挂载数据卷

主节点:
docker run -p 3306:3306 --privileged=true \
-v /home/docker_volume/mysql_master/log:/var/log/mysql \
-v /home/docker_volume/mysql_master/data:/var/lib/mysql \
-v /home/docker_volume/mysql_master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql_master \
-d mysql:8.0.32
​
从节点:
docker run -p 3307:3306 --privileged=true \
-v /home/docker_volume/mysql_slave/log:/var/log/mysql \
-v /home/docker_volume/mysql_slave/data:/var/lib/mysql \
-v /home/docker_volume/mysql_slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql_slave \
-d mysql:8.0.32

2.修改mysql_master配置

vim /home/docker_volume/mysql_master/conf/my.cnf
[client]
#客户端字符集
default-character-set=UTF8MB4
[mysqld]
#设置server_id,同一局域网中需要唯一
server_id=101
#服务端字符集
character-set-server=UTF8MB4
#开启二进制日志功能
log-bin=master-mysql-bin  
​
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
# 设置需要复制的数据库,默认复制全部数据库
#binlog-do-db=mytestdb
​
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
​
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
​
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
​
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

重启mysql_master

docker restart mysql_master

2.1进入mysql_master容器并创建用户

docker exec -it mysql_master /bin/bash
​
登录mysql-client
mysql -uroot -p123456
​
创建备份用户slave、授权;#注意必须使用mysql_native_password
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE,REPLICATION CLIENT,SUPER,RELOAD ON *.* TO 'slave'@'%';
​
FLUSH PRIVILEGES;
​
查看主从状态(主从节点都配置好并重启后)
show master status;

2.2 初始化数据库、表、数据

...省略(主从一致)

3.修改mysql_slave配置

vim /home/docker_volume/mysql_slave/conf/my.cnf
[client]
#客户端字符集
default-character-set=UTF8MB4
[mysqld]
#设置server_id,同一局域网中需要唯一
server_id=1011
​
#服务端字符集
character-set-server=UTF8MB4
​
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
​
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=slave-1011-mysql-bin
​
## relay_log配置中继日志
relay_log=slave-1011-mysql-relay-bin
​
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
​
## slave设置为只读(具有super权限的用户除外)
read_only=1
​
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
​
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
​
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
​
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
重启mysql_slave
docker restart mysql_slave

3.1初始化数据库、表、数据

...省略(主从一致)

3.2 mysql_slave开启主从同步

进入容器
docker exec -it mysql_slave /bin/bash
​
登录mysql-client
mysql -uroot -p123456
​
配置主从同步参数(master_log_file和master_log_pos !!从主节点show master status;查看)
master_host 推荐使用docker网络而不是IP地址,一旦ip地址发生变化,将无法同步
​
change master to 
master_host='主节点IP',
master_port=主节点端口,
master_user='备份用户名',
master_password='备份用户密码',
master_log_file='主节点binlog文件名',
master_log_pos=主节点bin-log位置,
master_connect_retry=30;
​
change master to master_host='192.168.1.39',master_port=3306,master_log_file='master-mysql-bin.000002',master_log_pos=157,master_connect_retry=30,master_user='slave',master_password='123456';
​
查看从节点状态(没有分号)
show slave status\G
正常情况:
    Slave_IO_Running: Yes    如果此项为Connecting或no需要检查防火墙设置
    Slave_SQL_Running: Yes
​
开启同步主节点数据
start slave;
stop slave; 停止同步主节点数据

通过日志排查问题

容易出现主从不同步问题:

1.检查防火墙

2.检查配置

3.分析日志 docker logs -f slave容器ID

问题处理:Could not find first log file name in binary log index file

1.从机先停止同步
mysql > stop slave;

2.主机关闭日志文件并创建一个新日志文件
mysql > flush logs;

3.查看主机新binlog文件名称和binlog文件位置
mysql > show master status;

4.从机重新设置文件和位置、
mysql > CHANGE MASTER TO MASTER_LOG_FILE='新的binlog文件名',MASTER_LOG_POS=123 ....

5.从机开启同步
mysql > start slave;

你可能感兴趣的:(数据库,mysql,云原生,docker)