Keeplaived 高可用nginx负载均衡

Single Point of Failure

htmt5a

系统环境: CentOS-7.3

软件: nginx-1.12.0,keepalived,ipvsadm
安装方式: 源码编译安装、YUM

安装位置: /usr/local/nginx/

下载地址: nignx
keepalived

集群由两台调度器(DirectorServer,DS)

192.168.0.80/24

192.168.0.81/24

两台真实服务器(RealServer,RS)构成

192.168.0.10/24

192.168.0.12/24

调度器一主一备,两台台真实服务器进行负载均衡提供服务。

1
2
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module
make&&make install

keepalived的配置文件global_defs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
! Configuration File for keepalived

global_defs {

notification_email {

abc@abc.com

}

notification_email_from guang384@163.com

smtp_server 127.0.0.1 #STMP服务

smtp_connect_timeout 30

#服务器全局属性,在收到提醒邮件的时候会用来作为当前服务器的标识,所以每台服务器都要唯一

router_id LVS_DR_DS1

vrrp_mcast_group4 224.0.100.19 #d多播地址



}
  • notification_email 故障发生时给谁发邮件通知。
  • notification_email_from 通知邮件从哪个地址发出。
  • smpt_server 通知邮件的smtp地址。
  • smtp_connect_timeout 连接smtp服务器的超时时间。
  • enable_traps 开启SNMP陷阱( Simple Network Management Protocol )。
  • router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生
    时,邮件通知会用到。

vrrp_mcast_group4 224.0.100.19 多播地址

224.0.0.0~239.255.255.255


static_ipaddress和static_routes区域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
vrrp_instance VI_1 {

state MASTER #指定Keepalived的角色, MASTER 为主机服务器, BACKUP 为备用服务器

interface eth0 #通过哪一个发送心跳信息

virtual_router_id 51 #当前虚拟路由器的惟一标识,范围是0-255;相同虚拟服务器相同,

priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR。当前主机在此虚拟路径器中的优先级;范围1-254;

advert_int 1 #心跳间隔,MASTER每隔1秒发送报文告知组内其他机器自己还活着。(主备状态依靠心跳维持)vrrp通告的时间间隔;

authentication {

auth_type PASS

auth_pass 571f97b2

}

virtual_ipaddress {

10.1.0.91/16 dev eno16777736 #设置主DR的虚拟IP地址(virtual IP),可多设,但必须每行1个

}

}



virtual_ipaddress {

<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>

192.168.200.17/24 dev eth1

192.168.200.18/24 dev eth2 label eth2:1

}
static_routes {
192.168.100/24 via 172.18.0.1 dev eth0 ...}

上分别表示启动keepalived时在本机执行命令:

1
2
3
4
5
# /sbin/ip addr add IP brd IP dev eth0         
# /sbin/ip route add IP via dev eth0
```


track_interface {

    eth0

    eth1

    ...

}

配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;

nopreempt:定义工作模式为非抢占模式;

preempt_delay 300:抢占式模式下,节点上线后触发新选举操作的延迟时长;

定义通知脚本:

notify_master |:当前节点成为主节点时触发的脚本;
notify_backup |:当前节点转为备节点时触发的脚本;
notify_fault |:当前节点转为“失败”状态时触发的脚本;

notify |:通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知;



------------------------------------------------------ 



#### 通知脚本示例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

#!/bin/bash
#

contact='root@localhost'
notify() {
mailsubject="$(hostname) to be $1, vip floating"
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;

fault)
notify fault
;;

*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;

esac
```
### 主keeplived调度配置
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id vser virtual_ipaddress 224.0.100.10 } vrrp_instance kpone { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 2 authentication { auth_type PASS auth_pass j7dPTXjI } virtual_ipaddress { 192.168.0.80/24 dev eth0 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance kptwo { state BACKUP interface eth0 virtual_router_id 52 priority 98 advert_int 2 authentication { auth_type PASS auth_pass j1dPTXjI } virtual_ipaddress { 192.168.0.81/24 dev eth0 } }
1
2
3
 

### 配置备用调度器的 keepalived
scp /etc/keepliaved/keeplived.conf 192.168.0.12:/etc/keepalived/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
只需要将 state MASTER 改为 state BACKUP,降低 priority 100 的值:

state MASTER —> state BACKUP

priority 100 —> priority 95 (此值必须低于主的)

双主模型中

virtual_router_id 52 值不同



#### keepalived主备用高可用负载均衡

virtual_server 192.168.0.80 80{ delay_loop 3 lb_algo wrr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 192.168.0.10 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.0.12 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
1
2
3
4
5
6
7
8
9




![m](/images/nginxh.png)


### keepalived nginx proxy 集群

http上下文 upstream websrvs { server 192.168.0.10:80; server 192.168.0.12:80; server 127.0.0.1:80 backup; } server { proxy_pass http://websrvs; }
1
2
3

配置选项说明
Master
# cat /etc/keepalived/keepalived.conf global_defs { notification_email { # acassen@firewall.loc # 指定keepalived在发生切换时需要发送email到的对象,一行一个 # sysadmin@firewall.loc } #notification_email_from Alexandre.Cassen@firewall.loc # 指定发件人 #smtp_server 192.168.200.1 # smtp 服务器地址 #smtp_connect_timeout 30 # smtp 服务器连接超时时间 router_id LVS_DEVEL # 标识本节点的字符串,通常为hostname,但不一定非得是hostname,故障发生时,邮件通知会用到 } ### 新增 ### vrrp_script chk_httpd { script "/etc/keepalived/check_and_start_httpd.sh" # apache httpd 服务检测并试图重启 interval 2 # 每2s检查一次 weight -5 # 检测失败(脚本返回非0)则优先级减少5个值 fall 3 # 如果连续失败次数达到此值,则认为服务器已down rise 2 # 如果连续成功次数达到此值,则认为服务器已up,但不修改优先级 } vrrp_instance VI_1 { # 实例名称 state MASTER # 可以是MASTER或BACKUP,不过当其他节点keepalived启动时会自动将priority比较大的节点选举为MASTER interface eth0 # 节点固有IP(非VIP)的网卡,用来发VRRP包做心跳检测 virtual_router_id 51 # 虚拟路由ID,取值在0-255之间,用来区分多个instance的VRRP组播,同一网段内ID不能重复;主备必须为一样 priority 100 # 用来选举master的,要成为master那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100) advert_int 1 # 检查间隔默认为1秒,即1秒进行一次master选举(可以认为是健康查检时间间隔) authentication { # 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位) auth_type PASS # 默认是PASS认证 auth_pass 1111 # PASS认证密码 } virtual_ipaddress { 192.168.14.166 # 虚拟VIP地址,允许多个,一行一个 # 192.168.200.17 } ### 新增 ### track_script { # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。 chk_httpd } }
1
Backup
state BACKUP # 此值可设置或不设置,只要保证下面的priority不一致即可 interface eth0 # 根据实际情况选择网卡 priority 40 # 此值要一定小于Master机器上的值,最好相差不少于50 mcast_src_ip 172.29.88.224 -> mcast_src_ip 172.29.88.225

参考


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!