最近在做一个华为的项目中,需要用到 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
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 { [email protected] } notification_email_from [email protected] 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 { [email protected] } notification_email_from [email protected] 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将被公布出去。