介绍
双节点主从 + 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方案架构示意图见下
配置双主集群
MySQL的可以配置两台服务器互为主从。用来搭建mysql的高可用架构,用来保证mysql服务器宕机的时候,能够自动的切换的另一台mysql服务器。主从的配置可以是基于日志点的也可以是基于GTID的,我们上面讲到了GTID的配置,所以我们现在配置一个基于GTID的双主集群
master1配置
修改 /etc/my.cnf 文件
s# 服务器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
master2配置
修改 /etc/my.cnf 文件
server-id=133
log-bin=mysql-bin
auto_increment_increment=2
# 生成主键从2开始
auto_increment_offset=2
gtid_mode = on
enforce-gtid-consistency=true
建立主从关系
如果之前已经开启的主从复制,建议使用 stop slave 关闭。在每个节点上切换binlog,执行如下语句
# 使用新的binlog
flush logs;
# 清空binlog
reset master;
然后使用 change master 语句建立主从关系
change master to
master_host='192.168.68.132',
master_port=3306,
master_user='root',
master_password='root',
master_auto_position = 1;
安装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路由器的
安装keepalived
安装keepalived非常简单可以直接使用yum方式在线安装
yum install keepalived -y
配置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
}
}
检查脚本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
启动keepalived
systemctl start keepalived
查看vip
ip addr
配置多源复制从节点
MySQL 5.7已经开始支持了多源复制,MySQL 5.7之前只能实现一主一从、一主多从或者多主多从的复制,如果想实现多主一从的复制,只好使用MariaDB,但是MariaDB又与官方的MySQL版本不兼容的,在MySQL 5.7版本已经可以实现多主一从的复制了。MySQL 5.7版本相比之前的版本,无论在功能还是性能、安全等方面都已经提升了不少,值得大家去研究和使用
多主一从架构带来的好处
一、在从服务器进行数据汇总,如果我们的主服务器进行了分库分表的操作,为了实现后期的一些数据统计功能,往往需要把数据汇总在一起再统计
二、如果我们想在从服务器时时对主服务器的数据进行备份,在MySQL 5.7之前每一个主服务器都需要一个从服务器,这样很容易造成资源浪费,同时也加大了DBA的维护成本,但MySQL 5.7引入多源复制,可以把多个主服务器的数据同步到一个从服务器进行备份
多主一从配置步骤
将主节点的数据同步到从节点
手动复制
配置my.cnf
server-id=134
gtid_mode=ON
enforce-gtid-consistency=ON
master_info_repository=table
relay_log_info_repository=table
配置多源复制
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
配置跳过的GTID集合
#master节点 :
flush logs;
show global variables like 'gtid_executed' \G
#slave节点:
reset master;
set global gtid_purged='640dc8cb-b864-11ea-a38c-000c297c8cb2:1-3,e53b5b46-b5fd-11ea-8faf-000c2940290b:1-3';
#启动节点
start slave for channel 'm-132';
#查看某一频道的复制状态
show slave status for channel 'm-132' \G