设为首页 收藏本站
查看: 1302|回复: 1

[经验分享] Nginx+keepalive做双机热备(主主模式)实现负载均衡

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-10-24 10:02:28 | 显示全部楼层 |阅读模式
keepalive:
    简单一点来说,keepalive就是一个在TCP中可以检测死连接的机制。
    原理:
    keepalive的原理很简单,TCP会在空闲的时候发送数据给对方:

    如果主机可达,对方就会响应ACK应答,就会认为是该主机是存活的;
    如果主机可达,但应用程序退出,对方就会发RST应答,发送TCP撤销连接;
    如果可达,但应用程序崩溃了,对方主机就会发送FIN消息;
    如果对方主机不响应ACK、RST,则会继续发送,直到超时,就会撤销连接。(默认是2个小时)
双机热备:
        特指基于高可用系统中的两台服务器的热备(或高可用)。
        双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active-Active方式),主-备方式即指的是一台服务器处于某种业务的激活状态(即Active状态),另一台服务器处于该业务的备用状态(即Standby状态)。而双主机方式即指两种不同业务分别在两台服务器上互为主备状态(即Active-Standby和Standby-Active状态)。

开始搭建实验环境(CentOS 7)

一、大致拓扑图:


a32eba90c0bf79ff9ff129ce4229d9f5.jpg-wh_500x0-wm_3-wmp_4-s_4194782924.jpg
拓扑图


主机ip地址主机角色vip
keepalive-110.0.0.11keepalive+Nginxvip1:10.0.0.100
vip2:10.0.0.200
keepalive-210.0.0.12keepalive+Nginx
web-110.0.0.13web服务器
web-210.0.0.14web服务器
说明:
负载均衡器(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安装包
1
2
3
     cd /usr/local/src
     yum install -y wget
     wget http://nginx.org/download/nginx-1.2.8.tar.gz



    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、开始编译   
1
       make  && make install



    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页面了

f9a8df6126f4eec5ad29cfd48073e314.png-wh_500x0-wm_3-wmp_4-s_473513444.png
       到此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已经起来了

5e4427131d490f4a7ed369997e2d02ef.png-wh_500x0-wm_3-wmp_4-s_3749320176.png
主机keepalive-1
827f0b0f0b478b2f2d4d7a2a5400260e.png-wh_500x0-wm_3-wmp_4-s_389123398.png
主机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页面,说明我们的实验做成功了。
87c2e5868d4b4a7b371f5d3c156d6bd7.png-wh_500x0-wm_3-wmp_4-s_1354651888.png
主机keepalive-1
c55921bf7bc1b8642c82cfc7ebde4c5d.png-wh_500x0-wm_3-wmp_4-s_1544214008.png
主机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双主机热备做负载均衡的实验就结束了。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-405822-1-1.html 上篇帖子: 设置nginx开机自动启动 下篇帖子: nginx 配置https(可支持thinkphp的pathinfo模式)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表