Keeplaived 高可用nginx负载均衡
Single Point of Failure
系统环境: CentOS-7.3
软件: nginx-1.12.0,keepalived,ipvsadm
安装方式: 源码编译安装、YUM
安装位置: /usr/local/nginx/
下载地址: nignx
集群由两台调度器(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 |
|
keepalived的配置文件global_defs
1 |
|
- 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 |
|
上分别表示启动keepalived时在本机执行命令:
1 |
|
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 协议 ,转载请注明出处!