• Nginx + Keepalived 高可用
    • 说明
    • 搭建
  • 全局配置
  • 邮箱通知配置,keepalived 在发生切换时需要发送 email 到的对象,一行一个
  • 指定发件人
  • notification_email_from Alexandre.Cassen@firewall.loc
  • 指定smtp服务器地址
  • smtp_server 192.168.200.1
  • 指定smtp连接超时时间,单位秒
  • smtp_connect_timeout 30
  • (重点)脚本监控实现
  • 运行脚本
  • 时间间隔,2秒
  • 权重
    • 启动各自服务
    • 高可用测试
  • 资料

    Nginx + Keepalived 高可用

    说明

    • 高可用 HA(High Availability),简单讲就是:我某个应用挂了,自动有另外应用起来接着扛着,致使整个服务对外来看是没有中断过的。这里的重点就是不中断,致使公司整个业务能不断进行中,把影响减到最小,赚得更多。
    • 因为要不中断,所以我们就需要用到了 Keepalived。Keepalived 一般不会单独使用,基本都是跟负载均衡软件(LVS、HAProxy、Nginx)一起工作来达到集群的高可用效果。
    • Keepalived 有双主、主备方案
    • 常用词:
      • 心跳:Master 会主动给 Backup 发送心跳检测包以及对外的网络功能,而 Backup 负责接收 Master 的心跳检测包,随时准备接管主机。为什么叫心跳不知道,但是挺形象的,心跳同步。
      • 选举:Keepalived 配置的时候可以指定各台主机优先级,Master 挂了,各台 Backup 要选举出一个新的 Master。
    • Keepalived
      • 官网:http://www.keepalived.org/
      • 官网下载:http://www.keepalived.org/download.html
      • 官网文档:http://www.keepalived.org/documentation.html

    搭建

    • 软件版本:
      • Nginx:1.8.1
      • Keepalived:1.2.20
      • JDK:8u72
      • Tomcat:8.0.32
    • 部署环境(下文中以第几台来代表这些主机):
      • 虚拟 IP(VIP):192.168.1.50
      • 第一台主机:Nginx 1 + Keepalived 1 == 192.168.1.120(Master)
      • 第二台主机:Nginx 2 + Keepalived 2 == 192.168.1.121(Backup)
      • 第三台主机:Tomcat 1 == 192.168.1.122(Web 1)
      • 第四台主机:Tomcat 2 == 192.168.1.123(Web 2)
    • 所有机子进行时间校准:NTP(Network Time Protocol)介绍
    • 第三、第四台主机部署:
      • JDK 的安装:JDK 安装
      • Tomcat 的安装:Tomcat 安装和配置、优化
    • 第一、二台主机部署(两台部署内容一样):
      • Nginx 的安装:Nginx 安装和配置
      • 添加虚拟 IP:
        • 复制一个网卡信息:sudo cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:0
        • 编辑配置文件:sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0:0
        • 修改内容为如下信息:
          1. DEVICE=eth0:0 >>> 这个需要修改
          2. TYPE=Ethernet
          3. UUID=8ddbb256-caab-4ddf-8e9a-6527b4ac5a26
          4. ONBOOT=yes
          5. NM_CONTROLLED=yes
          6. BOOTPROTO=none
          7. IPADDR=192.168.1.50 >>> 这个需要修改
          8. PREFIX=24
          9. GATEWAY=192.168.1.1
          10. DNS1=101.226.4.6
          11. DEFROUTE=yes
          12. IPV4_FAILURE_FATAL=yes
          13. IPV6INIT=no
          14. NAME="System eth0:0" >>> 这个需要修改
          15. HWADDR=00:0c:29:f4:17:db
          16. LAST_CONNECT=1460213205
        • 重启网卡服务:service network restart
        • 如果你要绑定更多虚拟 IP,则多复制几个网卡配置出来,命名如下:ifcfg-eth0:0,ifcfg-eth0:1,ifcfg-eth0:2 ……
      • Keepalived 开始安装
        • 安装依赖:sudo yum install -y gcc openssl-devel popt-devel
        • 解压包:cd /opt/setups/ ; tar zxvf keepalived-1.2.20.tar.gz
        • 编译:cd /opt/setups/keepalived-1.2.20 ; ./configure --prefix=/usr/program/keepalived
        • 编译安装:make && make install
      • Keepalived 设置服务和随机启动
        • 复制配置文件到启动脚本目录:cp /usr/program/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
        • 增加权限:chmod +x /etc/init.d/keepalived
        • 编辑配置文件:vim /etc/init.d/keepalived
          1. 15 行的:. /etc/sysconfig/keepalived,改为:
          2. . /usr/program/keepalived/etc/sysconfig/keepalived(注意:前面有一个点和空格需要注意)
        • 添加环境变量:vim /etc/profile
          1. # Keepalived 配置
          2. KEEPALIVED_HOME=/usr/program/keepalived
          3. PATH=$PATH:$KEEPALIVED_HOME/sbin
          4. export KEEPALIVED_HOME
          5. export PATH
        • 刷新环境变量:source /etc/profile
        • 检测环境变量:keepalived -v
        • ln -s /usr/program/keepalived/sbin/keepalived /usr/sbin/
        • vim /usr/program/keepalived/etc/sysconfig/keepalived
          1. 14 行的:KEEPALIVED_OPTIONS="-D",改为:
          2. KEEPALIVED_OPTIONS="-D -f /usr/program/keepalived/etc/keepalived/keepalived.conf"
        • 加入随机启动:chkconfig keepalived on
    • 第一、二台主机配置(两台在 Keepalived 配置上稍微有不一样):

      • 健康监测脚本(我个人放在:/opt/bash 目录下):nginx_check.sh
      • 健康监测脚本添加执行权限:chmod 755 /opt/bash/nginx_check.sh
      • 运行监测脚本,看下是否有问题:sh /opt/bash/nginx_check.sh,如果没有报错,则表示改脚本没有问题
        • 这个脚本很重要,如果脚本没法用,在启用 Keepalived 的时候可能会报:Keepalived_vrrp[5684]: pid 5959 exited with status 1
      • nginx 配置(两台一样配置):

        1. worker_processes 1;
        2. events {
        3. worker_connections 1024;
        4. }
        5. http {
        6. include mime.types;
        7. default_type application/octet-stream;
        8. sendfile on;
        9. keepalive_timeout 65;
        10. # (重点)
        11. upstream tomcatCluster {
        12. server 192.168.1.122:8080 weight=1;
        13. server 192.168.1.123:8080 weight=1;
        14. }
        15. # (重点)
        16. server {
        17. listen 80;
        18. server_name 192.168.1.50;
        19. location / {
        20. proxy_pass http://tomcatCluster;
        21. index index.html index.htm;
        22. }
        23. }
        24. }
      • Keepalived 配置文件编辑(第一、二台配置稍微不同,不同点具体看下面重点说明)

        • 编辑:vim /usr/program/keepalived/etc/keepalived/keepalived.conf

        ``` nginx
        ! Configuration File for keepalived

        全局配置

        global_defs {

        邮箱通知配置,keepalived 在发生切换时需要发送 email 到的对象,一行一个

        notification_email {

        1. #acassen@firewall.loc
        2. #failover@firewall.loc
        3. #sysadmin@firewall.loc

        }

        指定发件人

        Alexandre.Cassen@firewall.loc" class="reference-link">notification_email_from Alexandre.Cassen@firewall.loc

        指定smtp服务器地址

        smtp_server 192.168.200.1

        指定smtp连接超时时间,单位秒

        smtp_connect_timeout 30

        router_id LVS_DEVEL
        vrrp_skip_check_adv_addr
        vrrp_strict
        }

        (重点)脚本监控实现

        vrrp_script check_nginx {

        运行脚本

        script “/opt/bash/nginx_check.sh”

        时间间隔,2秒

        interval 2

        权重

        weight 2
        }

    1. vrrp_instance VI_1 {
    2. # (重点)Backup 机子这里是设置为:BACKUP
    3. state MASTER
    4. interface eth0
    5. virtual_router_id 51
    6. # (重点)Backup 机子要小于当前 Master 设置的 100,建议设置为 99
    7. priority 100
    8. # Master 与 Backup 负载均衡器之间同步检查的时间间隔,单位是秒
    9. advert_int 1
    10. authentication {
    11. auth_type PASS
    12. auth_pass 1111
    13. }
    14. # (重点)配置虚拟 IP 地址,如果有多个则一行一个
    15. virtual_ipaddress {
    16. 192.168.1.50
    17. }
    18. # (重点)脚本监控调用
    19. track_script {
    20. check_nginx
    21. }
    22. }
    23. ```

    启动各自服务

    • 四台机子都停掉防火墙:service iptables stop
    • 先启动两台 Tomcat:sh /usr/program/tomcat8/bin/startup.sh ; tail -200f /usr/program/tomcat8/logs/catalina.out
      • 检查两台 Tomcat 是否可以单独访问,最好给首页加上不同标识,好方便等下确认是否有负载
        • http://192.168.1.122:8080
        • http://192.168.1.123:8080
    • 启动两台 Nginx 服务:/usr/local/nginx/sbin/nginx
    • 启动两台 Keepalived 服务:service keepalived start
    • 查看 Master 和 Backup 两台主机的对应日志:tail -f /var/log/messages

    高可用测试

    • 模拟 Keepalived 挂掉
      • 关闭 Master 主机的 Keepalived,查看 Master 和 Backup 两台主机的对应日志:tail -f /var/log/messages
        • 关闭服务:service keepalived stop
        • 如果第二台机接管了,则表示成功
      • 重新开启 Master 主机的 Keepalived,查看 Master 和 Backup 两台主机的对应日志:tail -f /var/log/messages
        • 重启服务:service keepalived restart
        • 如果第一台机重新接管了,则表示成功
    • 模拟 Nginx 挂掉
      • 关闭 Master 主机的 Nginx,查看 Master 和 Backup 两台主机的对应日志:tail -f /var/log/messages
        • 关闭服务:/usr/local/nginx/sbin/nginx -s stop
        • 如果第二台机接管了,则表示成功
      • 重新开启 Master 主机的 Nginx,查看 Master 和 Backup 两台主机的对应日志:tail -f /var/log/messages
        • 重启 Nginx 服务:/usr/local/nginx/sbin/nginx -s reload
        • 重启 Keepalived 服务:service keepalived restart
        • 如果第一台机重新接管了,则表示成功
    • 可以优化的地方,改为双主热备,监控脚本上带有自启动相关细节,后续再进行。
    • 日志中常用的几句话解释:
      • Entering to MASTER STATE,变成 Master 状态
        • Netlink reflector reports IP 192.168.1.50 added,一般变为 Master 状态,都要重新加入虚拟 IP,一般叫法叫做:虚拟 IP 重新漂移到 Master 机子上
      • Entering BACKUP STATE,变成 Backup 状态
        • Netlink reflector reports IP 192.168.1.50 removed,一般变为 Backup 状态,都要移出虚拟 IP,一般叫法叫做:虚拟 IP 重新漂移到 Master 机子上
      • VRRP_Script(check_nginx) succeeded,监控脚本执行成功

    资料

    • http://xutaibao.blog.51cto.com/7482722/1669123
    • https://m.oschina.net/blog/301710
    • http://blog.csdn.net/u010028869/article/details/50612571
    • http://blog.csdn.net/wanglei_storage/article/details/51175418