Keepalive入门
安装keepalived
将下载后的keepalived的tar包上传至你的服务器上
然后解压,解压后的是源码包,需要我们编译和安装
tar -zxvf keepalived-2.0.18.tar.gz
进入源码包中,进行配置
./configure --prefix=/usr/local/keepalived --sysconf=/etc
- prefix: keepalived安装的位置
- sysconf: keepalived核心配置文件所在的位置,固定路径,改成其他路径 keepalived启动不了,/var/log/message中会报错
ps:配置过程中可能会出现警告信息,如下
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
需要安装libnl/libnl-3依赖
yum -y install libnl libnl-devel
然后重新configure就可以了,接着安装
make && make install
完成后,在/usr/local/keepalived上就是启动目录,而/etc/keepalived就是配置文件的目录
配置Keepalived 主
针对master状态的Nginx,在这台机器上配置keepalived。
编辑/etc/keepalived/keepalived.conf这个文件,文件中有些内容是不需要的,下面是主要的参数例子
global_defs {
# 路由id:当前安装keepalived的节点主机识别符,要保证全局唯一,所有keepalived的都要不同
router_id keep_171
}
vrrp_instance VI_1 {
# 表示状态是MASTER主机还是备用机BACKUP
state MASTER
# 给示例绑定的网卡,可以使用ifconfig来查看
interface ens33
# 保证主备节点一致即可
virtual_router_id 51
# 权重,master权重一般高于backup,如果是多个,就谁的权重大谁线上
priority 100
# 主备之间同步
advert_int 2
# 认证权限密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟出来的ip,可以有多个
virtual_ipaddress {
192.168.1.161
}
}
启动keepalived
/usr/local/keepalived/sbin/keepalived
这个时候你在使用ifconfig查看就会看到你的ens33网卡下多了一个ip地址
将keepalived注册 成系统服务
进入keepalived解压后的源码包中的keepalived/etc/,里面有两个子目录
init.d和sysconfig,执行下面的命令
cp init.d/keepalived /etc/init.d
cp sysconfig/keepalived /etc/sysconfig
# 重新配置系统服务
systemctl daemon-reload
# 启动keepalived服务
systemctl start keepalived.service
配置Keepalived 备
同样将keepalived的tar包上传到配用nginx所在的节点,解压安装步骤同上
进入到keepalived.conf配置文件
global_defs {
router_id keep_172
}
vrrp_instance VI_1 {
# 备用机设置为BACKUP
state BACKUP
interface ens33
virtual_router_id 51
# 权重低于MASTER
priority 80
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# 注意:主备两台的vip都是一样的,绑定到同一个vip
192.168.1.161
}
}
启动keepalived后,使用ifconfig查看,这时这台backup的机器上网卡下还不会多出一个192.168.1.161的ip,当master的机器挂掉后,就自动出现了
Keepalived配置Nginx自动重启功能
其实,这个时候我们的主备Nginx已经正常运行了,但有个不太好的地方就是,主要当主节点挂点或者宕机导致了主节点上的keepalived服务无法执行时backup节点上的nginx才能开启服务,如果仅仅是master节点上的nginx服务挂掉后是不能执行主备切换的,这样nginx服务也就挂点了无法继续执行了,也就是我们的主备配置没有用
因此,我们需要配置keepalived对nginx的自动重启,如果不能自动重启就杀掉master节点的keepalived服务,这样就能使备用nginx接替master节点工作了
首先,我们需要自己写一个Nginx重启检测脚本
vi /etc/keepalived/check_nginx_alive_or_not.sh
脚本代码如下
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
# 判断nginx是否宕机,如果宕机了尝试重启
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
# 等待一小会再次检测nginx,如果还是没用启动成功,则停止keepalived,使其启动备用机
sleep 3
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived
fi
fi
需要为上面的脚本添加执行权限
配置keepalived监听nginx脚本,在keepalived.conf脚本中添加下面代码
# 定义一个类似于方法的指令块
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 # 每隔两秒运行上一行脚本
weight 10 # 如果机哦啊笨运行成功,则升级权重+10
}
在vrrp_instance中新增上面的指令块
track_script {
check_nginx_alive # 指令块的名称
}
重启keepalived是的配置文件生效
实现Keepalived双主热备机制
其实,上面的配置基本能满足生产上的需要了。但是,如果使用上面的配置机制的话,需要两台硬件性能基本一致的机器,同时因为有一台是主节点,主要主节点是正常的,Nginx所接的所有请求都是通过主节点发送的,那么备用节点就一直空闲在那了,只有等主节点挂了它才替换上场,等主节点重新开启后,备用节点又被主节点替换下来了。
所以我们需要将两个节点互为主备,然后将我们的域名解析到两个vip上,这样由DNS服务器来实现对两个Nginx节点进行负载均衡,当某一个节点过掉了,那么两个vip都将请求流量导向另外一台正常的机器上。
规则:以一个vip分组归位同一个路由
主节点配置
global_defs {
router_id keep_171
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}
备用节点配置
global_defs {
router_id keep_172
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}
重启两个keepalived就可以了
同时要实现上面的功能需要将你的域名的DNS云解析配置成上面的两个VIP,然后对两个VIP的权重进行设置,如果是1:1就是请求流量对半分了,这些都可以在阿里云或者腾讯云上面完成的。我这里设置的两个vip都是基于我本地局域网来设的,仅供参考。