keepalive:
简单一点来说,keepalive就是一个在TCP中可以检测死连接的机制。
原理:
keepalive的原理很简单,TCP会在空闲的时候发送数据给对方:
如果主机可达,对方就会响应ACK应答,就会认为是该主机是存活的;
如果主机可达,但应用程序退出,对方就会发RST应答,发送TCP撤销连接;
如果可达,但应用程序崩溃了,对方主机就会发送FIN消息;
如果对方主机不响应ACK、RST,则会继续发送,直到超时,就会撤销连接。(默认是2个小时)
双机热备:
特指基于高可用系统中的两台服务器的热备(或高可用)。
双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active-Active方式),主-备方式即指的是一台服务器处于某种业务的激活状态(即Active状态),另一台服务器处于该业务的备用状态(即Standby状态)。而双主机方式即指两种不同业务分别在两台服务器上互为主备状态(即Active-Standby和Standby-Active状态)。
开始搭建实验环境(CentOS 7)
一、大致拓扑图:
拓扑图
主机 | ip地址 | 主机角色 | vip | keepalive-1 | 10.0.0.11 | keepalive+Nginx | vip1:10.0.0.100
vip2:10.0.0.200
| keepalive-2 | 10.0.0.12 | keepalive+Nginx | web-1 | 10.0.0.13 | web服务器 |
| web-2 | 10.0.0.14 | web服务器 |
|
说明: 负载均衡器(keepalive-1): 10.0.0.11(通过keepalived配置了vip:10.0.0.100和10.0.0.200供外使用)
负载均衡器(keepalive-2): 10.0.0.12(通过keepalived配置了VIP:10.0.0.100和10.0.0.200供外使用) 后端代理的web服务器(这里为了简单就使用Apache作为web服务):
10.0.0.13:80(web-1)
10.0.0.14:80(web-2)
二、实验步骤:
2.1、先弄好各主机的配置
1、配好ip地址,把selinux设置为disabled,在这里,我把firewalld防火墙也关掉了,设置为开机不启动,把yum源配置为阿里云的源。
2、在web-1和web-2,先用yum装好Apache服务,并配置好网页,这里就不写出来了。
3、为防止各台主机的时间不同步,在这里先同步一下时间
1
2
| yum install -y ntpdate
ntpdate -u 0.pool.ntp.org
|
2.2、在主机keepalive-1和keepalive-2上安装Nginx和keepalive(注:Nginx是源码编译安装的)
1、安装软件依赖包:
1
2
| yum-y groupinstall "Development Tools" "Server PlatformDeveopment"
yum-y install openssl-devel pcre-devel
|
2、下载Nginx安装包
3、添加Nginx用户和解压Nginx安装包 1
2
3
4
| useradd nginx
cd /usr/local/src
tar zxvf nginx-1.2.8.tar.gz
cd nginx-1.2.8
|
4、安装nginx包 1
2
|
./configure--prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module--with-http_flv_module --with-http_stub_status_module--with-http_gzip_static_module --with-pcre
|
5、开始编译
6、编译完成后,我们就可以启动Nginx了 1
2
3
4
5
| /usr/local/nginx/sbin/nginx -t ##检测Nginx配置是否正确
/usr/local/nginx/sbin/nginx ##启动Nginx
##注:
##如果Nginx进程已经存在了,则可以先杀死该进程再启动
ps -ef | grep nginx | awk '{print $2}'| xargs kill -9
|
7、启动成功后,我们就可以看到以下的web页面了
到此Nginx就已经编译安装完成了。
8、然后开始配置Nginx反向代理服务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| vim /usr/local/nginx/conf/nginx.conf
##找到server,并在server前面添加upstream,配置如下:
upstream web{
server 10.0.0.13:80 max_fails=3 fail_timeout=20s weight=2;
server 10.0.0.14:80 max_fails=3 fail_timeout=20s weight=2;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# root html;
# index index.html index.htm;
proxy_pass http://web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
}
}
|
然后检查配置是否正确,如果没有错误就重新读取Nginx的配置文件(如果之前没有启动Nginx,就直接启动Nginx就好了)
1
2
3
4
| [iyunv@keepalive-1 ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[iyunv@keepalive-1 ~]# /usr/local/nginx/sbin/nginx -s reload
|
访问Nginx,查看Nginx反向代理是否成功(Nginx反向代理成功)
[iyunv@keepalive-1 ~]# curl 10.0.0.11
It is web1
[iyunv@keepalive-1 ~]# curl 10.0.0.11
It is web2
[iyunv@keepalive-1 ~]# curl 10.0.0.11
It is web1
[iyunv@keepalive-1 ~]# curl 10.0.0.11
It is web2
到此Nginx就算配置好了,另外一台(keepalive-2)也是一样的配置。
2.3、开始配置keepalive
安装keepalive(这里使用yum安装就好了)
1
| yum install -y keepalived
|
开始配置keepalive文件(可以把原来的配置文件重命名为.bak作为备份,重新编辑一份配置文件)
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
| ##主机keepalive-1的配置文件:
[iyunv@keepalive-1 ~]# cat /etc/keepalived/keepalived.conf ##主机keepalive-1
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
#failover@firewall.loc
#sysadmin@firewall.loc
}
}
vrrp_script nginx_check { ##定义监控Nginx的脚本
script "/etc/keepalived/nginx_check.sh"
interval 1 ##没1s检测一次
weight -5 ##优先级减去5
fall 2
rise 1
}
vrrp_instance VI_1 { ##定义vrrptest实例
state MASTER ##服务器状态
interface ens33 ##使用的接口
virtual_router_id 51 ##虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
priority 150 ##服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER
advert_int 1 ##服务器之间的存活检查时间
authentication {
auth_type PASS ##认证类型
auth_pass 123456 ##认证密码,一组lvs 服务器的认证密码必须一致
}
virtual_ipaddress { ##虚拟IP地址
10.0.0.100
}
track_script { ##执行监控nginx进程的脚本
nginx_check
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.200
}
track_script {
nginx_check
}
}
|
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
| ##主机keepalive-2的配置文件:
[iyunv@keepalive-1 ~]# cat /etc/keepalived/keepalived.conf ##主机keepalive-2
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
#failover@firewall.loc
#sysadmin@firewall.loc
}
}
vrrp_script nginx_check { ##定义监控Nginx的脚本
script "/etc/keepalived/nginx_check.sh"
interval 1 ##没1s检测一次
weight -5 ##优先级减去5
fall 2
rise 1
}
vrrp_instance VI_1 { ##定义vrrptest实例
state BACKUP ##服务器状态
interface ens33 ##使用的接口
virtual_router_id 51 ##虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
priority 100 ##服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER
advert_int 1 ##服务器之间的存活检查时间
authentication {
auth_type PASS ##认证类型
auth_pass 123456 ##认证密码,一组lvs 服务器的认证密码必须一致
}
virtual_ipaddress { ##虚拟IP地址
10.0.0.100
}
track_script { ##执行监控nginx进程的脚本
nginx_check
}
} vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.200
}
track_script {
nginx_check
}
}
|
配置Nginx检查脚本,如果Nginx服务停掉了,自动关掉keepalive服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [iyunv@keepalive-1 ~]# cat /etc/keepalived/nginx_check.sh
#!/bin/bash
HOST=`hostname`
mail=123456@qq.com ##自己的邮箱地址
date=`date "+%F %H:%M:%S"`
pgrep nginx
if [ "$?" -ne "0" ]
then
systemctl stop keepalived
echo "Your nginx:$HOST in $date is dowm" | mail -s "Your nginx is dowm" $mail
fi
chmod a+x /etc/keepalived/nginx_check.sh
##加入计划任务
crontab -e
*/1 * * * * bash /etc/keepalived/nginx_check.sh >> /dev/null
|
在两台主机分别启动keepalive,可以看到VIP已经起来了
主机keepalive-1 主机keepalive-2 至此,所有服务就已经配置完成了,接下来就剩下测试了。
三、测试
1、先检查一下写的检查Nginx服务启用的脚本是否能够正常使用
1
2
3
4
5
6
7
8
9
10
| [iyunv@keepalive-1 ~]# bash -x /etc/keepalived/nginx_check.sh
++ hostname
+ HOST=keepalive-1
+ mail=123456@qq.com
++ date '+%F %H:%M:%S'
+ date='2017-10-22 17:21:36'
+ pgrep nginx
999
1005
+ '[' 0 -ne 0 ']'
|
经检查发现,该脚本是可以使用的(这里我并没有把Nginx服务停掉来测试)
2、在正常情况下使用vip来访问web服务,我们发现是可以正常访问的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [iyunv@localhost ~]# curl 10.0.0.100
It is web1
[iyunv@localhost ~]# curl 10.0.0.100
It is web2
[iyunv@localhost ~]# curl 10.0.0.100
It is web1
[iyunv@localhost ~]# curl 10.0.0.100
It is web2
[iyunv@localhost ~]#
[iyunv@localhost ~]# curl 10.0.0.200
It is web1
[iyunv@localhost ~]# curl 10.0.0.200
It is web2
[iyunv@localhost ~]# curl 10.0.0.200
is web1
[iyunv@localhost ~]# curl 10.0.0.200
It is web2
|
3、当我们把主机keepalive-1的Nginx服务停掉时,可以看到主机keepalive-1的keepalive服务已经停掉了,并且vip也迁移到了主机keepalive-2上了,主机keepalive-2出现了两个vip,并且此时也还是能正常访问web页面,说明我们的实验做成功了。
主机keepalive-1 主机keepalive-2 访问web页面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [iyunv@localhost ~]# curl 10.0.0.100
It is web1
[iyunv@localhost ~]# curl 10.0.0.100
It is web2
[iyunv@localhost ~]# curl 10.0.0.100
It is web1
[iyunv@localhost ~]# curl 10.0.0.100
It is web2
[iyunv@localhost ~]#
[iyunv@localhost ~]# curl 10.0.0.200
It is web1
[iyunv@localhost ~]# curl 10.0.0.200
It is web2
[iyunv@localhost ~]# curl 10.0.0.200
It is web1
[iyunv@localhost ~]# curl 10.0.0.200
It is web2
|
到这里,我们这次Nginx+keepalive双主机热备做负载均衡的实验就结束了。
|