架构介绍
企业级Mysql集群具备高可用、可扩展、易管理、低成本的特点。
Mysql的双主互备架构,主要设计思想是通过Mysql复制技术将两台Mysql服务器互相将对方作为自己的主服务器,自己又同时作为对方的从服务器来进行复制。这样就实现了高可用架构中的数据同步功能,同时,将采用keepalived来实现mysql的自动故障切换。在这个架构中,虽然两台Mysql服务器互为主从,但同一时刻只有一个Mysql服务器可读写,另一个Mysql服务器只能进行读操作,这样可保证数据的一致性。
DB1和DB2互为主从,保证两台Mysql服务器的数据始终是同步的,同时在DB1和DB2上还需要安装高可用软件keepalived。在正常情况下,Web服务器主机仅从DB1进行数据的读写操作,DB2主负责从DB1同步数据。而Keepalived维护一个VIP,此IP用来对外部提供链接服务。同时,keepalived还负责监控DB1和DB2上Mysql数据库的运行状态。当DB1主机出现故障或者Mysql运行异常时,自动将VIP地址和Mysql服务切换到DB2上,此时Web服务器主机继续从DB2进行数据的读写操作。通过Keepalived保持了数据库服务的连续性,整个切换过程非常快,并且对前端Web服务器主机是透明的。
主主互备模式配置
[root@mysql ~]# mysql -p
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.213.127
Master_User: copy
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 2589
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 590
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
[root@mysql-1 ~]# mysql -p
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.213.124
Master_User: copy
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1630
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 1524
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
配置Keepalived实现Mysql双主高可用
安装keepalived
两台服务器上都需要安装
(1)安装软件
[root@mysql ~]# wget https://www.keepalived.org/software/keepalived-2.0.1.tar.gz
[root@mysql ~]# mkdir -p /data/keepalived
[root@mysql ~]# tar -xf keepalived-2.0.1.tar.gz -C /usr/local/src
[root@mysql ~]# yum install openssl-devel gcc gcc-c++ make -y
[root@mysql ~]# cd /usr/local/src/keepalived-2.0.1
[root@mysql keepalived-2.0.1]# ./configure --prefix=/data/keepalived/
[root@mysql keepalived-2.0.1]# echo $?
0
[root@mysql keepalived-2.0.1]# make
[root@mysql keepalived-2.0.1]# echo $?
0
[root@mysql keepalived-2.0.1]# make install
[root@mysql keepalived-2.0.1]# echo $?
0
(2)配置规范启动
[root@bogon etc]# pwd
/usr/local/src/keepalived-2.0.1/keepalived/etc
[root@mysql etc]# pwd
/usr/local/src/keepalived-2.0.1/keepalived/etc
[root@mysql etc]# cp -R init /data/keepalived/
[root@mysql etc]# cp -R init /data/keepalived/etc/
[root@mysql etc]# cp -R init.d /data/keepalived/etc/
[root@mysql etc]# ll /data/keepalived/etc/
total 0
drwxr-xr-x 2 root root 86 Mar 3 20:25 init
drwxr-xr-x 2 root root 135 Mar 3 20:25 init.d
drwxr-xr-x 3 root root 44 Mar 3 20:23 keepalived
drwxr-xr-x 2 root root 24 Mar 3 20:23 sysconfig
[root@mysql etc]# cp /data/keepalived/etc/init.d/keepalived /etc/init.d/
[root@mysql etc]# cp /data/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@mysql etc]# mkdir /etc/keepalived
[root@mysql etc]# cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@mysql etc]# cp /data/keepalived/sbin/keepalived /usr/sbin/
(3)启动
[root@mysql ~]# /etc/init.d/keepalived start
Starting keepalived (via systemctl): [ OK ]
[root@mysql ~]# ps -ef |grep keepalived
root 7935 1 9 20:28 ? 00:00:01 /data/keepalived/sbin/keepalived -D
root 7936 7935 0 20:28 ? 00:00:00 /data/keepalived/sbin/keepalived -D
root 20466 3788 0 20:28 pts/1 00:00:00 grep --color=auto keepalived
root 20490 7935 0 20:28 ? 00:00:00 [keepalived] <defunct>
keepalived配置
keepalived中的两种模式
(1)master->backup模式
一旦主库宕机,虚拟ip会自动漂移到从库,当主库修复后,keepalived启动后,还会把虚拟ip抢占过来,即使设置了非抢占模式(nopreempt)抢占ip的动作也会发生。
(2)backup->backup模式
当主库宕机后虚拟ip会自动漂移到从库上,当原主库恢复和keepalived服务启动后,并不会抢占新主的虚拟ip,即使是优先级高于从库的优先级别,也不会发生抢占。为了减少ip漂移次数,通常是把修复好的主库当做新的备库。
在数据库的应用场景中,不建议数据库的频繁切换,因此,将其配置为keepalived的VIP不抢占模式,具体配置如下:
在mysql上
[root@mysql ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id HA_MYSQL01
}
vrrp_script check_mysqld {
script "/etc/keepalived/check_mysqld.sh"
interval 2
}
vrrp_instance HA_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 150
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.213.233
}
track_script {
check_mysqld
}
}
state BACKUP #在ser01和ser02上均配置为backup
nopreempt #不抢占模式,只在优先级高的机器上设置即可,优先级低的机器上不设置
在mysql-1上
[root@mysql-1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id HA_MYSQL01
}
vrrp_script check_mysqld {
script "/etc/keepalived/check_mysqld.sh"
interval 2
}
vrrp_instance HA_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.213.233
}
track_script {
check_mysqld
}
}
监控脚本
[root@mysql ~]# cat /etc/keepalived/check_mysqld.sh
#!/bin/bash
user=root
pass=Zhao123@com
/usr/local/mysql/bin/mysql -u$user -p$pass -e "show status;" > /dev/null 2>&1
if [ $? -eq 0 ];
then
MYSQL_STATUS=0
else
MYSQL_STATUS=1
fi
exit $MYSQL_STATUS
[root@mysql ~]# chmod +x /etc/keepalived/check_mysqld.sh
Mysql配置账号测试
(1)授权账号
mysql> create user 'keepalived'@'%' identified by 'Cloudbu@123';
mysql> ALTER USER 'keepalived'@'%' IDENTIFIED WITH mysql_native_password BY
'Cloudbu@123';
mysql> flush privileges;
(2)结果测试
在测试节点上用192.168.213.233,即浮动ip测试
[root@configure ~]# mysql -h192.168.213.233 -ukeepalived -pCloudbu@123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
关闭优先级别较高的mysql,VIP会漂移到mysql-1上,客户端连接会显示如下信息,但可重新登录上
[root@configure ~]# mysql -h192.168.213.233 -ukeepalived -pCloudbu@123
mysql> show databases;
ERROR 2013 (HY000): Lost connection to MySQL server during query
[root@configure ~]# mysql -h192.168.213.233 -ukeepalived -pCloudbu@123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
当mysql恢复后,能够实现数据同步,vip并没有漂移回mysql上,而是保持在mysql-1上;当mysql-1故障后,VIP自然漂移到了mysql上
注意事项
1.keepalived默认日志存放在系统日志:/var/log/messages,journalctl -u keepalived
也可查看其日志
2.当2台服务器都设置为BACKUP模式时,先开启keepalived进程的会先绑定VIP,后开启的即使优先级高也不会去抢占,除非先开启的挂掉,即双BACKUP模式下,要先开启优先级高的服务器的keepalived进程