MySQL双向复制和主库宕机自动切换

MySQL双向复制和主库宕机自动切换

背景

数据库需要主从复制,原本是打算主写从读的,但是上面要求出故障的时候自动切换不影响业务,就在原来的情况上修改,书接上回 MySQL主从复制和简易主从切换

操作原理

还是利用mysql驱动包(mysql-connector-java-xxx.jar)中已经具备了自动切换故障数据库的功能这个点来操作,假设两个库都能写入互相复制并且在宕机的时候直接自动切换那不就差不多了吗。所以去看了双向复制的知识点,发现有搞头,毕竟我不需要两边同时写,只会写一个库,只要保持服务正常就行,那采用双向复制对我来说就不会有太大的问题。如果两个库同时都写还是不建议这么操作。

主库配置

这个和单纯的主从复制不同,需要自己也从另外一个库上面复制,相当于自己也要去订阅另一台了了,所以配置也大不相同。定义服务器1为服务器A,服务器2为服务器B。
1.1 服务器A配置

server-id=1
log-bin=mysql-bin
binlog_format=ROW
#双主复制新增配置
auto-increment-increment = 2  #增量为2
auto-increment-offset = 1   #初始为1
slave-skip-errors = all       #忽略所有复制产生的错误
gtid_mode=ON
enforce-gtid-consistency=ON

在这里插入图片描述

1.2 服务器B配置

server-id=2
log-bin=mysql-bin
binlog_format=ROW
#双主复制新增配置
auto-increment-increment = 1  #增量为1    为了和之前的区别  相当于id自增这里增加1  但是上面的增加2
auto-increment-offset = 1   #初始为1
slave-skip-errors = all       #忽略所有复制产生的错误
gtid_mode=ON
enforce-gtid-consistency=ON

在这里插入图片描述
1.3 创建用户并赋权

mysql>CREATE USER 'mysqlcopy'@'%' IDENTIFIED BY '123456';

赋权

mysql>GRANT REPLICATION SLAVE ON *.* TO 'mysqlcopy'@'%'
mysql> update user set host='%' where user='mysqlcopy';

刷新权限

mysql>flush privileges;

1.4 开启双向复制
先进入Mysql数据库

mysql -u 用户名 -p

定义一下相互订阅 两边都执行

mysql>change master to master_host='需要订阅服务器的IP',master_port=数据库端口,master_user='授权的账号',master_password='授权账号的密码',master_log_file='二进制文件名',master_log_pos=0;
mysql>start slave

看一下状态

mysql>show slave status \G;

在这里插入图片描述
1.5 开始测试
到两边的数据库进行修改测试,两个库会互相同步就成功了。

自动切换

利用mysql驱动包(mysql-connector-java-xxx.jar)中已经具备了自动切换故障数据库的功能这个点来操作
配置方式我之前采用的是这种类型:
url: jdbc:mysql://address=(host=192.168.XXX.XXX)(port=3336)(user=XX)(password=XX),address=(host=XXX.XXX.XXX.134)(port=3306)(user=XX)(password=XX)/数据库名?characterEncoding=utf-8&useSSL=false
这种可以指定端口和用户名
但是会出现切换后出现只读的情况 不能写入,翻了翻官方文档得到了解决。
参考链接 MySQL官方文档
在这里插入图片描述
只需要加一个配置就可以了 failOverReadOnly=false
修改后
url: jdbc:mysql://address=(host=192.168.XXX.XXX)(port=3336)(user=XX)(password=XX),address=(host=XXX.XXX.XXX.134)(port=3306)(user=XX)(password=XX)/数据库名?characterEncoding=utf-8&useSSL=false&failOverReadOnly=false

还有几个参数一起解释一下
failOverReadOnly:
这个参数用于控制当发生故障转移时,新的主数据库是否应该是只读的。如果设置为true,则在故障转移后,连接会变为只读模式,通常用于避免在主从复制环境中因为故障转移导致的写操作问题。
secondsBeforeRetrySource:
这个参数定义了在尝试重新连接到主数据库之前应该等待的秒数。当主数据库发生故障,系统可能需要一定时间来恢复,这个参数就是用来设置等待时间的,不配置默认值为0。举个例子:secondsBeforeRetrySource 被设置为 30 秒。这意味着在发生故障转移之后,JDBC 驱动将等待 30 秒再尝试重新连接到之前的主数据库。
queriesBeforeRetrySource:
这个参数指定了在重新尝试连接到主数据库之前可以执行的查询数量。如果在执行了一定数量的查询后,连接仍然没有恢复,系统会尝试重新连接到主数据库。
retriesAllDown:
当所有的数据库节点都不可用时,这个参数定义了驱动程序应该尝试重连的次数。一旦达到这个次数,连接尝试将会停止。
autoReconnect:
这个参数用于控制当数据库连接意外断开时,驱动程序是否应该尝试自动重新连接。如果设置为true,则在连接断开时会自动尝试重新连接。
autoReconnectForPools:
当使用连接池时,这个参数决定了是否应该为连接池中的每个连接启用自动重连功能。通常,连接池管理连接的生命周期,所以这个参数可能不会经常使用。

配置切换条件:分为时间和查询条件两种
时间条件:从故障发生并且开始等待重连的那一刻起,如果经过了 secondsBeforeRetrySource 参数指定的秒数,那么时间条件就被满足了。换句话说,如果设置了 secondsBeforeRetrySource=30,那么在故障发生后,驱动程序会等待 30 秒再尝试重新连接。
查询条件:与 queriesBeforeRetrySource 参数结合使用时,如果驱动程序在等待期间执行了 queriesBeforeRetrySource 参数指定的查询次数,那么查询条件就被满足了。例如,如果 queriesBeforeRetrySource 设置为 50,那么在等待 secondsBeforeRetrySource 期间,如果执行了 50 次查询,驱动程序也会尝试重新连接。
因此,“满足条件”意味着以下任一情况先发生,驱动程序就会尝试重新连接到主数据库:

这两个切换条件共同控制着故障转移后的重连策略,以确保在尝试重连之前有足够的等待时间,或者已经执行了一定数量的查询。这样可以避免在数据库可能还未完全恢复的情况下频繁尝试重连。

添加后进行验证就可以都读写了,当出现第一个节点挂了会自动转到第二个节点确保服务的持续,即使写入一部分数据后第一个节点活了也会同步数据过去然后切到主节点,所以就可以解决这个需求了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值