keepalived的原理和基本实现-阿里云开发者社区

开发者社区> 余二五> 正文

keepalived的原理和基本实现

简介:
+关注继续查看

一、keepalived的基本原理介绍

keepalived最初设计的目的是为了实现lvs前端director的高可用,非常轻量级。主要的实现的vrrp协议。

VRRP是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。

VRRP具有如下优点:

  • 简化网络管理:在具有多播或广播能力的局域网(如以太网)中,借助VRRP 能在某台设备出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息,也无需修改主机的默认网关配置。

  • 适应性强:VRRP 报文封装在 IP 报文中,支持各种上层协议。

  • 网络开销小:VRRP 只定义了一种报文——VRRP 通告报文,并且只有处于Master 状态的路由器可以发送 VRRP 报文。

keepalived的软件架构如下:(图片来源于keepalived官网)

 

1


组件简单介绍:

IPVS: 为lvs生成ipvs规则的组件,是内核级别的。

NETLINK:Netlink是套接字家族中的一员,主要用内核与用户空间的进程间、用户进程间的通讯。然而它并不像网络套接字可以用于主机间通讯,Netlink只能用于同一主机上进程通讯,并通过PID来标识它们。Netlink被设计为在Linux内核与用户空间进程传送各种网络信息。网络工具iproute2利用 Netlink从用户空间与内核进行通讯。Netlink由一个在用户空间的标准的Socket接口和内核模块提供的内核API组成。Netlink的设计比ioctl更加灵活,Netlink使用了AF_NETLINK Socket 家族。(摘自维基百科)

IPVS wrapper:借助于Checkers实现后端lvs主机的健康状态检测

VRRP Stack: 实现VRRP协议,实现虚拟IP地址的转移。

更多详细的介绍,参考官网地址:http://www.keepalived.org/documentation.html

二、keepalived的安装配置

在CentOS6.4以后,keepalived直接收录到内置的rpm仓库中,可以直接安装使用。

1
yum install keepalived -y

keepalived配置文件:

1
/etc/keepalived/keepalived.conf

1、简单的实现vrrp协议的配置

1
2
3
4
配置模式(主从模式):
主节点(Master):172.16.10.9
从节点(Backup):172.16.10.77
虚拟地址:172.16.10.68

配置过程:

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
### 172.16.10.9:/etc/keepalived/keepalived.conf,实例内容: 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 10
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass MasBac
    }
    virtual_ipaddress {
        172.16.10.68
    }
}
### 172.16.10.77:/etc/keepalived/keepalived.conf,实例内容: 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 10
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass MasBac
    }
    virtual_ipaddress {
        172.16.10.68
    }
}

配置完成后,先启动172.16.10.77的keepalived服务,查看日志信息:

2

3

此时,启动Master端172.16.10.9的keepalived服务:

4

1
2
3
4
5
6
7
8
9
10
11
配置模式(双主模式):
节点地址:172.16.10.9,172.16.10.77
虚拟地址:172.16.10.68 172.16.10.69
说明:这里的双主模型的实现实际上是配置了2组vrrp的示例。
如下关系:
示例1:
    主节点:172.16.10.9
    从节点:172.16.10.77 
示例2:
    主节点:172.16.10.77
    从节点:172.16.10.9

配置信息:

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
## 172.16.10.9的vrrp实例信息:
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 10
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass MasBac
    }
    virtual_ipaddress {
        172.16.10.68
    }
}
 
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 15
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass DouMas
    }
    virtual_ipaddress {
        172.16.10.69
    }
}
## 172.16.10.77的vrrp实例信息:
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 10
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass MasBac
    }
    virtual_ipaddress {
        172.16.10.68
    }
}
 
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 15
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass DouMas
    }
    virtual_ipaddress {
        172.16.10.69
    }
}

重新启动keepalived服务:

5 

此时,如果 172.16.10.77 出现故障,172.16.10.9会拥有2个虚拟ip地址,实现真正的冗余

6 

2、配置keepalived为实现lvs高可用

1
2
3
环境说明:
keepalived采用双主模型:节点是172.16.10.9 172.16.10.77
后端的realserver:172.16.10.122 172.16.10.133

配置说明:

1
2
3
4
5
6
7
8
9
10
11
12
## 配置后端节点:172.16.10.122 172.16.10.133
## ifconfig eth0 172.16.10.122/16 up 
## ifconfig eth0 172.16.10.122/16 up  # 这个也可以写到配置文件
 
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 172.16.10.68 netmask 255.255.255.255 broadcast 172.16.10.68
route add -host 172.16.10.68  dev lo:0
ifconfig lo:1 172.16.10.69 netmask 255.255.255.255 broadcast 172.16.10.69
route add -host 172.16.10.69  dev lo:1

配置keepalived:

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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
### 172.16.10.9:/etc/keepalived/keepalived.conf的配置:
global_defs {
   notification_email {
     root@example.com
   }
   notification_email_from keepalived@example.com
   smtp_server 172.16.10.9
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 10
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass MasBac
    }
    virtual_ipaddress {
        172.16.10.68    
    }
}
 
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 15
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass DouMas
    }
    virtual_ipaddress {
        172.16.10.69
    }
}
 
virtual_server 172.16.10.68 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP 
    sorry_server 172.16.10.77 80
 
    real_server 172.16.10.122 80 {
        weight 1
        HTTP_GET {
        url {
        path /
        status_code 200
        }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }   
    }
    real_server 172.16.10.133 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200 
            }   
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }   
    
}
 
 
virtual_server 172.16.10.69 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR 
    #persistence_timeout 50
    protocol TCP
    sorry_server 172.16.10.77 80
 
    real_server 172.16.10.122 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.10.133 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
### 172.16.10.77:/etc/keepalived/keepalived.conf的配置:
! Configuration File for keepalived
 
global_defs {
   notification_email {
     root@example.com
   }
   notification_email_from keepalived@example.com
   smtp_server 172.16.10.9
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 10
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass MasBac
    }
    virtual_ipaddress {
        172.16.10.68
    }
}
 
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 15
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass DouMas
    }
    virtual_ipaddress {
        172.16.10.69
    }
}
 
virtual_server 172.16.10.68 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    sorry_server 172.16.10.77 80
 
    real_server 172.16.10.122 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.10.133 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
 
virtual_server 172.16.10.69 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    sorry_server 172.16.10.77 80
 
    real_server 172.16.10.122 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.10.133 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
TCP_CHECK {
     connect_port 80
     connect_timeout 3
}

测试:

测试前,重启keepalived服务。

8

image

image

当后端realserver都出现故障时:

image

配置完成。










本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1568581,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
26037 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11732 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
11427 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
8249 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4507 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
3104 0
+关注
20382
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载