【高并发高性能高可用之海量数据MySQL实战-30】-MySQL基于主从复制的高可用方案

本文介绍了使用双节点主从配合keepalived/heartbeat实现MySQL高可用的方案,强调了配置过程中的关键点,如自增ID避免冲突、硬件配置、延迟处理、VRRP协议等,并探讨了多源复制的优势。
摘要由CSDN通过智能技术生成

双节点主从 + 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

如果您觉得文章好看,欢迎点赞收藏加关注,一连三击呀,您的肯定是我持续输出的动力,感谢!!☺☻ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要迷恋发哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值