keepalived高可用集群
Keepalived 高可用集群详解环境:linux 2.6.32-358.el6.x86_64
注意:keepalived实现高可用与之前博客中的提到的corosync和heartbeat服务实现的高可用的配置比起来有不小的不同之处,其中由其需要引起注意的是,keepalived实现对服务的高可用时,不再将服务本身当作资源。因此,服务需要开机启动,或者最起码要在keepalived服务启动之前启动。
一、准备工作(两个节点都要做)
1、时间同步
# ntpdate 时间服务器ip
2、hosts能够互相解析
# vim /etc/hosts 中追加
172.16.5.11 www.a.com a
172.16.5.12 www.b.com b
3、双机互信
# ssh-keygen -t rsa -P ‘’
# ssh-copy-id root@a|b
二、keepalived高可用的实现
1、主配置文件/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost 收件人
root@172.16.5..... 要给谁发,就写上谁的
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 发件人
smtp_connect_timeout 30连接超时时间
router_id LVS_DEVEL路由器标识 LVS_DEVEL 自定义字符串
}
vrrp_instance VI_1 { VI_1自己取名 虚拟冗余路由协议实例
state MASTER初始状态
interface eth0通过哪个接口发送信号
virtual_router_id 51虚拟路由id 不能大于255
priority 100初始优先级
advert_int 1通告数
authentication {明文认证
auth_type PASS
auth_pass 1111最好随机生成密码
}
virtual_ipaddress {
172.16.5.10/16 虚拟ip 默认在网卡eth0上,网卡与interface eth0对应
}
}
2、将其余部分全部注释掉,试验keepalived是否能够实现高可用性。
将配置文件keepalived.conf复制到另一个节点
# scp keepalived.conf b:/etc/keepalived/
在另一个节点中编辑keepalived,主要修改两个地方
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost 收件人
root@172.16.5..... 要给谁发,就写上谁的
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 发件人
smtp_connect_timeout 30连接超时时间
router_id LVS_DEVEL路由器标识 LVS_DEVEL 自定义字符串
}
vrrp_instance VI_1 { VI_1自己取名
state BACKUP初始状态
interface eth0通过哪个接口发送信号
virtual_router_id 51虚拟路由id 不能大于255 如果是在一个教室内做实验记得要改,不然所有人冲突,日志文件中会一直更新。
priority 99 初始优先级
advert_int 1通告数
authentication {明文认证
auth_type PASS
auth_pass 1111最好随机生成密码
}
virtual_ipaddress {
172.16.5.10/16 虚拟ip
}
}
可以一起启动主节点和备用节点,检验两个节点是否能够正常工作。
# tail -f /var/log/messages
# servcie keepalived start
都启动后,可以停掉一个观察另一个的变化
3、我们也可以创建一个脚本,手动生成一个文件,来观察两个节点的变化。
在主节点中配置
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost 收件人
root@172.16.5..... 要给谁发,就写上谁的
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 发件人
smtp_connect_timeout 30连接超时时间
router_id LVS_DEVEL路由器标识 LVS_DEVEL 自定义字符串
}
vrrp_script chk_mantaince_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -2
}
vrrp_instance VI_1 { VI_1自己取名 实例
state MASTER初始状态
interface eth0通过哪个接口发送信号
virtual_router_id 51虚拟路由id 不能大于255
priority 100初始优先级
advert_int 1通告数
authentication {明文认证
auth_type PASS
auth_pass 1111最好随机生成密码
}
virtual_ipaddress {
172.16.5.10/16 虚拟ip 默认在网卡eth0上,网卡与interface eth0对应
}
Track_script {
chk_mantaince_down
}
}
从节点中同样加上这些配置,然后在各自的/etc/keepalived目录下创建down文件观察两个节点的变化。
# tail -f /var/log/messages
# touch /etc/keepalived/down
4、实现状态转换时通知其他节点
需要通过脚本来实现
# vim /etc/keepalived/notify.sh
#!/bin/bash
# Author: qiufengsong
# description: An example of notify script
#
vip=172.16.100.1
contact='root@localhost'
notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
;;
Esac
Master:主
Backup:从
Fault:故障
1
2
# chmod +x notify.sh
# vim keepalived.conf
在instance中插入通知的命令
vrrp_instance VI_1 { VI_1自己取名 实例
state MASTER初始状态
interface eth0通过哪个接口发送信号
virtual_router_id 51虚拟路由id 不能大于255
priority 100初始优先级
advert_int 1通告数
authentication {明文认证
auth_type PASS
auth_pass 1111最好随机生成密码
}
virtual_ipaddress {
172.16.5.10/16 虚拟ip 默认在网卡eth0上,网卡与interface eth0对应
}
Track_script {
chk_mantaince_down
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
在通过之前脚本,创建down文件,让节点down掉,删除down文件,让节点重新上限,就会发现有邮件通知了。
三、实现负载均衡
1、如何定义负载均衡。
virtual_server 172.16.5.200 80 {
delay_loop 6
lb_algo rr loadbalance 负载均衡算法
lb_kind NAT 类型
nat_mask 255.255.255.0 掩码
persistence_timeout 50 持久连接时间
protocol TCP
#sorry_server 192.168.200.200 1358 提供一个表示歉意的页面
real_server 192.168.201.100 443 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc 获取结果的校验码
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3连接超时时间
nb_get_retry 3尝试次数
delay_before_retry 3每次尝试连接的等待时间
}
}
}
2、实例验证lvs负载均衡
2.1编辑配置文件/etc/keepalived/keepalived.conf,加入realserver
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_mantaince_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1000
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth2
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.5.10 dev eth2
}
track_script {
chk_mantaince_down
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 172.16.5.10 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.0.0
persistence_timeout 0
protocol TCP
real_server 172.16.5.13 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
需要多少个realserer就在后边定义多少个
2.2将改变同步到另一个节点。
重启服务keepalived后,使用ipvsadm命令会发现规则已经生效。
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP172.16.5.10:80 rr
-> 172.16.5.13:80 Route 1 0 0
此时,只有一个被负载的节点,即realserver,要想使用更多,自行添加,本人由于个人电脑内存限制,就不再添加虚拟设备了。
6.3由于keepalived不需要配置规则,所以只需要配置lvs负载均衡的其他过程即可。上边我们在配置文件中使用的是DR模型,所以接下来的配置如下。
在keepalived服务器上的配置都是两个节点都必须的,下边只在一台上边做演示。在虚拟ip所在的节点上添加一个ip,以便能使它与realserver通信。
#ifconfig eth2:0 192.168.1.11/24 up
# route add default gw 192.168.1.254
#sysctl -w net.ipv4.ip_forward=1
在realserver上配置如下
#ifconfig lo:0 172.16.5.10 broadcast 172.16.5.10 netmask 255.255.255.255 up
#route add -host 172.16.5.11 dev lo:0
#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
重启realserver上的web服务和keepalived主节点的keepalived服务,就可以使用虚拟IP访问realserver主机了。
Realserver
# service httpd restart
Keepalived
# service keepalived resart
Lvs负载均衡可以在随意加入其他节点,请自行验证。
然而,lvs虽然能够实现负载均衡,去无法实现动静分离,这时就需要用到nginx或者
haproxy。
四、对nginx实现高可用
将之前配置的负载均衡内容删除
4.1 在两个节点同时安装nginx
1
# yum -y install nginx
4.2 两个节点上提供一个web页面
# vim /usr/share/nginx/html/index.html
Abc
# vim /usr/share/nginx/html/index.html
Cba
4.3修改notify.sh
#!/bin/bash
# Author: qiufengsong
# description: An example of notify script
#
vip=172.16.100.1
contact='root@localhost'
notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
/etc/rc.d/init.d/nginx start
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/nginx stop
exit 0
;;
fault)
notify fault
/etc/rc.d/init.d/nginx stop
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
;;
Esac
即在通知的时候启动或者停止nginx服务,将修改同步到另一个节点,重启服务。
在/etc/keepalived/目录下通过touch down文件做检测,看看服务会不会转移。
# touch down
# ip addr 发现vip已经消失
在另一个节点
# ip addr 发现vip出现,而且原先没有启动nginx服务的该节点,80端口也开启了。
# ss -an 发现80 端口
4.4然而,当我们kill掉一个节点上的nginx服务时,发现另一个节点上的nginx服务并没有启动,这是为什么呢,vip没有转移,也就是没有实现高可用。
原因如下:
Keepalived服务在工作时,是如何实现资源转移的,它跟heartbeat、corosync的区别在于,heartbeat和corosync的资源转移是通过我们所谓的心跳连接实现的,心跳连接的机制是通过组播发送信息,让集群里的各个成员能够收到相互之间存活与否的信息,keepalived则是通过虚拟冗余路由协议vrrp监控一个资源,然后将节点的优先级改变(降级或升级)来实现资源vip的转移。
而我们上面所做的操作,并没有实现节点优先级的改变,所以,必须定义监控服务本身,来让节点的优先级发生改变,才能实现资源转移的时候一并启动或者关闭nginx服务。
4.5 监控服务本身,实现服务高可用。针对nginx服务,两个节点都需要配置.
外部脚本,/etc/keepalived/chk_nginx.sh
#!/bin/bash
killall -0 nginx&> /dev/null 判断nginx服务是否在线
if [ $? -eq 1 ];then如果不在线
/etc/init.d/nginx start启动服务
sleep 3隔三秒
killall -0 nginx &> /dev/null 再次检查nginx是否在线
if [ $? -eq 1 ];then依旧不在线
killall keepalived kill掉该节点keepalived服务注意,在这里用降低优先级无法实现。
fi
fi
内部配置,增加
Vrrp_script chk_nginx {
Script “/etc/keepalived/chk_nginx.sh”
Interval 1
}
Track_script {
Chk-nginx
}
针对服务的故障转移,这种方式看似还不是很完善,等我得到更好的解决办法,会做出补充。
五、双主模型
两个节点上分别配置
节点172.16.5.11 /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 5
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.5.10 dev eth0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 6
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 21111
}
virtual_ipaddress {
172.16.5.200 dev eth0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
查看虚拟ip
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:bc:60:18 brd ff:ff:ff:ff:ff:ff
inet 172.16.5.11/16 brd 172.16.255.255 scope global eth0
inet 172.16.5.10/32 scope global eth0
inet6 fe80::20c:29ff:febc:6018/64 scope link
节点172.16.5.12 /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 5
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.5.10 dev eth0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 6
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 21111
}
virtual_ipaddress {
172.16.5.200 dev eth0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
查看虚拟ip
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:20:c7:a4 brd ff:ff:ff:ff:ff:ff
inet 172.16.5.12/16 brd 172.16.255.255 scope global eth0
inet 172.16.5.200/32 scope global eth0
inet6 fe80::20c:29ff:fe20:c7a4/64 scope link
valid_lft forever preferred_lft forever
我妈常说,我们家要是没有电话就不会这么穷。 男人靠的住,母猪能上树! 比我有才的都没我帅,比我帅的都没我有才! 学习了,不错,讲的太有道理了 有竞争才有进步嘛 昨天,系花对我笑了一下,乐得我晚上直数羊,一只羊,两只羊,三只羊……
页:
[1]