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、为防止各台主机的时间不同步,在这里先同步一下时间
yum install -y ntpdate ntpdate -u 0.pool.ntp.org
2.2、在主机keepalive-1和keepalive-2上安装Nginx和keepalive(注:Nginx是源码编译安装的)
1、安装软件依赖包:
yum-y groupinstall "Development Tools" "Server PlatformDeveopment" yum-y install openssl-devel pcre-devel
2、下载Nginx安装包
cd /usr/local/src yum install -y wget wget http://nginx.org/download/nginx-1.2.8.tar.gz
3、添加Nginx用户和解压Nginx安装包
useradd nginx cd /usr/local/src tar zxvf nginx-1.2.8.tar.gz cd nginx-1.2.8
4、安装nginx包
./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、开始编译
make && make install
6、编译完成后,我们就可以启动Nginx了
/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反向代理服务。
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就好了)
[root@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 [root@keepalive-1 ~]# /usr/local/nginx/sbin/nginx -s reload
访问Nginx,查看Nginx反向代理是否成功(Nginx反向代理成功)
[root@keepalive-1 ~]# curl 10.0.0.11
It is web1
[root@keepalive-1 ~]# curl 10.0.0.11
It is web2
[root@keepalive-1 ~]# curl 10.0.0.11
It is web1
[root@keepalive-1 ~]# curl 10.0.0.11
It is web2
到此Nginx就算配置好了,另外一台(keepalive-2)也是一样的配置。
2.3、开始配置keepalive
安装keepalive(这里使用yum安装就好了)
yum install -y keepalived
开始配置keepalive文件(可以把原来的配置文件重命名为.bak作为备份,重新编辑一份配置文件)
##主机keepalive-1的配置文件: [root@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 } }
##主机keepalive-2的配置文件: [root@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服务
[root@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服务启用的脚本是否能够正常使用
[root@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服务,我们发现是可以正常访问的。
[root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# [root@localhost ~]# curl 10.0.0.200 It is web1 [root@localhost ~]# curl 10.0.0.200 It is web2 [root@localhost ~]# curl 10.0.0.200 is web1 [root@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页面
[root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# [root@localhost ~]# curl 10.0.0.200 It is web1 [root@localhost ~]# curl 10.0.0.200 It is web2 [root@localhost ~]# curl 10.0.0.200 It is web1 [root@localhost ~]# curl 10.0.0.200 It is web2
到这里,我们这次Nginx+keepalive双主机热备做负载均衡的实验就结束了。
转载于:https://blog.51cto.com/3381847248/1975117