erfsfd 发表于 2017-10-24 10:02:28

Nginx+keepalive做双机热备(主主模式)实现负载均衡

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


       到此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:80max_fails=3 fail_timeout=20s weight=2;
               server 10.0.0.14:80max_fails=3 fail_timeout=20s weight=2;
         }
         server {
               listen       80;
               server_namelocalhost;
               #charset koi8-r;
               #access_log logs/host.access.logmain;
               location / {
               #    root   html;
               #    indexindex.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
          # /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
          # /usr/local/nginx/sbin/nginx -s reload




         访问Nginx,查看Nginx反向代理是否成功(Nginx反向代理成功)   
            # curl 10.0.0.11
            It is web1
            # curl 10.0.0.11
            It is web2
            # curl 10.0.0.11
            It is web1
            # 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的配置文件:
    # 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的配置文件:
    # 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
   # 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
   # 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
    # curl 10.0.0.100
    It is web1
    # curl 10.0.0.100
    It is web2
    # curl 10.0.0.100
    It is web1
    # curl 10.0.0.100
    It is web2
    #
    # curl 10.0.0.200
    It is web1
    # curl 10.0.0.200
    It is web2
    # curl 10.0.0.200
   is web1
    # 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
    # curl 10.0.0.100
    It is web1
    # curl 10.0.0.100
    It is web2
    # curl 10.0.0.100
    It is web1
    # curl 10.0.0.100
    It is web2
    #
    # curl 10.0.0.200
    It is web1
    # curl 10.0.0.200
    It is web2
    # curl 10.0.0.200
    It is web1
    # curl 10.0.0.200
    It is web2





    到这里,我们这次Nginx+keepalive双主机热备做负载均衡的实验就结束了。



sdylag 发表于 2017-10-25 00:56:12

{:6_395:}{:6_403:}感谢分享。
页: [1]
查看完整版本: Nginx+keepalive做双机热备(主主模式)实现负载均衡