Mysql+Keepalived双主热备高可用
[TOC]
一:MySQL+keepalived介绍
1.1:简介
我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。下面说下Mysql+keeoalived双主热备高可用方案的实施。
Keepalived看名字就知道,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导整个系统架构的不可用)的发生,那说到keepalived不得不说的一个协议不是VRRP协议,可以说这个协议就是keepalived实现的基础。
1)Keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。在VRRP中有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。
2)VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。Vrrp中存在着一种选举机制,用以选出提供服务的路由即主控路由,其他的则成了备份路由。当主控路由失效后,备份路由中会重新选举出一个主控路由,来继续工作,来保障不间断服务。
更多的keepalived自行参考百度。
1)先实施Master->Slave的主主同步。主主是数据双向同步,主从是数据单向同步。一般情况下,主库宕机后,需要手动将连接切换到从库上。(但是用keepalived就可以自动切换)
2)再结合Keepalived的使用,通过VIP实现Mysql双主对外连接的统一接口。即客户端通过Vip连接数据库;当其中一台宕机后,VIP会漂移到另一台上,这个过程对于客户端来说几乎无感知,从而实现高可用。
1.2:环境描述:
centos7.4版本
keepalived-mysql-1 192.168.19.17 安装mysql和keepalived
keepalived-mysql-2 192.168.19.18 安装mysql和keepalived
vip:192.168.19.50
实现MySQL主主同步注意下面几点:
1)要保证同步服务期间之间的网络联通。即能相互ping通,能使用对方授权信息连接到对方数据库(防火墙开放3306端口)。
2)关闭selinux。
3)同步前,双方数据库中需要同步的数据要保持一致。这样,同步环境实现后,再次更新的数据就会如期同步了。
二:Mysql主主同步环境部署并测试insert是否能够同步
1.1:keepalived-mysql-1操作记录(创建数据库、建表、插入数据、修改my.cnf配置文件)
[root@keepalived-mysql-1 ~]# mysql -uroot -p123456
mysql> create database test;
mysql> use test
mysql> insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
mysql> select * from emp;
+-------+-------+-------+------+---------------------+--------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+-------+-------+------+---------------------+--------+------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
+-------+-------+-------+------+---------------------+--------+------+--------+
[root@keepalived-mysql-1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data/
socket=/tmp/mysql.sock
log-bin=mysql-bin-master
server-id=1
binlog-do-db=test
binlog-ignore-db=mysql
[mysqld_safe]
log-error=/usr/local/mysql/log/err.log
pid-file=/usr/local/mysql/data/mysql.pid
[root@keepalived-mysql-1 ~]# /etc/init.d/mysqld stop
[root@keepalived-mysql-1 ~]# /etc/init.d/mysqld start
1.2:keepalived-mysql-2操作(创建数据库、建表、插入数据、修改my.cnf配置文件)
[root@keepalived-mysql-2 ~]# mysql -uroot -p123456
mysql> create database test;
mysql> use test
mysql> insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
mysql> select * from emp;
+-------+-------+-------+------+---------------------+--------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+-------+-------+------+---------------------+--------+------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
+-------+-------+-------+------+---------------------+--------+------+--------+
[root@keepalived-mysql-2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data/
socket=/tmp/mysql.sock
log-bin=mysql-bin-slave
server-id=2
binlog-do-db=test
binlog-ignore-db=mysql
[mysqld_safe]
log-error=/usr/local/mysql/log/err.log
pid-file=/usr/local/mysql/data/mysql.pid
[root@keepalived-mysql-2 ~]# /etc/init.d/mysqld stop
[root@keepalived-mysql-2 ~]# /etc/init.d/mysqld start
1.3:keepalived-mysql-1做同步操作(授权192.168.19.18能够访问数据库、查看log bin日志和pos值位置给192.168.19.17change master使用)
[root@keepalived-mysql-1 ~]# mysql -uroot -p123456
mysql> show master status;
+-------------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| mysql-bin-master.000001 | 602 | test | mysql | |
+-------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> grant replication slave on *.* to slave@192.168.19.18 identified by "123456";
mysql> flush privileges;
mysql> stop slave;
mysql> change master to master_host='192.168.19.18',master_port=3306,master_user='slave',master_password='123456',master_log_file='mysql-bin-slave.000001',master_log_pos=602;
mysql> start slave;
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
1.4:keepalived-mysql-2做同步操作(授权192.168.19.17能够访问数据库、查看log bin日志和pos值位置给192.168.19.18change master使用)
[root@keepalived-mysql-2 ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to slave@192.168.19.17 identified by "123456";
mysql> flush privileges;
mysql> show master status;
+------------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------------+----------+--------------+------------------+-------------------+
| mysql-bin-slave.000001 | 602 | test | mysql | |
+------------------------+----------+--------------+------------------+-------------------+
mysql> stop slave;
mysql> change master to master_host='192.168.19.17',master_port=3306,master_user='slave',master_password='123456',master_log_file='mysql-bin-master.000001',master_log_pos=602;
mysql> start slave;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这样,keepalived-mysql-1就和keepalived-mysql-2实现了主从同步,即keepalived-mysql-2也同步keepalived-mysql-1的数据。
以上表明双方已经实现了mysql主主同步。
当运行一段时间后,要是发现同步有问题,比如只能单向同步,双向同步失效。可以重新执行下上面的change master同步操作,只不过这样同步后,只能同步在此之后的更新数据。下面开始进行数据验证:
1.5:insert插入测试
--keepalived-mysql-1数据库插入数据测试
mysql> insert into emp values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
--keepalived-mysql-2数据库插入数据测试
mysql> insert into emp values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
三:配置Mysql+Keepalived故障转移的高可用环境
3.1:安装keepalived并将其配置成系统服务。root@keepalived-mysql-1和root@keepalived-mysql-2两台机器上同样进行如下操作:
[root@keepalived-mysql-1 ~]# yum install -y keepalived ipvsadm
[root@keepalived-mysql-2 ~]# yum install -y keepalived ipvsadm
3.2:keepalived-mysql-1机器上的keepalived.conf配置。(下面配置中没有使用lvs的负载均衡功能,所以不需要配置虚拟服务器virtual server)
[root@keepalived-mysql-1 ~]# vim /etc/keepalived/keepalived.conf #清空默认内容,直接采用下面配置
! Configuration File for keepalived
global_defs {
notification_email {
ops@wangshibo.cn
tech@wangshibo.cn
}
notification_email_from ops@wangshibo.cn
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MASTER-HA
}
vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
script "/opt/chk_mysql.sh" #这里通过脚本监测
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
state MASTER
interface ens33 #指定虚拟ip的网卡接口
mcast_src_ip 192.168.19.17
virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的
priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.19.50
}
track_script {
chk_mysql_port
}
}
3.3:编写切换脚本。KeepAlived做心跳检测,如果Master的MySQL服务挂了(3306端口挂了),那么它就会选择自杀。keepalived-mysql-2的KeepAlived通过心跳检测发现这个情况,就会将VIP的请求接管。
[root@keepalived-mysql-1 ~]# vim /opt/chk_mysql.sh
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl stop keepalived
fi
3.4:授权、启动
[root@keepalived-mysql-1 ~]# chmod 755 /opt/chk_mysql.sh
[root@keepalived-mysql-1 ~]# systemctl start keepalived
[root@keepalived-mysql-1 ~]# systemctl status keepalived
3.5:keepalived-mysql-1机器上的keepalived.conf配置。(下面配置中没有使用lvs的负载均衡功能,所以不需要配置虚拟服务器virtual server)
[root@keepalived-mysql-1 ~]# scp -r /etc/keepalived/keepalived.conf 192.168.19.18:/etc/keepalived/keepalived.conf
[root@keepalived-mysql-2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
18810779260@163.com
}
notification_email_from 18810779260@163.com
smtp_server localhost
smtp_connect_timeout 30
router_id SLAVE-HA
}
vrrp_script chk_mysql_port {
script "/opt/chk_mysql.sh"
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 192.168.19.18
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.19.50
}
track_script {
chk_mysql_port
}
}
3.6:编写切换脚本
[root@keepalived-mysql-2 ~]# vim /opt/chk_mysql.sh
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl stop keepalived
fi
3.7:授权、启动
[root@keepalived-mysql-2 ~]# chmod 755 /opt/chk_mysql.sh
[root@keepalived-mysql-2 ~]# systemctl start keepalived
[root@keepalived-mysql-2 ~]# systemctl status keepalived
3.8:keepalived-mysql-1和keepalived-mysql-2两台服务器都要授权允许root用户远程登录,用于在客户端登陆测试!
mysql> grant all on *.* to root@'%' identified by "123456";
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
3.9:在master1和master2两台机器上设置iptables防火墙规则,如下:不是必须要做的。centos7请自行查阅一下。
[root@master1 ~]# cat /etc/sysconfig/iptables
........
-A INPUT -s 182.148.15.0/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信
-A INPUT -s 182.148.15.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协)通信
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT #开放mysql的3306端口
[root@master1 ~]# /etc/init.d/iptables restart
四:Mysql + keepalived故障转移的高可用测试
4.1:通过Mysql客户端通过VIP连接,看是否连接成功。
比如,在远程一台测试机上连接,通过vip地址可以正常连接(下面的连接权限要是在服务端提前授权的)
[root@client ~]# mysql -uroot -p123456 -h192.168.19.50
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.18-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> select * from test.emp;
+-------+-------+----------+------+---------------------+---------+--------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+-------+----------+------+---------------------+---------+--------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 |
+-------+-------+----------+------+---------------------+---------+--------+--------+
3 rows in set (0.00 sec)
4.2:默认情况下,vip是在master1上的。使用"ip addr"命令查看vip切换情况
[root@keepalived-mysql-1 ~]# ip a|tail -8
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:09:78:fb brd ff:ff:ff:ff:ff:ff
inet 192.168.19.17/24 brd 192.168.19.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.19.50/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe09:78fb/64 scope link
valid_lft forever preferred_lft forever
停止keepalived-mysql-1机器上的mysql服务,根据配置中的脚本,mysql服务停了,keepalived也会停,从而vip资源将会切换到keepalived-mysql-2机器上。(mysql服务没有起来的时候,keepalived服务也无法顺利启动!)
[root@keepalived-mysql-1 ~]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!
[root@keepalived-mysql-1 ~]# ps -ef|grep mysql
root 27473 19986 0 22:03 pts/1 00:00:00 grep --color=auto mysql
[root@keepalived-mysql-1 ~]# ps -ef|grep keepalived
root 27475 19986 0 22:03 pts/1 00:00:00 grep --color=auto keepalived
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:09:78:fb brd ff:ff:ff:ff:ff:ff
inet 192.168.19.17/24 brd 192.168.19.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe09:78fb/64 scope link
valid_lft forever preferred_lft forever
如上结果,发现vip没有了,说明此时vip资源已不在keepalived-mysql-1机器上了
查看下keepalived-mysql-1的系统日志,如下,会发现vip资源已经切换走了
[root@keepalived-mysql-1 ~]# tail -f /var/log/messages
再到keepalived-mysql-2机器上,发现vip资源的确切换过来了
[root@keepalived-mysql-2 ~]# ip a|tail -8
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d0:2f:38 brd ff:ff:ff:ff:ff:ff
inet 192.168.19.18/24 brd 192.168.19.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.19.50/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed0:2f38/64 scope link
valid_lft forever preferred_lft forever
查看keepalived-mysql-2的日志
[root@keepalived-mysql-2 ~]# tail -f /var/log/messages
Jan 2 22:01:56 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:01:56 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:01:56 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:01:56 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
4.3:再次启动keepalived-mysql-1的mysql和keepalived服务。(注意:如果restart重启mysql,那么还要启动下keepalived,因为mysql重启,根据脚本会造成keepalived关闭)
注意:一定要先启动mysql服务,然后再启动keepalived服务。如果先启动keepalived服务,按照上面的配置,mysql没有起来,就会自动关闭keepalived。
[root@keepalived-mysql-1 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
[root@keepalived-mysql-1 ~]# systemctl start keepalived
[root@keepalived-mysql-1 ~]# systemctl status keepalived|grep active
启动这两个服务器后,稍微等过一会儿,注意观察会发现vip资源再次从keepalived-mysql-2机器上切换回来了。
[root@keepalived-mysql-1 ~]# ip a|tail -8
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:09:78:fb brd ff:ff:ff:ff:ff:ff
inet 192.168.19.17/24 brd 192.168.19.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.19.50/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe09:78fb/64 scope link
valid_lft forever preferred_lft forever
[root@keepalived-mysql-1 ~]# tail -f /var/log/messages
Jan 2 22:08:27 keepalived-mysql-1 Keepalived_vrrp[27717]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:08:27 keepalived-mysql-1 Keepalived_vrrp[27717]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:08:27 keepalived-mysql-1 Keepalived_vrrp[27717]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:08:27 keepalived-mysql-1 Keepalived_vrrp[27717]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:08:32 keepalived-mysql-1 Keepalived_vrrp[27717]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:08:32 keepalived-mysql-1 Keepalived_vrrp[27717]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.19.50
Jan 2 22:08:32 keepalived-mysql-1 Keepalived_vrrp[27717]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:08:32 keepalived-mysql-1 Keepalived_vrrp[27717]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:08:32 keepalived-mysql-1 Keepalived_vrrp[27717]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:08:32 keepalived-mysql-1 Keepalived_vrrp[27717]: Sending gratuitous ARP on ens33 for 192.168.19.50
再看看keepalived-mysql-2机器,发现vip资源又被恢复后的keepalived-mysql-1抢过去了
[root@keepalived-mysql-2 ~]# ip a|tail -6
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d0:2f:38 brd ff:ff:ff:ff:ff:ff
inet 192.168.19.18/24 brd 192.168.19.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed0:2f38/64 scope link
valid_lft forever preferred_lft forever
[root@keepalived-mysql-2 ~]# tail -f /var/log/messages
Jan 2 22:01:56 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:02:01 keepalived-mysql-2 Keepalived_vrrp[10795]: Sending gratuitous ARP on ens33 for 192.168.19.50
Jan 2 22:08:26 keepalived-mysql-2 Keepalived_vrrp[10795]: VRRP_Instance(VI_1) Received advert with higher priority 101, ours 99
Jan 2 22:08:26 keepalived-mysql-2 Keepalived_vrrp[10795]: VRRP_Instance(VI_1) Entering BACKUP STATE
Jan 2 22:08:26 keepalived-mysql-2 Keepalived_vrrp[10795]: VRRP_Instance(VI_1) removing protocol VIPs.
五:总结:
keepalive是基于vrrp协议在linux主机上以守护进程方式,根据配置文件实现健康检查。
VRRP是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的VRRP路由器中的一台。
控制虚拟路由器IP地址的VRRP路由器称为主路由器,它负责转发数据包到这些虚拟IP地址。
一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的IP地址可以作为终端主机的默认第一跳路由器。
keepalive通过组播,单播等方式(自定义),实现keepalive主备推选。工作模式分为抢占和非抢占(通过参数nopreempt来控制)。
1)抢占模式:
主服务正常工作时,虚拟IP会在主上,备不提供服务,当主服务优先级低于备的时候,备会自动抢占虚拟IP,这时,主不提供服务,备提供服务。
也就是说,工作在抢占模式下,不分主备,只管优先级。
如上配置,不管keepalived.conf里的state配置成master还是backup,只看谁的priority优先级高(一般而言,state为MASTER的优先级要高于BACKUP)。
priority优先级高的那一个在故障恢复后,会自动将VIP资源再次抢占回来!!
2)非抢占模式:
这种方式通过参数nopreempt(一般设置在advert_int的那一行下面)来控制。不管priority优先级,只要MASTER机器发生故障,VIP资源就会被切换到BACKUP上。
并且当MASTER机器恢复后,也不会去将VIP资源抢占回来,直至BACKUP机器发生故障时,才能自动切换回来。
千万注意:
nopreempt这个参数只能用于state为backup的情况,所以在配置的时候要把master和backup的state都设置成backup,这样才会实现keepalived的非抢占模式!
也就是说:
a)当state状态一个为master,一个为backup的时候,加不加nopreempt这个参数都是一样的效果。即都是根据priority优先级来决定谁抢占vip资源的,是抢占模式!
b)当state状态都设置成backup,如果不配置nopreempt参数,那么也是看priority优先级决定谁抢占vip资源,即也是抢占模式。
c)当state状态都设置成backup,如果配置nopreempt参数,那么就不会去考虑priority优先级了,是非抢占模式!即只有vip当前所在机器发生故障,另一台机器才能接管vip。即使优先级高的那一台机器恢复 后也不会主动抢回vip,只能等到对方发生故障,才会将vip切回来。