Mysql-主从配置
mysql主从配置采用的版本为mysql:5.7.28
,这里采用单一Deployment
进行配置,非StatefulSet
。
1、mysql.cnf Configmap配置
master配置,主要属性配置如下:
server_id:指定服务id
log-bin:开启二进制日志(文件格式示例:mysql-bin.000001)
binlog-ignore-db:忽略不同步的数据库
# mysql.cnf mysql-master
[mysqld]
server_id=1
log-bin=mysql-bin
binlog-ignore-db=mysql
expire_logs_days=7
max_connections=500
lower_case_table_names=1
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake=true
slave配置,主要属性配置如下:
server_id:指定服务id
relay_log: 定义relay_log的位置和名称 (同步master的日志记录)
binlog-ignore-db:忽略不同步的数据库
# mysql.cnf mysql-slave
[mysqld]
server_id=2
relay_log=/var/lib/mysql/waf-relay-bin
binlog-ignore-db=mysql
expire_logs_days=7
max_connections=500
lower_case_table_names=1
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake=true
2、mysql-master部署
名称:mysql-maseter (名称自定义)
Docker镜像:172.16.102.2:5000/library/mysql:5.7.28
端口映射:3306 (以NodePort方式暴露,可以进行外部访问)
环境变量:
MYSQL_USER:datasync (这里创建一个用户,用于slave的同步)
MYSQL_PASSWORD:****** (datasync的密码)
MYSQL_ROOT_PASSWORD:****** (root账号的密码)
存储卷:
configmap:
卷名:master-conf
默认模式 :644
配置映射名:mysql-master
容器路径:/etc/mysql/conf.d/mysql.cnf
子路径:mysql.cnf
PVC:
卷名:mysql-master-pvc
PVC:创建一个PVC如:mysql-master-pvc,选择一个存储类
容器路径:/var/lib/mysql
启动应用进入容器授权datasync
用户 slave 同步复制权限
# 手工创建一个用户
# CREATE USER 'datasync'@'%' IDENTIFIED WITH mysql_native_password BY 'Wiseda@2021';
# 授权datasync用户同步复制权限
GRANT REPLICATION SLAVE ON *.* TO 'datasync'@'%';
# 刷新权限
flush privileges;
# 显示master状态
show master status;
这里记录文件mysql-bin.000004
,当前位置:1540
,用于在slave配置同步日志。
3、mysql-slave 部署
名称:mysql-slave(名称自定义)
Docker镜像:172.16.102.2:5000/library/mysql:5.7.28
端口映射:3306 (以NodePort方式暴露,可以进行外部访问)
环境变量:
MYSQL_ROOT_PASSWORD:****** (root账号的密码)
存储卷:
configmap:
卷名:slave-conf
默认模式 :644
配置映射名:mysql-slave
容器路径:/etc/mysql/conf.d/mysql.cnf
子路径:mysql.cnf
PVC:
卷名:mysql-slave-pvc
PVC:创建一个PVC如:mysql-slave-pvc,选择一个存储类
容器路径:/var/lib/mysql
启动应用进入容器配置
# 登录mysql
mysql -u root -p******
# 配置与master连接(将生成master.info文件在var/lib/mysql目录下)
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='datasync',
MASTER_PASSWORD='Wiseda@2021',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=1540;
# 启动slave
start slave
# 查看slave状态
show slave status\G;
# Slave_IO_Running、Slave_SQL_Running均为yes表示从节点已经可以正常同步master
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes
进行主从同步测试 ,如:
从主库中创建一个数据库、数据表,添加数据,检查从库是否正常同步过来
stop slave (停止slave,在master进行操作,操作完后,再start slave,检查数据是否同步)
删除slave节点中的pod,操作master,再添加slave(副本数设置 为0删除,设置为1再启用,模拟从节点当机,重启后是否正常)
删除master节点中的pod,再添加master(副本数设置 为0删除,设置为1再启用,模拟主节点当机,重启后是否正常)
4、相关操作
# 登录mysql
mysql -u root -p******
# 查看master状态
show master status;
# 查看某一binlog日志记录的事件与position (可选择某一位置点进行恢复)
show binlog events in 'mysql-bin.000001';
# 从某一position位置开始,并从第1行取10条
show binlog events in 'mysql-bin.000001' form 123 limit 0,10;
# 查看slave状态
shwo slave status\G;
# 重置master (仅用于初始化主从配置 )
# reset master
# 重置slaver (用于删除与master的复制关系)
# reset slave
5、常用错误
5.1、start slave; 异常
出现slave启动失败的错误,由于在没指标relay_log
时,会以当前pod名称做为relay_log的文件名,导致 pod被删除重新拉起新pod时名称变动了,
mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
# 系统日志
2021-08-31T03:08:07.802800Z 0 [ERROR] Failed to open the relay log './mysql-slave-b6b7cc85-42l9r-relay-bin.000005' (relay_log_pos 642).
2021-08-31T03:08:07.802823Z 0 [ERROR] Could not find target log file mentioned in relay log info in the index file './mysql-slave-b6b7cc85-dgs5n-relay-bin.index' during relay log initialization.
解决方案:
在 mysql.conf中指定relay_log的路径与文件名,如:
/var/lib/mysql/waf-relay-bin
reset slave; (清除slave同步复制关系,删除master.info)
再重新
CHANGE MASTER TO...
,然后重启 slavestart slave
5.2、slave复制出现错误
对照着错误码1146
可以看到是数据表缺失,这是因为flyway在初始化时默认创建的 flyway_schema_history
没有同步到从节点
slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors。
# error code代表的错误如下:
1007:数据库已存在,创建数据库失败
1008:数据库不存在,删除数据库失败
1050:数据表已存在,创建数据表失败
1051:数据表不存在,删除数据表失败
1054:字段不存在,或程序文件跟数据库有冲突
1060:字段重复,导致无法插入
1061:重复键名
1068:定义了多个主键
1094:位置线程ID
1146:数据表缺失,请恢复数据库
1053:复制过程中主服务器宕机
1062:主键冲突 Duplicate entry '%s' for key %d
# mysql.conf 配置中写法方式如下
slave_skip_errors=1062,1053
slave_skip_errors=all
slave_skip_errors=ddl_exist_errors
解决方案:
方案1:在configmap中添加跳过的错误码,再删除pod,拉个新pod同步
方案2:在从库中创建flyway_schema_history
表,再重启slave.
stop slave; # 停止复制
start slave; # 重启复制
show slave status\G; # 检查状态