keepalived是一个用于做双机热备(HA)的软件,常和haproxy联合起来做热备+负载均衡,达到高可用。
运行原理
keepalived通过选举(看服务器设置的权重)挑选出一台热备服务器做MASTER机器,MASTER机器会被分配到一个指定的虚拟ip,外部程序可通过该ip访问这台服务器,如果这台服务器出现故障
(断网,重启,或者本机器上的keepalived crash等),keepalived会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做MASTER并分配同样的虚拟IP,充当前一台MASTER的角色。
选举策略
选举策略是根据VRRP协议,完全按照权重大小,权重最大(0~255)的是MASTER机器,下面几种情况会触发选举
1. keepalived启动的时候
2. master服务器出现故障(断网,重启,或者本机器上的keepalived crash等,而本机器上其他应用程序crash不算)
3. 有新的备份服务器加入且权重最大
1、全局配置(global configure)
2、VRRPD配置
3、LVS配置
解压安装
tar -zxvf keepalived-1.2.2.tar.gz
cd keepalived-1.2.2
./configure --prefix=/usr/local/keepalived
make
make install
下面这几步不是必须的,但是为了方便以后的操作建议做了
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
为keepalived创建配置文件存放路径
mkdir -p /etc/keepalived/
[root@dg log] cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc // 发生故障时发送的邮箱
}
notification_email_from Alexandre.Cassen@firewall.loc // 使用哪个邮箱发送
smtp_server 192.168.200.1 // 发件服务器
smtp_connect_timeout 30
router_id LVS_DEVEL 标识本节点的字条串,通常为hostname
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state master //设置为主服务器
interface eth0 //设置网络接口
virtual_router_id 51 //主备必须一样
priority 100 //主备机取不同的优先级,主机较大,备机值较小,值越大优先级越高
advert_int 1 //vrrp multicast广播周期秒数
authentication {
auth_type PASS //VRRP认证方式,主备必须一致
auth_pass 1111 //密码
}
virtual_ipaddress {
10.10.6.81
}
}
virtual_server 10.10.6.81 3306 {
delay_loop 6 // 每隔6秒查看realserver状态
lb_algo rr // 调度算法为加权最小连接数
lb_kind DR // 调度算法为加权最小连接数
persistence_timeout 50 // 同一IP 的连接50秒内被分配到同一台realserver
protocol TCP // 用TCP监测realserver的状态
virtual_server 10.10.6.81 3306 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 10.10.6.86 3306 {
TCP_CHECK {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
备库的配置
[root@dg2 ~] cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state backup //主写master 备backup
interface eth0
virtual_router_id 51 //必须和主一致
priority 99 //备必须比主的加权低一点
advert_int 1 // VRRP Multicast 广播周期秒数
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.6.81 //必须和主保持一致
}
}
virtual_server 10.10.6.81 3306 {
delay_loop 6 //每隔6s查看realserver 状态
lb_algo rr // 调度算法为加权最小连接数
lb_kind NAT //调度算法为加权最小连接数, lb_kind NAT 说明是nat方式
persistence_timeout 50 // 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
protocol TCP
virtual_server 10.10.6.81 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 10.10.6.87 3306 {
TCP_CHECK {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
global_defs: 全局配置标识,表面下面的区域{}是全局配置
notification_email: 里面填邮箱地址,如果keepalived在发生诸如切换操作时会的发邮件到配置上的邮箱,邮件地址可以多个,每行一个
notification_email_from:表示发送通知邮件时邮件源地址是谁
smtp_server:表示发送email时使用的smtp服务器地址,可以填127.0.0.1
smtp_connect_timeout:连接smtp超时时间
vrrp_instance:各服务器上实例配置域,这里按本服务器的具体情况填值
state:本实例启动状态,MASTER/SLAVE,不管填MASTER/SLAVE,最终还是要看本机器的权重。
interface:实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,这里按本机情况而定
virtual_router_id:这里设置VRID,如果两台机器是同一个备份组,设置一样
priority:设置本节点的优先级,优先级高的为master,不能超过255
advert_int:组播信息发送间隔,同一个备份组两个机器设置必须一样,默认是1S
authentication:验证域,同组的机器auth_type(验证类型)和auth_pass(验证密码)必须一样
virtual_ipaddress:VIP,为master机器设置的虚拟地址,和实例绑定的网卡(interface)设置到一个网段
配置好了就可以直接启动了
虚拟服务器virtual_server定义块
virtual_server:定义一个虚拟服务器,这个ip是virtual_ipaddress中定义的其中一个,后面一个空格,然后加上虚拟服务的端口号。
1> delay_loop:健康检查时间间隔,单位:秒
2> lb_algo:负载均衡调度算法,互联网应用常用方式为wlc或rr
lvs支持8种不同的调度算法轮叫(rr)、加权轮叫(wrr)、最小连接(lc)、加权最小连接(wlc)、基于局部性最小连接(lblc)、带复制的基于局部性最少链接(lblcr)、目标地址散列(dh)和源地址散列(sh).
3> lb_kind:负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。
4> persistence_timeout:http服务会话保持时间,单位:秒
5> protocol:转发协议,分为TCP和UDP两种
real_server:真实服务器IP和端口,可以定义多个
1> weight:负载权重,值越大,转发的优先级越高
2> notify_down:服务停止后执行的脚本
3> TCP_CHECK:服务有效性检测
* connect_port:服务连接端口
* connect_timeout:服务连接超时时长,单位:秒
* nb_get_retry:服务连接失败重试次数
* delay_before_retry:重试连接间隔,单位:秒
[root@dg keepalived-1.2.24] /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@dg keepalived-1.2.24] /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@dg log]# ps -ef |grep kee
root 2969 1 0 20:25 ? 00:00:00 keepalived -D
root 2970 2969 0 20:25 ? 00:00:00 keepalived -D
root 2971 2969 0 20:25 ? 00:00:00 keepalived -D
[root@dg log]# ip a show|awk '/inet\ /'
inet 127.0.0.1/8 scope host lo
inet 10.10.6.86/24 brd 10.10.6.255 scope global eth0
inet 10.10.6.81/32 scope global eth0
[root@dg2 ~]# ip a show|awk '/inet\ /'
inet 127.0.0.1/8 scope host lo
inet 10.10.6.87/24 brd 10.10.6.255 scope global eth0
---主的keepalived关闭,可以发现ip地址飘到从主机上,主的上面开启keepalived打开,会飘回到主的主机上
service keepalived stop
可是在mysql停止后,主库的keepalived 也会down 了,主库的vip 飘到备库上了,
但是当主库mysql 恢复后,主库的keepalived不会恢复,所以vip也不会飘到主库上,只有重启主库上的keepalived
注意:
上面两台服务器的keepalived都设置为了BACKUP模式,在keepalived中2种模式,分别是master->backup模式和backup->backup模式。
这两种模式有很大区别。在master->backup模式下,一旦主库宕机,虚拟ip会自动漂移到从库,当主库修复后,keepalived启动后,
还会把虚拟ip抢占过来,即使设置了非抢占模式(nopreempt)抢占ip的动作也会发生。在backup->backup模式下,当主库宕机后虚
拟ip会自动漂移到从库上,当原主库恢复和keepalived服务启动后,并不会抢占新主的虚拟ip,即使是优先级高于从库的优先级别,
也不会发生抢占。为了减少ip漂移次数,通常是把修复好的主库当做新的备库。
运行原理
keepalived通过选举(看服务器设置的权重)挑选出一台热备服务器做MASTER机器,MASTER机器会被分配到一个指定的虚拟ip,外部程序可通过该ip访问这台服务器,如果这台服务器出现故障
(断网,重启,或者本机器上的keepalived crash等),keepalived会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做MASTER并分配同样的虚拟IP,充当前一台MASTER的角色。
选举策略
选举策略是根据VRRP协议,完全按照权重大小,权重最大(0~255)的是MASTER机器,下面几种情况会触发选举
1. keepalived启动的时候
2. master服务器出现故障(断网,重启,或者本机器上的keepalived crash等,而本机器上其他应用程序crash不算)
3. 有新的备份服务器加入且权重最大
1、全局配置(global configure)
2、VRRPD配置
3、LVS配置
解压安装
tar -zxvf keepalived-1.2.2.tar.gz
cd keepalived-1.2.2
./configure --prefix=/usr/local/keepalived
make
make install
下面这几步不是必须的,但是为了方便以后的操作建议做了
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
为keepalived创建配置文件存放路径
mkdir -p /etc/keepalived/
vi /etc/keepalived/keepalived.conf
修改配置文件
[root@dg log] cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc // 发生故障时发送的邮箱
}
notification_email_from Alexandre.Cassen@firewall.loc // 使用哪个邮箱发送
smtp_server 192.168.200.1 // 发件服务器
smtp_connect_timeout 30
router_id LVS_DEVEL 标识本节点的字条串,通常为hostname
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state master //设置为主服务器
interface eth0 //设置网络接口
virtual_router_id 51 //主备必须一样
priority 100 //主备机取不同的优先级,主机较大,备机值较小,值越大优先级越高
advert_int 1 //vrrp multicast广播周期秒数
authentication {
auth_type PASS //VRRP认证方式,主备必须一致
auth_pass 1111 //密码
}
virtual_ipaddress {
10.10.6.81
}
}
virtual_server 10.10.6.81 3306 {
delay_loop 6 // 每隔6秒查看realserver状态
lb_algo rr // 调度算法为加权最小连接数
lb_kind DR // 调度算法为加权最小连接数
persistence_timeout 50 // 同一IP 的连接50秒内被分配到同一台realserver
protocol TCP // 用TCP监测realserver的状态
virtual_server 10.10.6.81 3306 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 10.10.6.86 3306 {
TCP_CHECK {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
备库的配置
[root@dg2 ~] cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state backup //主写master 备backup
interface eth0
virtual_router_id 51 //必须和主一致
priority 99 //备必须比主的加权低一点
advert_int 1 // VRRP Multicast 广播周期秒数
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.6.81 //必须和主保持一致
}
}
virtual_server 10.10.6.81 3306 {
delay_loop 6 //每隔6s查看realserver 状态
lb_algo rr // 调度算法为加权最小连接数
lb_kind NAT //调度算法为加权最小连接数, lb_kind NAT 说明是nat方式
persistence_timeout 50 // 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
protocol TCP
virtual_server 10.10.6.81 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 10.10.6.87 3306 {
TCP_CHECK {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
global_defs: 全局配置标识,表面下面的区域{}是全局配置
notification_email: 里面填邮箱地址,如果keepalived在发生诸如切换操作时会的发邮件到配置上的邮箱,邮件地址可以多个,每行一个
notification_email_from:表示发送通知邮件时邮件源地址是谁
smtp_server:表示发送email时使用的smtp服务器地址,可以填127.0.0.1
smtp_connect_timeout:连接smtp超时时间
vrrp_instance:各服务器上实例配置域,这里按本服务器的具体情况填值
state:本实例启动状态,MASTER/SLAVE,不管填MASTER/SLAVE,最终还是要看本机器的权重。
interface:实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,这里按本机情况而定
virtual_router_id:这里设置VRID,如果两台机器是同一个备份组,设置一样
priority:设置本节点的优先级,优先级高的为master,不能超过255
advert_int:组播信息发送间隔,同一个备份组两个机器设置必须一样,默认是1S
authentication:验证域,同组的机器auth_type(验证类型)和auth_pass(验证密码)必须一样
virtual_ipaddress:VIP,为master机器设置的虚拟地址,和实例绑定的网卡(interface)设置到一个网段
配置好了就可以直接启动了
虚拟服务器virtual_server定义块
virtual_server:定义一个虚拟服务器,这个ip是virtual_ipaddress中定义的其中一个,后面一个空格,然后加上虚拟服务的端口号。
1> delay_loop:健康检查时间间隔,单位:秒
2> lb_algo:负载均衡调度算法,互联网应用常用方式为wlc或rr
lvs支持8种不同的调度算法轮叫(rr)、加权轮叫(wrr)、最小连接(lc)、加权最小连接(wlc)、基于局部性最小连接(lblc)、带复制的基于局部性最少链接(lblcr)、目标地址散列(dh)和源地址散列(sh).
3> lb_kind:负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。
4> persistence_timeout:http服务会话保持时间,单位:秒
5> protocol:转发协议,分为TCP和UDP两种
real_server:真实服务器IP和端口,可以定义多个
1> weight:负载权重,值越大,转发的优先级越高
2> notify_down:服务停止后执行的脚本
3> TCP_CHECK:服务有效性检测
* connect_port:服务连接端口
* connect_timeout:服务连接超时时长,单位:秒
* nb_get_retry:服务连接失败重试次数
* delay_before_retry:重试连接间隔,单位:秒
[root@dg keepalived-1.2.24] /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@dg keepalived-1.2.24] /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@dg log]# ps -ef |grep kee
root 2969 1 0 20:25 ? 00:00:00 keepalived -D
root 2970 2969 0 20:25 ? 00:00:00 keepalived -D
root 2971 2969 0 20:25 ? 00:00:00 keepalived -D
[root@dg log]# ip a show|awk '/inet\ /'
inet 127.0.0.1/8 scope host lo
inet 10.10.6.86/24 brd 10.10.6.255 scope global eth0
inet 10.10.6.81/32 scope global eth0
[root@dg2 ~]# ip a show|awk '/inet\ /'
inet 127.0.0.1/8 scope host lo
inet 10.10.6.87/24 brd 10.10.6.255 scope global eth0
---主的keepalived关闭,可以发现ip地址飘到从主机上,主的上面开启keepalived打开,会飘回到主的主机上
service keepalived stop
可是在mysql停止后,主库的keepalived 也会down 了,主库的vip 飘到备库上了,
但是当主库mysql 恢复后,主库的keepalived不会恢复,所以vip也不会飘到主库上,只有重启主库上的keepalived
注意:
上面两台服务器的keepalived都设置为了BACKUP模式,在keepalived中2种模式,分别是master->backup模式和backup->backup模式。
这两种模式有很大区别。在master->backup模式下,一旦主库宕机,虚拟ip会自动漂移到从库,当主库修复后,keepalived启动后,
还会把虚拟ip抢占过来,即使设置了非抢占模式(nopreempt)抢占ip的动作也会发生。在backup->backup模式下,当主库宕机后虚
拟ip会自动漂移到从库上,当原主库恢复和keepalived服务启动后,并不会抢占新主的虚拟ip,即使是优先级高于从库的优先级别,
也不会发生抢占。为了减少ip漂移次数,通常是把修复好的主库当做新的备库。