引言
实际生产中要求数据库的高可用性,就要考虑mysql的主从、主主。若针对的是上云的机器,比如使用阿里云,那可以购买相应厂商的服务,只需要修改相应的配置就可以做到热备,冷备的效果。但是若针对的是使用自己的服务器的企业,那只能自己撸起袖子来干了。
参考网址
1.mysql主从
Mysql主从复制原理及搭建
https://www.jianshu.com/p/b0cf461451fb
2.mysql设置步长
mysql修改数据表自增步
3.更进一步,mysql双主
https://www.jianshu.com/p/469279c1ad39
主主搭建
本文将以174,175两台服务器为例子,介绍给读者双主数据库的搭建方法。
1. Mysql安装
安装方法在网上有很多,此处本文就不在重复了,但是要强调一点,两台机器上的mysql至少安装5.7以上的版本,且两台机器上的mysql版本,安装路径,配置,最好是一模一样的。
2. Mysql配置
修改my.cnf配置信息,默认安装存放在 /etc/my.cnf中
2.1 开启relay log配置
这里以174上的mysql作为例子,同理可修改175上的配置,建议配置均以后缀IP不同作为区分。
[mysqlId]
# 同一局域名内注意要唯一
server-id=174
# 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin-174
# relay_log配置中继日志
relay_log=mysql-relay-bin-174
2.2 设置步长
在主主同步是先写入一台机器,然后在同步到另外一台机器上面,本质上并不是数据的同步,而是sql语言的同步。基于这个原理,在双主模式下如果只是单纯使用mysql的自增长策略,那将会导致冲突(比如A机器插入一条id为3的数据,B机器也插入了一条id为3的数据,这样子AB机器之间就无法同步了)。
这个问题其实可以扩大成分布式环境下数据库id一致性问题。解决办法有很多,比如本博主之前写到的另外一篇文章,采用雪花算法保证全局id的唯一性。
关于雪花算法的一些思考与工具类实现
这里因为是两台机器,所以我们可以做一种简单处理,针对mysql的自增长一台为单数,一台为复数进行区分。因此修改mysql配置如下
[mysqlId]
#设置步长,两台机器均为2
auto_increment_increment=2
#设置初始值,一台为1,另一台为2
auto_increment_offset=1
修改完成mysql的配置后记得要重启
sevice mysql restart
3. mysql主主实现
在两台机器174,175上均用root用户访问mysql
3.1 创建slave用户
174
create user 'slave'@'xx.xx.xx.175' identified by 'pwd';
grant replication slave,replication client on *.* to 'slave'@'xx.xx.xx.175';
flush privileges;
175
create user 'slave'@'xx.xx.xx.174' identified by 'pwd';
grant replication slave,replication client on *.* to 'slave'@'xx.xx.xx.174';
flush privileges;
3.2 配置主主
在174上配置自己为slave,主指向175;
在175上配置自己为slave,主指向174。
174
show master status \G; #记录下 file和position
master_host='xx.xx.xx.175',master_user='slave',master_password='pwd',master_port=3306,master_log_file='175上记录下的file',master_log_pos=175上记录下的position;
175
show master status \G; #记录下 file和position
master_host='xx.xx.xx.174',master_user='slave',master_password='pwd',master_port=3306,master_log_file='174上记录下的file',master_log_pos=174上记录下的position;
命令说明
master_host :Master的地址
master_port:Master的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
分别在174和175中中查看主从同步状态:
show slave status \G;
此时的SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。
开启主从复制:
start slave;
再次查看同步状态:
show slave status \G;
SlaveIORunning 和 SlaveSQLRunning 都是Yes说明主从复制已经开启。
4. 更多
4.1 问题
若SlaveIORunning一直是Connecting,有下面4种原因:
1、网络不通,检查ip端口
2、密码不对,检查用于同步的用户名和密码
3、pos不对,检查Master的Position
4、mysql8特有的密码规则问题引起:
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '@#$Rfg345634523rft4fa';
将密码规则修改为:mysql_native_password
4.2 指定数据库主从
如果需要指定想要主从同步哪个数据库,可以在master的my.cnf添加配置:
binlog-do-db:指定mysql的binlog日志记录哪个db
或者在slave的my.cnf添加配置:
replicate-do-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
replicate-ignore-db=需要忽略的数据库名,如果忽略多个数据库,重复设置这个选项即可
4.3 slave的启动
若遇到奇怪的问题,可以先关闭slave,调整好file和position,在重新开启。不过此时应该注意两边数据的完整性
stop slave;
start slave;