Nginx+keepalived 实现高可用的负载均衡

一、前沿介绍
nginx 进程基于 Master+Slave(worker) 多进程模型,自身具有非常稳定的子进程管理功能。在 Master 进程分配模式下, Master 进程永远不进行业务处理,只是进行任务分发,从而达到 Master 进程的存活高可靠性, Slave(worker) 进程所有的业务信号都由主进程发出, Slave(worker) 进程所有的超时任务都会被 Master 中止,属于非阻塞式任务模型。
Keepalived Linux 下面实现 VRRP 备份路由的高可靠性运行件。基于 Keepalived 设计的服务模式能够真正做到主服务器和备份服务器故障时 IP 瞬间无缝交接。二者结合,可以构架出比较稳定的软件 Load  Balancer 方案。
二、nginx+keepalived 架构配置实战演示
采用两台服务器做 nginx 主备,后端采用两个 real server (可以随意扩展),数据库采用 mysql 主从(这里就不说主从的配置了!)架构图如下:
Server                ip
nginx master     192.168.1.108
nginx backup     192.168.1.110
Vip              192.168.1.100
real server1     192.168.1.105
real server2     192.168.1.103
三、开始nginx 的安装和配置
1 、创建供 Nginx 运行使用的组和帐号:
# groupadd -r nginx
# useradd -r -g nginx -s /sbin/nologin -M nginx
2 、编译安装 rewrite 模块支持包
下载 pcre 包到本地,版本选择 7.0 以上版本就可以,此处是 7.8 版本
#tar zxvf pcre-7.8.tar.gz
#cd  pcre-7.8/
#./configure
#make && make install
#cd ../
3 、编译安装 Nginx 服务
此处使用的 Nginx 版本为 0.7.64 ,可以使用其他版本,此处使用 1.0.10 版本
wget http://sysoev.ru/nginx/nginx-1.0.10.tar.gz
#tar zxvf nginx-1.0.10.tar.gz
#cd  nginx-1.0.10/
#./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_flv_module
#make && make install
#cd ../
4 、备份默认 nginx.conf 配置文件
#cd  /etc/nginx
#cp  nginx.conf  nginx.old
5 、配置 nginx 服务 (Master  Back up nginx 配置文件是一样的 )
1 )、在 nginx  Master 上进行配置,将 nginx 的默认配置文件修改为如下:
# cat  /etc/nginx/nginx.conf
user    nginx   nginx;
worker_processes  8;
pid     /var/run/nginx.pid;
worker_rlimit_nofile 51200;
events
{       use epoll;
        worker_connections      5120;
}
http
{
        include           mime.types;
        default_type  application/octet-stream;
        charset  gb2312;
        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        sendfile on;
        tcp_nopush         on;
        keepalive_timeout 60;
        tcp_nodelay on;
        gzip on;
        gzip_min_length  1k;
        gzip_buffers         4 16k;
        gzip_http_version 1.0;
        gzip_comp_level 2;
        gzip_types           text/plain application/x-javascript text/css application/xml;
        gzip_vary on;
        upstream srtweb {
                server  192.168.1.105:80;    // 此处的 IP 是后端的 Real Server IP
                server  192.168.1.103:80;    // 有几个 Real server 写几个
        }
        server {
                listen 80;
                server_name www.linuxgg.com;   // 可以为 hostname 也可以为 localhost
                location /{
                        root   html;
                        index  index.html index.htm;
                        proxy_pass      http://srtweb;
                        proxy_set_header Host   $host;
                        proxy_set_header X-Real-IP      $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }
        }
}
2 )、在 Nginx  Backup 上进行配置,和 Nginx  Master 上的配置一样,可以将 Nginx Master 上的 nginx.conf 配置文件拷贝到 Nginx Backup /etc/nginx/ 目录下面!
6 、启动测试 Nginx 服务
分别启动 Master Backup 服务器上的 Nginx 服务,
#/usr/sbin/nginx
查看 Nginx 监听的端口,如果监听正常,并且显示如下图说明 Nginx 服务启动成功!
#netstat  -tunlp
四、安装配置Keepalived
1 、安装 keepalived (在 Nginx Master Backup 上都要安装!)
wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
#tar zxvf keepalived-1.1.19.tar.gz
#cd keepalived-1.1.19
#./configure --prefix=/usr/local/keepalived
#make
#make install
#cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
#cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
#cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
#mkdir /etc/keepalived
#cd  /etc/keepalived/
2 、配置 nginx  master keepalived 配置文件
keepalived.conf 文件配置为如下内容即可!
# cat  /etc/keepalived/keepalived.conf
global_defs {
        notification_email {
               [email protected]
        }
        notification_email_from [email protected]
        smtp_server 127.0.0.1
        smtp_connect_timeout 30
        router_id  test1
}
vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        mcast_src_ip   192.168.1.108   //Nginx Master IP 地址
        priority 100                  // 此处的数值要比 Nginx Backup 中的高
        advert_int 1
        smtp_alert
        authentication {
                auth_type PASS
                auth_pass 123
        }
        virtual_ipaddress {
                192.168.1.100       //vip 地址        
        }
}
3 、配置 nginx  backup keepalived 配置文件
# cat  /etc/keepalived/keepalived.conf
global_defs {
        notification_email {
                [email protected]     // 定义 email 地址
        }
        notification_email_from [email protected]
        smtp_server 127.0.0.1
        smtp_connect_timeout 30
        router_id test2
}
vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 51
        mcast_src_ip  192.168.1.110   //Nginx Backup IP 地址
        priority 80
        advert_int 1
        smtp_alert
        authentication {
                auth_type PASS
                auth_pass 123
        }
         virtual_ipaddress {
                192.168.1.100    //vip 地址
        }
}
4 、启动 Nginx Master Nginx Backup 服务器上的 keepalived 服务
查看虚拟 IP 是否绑定!
# /etc/rc.d/init.d/keepalived start
  Starting keepalived:                                       [  OK  ]
