背景
- 项目中某些设备,包含两块主控板,需要实现某一块板卡拔掉之后,另一块主控板继续提供服务
基础环境
- CentOS 7 x86-64位
- mysql 8.0.39
- nginx windows 1.18.0
基础参数
- 虚拟机A:192.168.100.100
- 虚拟机B:192.168.100.110
- 宿主机:192.168.0.5
主备配置
- 默认已成功安装mysql,以后再增加安装文档链接(虚拟机部署时,我一般部署一个,然后克隆过去,修改一下参数就行)。
- 通过虚拟机克隆的,修改一下mysql在初始化数据库时,指定的data目录下auto.cnf文件,保证主备uuid唯一。
#data/auto.cnf配置
[auto]
server-uuid=dd18c317-86ce-xxxx-xxxx-000c296b2ece
#uuid一致时,开启slave时,所报错误
[ERROR] [MY-013117] [Repl] Replica I/O for channel ‘’: Fatal error: The replica I/O thread stops because source and replica have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: MY-013117
- 用户准备,数据同步时,slave需要一个用户连接到master,用以监听master事件,然后进行binlog的io操作
- 两台mysql服务都执行以下SQL
#创建用户
create user ‘sync’@‘%’ identified by ‘123456’;
#授权账号复制权限
grant replication slave on . to ‘sync’@‘%’;
#刷新配置
FLUSH PRIVILEGES;
互为主备配置
- windows下默认为my.ini,linux在mysql初始化数据库时(–initialize时),可指定,一般定义为my.cnf
- 以下为mysql配置my.cnf,能满足双主的简单示例,复制之后根据注释小小修改以下就行
[mysqld] #基础配置
basedir=/usr/local/apps/mysql8/
datadir=/usr/local/apps/mysql8/data
socket=/usr/local/apps/mysql8/tmp/mysql.sock #可删,默认在/tmp目录下
#主从配置
server-id=2 #需改,保证唯一
character-set-server=UTF8MB4
#本地中继文件名,从服务接收过来要存在data目录下
relay-log = mysql-relay-bin
#服务器的二进制文件名称,作为主,必配项,要给slave提供的文件
log-bin=log-bin
#不用同步的库
replicate-ignore-db = mysql
replicate-ignore-db = infomation_schema
replicate-ignore-db = performance_schema
[mysql_safe]
#默认在/var/log/mariadb/mariadb.log中
log-error=/usr/local/apps/mysql8/log/mysqld.log
- 只是进行主备配置的话,master删掉replicate-xxx那三个配置、relay-log,slave删掉log-bin
服务设置
- 以A机为master,B为slave示例(主备),反过来修修改改再执行一遍(双主)
- 查询A机master状态,列File和Position需要在slave设置的时候使用
- B作为A的备用服务,需要设置,以A作为master的相关参数
STOP SLAVE;
CHANGE MASTER TO
master_host = ‘192.168.100.110’,
master_user = ‘sync’,
master_password = ‘123456’,
– 主服务器数据库上的File值
master_log_file = ‘log-bin.000002’,
– 主服务器数据库的Position值
master_log_pos = 1476,
get_master_public_key=2;
START SLAVE;
- 这就完了,然后去随便修修改改,测试一下对端数据库是否会变化
- 是服务级别的同步,创建一个数据库也会被同步过去
Nginx实现VIP
- 需要nginx1.9以上,支持stream
- 修改nginx.conf
故障排查
- 设置master/slave之后,如果发现数据更新未同步,查看slave状态,Last_IO_Error会显示最后一次失败的简要说明
- 日志查看
- 如果是mysql启动问题,查看/var/log/message
- 如果是运行期间的问题,默认查看var/log/mariabd/mariabd.log
- 不知道日志在哪里时,查看mysql线程:ps -ef | grep mysql;里面有详细参数