keepalived总结

一、实验环境

默认ng已安装

机器如下

keepalived-master: 192.168.199.201   
keepalived-backup: 192.168.199.202   
VIP:               192.168.199.222

# 作为keepalived+ng使用的nginx实例
ng1: 192.168.199.201
ng2: 192.168.199.202
# 作为RS使用的nginx实例
ng3: 192.168.199.203
ng4: 192.168.199.203

二、安装keepalived(两台)

PS:两种方式2选一即可

2.1 RPM包安装

wget http://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/keepalived-1.3.5-19.el7.x86_64.rpm 
#如果启动报下图的错误,需要安装net-snmp依赖。建议直接安装
yum install net-snmp
rpm -ivhU keepalived-1.3.5-19.el7.x86_64.rpm --force --nodeps

在这里插入图片描述

2.2 tar包安装

安装依赖(可能需要)

yum -y install gcc gcc-c++ ncurses-devel bison libaio-devel  openssl openssl-devel

下载keepalived安装包

wget https://www.keepalived.org/software/keepalived-2.1.0.tar.gz --no-check-certificate

解压安装

tar -zxvf keepalived-2.1.0.tar.gz
cd keepalived-2.1.0
./configure
make && make install

三、单/双网卡配置(仅配置VIP)

这里以tar包安装为例,RPM包安装会跳过下面三个命令,其余一致

cp  keepalived-2.1.0/keepalived/etc/init.d/keepalived  /etc/rc.d/init.d/
cp  /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived

3.1 单网卡配置

3.1.1 MASTER(192.168.199.201)配置如下

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id nodex	            ##本机keepalived标识,主备写一致就行
}
# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {			
    state MASTER				##MASTER表示主服务器
    interface ens33				##承载VIP地址的物理接口
    virtual_router_id 51		##虚拟路由器的ID号
    priority 100				##优先级,数值越大优先级越高
    advert_int 1				##通告间隔秒数(心跳频率)
    authentication {			##认证信息
        auth_type PASS		    ##认证类型
        auth_pass 123456		##密码字串,最多为8位
    }
    ## 最好加上,防止交换机禁止组播
	unicast_src_ip 192.168.199.201   ##本机IP
    unicast_peer {
                192.168.199.202      ##对端IP
    }
	virtual_ipaddress {
		192.168.199.222		         ##指定漂移地址(VIP)
    }
}

重启主keepalive的服务

systemctl restart  keepalived

3.1.2 BACKUP(192.168.199.202)配置如下

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id nodex	            ##本机keepalived标识,主备写一致就行
}
# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {			
    state BACKUP				##MASTER表示主服务器
    interface ens33				##承载VIP地址的物理接口
    virtual_router_id 51		##虚拟路由器的ID号
    priority 90				    ##优先级,数值越大优先级越高
    advert_int 1				##通告间隔秒数(心跳频率)
    authentication {			##认证信息
        auth_type PASS		    ##认证类型
        auth_pass 123456		##密码字串,最多为8位
    }
    ## 最好加上,防止交换机禁止组播
	unicast_src_ip 192.168.199.202    ##本机IP
    unicast_peer {
                192.168.199.201       ##对端IP
    }	
	virtual_ipaddress {
		192.168.199.222		    	  ##指定漂移地址(VIP)
    }
}

重启备keepalive的服务

systemctl restart  keepalived

3.1.3 实验比较简单,结果语述如下:

1. VIP 会在201机器上
2. 停止201的keepalived,VIP会飘到202上
3. 重启201的keepalived,VIP会飘到201上

3.2 双网卡配置

假设:这里的公网IP是用的百度的
在这里插入图片描述

3.2.1 MASTER配置可参考:

# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id nodex                     ##本机keepalived标识,主备写一致就行
}

