Linux实战之MySQL数据库——keepalived实现mysql双主架构

架构介绍

企业级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进程

发布了57 篇原创文章 · 获赞 32 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42049496/article/details/104640188