零:准备工作
0.2:安装工具软件
yum install curl gcc openssl-devel libnl3-devel net-snmp-devel libnfnetlink-devel -y
0.3:服务器环境
ip | 服务器名称 | 作用 | 备注 |
192.168.122.29 | proxy1 | nginx1.18、keepalived2.1.5 | keepalived 主 |
192.168.122.30 | proxy2 | nginx1.18、keepalived2.1.5 | keepalived 备 |
虚IP:192.168.122.230
一:开始安装
1.0:流程介绍
与nginx的编译并修改配置文件就可以轻松启动不同。
编译安装keepalived的过程较复杂,这里先把流程梳理如下。
解压、编译、修改conf文件、将conf文件和可执行文件置于正确的位置上、修改服务启动文件、配置防火墙。
下面就按照这个顺序来逐个介绍。
1.1:解压:、配置、编译。
将下载的 keepalived-2.1.5.tar.gz 置于 /usr/local/下,操作如下
#解压
[root@proxy1 local]# tar -vxf keepalived-2.1.5.tar.gz
#进入
[root@proxy1 local]# cd keepalived-2.1.5/
#执行配置。其中prefix对应安装后路径, with-run-dir对应进程id路径
[root@proxy1 keepalived-2.1.5]# ./configure --prefix=/usr/local/keepalived --with-run-dir=/usr/local/keepalived/run
#编译安装
[root@proxy1 keepalived-2.1.5]# make & make install
1.2:配置文件
首先演示抢占式策略
以主服务器的配置为例,展示配置文件,如下所示
###########主###########
! Configuration File for keepalived
global_defs {
#这里是主机名称
router_id proxy1
}
vrrp_script chk_nginx {
#执行脚本位置
script "/etc/keepalived/chk_nginx.sh"
#检测时间间隔。除非使用了NTP,否则服务器间时间可能不同步,为避免这个问题,增大检测时间间隔
interval 10
# 如果条件成立则权重减20(-20)
weight -20
}
vrrp_instance VI_1 {
#主
state MASTER
#当前服务器的网卡
interface ens33
# 虚拟路由编号,主从要一致
virtual_router_id 51
# 优先级,数值越大,获取处理请求的优先级越高
priority 100
#本机IP
mcast_src_ip 192.168.122.29
# 检查间隔,默认为1s(vrrp组播周期秒数)
advert_int 1
#授权访问
authentication {
#设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_type PASS
auth_pass 6666
}
#执行脚本
track_script {
chk_nginx
}
# 定义虚拟ip(VIP),可多设,每行一个
virtual_ipaddress {
192.168.122.230
}
}
从的配置略
主与从的区别在于四个地方:
state(角色) router_id(主机名称) mcast_src_ip(当前主机ip) priority(优先级。确保主的数值高于从的即可)
除了抢占式策略,还有一种是非抢占式策略
这种策略下,主从的配置文件的“state”属性不再区分“MASTER和BACKUP”。都使用“BACKUP”。不同的keepalived服务器之间通过priority属性值的大小区分主从,最后一个不同就是在 state BACKUP下一行添加 nopreempt即可,表示“非抢占”。
抢占与非抢占模式的区别在于:
抢占模式在主服务器挂了之后,由从服务器接手“主服务器”角色;当主服务器恢复则主服务器会抢回其“主服务器”的角色。
非抢占式则是当主服务器恢复后,担当从的角色。二者的区别主要在于此。
1.3:启动nginx的脚本
因为我这里与keepalived搭档的是nginx。因此这里抄了一个当nginx停掉的时候,重启nginx的脚本,如下所示。
#chk_nginx.sh脚本的配置
[root@proxy1 keepalived]# vim /etc/keepalived/chk_nginx.sh
#!/bin/bash
A=`ps -C nginx --no-header | grep -v grep | wc -l`
if [ $A -eq 0 ];then
#尝试重新启动nginx
/usr/local/nginx/sbin/nginx
#睡眠2秒
sleep 2
if [ `ps -C nginx --no-header | grep -v grep | wc -l` -eq 0 ];then
#启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
killall keepalived
fi
fi
1.4:配置后操作
#创建存放keepalived.id的路径
[root@proxy1 keepalived-2.1.5]# mkdir /usr/local/keepalived/run
#拷贝配置文件到正确位置。
[root@proxy1 keepalived-2.1.5]# cp -rf /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
#将可执行文件拷贝到目标目录
[root@proxy1 keepalived-2.1.5]# cp -rf /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
#为另一个必要的配置文件设置软连接。
[root@proxy1 keepalived-2.1.5]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
#########################这里请注意######################
#下面这步,dark亲身经历就是:不做应该也能成功,做了反而可能不成功。大家自行决定是否执行
[root@proxy1 keepalived-2.1.5]# cp /usr/local/java/keepalived/keepalived-2.1.5/keepalived/etc/init.d/keepalived /etc/init.d/
1.5:服务启动文件
#修改启动文件
[root@proxy1 keepalived]# vim /usr/lib/systemd/system/keepalived.service
[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target
Wants=network-online.target
[Service]
Type=forking
#pid位置
PIDFile=/usr/local/keepalived/run/keepalived.pid
KillMode=process
#环境变量文件(此文件中其实没啥东西)
EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived
#可执行文件位置
ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
1.6:启动配置
#刷新1.3步骤的配置,使之生效
[root@proxy1 keepalived]# systemctl daemon-reload
#配置开机启动
[root@proxy1 keepalived]# systemctl enable keepalived.service
#常用的一些服务,启停、查看状态
systemctl start keepalived.service
systemctl stop keepalived.service
systemctl restart keepalived.service
systemctl status keepalived.service
1.7:防火墙
因为keepalived是基于vrrp在服务器间互相探测,用以确保与之关联的服务器处于开启状态。故需要对防火墙做一些设置。
如果只是测试环境进行验证,可以将防火墙关闭。
[root@proxy1 keepalived]# systemctl stop firewalld
如果是较正式环境,可以在firewall上打通相应协议,如下所示
[root@proxy1 keepalived]# firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
[root@proxy1 keepalived]# firewall-cmd --reload
1.8:启动
执行 systemctl start keepalived.service 启动keepalived。然后执行 systemctl status keepalived.service 查看状态
主:
从:
通过对比可知,虚ip出现在主服务器的网卡上面。
然后关闭主服务器上的keepalived。会发现虚ip转移到了从服务器上。目的达成。
二:yum安装
yum安装比编译安装要简单很多。相比编译安装,可以省略掉拷贝那些可执行文件的步骤。只需要将配置文件拷贝到对应目录即可。
一个命令搞定 yum install -y keepalived。
三:踩坑
2.1:脑裂问题
最初我没有对firewalld做任何操作,然后结果就是在主从服务器上都看到了192.168.122.230这个虚ip。原因就在于主从两个服务器都不能发现对方。打通网络后重启keepalived,问题解决。
2.2:配置文件
如下图所示
告诉我,/etc/keepalived/keepalived.comf 不是一个常规的可执行文件。查了一下,发现我已经给它和它所属的路径755权限。而事实上这个配置文件只能给644。修改后即可。
2.3:启动失败
开始以为,编译安装并修改conf文件即可。然后发现完全不能正常启动。
后来参考了好多不同版本keepalived的编译安装的文章,大家说的各有不同,感觉更加迷惑。
有的文章中说,需要如下操作
cp /usr/local/java/keepalived/keepalived-2.1.5/keepalived/etc/init.d/keepalived /etc/init.d/
按照人家说的去做,发现依然不能正常启动。。。
然后我以yum方式安装,在conf文件不变的情况下启动keepalived,发现可以正常使用。
对比了两种安装方式的不同,发现还是因为配置文件的位置和keepalived.service文件中的位置不一致导致的启动失败。
最后,才有了本文。
所以,遇到问题的时候,可以通过比较,找到不同,再定位自己问题的真正原因。解决了原因,问题自然被解决了。