vrrp_instance VI_1 {                    ##定义VRRP热备实例
    state MASTER                        ##主/备服务器
    interface eth0                      ##承载vip地址的物理接口
    virtual_router_id 51                ##虚拟路由器的ID号
    priority 100                        ##优先级,数值越大优先级越高
    advert_int 1                        ##通告间隔秒数(心跳频率)
    authentication {                    ##认证信息
        auth_type PASS                  ##认证类型
        auth_pass 123456                ##密码字串
    }
    
    unicast_src_ip 10.10.10.10         ##本机eth0_IP
    unicast_peer {
        10.10.10.11                    ##对端eth0_IP   
    } 
    virtual_ipaddress {
        10.10.10.222                   ##eth0_VIP
   }
}

vrrp_instance VI_2 {                    ##定义VRRP热备实例
    state MASTER                        ##主/备服务器
    interface eth1                      ##承载vip地址的物理接口
    virtual_router_id 52                ##虚拟路由器的ID号
    priority 100                        ##优先级,数值越大优先级越高
    advert_int 1                        ##通告间隔秒数(心跳频率)
    authentication {                    ##认证信息
        auth_type PASS                  ##认证类型
        auth_pass 123456                ##密码字串
    }

    unicast_src_ip 119.75.217.109   ##本机eth1_IP
    unicast_peer {
         119.75.217.110             ##对端eth1_IP  
    }
    virtual_ipaddress {
         119.75.217.222             ##eth1_VIP
    }
}

3.2.2 BACKUP配置可参考:

# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id nodex                     ##本机keepalived标识,主备写一致就行
}

vrrp_instance VI_1 {                    ##定义VRRP热备实例
    state BACKUP                        ##主/备服务器
    interface eth0                      ##承载vip地址的物理接口
    virtual_router_id 51                ##虚拟路由器的ID号
    priority 90                         ##优先级,数值越大优先级越高
    advert_int 1                        ##通告间隔秒数(心跳频率)
    authentication {                    ##认证信息
        auth_type PASS                  ##认证类型
        auth_pass 123456                ##密码字串
    }
        
    unicast_src_ip 10.10.10.11
    unicast_peer {
        10.10.10.10
    }
    virtual_ipaddress {
        10.10.10.222
    }
}

vrrp_instance VI_2 {                    ##定义VRRP热备实例
    state BACKUP                        ##主/备服务器
    interface eth1                      ##承载vip地址的物理接口
    virtual_router_id 52                ##虚拟路由器的ID号
    priority 90                         ##优先级,数值越大优先级越高
    advert_int 1                        ##通告间隔秒数(心跳频率)
    authentication {                    ##认证信息
        auth_type PASS                  ##认证类型
        auth_pass 123456                ##密码字串
    }

   unicast_src_ip 119.75.217.110
   unicast_peer {
          119.75.217.109
   }
   virtual_ipaddress {
          119.75.217.222
   }
}

3.3 测试结果如下

201的两个网卡各有一个VIP,202只有本机IP。
201的结果如下图:
在这里插入图片描述

3.4 非抢占模式

需要的场景:不能频繁切换业务繁忙的网站

1. 一般master服务故障后backup会变成master
2. 当master服务又恢复的时候,master会抢占VIP
这样就会发生两次切换对业务繁忙的网站来说并不是太友好

注意事项:

此时我们可以配置keepalived为非抢占式,需要两台机器硬件配置信息一致
1、两个节点的state都必须配置为BACKUP(官方建议)
2、两个节点都在vrrp_instance中添加nopreempt参数
3、其中一个节点的优先级必须要高于另外一个节点的优先级。

主配置:

! Configuration File for keepalived
global_defs {
    router_id nodex     ##本机keepalived标识,主备写一致就行
}

# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP                        ##MASTER表示主服务器
    nopreempt                           ##不抢占
    interface ens33                     ##承载VIP地址的物理接口
    virtual_router_id 51                ##虚拟路由器的ID号
    priority 100                         ##优先级,数值越大优先级越高
    advert_int 1                        ##通告间隔秒数(心跳频率)
    authentication {                    ##认证信息
        auth_type PASS                  ##认证类型
        auth_pass 123456                ##密码字串,最多为8位
    }
    unicast_src_ip 192.168.199.201      ##本机IP
    unicast_peer {
        192.168.199.202                 ##对端IP
    }
    virtual_ipaddress {
        192.168.199.222                 ##指定漂移地址(VIP)
    }
}

备:

! Configuration File for keepalived
global_defs {
    router_id nodex     ##本机keepalived标识,主备写一致就行
}

# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP                        ##MASTER表示主服务器
    nopreempt
    interface ens33                     ##承载VIP地址的物理接口
    virtual_router_id 51                ##虚拟路由器的ID号
    priority 90                         ##优先级,数值越大优先级越高
    advert_int 1                        ##通告间隔秒数(心跳频率)
    authentication {                    ##认证信息
        auth_type PASS                  ##认证类型
        auth_pass 123456                ##密码字串,最多为8位
    }
    unicast_src_ip 192.168.199.202      ##本机IP
    unicast_peer {
        192.168.199.201                 ##对端IP
    }
    virtual_ipaddress {
        192.168.199.222                 ##指定漂移地址(VIP)
    }
}

经测试符合预期

四、keepalived + ng (主要是用来防止单点故障)

重要说明:

  1. 这里需要把keepalived 和ng放在同一台机器上。
  2. ng是个范例,可以是其他服务。通常ng反向代理了其他服务。
  3. 这种主要是防止单点故障,比如一台ng服务宕了,可以快速切换到另外一台。

4.1 201上keeplived 编辑配置文件(MASTER)

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id nodex     ##本机keepalived标识,主备写一致就行
}

vrrp_script chk_nginx {
    script "/etc/keepalived/ng_check.sh"   ## 检测服务状态的脚本路径 
    interval 2                             ## 检测时间间隔
    weight -20                             ## 如果条件成立,权重-20
}

# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {                    
    state MASTER                        ##MASTER表示主服务器
    interface ens33                     ##承载VIP地址的物理接口
    virtual_router_id 51                ##虚拟路由器的ID号
    priority 100                        ##优先级,数值越大优先级越高
    advert_int 1                        ##通告间隔秒数(心跳频率)
    authentication {                    ##认证信息
        auth_type PASS                  ##认证类型
        auth_pass 123456                ##密码字串,最多为8位
    }
	unicast_src_ip 192.168.199.201      ##本机IP
    unicast_peer {
    	192.168.199.202         ##对端IP
    }	
    virtual_ipaddress {
    	192.168.199.222         ##指定漂移地址(VIP)
    }
    track_script {
        chk_nginx               ##执行监控的服务
    }
}

检测Nginx的脚本

vim /etc/keepalived/ng_check.sh
#!/bin/bash
ngres=$(ps -C nginx --no-header|wc -l)
if [ $ngres -eq 0 ];then 
	echo -e " nginx1(192.168.199.201) is down on $(date +%F-%T)" >/tmp/201-nginx.log
	systemctl  stop keepalived
fi
chmod +x ng_check.sh

重启备keepalive的服务

systemctl restart  keepalived

4.1 202上keeplived 编辑配置文件(BACKUP)

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id nodex       ##本机keepalived标识,主备写一致就行
}
vrrp_script chk_nginx {
    script "/etc/keepalived/ng_check.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {            ##定义VRRP热备实例
    state BACKUP                ##MASTER表示主服务器
    interface ens33             ##承载VIP地址的物理接口
    virtual_router_id 51        ##虚拟路由器的ID号
    priority 90                 ##优先级,数值越大优先级越高
    advert_int 1                ##通告间隔秒数(心跳频率)
    authentication {            ##认证信息
        auth_type PASS          ##认证类型
        auth_pass 123456        ##密码字串
    }
	unicast_src_ip 192.168.199.202
    unicast_peer {
        192.168.199.201
    }	
    virtual_ipaddress {
        192.168.199.222      
    }
  track_script {
        chk_nginx
    }
}

