MySQL(十二)MYSQL集群---基于主从复制的高可用方案

1,444 阅读7分钟

介绍

双节点主从 + 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方案架构示意图见下

微信图片_20210917175441.png

配置双主集群

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