1 )、首先在 Nginx  Master 上查看 IP 绑定的情况!

红色方框部分显示 VIP 已经加载到 Nginx  Master 服务器上了
2 )、其次查看 Nginx  Backup 服务器上 IP 情况!
#ip  addr


3 )、停止 Nginx Master 服务器上的 keepalived 服务,模拟 Nginx Master 宕机,看 backup 服务器是否接管 vip
#service  keepalived  stop
Stopping keepalived: [  OK  ]
然后再查看 Nginx Master 服务器上的 IP 绑定情况
#ip  addr
接下来查看 Nginx Backup 服务器是否接管了 vip
#ip  addr
说明 vip 已经可以正常切换!
补充说明 :不知道大家测试过没有,经过测试,如果 Master 服务器上的 nginx 服务宕掉了,而 keepalived 正常工作, vip 无法切换到 Backup 服务器上, nginx 提供的服务也就无法正常运行,如果停掉 keepalived 服务, vip 就可以切换到 Backup 服务器上,这说明控制 vip 切换的是 keepalived 服务,为了确保在 nginx 服务宕机的时候, vip 能正常切换到 Backup 服务器上,需要一个控制脚本,如下:
#vi /root/nginx_pid.sh
  #!/bin/bash
  nginxid=`ps �CC nginx --no-header | wc  -l`
  if [  $nginxid  -eq  0 ]; then
     /usr/loca/nginx/sbin/nginx
     sleep 5
     if [  $nginxid  -eq  0 ]; then
     /etc/init.d/keepalived stop
     fi
fi
此脚本思路其实也很简单,即放置在后台一直监控 nginx 进程;如进程消失,尝试重启 nginx ,如是失败则立即停掉本机的 keepalived 服务,让另一台负载均衡器接手即可。
五、vip 无法切换到从主服务器切换到从服务器的问题
1 、案例一
描述:配置好 Nginx 服务和 keepalived 服务后,停掉 Nginx Master Nginx 服务和 keepalived 服务, vip 却无法切换到 Nginx Backup 服务器上, Master Backup 日志分别显示如下:
#tail  /var/log/messages
Master 日志:
Backup 日志:

主从的日志都提到了 VRRP ,说是假的 VIP 报文接收在 eth0 上,其实 VRRP 的目的就是为了解决静态路由单点故障问题
解决方案:
改变主从配置文件 /etc/keepalived/keepalived.conf virtual_route_id 的值
virtual_router_id 60 主从方都要改,默认值为 51
原因:如果在同一网关 (192.168.1.1) 内建了 2 组集群, virtual_router_id 就重复了,改个不一样的就可以,不一定要 60
 
如有不足之处请指出!

你可能感兴趣的:(高可用负载均衡)