Nginx检测脚本:

vim /etc/keepalived/ng_check.sh
#!/bin/bash
ngres=$(ps -C nginx --no-header|wc -l)
if [ $ngres -eq 0 ];then 	
	echo -e " nginx1(192.168.199.202) is down on $(date +%F-%T)" >/tmp/202-nginx.log
	systemctl  stop keepalived
fi

重启备keepalive的服务

systemctl restart  keepalived

4.3 测试结果

正常情况下,访问vip,到达201
在这里插入图片描述
停掉201的ng,VIP会到202上,访问vip,到达202
在这里插入图片描述
重启201的ng 和 keepalived,VIP又会会到201上

五、keepalived + LVS + NG +(RS)

问题:明明keepalived+ ng已经可以防止单点故障,为什么还需要LVS?
答曰:nginx本身可能也会出现故障,需要引进
重要:如果用NG反向代理,LVS配置是可以不写的

5.1 实验环境:

ng主要做反向代理,或者web服务,这里我用ng当做RS

lvs调度器:     192.168.199.201  网卡:ens33   ipvsadm、keepalived(热备)
lvs调度器:     192.168.199.202  网卡:ens33   ipvsadm、keepalived
vip:           192.168.199.222
NG:            192.168.199.203
NG:            192.168.199.204

5.2 201 202 操作

安装

yum install ipvsadm keepalived -y

5.2.1 配置(201-主)

! Configuration File for keepalived
global_defs {
    router_id nodex     ##本机keepalived标识,主备写一致就行
}
# VRRP实例(instance)配置
# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {                    
    state MASTER                        ##MASTER表示主服务器
    interface ens33                     ##承载VIP地址的物理接口
    virtual_router_id 51                ##虚拟路由器的ID号
    priority 100                        ##优先级,数值越大优先级越高
    advert_int 1                        ##通告间隔秒数(心跳频率)
    authentication {                    ##认证信息
        auth_type PASS                  ##认证类型
        auth_pass 123456                ##密码字串,最多为8位
    }
    unicast_src_ip 192.168.199.201      ##本机IP
    unicast_peer {
        192.168.199.202                 ##对端IP
    }   
    virtual_ipaddress {
        192.168.199.222                 ##指定漂移地址(VIP)
    }
}
# LVS 配置
virtual_server 192.168.199.222 80 {   # VIP地址
    delay_loop 3                    # 设置健康状态检查时间
    lb_algo rr                      # lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh 
    lb_kind DR                      # 负载均衡转发规则NAT|DR|RUN
    persistence_timeout 5           # 持久连接超时时间
    protocol TCP                    # 使用的协议 
	
    real_server 192.168.199.203 80 {  # RS的真实IP地址,这里用NG替代一下
        weight 1                      # 默认为1,0为失效
        TCP_CHECK {
            connect_timeout 3       # 连接超时时间
            nb_get_retry 3          # 重连次数
            delay_before_retry 3    # 重连间隔时间
            connect_port 80         # 健康检查的端口的端口 
        }
    }
	 real_server 192.168.199.204 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3       # 连接超时时间
            nb_get_retry 3          # 重连次数
            delay_before_retry 3    # 重连间隔时间
            connect_port 80         # 健康检查的端口的端口 
        }
    }
}

重启备keepalive的服务

systemctl restart  keepalived

5.2.3 配置(202-备),参考上文

重启备keepalive的服务

systemctl restart  keepalived

5.2.4 配置转发策略

ipvsadm -C
ipvsadm -A -t 192.168.199.222:80 -s rr
ipvsadm -a -t 192.168.199.222:80 -r 192.168.199.203:80 -g
ipvsadm -a -t 192.168.199.222:80 -r 192.168.199.204:80 -g

查看

# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.199.222:80 rr
  -> 192.168.199.203:80           Route   1      0          0
  -> 192.168.199.204:80           Route   1      0          0

5.3 203 204 配置

两台均需要操作

cat add_vip.sh
#!/bin/bash
SNS_VIP=192.168.199.222
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
sh add_vip.sh start

结果如图:
在这里插入图片描述

5.4 测试结果

如图可见,轮询成功
在这里插入图片描述

六、其他

keepalived命令

systemctl  start|stop|restart|status keepalived

查看日志

tail -n300 -f  /var/log/messages
OR
systemctl status keepalived
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在Keepalived配置文件中设置“state”选项为“MASTER”状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的“weight”值,这两个选项对应的都是一个整数值,其中“weight”值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。 在一个一主多备的Keepalived集群中,“priority”值最大的将成为集群中的Master节点,而其他都是Backup节点。在Master节点发生故障后,Backup节点之间将进行“民主选举”,通过对节点优先级值“priority”和““weight”的计算,选出新的Master节点接管集群服务。 在vrrp_script模块中,如果不设置“weight”选项值,那么集群优先级的选择将由Keepalived配置文件中的“priority”值决定,而在需要对集群中优先级进行灵活控制时,可以通过在vrrp_script模块中设置“weight”值来实现。下面列举一个实例来具体说明。 假定有A和B两节点组成的Keepalived集群,在A节点keepalived.conf文件中,设置“priority”值为100,而在B节点keepalived.conf文件中,设置“priority”值为80,并且A、B两个节点都使用了“vrrp_script”模块来监控mysql服务,同时都设置“weight”值为10,那么将会发生如下情况。 在两节点都启动Keepalived服务后,正常情况是A节点将成为集群中的Master节点,而B自动成为Backup节点,此时将A节点的mysql服务关闭,通过查看日志发现,并没有出现B节点接管A节点的日志,B节点仍然处于Backup状态,而A节点依旧是Master状态,在这种情况下整个HA集群将失去意义。 下面就分析一下产生这种情况的原因,这也就是Keepalived集群中主、备角色选举策略的问题。下面总结了在Keepalived中使用vrrp_script模块时整个集群角色的选举算法,由于“weight”值可以是正数也可以是负数,因此,要分两种情况进行说明。 1.“weight”值为正数时 在vrrp_script中指定的脚本如果检测成功,那么Master节点的权值将是“weight值与”priority“值之和,如果脚本检测失败,那么Master节点的权值保持为“priority”值,因此切换策略为: Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值小于Backup节点“weight值与”priority“值之和,将发生主、备切换。 Master节点“vrrp_script”脚本检测成功时,如果Master节点“weight”值与“priority”值之和大于Backup节点“weight”值与“priority”值之和,主节点依然为主节点,不发生切换。 2.“weight”值为负数时 在“vrrp_script”中指定的脚本如果检测成功,那么Master节点的权值仍为“priority”值,当脚本检测失败时,Master节点的权值将是“priority“值与“weight”值之差,因此切换策略为: Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值与“weight”值之差小于Backup节点“priority”值,将发生主、备切换。 Master节点“vrrp_script”脚本检测成功时,如果Master节点“priority”值大于Backup节点“priority”值时,主节点依然为主节点,不发生切换。 在熟悉了Keepalived主、备角色的选举策略后,再来分析一下刚才实例,由于A、B两个节点设置的“weight”值都为10,因此符合选举策略的第一种,在A节点停止Mysql服务后,A节点的脚本检测将失败,此时A节点的权值将保持为A节点上设置的“priority”值,即为100,而B节点的权值将变为“weight”值与“priority”值之和,也就是90(10+80),这样就出现了A节点权值仍然大于B节点权值的情况,因此不会发生主、备切换。 对于“weight”值的设置,有一个简单的标准,即“weight”值的绝对值要大于Master和Backup节点“priority”值之差。对于

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值