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账号的密码)

1630390942238

存储卷:

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

1630390959924

启动应用进入容器授权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;

1630394886300

这里记录文件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账号的密码)

1630393710033

存储卷:

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

1630393847127

启动应用进入容器配置

# 登录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

1630394725337

进行主从同步测试 ,如:

  • 从主库中创建一个数据库、数据表,添加数据,检查从库是否正常同步过来

  • 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...,然后重启 slave start slave

5.2、slave复制出现错误

1630401654159

对照着错误码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; # 检查状态
上次更新:
编辑者: 李贤伟