keepalived+MySQL双主高可用
我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是Master宕机后不能实现动态切换。使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。
过多内容在这里就不做详细介绍了,下面详细记录下Mysql+Keepalived双主热备的高可用方案实践
1)先实施ctcdb1->ctcdb2的主主同步。主主是数据双向同步,主从是数据单向同步。一般情况下,主库宕机后,需要手动将连接切换到从库上。(但是用keepalived就可以自动切换)
2)再结合Keepalived的使用,通过vip实现MySQL双主对外连接的统一接口。即客户端通过vip连接数据库;当其中一台宕机后,vip会漂移到另一台上,这个过程对于客户端的数据连接来说几乎无感觉,从而实现高可用。
环境描述:
Centos 7.5版本
ctcdb1:192.168.2.101 安装mysql和keepalived
ctcdb2:192.168.2.102 安装mysql和keepalived
vip: 192.168.2.103
一MySQL主主同步环境部署---------------ctcdb1服务器操作记录---------------
在my.cnf文件的[mysqld]配置区域添加下面内容:
[root@ctcdb1~]# vi etc/my.cnf
server-id= 1 #唯一值
auto-increment-increment= 2 #自增值,从1开始,每次递增2.数值是1,3,5,7……
auto-increment-offset= 1 #第一次加载数值时的偏移值的个位值
[root@ctcdb1~]# /usr/local/mysql/bin/mysqld &
mysql>createuser repl@’192.168.2.101’ identified by ‘msyql123’;
mysql> grantreplication slave,replication client on *.* to repl@’192.168.2.101’identified by ‘msyql123’;
mysql>createuser repl@’192.168.2.102’ identified by ‘msyql123’;
mysql>grant replication slave,replication client on *.*to repl@’192.168.2.102’ identified by ‘msyql123’;
mysql>flush privileges;
(如由主从升级为主主,则由master端执行create user命令,否则会报数据不一致错)
---------------ctcdb2服务器操作记录---------------
在my.cnf文件的[mysqld]配置区域添加下面内容:
[root@ctcdb2~]# vi etc/my.cnf
server-id= 2 #唯一值
auto-increment-increment= 2 #自增值,从2开始,每次递增2.数值是2,4,6,8……
auto-increment-offset= 2 #第一次加载数值时的偏移值的个位值
[root@ctcdb2~]# /usr/local/mysql/bin/mysqld &
mysql>changemaster tomaster_host='192.168.2.101',master_user='repl',master_password='mysql123',master_auto_position=1;
mysql> startslave;
---查看同步状态,如下出现两个“Yes”,表明同步成功!---
mysql> showslave status G;
***************************1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
---------------ctcdb1服务器做同步操作---------------
mysql> changemaster tomaster_host='192.168.2.102',master_user='repl',master_password='mysql123',master_auto_position=1;
mysql> startslave;
mysql> showslave status G;
***************************1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这样,ctcdb1就和ctcdb2实现了主主同步
下面开始进行数据验证:
-----------------主主同步效果验证---------------------
1) 在ctcdb1数据库上写入新数据
mysql> createdatabase text1;
QueryOK, 1 row affected (0.01 sec)
然后在ctcdb2数据库上查看,发现数据已经同步过来了!
mysql> showdatabases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|text1 |
|mysql |
|performance_schema |
+--------------------+
4 rowsin set (0.00 sec)
2)在ctcdb2数据库上写入新数据
mysql> createdatabase text2;
QueryOK, 1 row affected (0.00 sec)
然后在ctcdb1数据库上查看,发现数据也已经同步过来了!
mysql> showdatabases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|text1 |
|text2 |
|mysql |
|performance_schema |
+--------------------+
5 rowsin set (0.00 sec)
至此,Mysql主主同步环境已经实现。
二配置MySQL+Keepalived故障转移的高可用环境(双节点部署,以单节点为示例)1、下载keepalived
https://www.keepalived.org/
2、安装依赖包
[root@ctcdb1~]# yum install kernel-devel openssl-devel pdata/soft-devel gcc
3、解压
[root@ctcdb1~]#cd data/soft
[root@ctcdb1~]# tar zxvf data/soft/keepalived-2.0.16.tar.gz
4、部署keepalived
[root@ctcdb1~]# cd data/soft/keepalived-2.0.16 ./configure --prefix=/ &&make && make install
[root@ctcdb1~]# cp/data/soft/keepalived-2.0.16/keepalived/etc/init.d/keepalived /etc/init.d/
5、配置文件
[root@ctcdb1~]# cat etc/keepalived/keepalived.conf
!Configuration File for keepalived
global_defs{
notification_email{
873387660@qq.com
}
notification_email_from873387660@qq.com
smtp_server127.0.0.1
smtp_connect_timeout30
router_idctcdb1 #主机名
}
vrrp_scriptcheck_mysqld { #检测mysql服务是否在运行。比如进程,用脚本检测等等
script "/etc/keepalived/mysqlcheck/keepalived_check_mysql.sh"
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级-5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
vrrp_instanceVI_1 {
state MASTER #备节点为BACKUP
interface enp0s8 #指定虚拟ip的网卡接口
mcast_src_ip 192.168.2.101 #本机IP
virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的
priority 110 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将vip资源再次抢回来
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.103 #vip
}
track_script{
check_mysqld
}
}
[root@ctcdb1~]# cat etc/keepalived/mysqlcheck/keepalived_check_mysql.sh
#!/bin/bash
counter=$(netstat-na|grep "LISTEN"|grep "3306"|wc -l)
if ["${counter}" -eq 0 ]; then
systemctl stopkeepalived
fi
[root@ctcdb1~]# chmod 755/etc/keepalived/mysqlcheck/keepalived_check_mysql.sh
6、启动keepalived服务
[root@ctcdb1~]# systemctl start keepalived
(MySQL要先于keepalived启动)
三MySQL+keepalived故障转移的高可用测试
1、利用Navicat通过vip连接,看是否连接成功。
(192.168.2.100为Navicat地址)
root@localhost[(none)]>show processlist;
+----+-------------+---------------------+------+------------------+------+---------------------------------------------------------------+-----
| Id |User |Host |db | Command |Time |State |Info
+----+-------------+---------------------+------+------------------+------+---------------------------------------------------------------+-----
| 2| root |localhost |NULL | Query | 0| starting |show processlist |
| 3| system user | |NULL | Connect | 121| Waiting for master to send event |NULL |
| 4| system user | |NULL | Connect | 121| Slave has read all relay log; waiting for more updates |NULL |
| 5| system user | |NULL | Connect | 121| Waiting for an event from Coordinator |NULL |
| 6| system user | |NULL | Connect | 121| Waiting for an event from Coordinator |NULL |
| 7| system user | |NULL | Connect | 121| Waiting for an event from Coordinator |NULL |
| 8| system user | |NULL | Connect | 121| Waiting for an event from Coordinator |NULL |
| 9| repl |192.168.2.102:56970 | NULL | Binlog Dump GTID | 111 |Master has sent all binlog to slave; waiting for more updates |NULL |
| 10 |root |192.168.2.100:59777 | NULL | Sleep | 4| |NULL
+----+-------------+---------------------+------+------------------+------+---------------------------------------------------------------+-----
9 rowsin set (0.00 sec)
2、查看vip
[root@ctcdb1~]# ip a
3:enp0s8:mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:de:5c:48brd ff:ff:ff:ff:ff:ff
inet 192.168.2.101/24brd 192.168.2.255 scope global enp0s8
valid_lft foreverpreferred_lft forever
inet 192.168.2.103/32scope global enp0s8 #这个32位子网掩码的vip地址表示该资源目前还在ctcdb1机器上
valid_lft foreverpreferred_lft forever
inet6 fe80::a00:27ff:fede:5c48/64scope link
valid_lft foreverpreferred_lft forever
[root@ctcdb2~]# ip a
3:enp0s8:mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:ab:4f:cbbrd ff:ff:ff:ff:ff:ff
inet 192.168.2.102/24brd 192.168.2.255 scope global enp0s8
valid_lft foreverpreferred_lft forever
inet6 fe80::a00:27ff:feab:4fcb/64scope link
valid_lft foreverpreferred_lft forever
(2节点未见vip)
3、高可用测试
停止ctcdb1机器上的mysql服务,根据配置中的脚本,mysql服务停了,keepalived也会停,从而vip资源将会切换到ctcdb2机器上。(mysql服务没有起来的时候,keepalived服务也无法顺利启动!)
---------------ctcdb1服务器操作记录---------------
root@localhost[(none)]>shutdown;
QueryOK, 0 rows affected (0.00 sec)
[root@ctcdb1~]# tail -f /var/log/messages
May 2519:46:46 ctcdb1 Keepalived[21086]: Stopping
May 2519:46:46 ctcdb1 systemd: Stopping LVS and VRRP High AvailabilityMonitor...
May 2519:46:46 ctcdb1 Keepalived_vrrp[21088]: (VI_1) sent 0 priority
May 2519:46:46 ctcdb1 Keepalived_vrrp[21088]: (VI_1) removingvips. #移除vip
May 2519:46:46 ctcdb1 avahi-daemon[3160]: Withdrawing address record for192.168.2.103 on enp0s8.
May 2519:46:47 ctcdb1 Keepalived_vrrp[21088]: Stopped - used 0.030909 usertime, 0.042863 system time
May 2519:46:47 ctcdb1 Keepalived[21086]: Stopped Keepalived v2.0.16(05/03,2019), git commit v2.0.15-96-g4d492740+
[root@ctcdb1~]# ip a
3:enp0s8:mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:de:5c:48brd ff:ff:ff:ff:ff:ff
inet 192.168.2.101/24brd 192.168.2.255 scope global enp0s8
valid_lft foreverpreferred_lft forever
inet6 fe80::a00:27ff:fede:5c48/64scope link
valid_lft foreverpreferred_lft forever
---------------ctcdb2服务器操作记录---------------
[root@ctcdb2~]# tail -f /var/log/messages
May 2519:46:46 ctcdb2 Keepalived_vrrp[20346]: (VI_1) Backup receivedpriority 0 advertisement
May 2519:46:46 ctcdb2 Keepalived_vrrp[20346]: (VI_1) Receive advertisementtimeout
May 2519:46:46 ctcdb2 Keepalived_vrrp[20346]: (VI_1) Entering MASTER STATE
May 2519:46:46 ctcdb2 Keepalived_vrrp[20346]: (VI_1) settingvips. #设置vip
May 2519:46:46 ctcdb2 Keepalived_vrrp[20346]: Sending gratuitous ARP onenp0s8 for 192.168.2.103
May 2519:46:46 ctcdb2 Keepalived_vrrp[20346]: (VI_1) Sending/queueinggratuitous ARPs on enp0s8 for 192.168.2.103
May 2519:46:46 ctcdb2 Keepalived_vrrp[20346]: Sending gratuitous ARP onenp0s8 for 192.168.2.103
May 2519:46:46 ctcdb2 Keepalived_vrrp[20346]: Sending gratuitous ARP onenp0s8 for 192.168.2.103
May 2519:46:46 ctcdb2 Keepalived_vrrp[20346]: Sending gratuitous ARP onenp0s8 for 192.168.2.103
May 2519:46:46 ctcdb2 Keepalived_vrrp[20346]: Sending gratuitous ARP onenp0s8 for 192.168.2.103
May 2519:46:46 ctcdb2 avahi-daemon[3149]: Registering new address recordfor 192.168.2.103 on enp0s8.IPv4.
[root@ctcdb2~]# ip a
3:enp0s8:mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:ab:4f:cbbrd ff:ff:ff:ff:ff:ff
inet 192.168.2.102/24brd 192.168.2.255 scope global enp0s8
valid_lft foreverpreferred_lft forever
inet 192.168.2.103/32scope global enp0s8
valid_lft foreverpreferred_lft forever
inet6 fe80::a00:27ff:feab:4fcb/64scope link
valid_lft foreverpreferred_lft forever
root@localhost[(none)]>show processlist;
+----+-------------+---------------------+------+------------------+------+---------------------------------------------------------------+-----
| Id |User |Host |db | Command |Time |State |Info
+----+-------------+---------------------+------+------------------+------+---------------------------------------------------------------+-----
| 4| root |localhost |NULL | Query | 0| starting |show processlist |
| 5| repl |192.168.2.101:38742 | NULL | Binlog Dump GTID | 231 |Master has sent all binlog to slave; waiting for more updates |NULL |
| 6| system user | |NULL | Connect | 221| Reconnecting after a failed master event read |NULL |
| 7| system user | |NULL | Connect | 221| Slave has read all relay log; waiting for more updates |NULL |
| 8| system user | |NULL | Connect | 221| Waiting for an event from Coordinator |NULL |
| 9| system user | |NULL | Connect | 221| Waiting for an event from Coordinator |NULL |
| 10 |system user | |NULL | Connect | 221| Waiting for an event from Coordinator |NULL |
| 11 |system user | |NULL | Connect | 221| Waiting for an event from Coordinator |NULL |
| 12 |root |192.168.2.100:59799 | NULL | Sleep | 4| |NULL
+----+-------------+---------------------+------+------------------+------+---------------------------------------------------------------+-----
9 rowsin set (0.00 sec)
4、回切
将1节点MySQL+keepalived启动即可自动完成切换
四总结本MySQL高可用方案配置简单,对现有MySQL架构无任何影响,也不需要停止数据库服务,完全联机操作即可。有一点需要注意,主从库的端口必须一样。