双节点主从 + keepalived/heartbeat方案,一般来说,中小型规模的时候,采用这种架构是最省事的。两个节点可以采用简单的一主一从模式,或者双主模式,并且放置于同一个VLAN中,在master节点发生故障后,利用keepalived/heartbeat的高可用机制实现快速切换到slave节点。
在这个方案里,有几个需要注意的地方:
把两个节点的auto_increment_increment(自增起始值)和auto_increment_offset(自增步 长)设成不同值。其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突了,因此一开始就使其 错开;当然了,如果有合适的容错机制能解决主从自增ID冲突的话,也可以不这么做;
slave节点服务器配置不要太差,否则更容易导致复制延迟。作为热备节点的slave服务器,硬件配 置不能低于master节点;
如果对延迟问题很敏感的话,可考虑使用MariaDB分支版本,或者直接上线MySQL 5.7最新版本, 利用多线程复制的方式可以很大程度降低复制延迟;
keepalived的检测机制需要适当完善,不能仅仅只是检查mysqld进程是否存活,或者MySQL服务 端口是否可通,还应该进一步做数据写入或者运算的探测,判断响应时间,如果超过设定的阈值, 就可以启动切换机制;
keepalived最终确定进行切换时,还需要判断slave的延迟程度。需要事先定好规则,以便决定在 延迟情况下,采取直接切换或等待何种策略。直接切换可能因为复制延迟有些数据无法查询到而重 复写入;
keepalived或heartbeat自身都无法解决脑裂的问题,因此在进行服务异常判断时,可以调整判断 脚本,通过对第三方节点补充检测来决定是否进行切换,可降低脑裂问题产生的风险。
双节点主从+keepalived/heartbeat方案架构示意图见下:
1、配置双主集群
MySQL的可以配置两台服务器互为主从。用来搭建mysql的高可用架构,用来保证mysql服务器宕机的 时候,能够自动的切换的另一台mysql服务器。主从的配置可以是基于日志点的也可以是基于GTID的, 我们上面讲到了GTID的配置,所以我们现在配置一个基于GTID的双主集群。
1) master1配置
修改/etc/my.cnf 文件
# 服务器id,一般是ip的最后一段
server-id=132
# 开启binlog
log-bin=mysql-bin
# 表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535
auto_increment_increment=2
# 表示自增长字段从那个数开始,他的取值范围是1 .. 65535,另外一台服务器的offset为2,防止生成的主键冲突
auto_increment_offset=1
# 开启基于GTID的复制
gtid_mode = on
# 只记录对基于gtid的复制安全的语句
enforce-gtid-consistency=true
2) master2配置
server-id=133
log-bin=mysql-bin
auto_increment_increment=2
# 生成主键从2开始
auto_increment_offset=2
gtid_mode = on
enforce-gtid-consistency=true
3) 建立主从关系
如果之前已经开启的主从复制,建议使用stop slave 关闭。在每个节点上切换binlog,执行如下语句:
# 使用新的binlog
mysql> flush logs;
# 清空binlog
mysql> reset master;
然后使用change master 语句建立主从关系:
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.68.133',
SOURCE_USER='slave2',
SOURCE_PASSWORD='Abc_123456',
SOURCE_PORT=3306,
SOURCE_AUTO_POSITION = 1,
GET_SOURCE_PUBLIC_KEY=1;
2、安装keepalived
Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送
(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
什么是VRRP呢?
VRRP ,全 称 Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。
1) 安装keepalived
安装keepalived非常简单可以直接使用yum方式在线安装:
$ yum install keepalived -y
2) 配置keepalived
# 配置通知的email
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 检查mysql脚本,定时执行
vrrp_script check_run {
script "/usr/check_run.sh"
interval 3
}
# 设 置 虚 拟 ip
vrrp_instance VI_1 {
# 当前节点的状态MASTER、BACKUP state MASTER
# 当前服务器使用的网卡名称,使用ifconfig查看
interface eno16777736
#VRRP组名,两个节点的设置必须一样virtual_router_id 51
#主节点的优先级(1-254之间) priority 100
#组播信息发送间隔,两个节点设置必须一样advert_int 1
#设置验证信息,两个节点必须一致authentication {
auth_type PASS auth_pass 1111
}
#虚拟IP,对外提供MySQL服务的IP地址
virtual_ipaddress {
192.168.68.110
}
}
3) 检查脚本check_run.sh
#!/bin/bash
. /root/.bashrc
count=1
while true
do
mysql -uroot -proot -S /var/lib/mysql/mysql.sock -e "select now();" >
/dev/null 2>&1
i=$?
ps aux | grep mysqld | grep -v grep > /dev/null 2>&1 j=$?
if [ $i = 0 ] && [ $j = 0 ]
then
exit 0
else
if [ $i = 1 ] && [ $j = 0 ]
then
exit 0
else
if [ $count -gt 5 ]
then
break
fi
let count++
continue
fi
fi
done
systemctl stop keepalived.service
4) 启动keepalived
$ systemctl start keepalived
5) 查看vip
[root@mysql133 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:7c:8c:b2 brd ff:ff:ff:ff:ff:ff
inet 192.168.68.133/24 brd 192.168.68.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.68.110/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7c:8cb2/64 scope link
valid_lft forever preferred_lft forever
3、配置多源复制从节点
MySQL 5.7之前只能实现一主一从、一主多从或者多主多从的复制,如果想实现多主一从的复制,只好使用MariaDB,但是MariaDB又与官方的MySQL版本不兼容的,在MySQL 5.7、8.0版本已经可以实现多主一从的复制了。
多主一从架构带来的好处:
一、在从服务器进行数据汇总,如果我们的主服务器进行了分库分表的操作,为了实现后期的一些数据 统计功能,往往需要把数据汇总在一起再统计。
二、如果我们想在从服务器时时对主服务器的数据进行备份,之前每一个主服务器都需要一个从服务器,这样很容易造成资源浪费,同时也加大了DBA的维护成本,引入多源复制,可以把多个主服务器的数据同步到一个从服务器进行备份。
配置步骤 :
1)将主节点的数据同步到从节点略
2) 配置my.cnf
server-id=134
gtid_mode=ON
enforce-gtid-consistency=ON
master_info_repository=table
relay_log_info_repository=table
3) 配置多源复制
mysql> change master to
master_host='192.168.68.133',
master_port=3306,
master_user='root',
master_password='root',
master_auto_position = 1
FOR CHANNEL 'm-133';
和普通复制不同的是需要增加FOR CHANNEL 'xxx' 语句指定不同的频道复制。由于是多源复制必须指定参数master_info_repository=table
4) 配置跳过的GTID集合
#master节点 :
mysql> flush logs;
mysql> show global variables like 'gtid_executed' \G
#slave节点:
mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
mysql> set global gtid_purged='640dc8cb-b864-11ea-a38c-000c297c8cb2:1- 3,e53b5b46-b5fd-11ea-8faf-000c2940290b:1-3';
Query OK, 0 rows affected (0.00 sec)
#启动节点
mysql> start slave for channel 'm-132';
#查看某一频道的复制状态
mysql> show slave status for channel 'm-132' \G
如果您觉得文章好看,欢迎点赞收藏加关注,一连三击呀,您的肯定是我持续输出的动力,感谢!!☺☻