最近在做一个华为的项目中,需要用到 keepalived。按我的理解,这keepalived 就是让多个机器相互竞争一个虚拟IP。这个虚拟IP是用来对外提供服务的。当然说竞争有点不妥,应该是协作,同一时间只有一个服务器提供服务,当这个服务挂掉以后,备用的服务器顶上来提供服务。
下面备忘一下 keepalived的安装和配置。
首先需要2个机器。分别假设是A和B
安装:
1、先检测依赖的程序: openssl 、openssl-devel 、gcc 、 kernel-devel 这几个我也是从网上看的,不确定如果其中一个不安装的话,有问题吗。
查看是否安装: yum list installed openssl/XXX/XXX
安装:先查找名称:yum search openssl-devel ,列出来以后就安装: yum install <soft_name> -y
2、获取程序:到网上下载或者wget下来都行。我下载以后是个安装包,解压
如解压后目录是: /home/mm/keepalived/
进入此目录,执行 ./configure --prefix=/usr/local/keepalived
然后执行: make && make install
安装完了,然后把一些配置和程序拷贝到对应 的默认目录:
cp /usr/local/keepalived/etc/keepalived /etc/ -r
cp /usr/local/keepalived/etc/rc.d/keepalived /etc/rc.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
然后修改文件:vi /etc/sysconfig/keepalived
将KEEPALIVED_OPTIONS="-D"
修改为:
KEEPALIVED_OPTIONS="-D -f /etc/keepalived/keepalived.conf"
-f 用于指定配置文件。其实我写此文比较急促,很多冗余的地方,有些操作可能是没必要的。
两个机器都安装上面的操作。
然后就是配置文件:(严重注意:配置文件中 { 前面必须要有空格)
A机器(主机):vi /etc/keepalived/keepalived.conf
======================================
global_defs {
notification_email {
aaaafd@mapsd.com
}
notification_email_from aaaafd@mapsd.com
smtp_server 127.0.0.1
stmp_connect_timeout 30
router_id lnmp_node1
}
vrrp_script check_1 {
script "/tmp/check.sh"
interval 1 # 每1秒进行一次检测
weight -20 # 如果检测失败,那么将instance 的 priority (优先级)减去20.如此有用的地方是:如果双方都是backup,那么谁优先级高,谁拥有虚拟ip
}
vrrp_instance lnmp {
state MASTER # 这里是表示这个是主机,其他备机则是 BACKUP
interface eth0
virtual_router_id 100 #这个所有机器的配置都一样,作用类似于radio 的name
priority 150 #这是优先级,大的优先级高,当有2个备用机的时候大的先启用
advert_int 5
track_interface { #这是额外的检测网卡,如果这2个网卡出现故障,则抹掉自己的虚拟ip
eth0
eth1
}
track_script {
check_1 #上面申明的track脚本的名字
}
authentication { # 这个校验都保持一致
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.18.205/16 # 这里是指定虚拟IP,可以是多个
}
}
B机器(备机)vi /etc/keepalived/keepalived.conf
==============================================
global_defs {
notification_email {
aaaafd@mapsd.com
}
notification_email_from aaaafd@mapsd.com
smtp_server 127.0.0.1
stmp_connect_timeout 30
router_id lnmp_node1
}
vrrp_script check_1 {
script "/tmp/check.sh"
interval 1 # 每1秒进行一次检测
weight -20 # 如果检测失败,那么将instance 的 priority (优先级)减去20.如此有用的地方是:如果双方都是backup,那么谁优先级高,谁拥有虚拟ip
}
vrrp_instance lnmp {
state BACKUP
interface eth0
virtual_router_id 100 #这个所有机器的配置都一样,作用类似于radio 的name
priority 150 #这是优先级,大的优先级高,当有2个备用机的时候大的先启用
advert_int 5
track_interface { #这是额外的检测网卡,如果这2个网卡出现故障,则抹掉自己的虚拟ip
eth0
eth1
}
track_script {
check_1
}
authentication { # 这个校验都保持一致
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.18.205/16 # 这里是指定虚拟IP,可以是多个 ,16是掩码长度
}
}
检测脚本:/tmp/check.sh 的内容如下
#!/bin/sh
c=`service iptables status |grep 'is not running'|wc -l`
if [ $c = '0' ]; then
exit 0
else
exit 1
fi
我这里是简单的来检测iptables 服务是否启动来作为测试。
检测脚本需要通过exit 0或者1 的方式来表明检测结果,0表示正常,1表示失败。
另外通过这样执行: /tmp/check.sh && echo 'ok' || echo 'failed' 也可以看到0 和1 的效果。即1表示命令执行失败了。
看日志是 tail -fn 1000 /var/log/messages 这个文件
启动服务可以这样: service keepalived start ,A B都启动。
另外可以用 nc -l 999 来监听本机的 任意端口,然后用任意的机器去telnet 它,tenet 192.168.18.205 999 即可知道 这个虚拟IP 被谁占用了。
上面的虚拟ip 指定的是 192.168.18.205 ,启动 keepalvied 之后,可以通过命令: ip addr 来看,可以发现,正常情况下, 主服务器的 eth0 网卡将拥有该虚拟ip 。
keepalive貌似可以附带着 lvs一块安装。keepalived 的作用是主从切换,通过虚拟ip争夺的方式。应用场景是许多群集环境都是单一入口,比如一个 前端 lvs 或者 nginx 来做分发,但是lvs 或者 nginx 自身如果出现了问题,那么就歇菜了,这就是单一入口的坏处,应该多个lvs或者nginx来提供分发服务。但是对外的ip必须是唯一的,那么就可以通过keepalived来检测lvs或者nginx服务正常情况,来切换虚拟ip,将虚拟ip提供给服务正常者。虚拟ip将被公布出去。