Linux 高可用(HA)集群之keepalive
一:前言Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);Keepalived的目的是模拟路由器的高可用,一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。总结一下,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。
二:keepalive
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
三:配置keepalive实现HTTP高可用
1) 环境准备
CentOS 6.5 X86_64
ipvsadm.x86_64 0:1.25-10.el6 keepalived.x86_64 0:1.2.7-3.el6 httpd-2.2.15-29.el6.centos.x86_642)试验拓扑图
试验拓扑图中VIP为172.16.16.7.节点node1为172.16.16.1,节点node2为172.16.16.6.
3)配置master
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
42
43
vim /etc/keepalived/keepalived.conf
global_defs
{
notification_email
{
stu16@llh.com #接收邮件地址
}
notification_email_from kanotify@magedu.com#发送邮件地址
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_mantaince_down { #定义检测机制
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1 #每个多长时间检测一次
weight -2 #当在/etc/keepalived/下创建一个down文件时执行下面的命令权重减2.
fall 3 #从正常到失败检测几次完成
raise3 #从失败到正常需要检测几次
}
vrrp_instance VI_1 {
interface eth1
state MASTER # BACKUP for slave routers #当在被节点上修改为BACKUP
priority 101 # 100 for BACKUP #被节点的priority数值要小于主节点
virtual_router_id 16 #主机routeID,
garp_master_delay 1
authentication {
auth_type PASS
auth_pass password #输入验证密码
}
track_interface {
eth0 #配置IP地址所在的网卡
}
virtual_ipaddress {
172.16.16.7/16 dev eth0 label eth0:0 #配置的IP地址
}
track_script { #调用检测机制
chk_mantaince_down
}
notify_master "/etc/rc.d/init.d/httpd start" # 当成为master时就启动http服务
notify_backup "/etc/rc.d/init.f/httpd stop" # 当成为backup时就关闭http服务
notify_fault "/etc/rc.d/init.d/httpd stop"
}
4)将配置文件同步到slave
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
42
43
44
scp /etc/keepalived/keepalived.conf root@172.16.16.5:/etc/keepalived/
修改配置文件
global_defs
{
notification_email
{
stu16@llh.com #接收邮件地址
}
notification_email_from kanotify@magedu.com#发送邮件地址
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_mantaince_down { #定义检测机制
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1 #每个多长时间检测一次
weight -2 #当在/etc/keepalived/下创建一个down文件时执行下面的命令权重减2.
fall 3 #从正常到失败检测几次完成
raise3 #从失败到正常需要检测几次
}
vrrp_instance VI_1 {
interface eth1
state BACKUP # BACKUP for slave routers #此处修改为BACKUP
priority 100 # 100 for BACKUP #此处修改为100
virtual_router_id 16 #主机routeID,
garp_master_delay 1
authentication {
auth_type PASS
auth_pass password #输入验证密码
}
track_interface {
eth0 #配置IP地址所在的网卡
}
virtual_ipaddress {
172.16.16.7/16 dev eth0 label eth0:0 #配置的IP地址
}
track_script { #调用检测机制
chk_mantaince_down
}
notify_master "/etc/rc.d/init.d/httpd start" # 当成为master时就启动http服务
notify_backup "/etc/rc.d/init.f/httpd stop" # 当成为backup时就关闭http服务
notify_fault "/etc/rc.d/init.d/httpd stop"
}
5)启动keepalive
1
2
3
4
# service keepalived start
正在启动 keepalived: [确定]
# service keepalived start
正在启动 keepalived: [确定]
四:keepalive+lvs 实现LVS双主高可用
1)试验拓扑图
2)配置RIP1服务
1
2
3
4
5
6
7
8
9
10
因为RIP服务器配置的有VIP地址所以外面有请求VIP时他也会进行相应,而我们这里是为了实现DR转发,不能让他进行响应,我们需要对RIP的端口信息进行隐藏。
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore#忽略其他端口发来的请求信息
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce #不广播自己的端口信息
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig eth0 192.168.16.2/24 up
ifconfig lo:0 172.16.16.7 netmask 255.255.255.255 broadcast 172.16.16.7
route add -host 172.16.16.7 dev lo:0响应的信息通过lo:0端口 ,为了使响应的IP地址为VI
ifconfig lo:1 172.16.16.8 netmask 255.255.255.255 broadcast 172.16.16.8
route add -host 172.16.16.8 dev lo:1
3)配置RIP2服务
1
2
3
4
5
6
7
8
9
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore#忽略其他端口发来的请求信息
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce #不广播自己的端口信息
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig eth0 192.168.16.3/24 up
ifconfig lo:0 172.16.16.7 netmask 255.255.255.255 broadcast 172.16.16.7
route add -host 172.16.16.7 dev lo:0响应的信息通过lo:0端口 ,为了使响应的IP地址为VI
ifconfig lo:1 172.16.16.8 netmask 255.255.255.255 broadcast 172.16.16.8
route add -host 172.16.16.8 dev lo:1
4)配置master
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
global_defs
{
notification_email
{
linuxedu@foxmail.commageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_schedown
{
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
#创建down文件权重减2
interval 2
weight -2
}
vrrp_instance VI_1
{
interface eth0
state MASTER#此节点为主节点
priority 101
virtual_router_id 51
garp_master_delay 1
authentication
{
auth_type PASS
auth_pass password
}
track_interface
{
eth0
}
virtual_ipaddress
{
172.16.16.7/16 dev eth0 label eth0:0 #配置对外的VIP地址 }
track_script
{
chk_schedown
}
}
vrrp_instance VI_2
{
interface eth0
state BACKUP #此节点为被节点
priority 100
virtual_router_id 50
garp_master_delay 1
authentication {
auth_type PASS
auth_pass 12345678
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.16.8/16 dev eth0 label eth0:1 #配置对外的VIP地址
}
track_script {
chk_schedown
}
}
virtual_server 172.16.16.7 80#配置一个VIP 工作在TCP的80端口上
{
delay_loop 6 #lb_algo rr #负载均衡的调度算法
lb_kind DR #工作在NAT模型上
persistence_timeout 50 #是否启用IPVS持久连接
protocol TCP#采用的是TCP协议
# sorry_server 192.168.16.2 1358 #所有服务挂了 ,出现的提示页面.要在这台服务器上开启http服务
real_server 192.168.16.2 80 #后面RIP地址
{
weight 1 #权重
HTTP_GET
{
url
{
path /
status_code 200 #取得主页面的状态,状态码为200就意味着请求成功;也可写入md5码,但要制定静态码
}
connect_timeout 3 #每次测试3秒
nb_get_retry 3 #测试次数
delay_before_retry 3 #测试失败在测试3次
}
}
real_server 192.168.16.3 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3nb_get_retry 3delay_before_retry 3
}
}
}
virtual_server 172.16.16.8 80#配置一个VIP 工作在TCP的80端口上
{
delay_loop 6 #
lb_algo rr #负载均衡的调度算法
lb_kind DR #工作在NAT模型上
#persistence_timeout 50 #是否启用IPVS持久连接,这项要注销.连接50S才会切换
protocol TCP#采用的是TCP协议
# sorry_server 192.168.16.2 1358 #所有服务挂了 ,出现的提示页面.要在这台服务器上开启http服务
real_server 192.168.16.2 80 #后面RIP地址
{
weight 1 #权重
HTTP_GET
{
url
{
path /
status_code 200 #取得主页面的状态,状态码为200就意味着请求成功;也可写入md5码,但要制定静态码
}
connect_timeout 3 #每次测试3秒
nb_get_retry 3 #测试次数
delay_before_retry 3 #测试失败在测试3次
}
}
real_server 192.168.16.3 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
5)配置backup
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
global_defs
{
notification_email
{
linuxedu@foxmail.commageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_schedown
{
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
#创建down文件权重减2
interval 2
weight -2
}
vrrp_instance VI_1
{
interface eth0
state BACKUP#此节点为被节点
priority 100
virtual_router_id 51
garp_master_delay1
authentication
{
auth_type PASS
auth_pass password
}
track_interface
{
eth0
}
virtual_ipaddress
{
172.16.16.7/16 dev eth0 label eth0:0 #配置对外的VIP地址 }
track_script
{
chk_schedown
}
}
vrrp_instance VI_2
{
interface eth0
state MASTER #此节点为主节点
priority 101
virtual_router_id 50
garp_master_delay 1
authentication {
auth_type PASS
auth_pass 12345678
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.16.8/16 dev eth0 label eth0:1 #配置对外的VIP地址
}
track_script {
chk_schedown
}
}
virtual_server 172.16.16.7 80#配置一个VIP 工作在TCP的80端口上
{
delay_loop 6 #lb_algo rr #负载均衡的调度算法
lb_kind DR #工作在NAT模型上
persistence_timeout 50 #是否启用IPVS持久连接
protocol TCP#采用的是TCP协议
# sorry_server 192.168.16.2 1358 #所有服务挂了 ,出现的提示页面.要在这台服务器上开启http服务
real_server 192.168.16.2 80 #后面RIP地址
{
weight 1 #权重
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.16.3 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3nb_get_retry 3delay_before_retry 3
}
}
}
virtual_server 172.16.16.8 80#配置一个VIP 工作在TCP的80端口上
{
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
# sorry_server 192.168.16.2 1358
real_server 192.168.16.2 80 #后面RIP地址
{
weight 1 #权重
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3 #每次测试3秒
nb_get_retry 3 #测试次数
delay_before_retry 3 #测试失败在测试3次
}
}
real_server 192.168.16.3 80
{
weight 1
HTTP_GET
{
url
{
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
5)启动keepalive
页:
[1]