zoukankan      html  css  js  c++  java
  • Nginx + keepalived 实现高可用

            前两天成功配置了用 nginx 做负载均衡,此时 nginx 服务器存在单点故障的问题。可以通过使用 keepalived 实现高可用。网上搜了几篇文章,貌似都很简单,可是照着做时却遇到了不少问题。我的虚拟机是 ubuntu 16.04,碰到问题也许是别人的机器不是 ubuntu 吧。

    IP 分配:  

    IP 地址 安装软件
    192.168.137.47(主) Nginx + keepalived
    192.168.137.48 (备) Nginx + keepalived
    192.168.137.11 Tomcat
    192.168.137.12 Tomcat

    在 192.168.137.47 上:

           1. 安装 keepalived:   apt-get install keepalived

           2. 修改 /etc/keepalived/keepalived.conf 这个配置文件(我安装完后,这个配置文件并不存在,连 /etc/keepalived 这个文件夹都不存在,自己创建了),在文件里添加了如下内容:

        ! Configuration File for keepalived

    global_defs {
       notification_email {
         zonghsh001@126.com
       }
       notification_email_from zonghsh007@126.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id LVS_Master   # 随便取一个唯一的标识符,主机和备机需要用不同的值
       vrrp_skip_check_adv_addr
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }

    vrrp_script chk_http_port {
       script "/opt/programs/keepalived/etc/keepalived/check_nginx_pid.sh"
       interval 2
       weight 2
    }

    vrrp_instance VI_1 {
        #state MASTER
        state BACKUP # 主、备都设成 BACKUP,主机的配置里再加下面 nopreempt 的配置,这样主机 down 掉后,原来的备机(192.168.137.48)就成了新的主机,本机再启动起来后,不会迫使 192.168.137.48 重新成为备机。192.168.137.48 在正常工作着,完全没必要做这样的切换
        nopreempt  #备机上不需要此配置
        interface ens33 # 通过 ifconfig 得到的本机的网卡
        virtual_router_id 51
        #mcast_src_ip 192.168.137.48
        priority 100  # 主机的 priority 的值需要比备机的值至少大50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }

        track_script {
            chk_http_port
        }

        virtual_ipaddress {
            192.168.200.88/24 dev ens33 scope global  # 192.168.200.88 就是虚拟出来的 IP 地址,主机启动后,通过 ip a 就可以看到这个IP 地址绑定在了 ens33 这样网卡上,如果主机 down 了,备机就会拥有这个IP。
        }
    }

    上面的配置中,大括号前面都要有空格,一开始有几个地方我没有放空格,结果,怎么都出现不了那个虚拟的IP 地址。搞了好几个小时。。。。。。

    另外,用到的 check_nginx_pid.sh 内容如下(自己创建完后需要加上执行权限):

    #!/bin/bash
    A=`ps -C nginx --no-header |wc -l`        
    if [ $A -eq 0 ];then                            
          /opt/programs/tengine/sbin/nginx
          sleep 4       
          if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then  
                  killall keepalived                    
          fi
    fi

            3. 为了查看 keepalived 的日志,网上搜了一下,好像没有简单的方式,只有通过复杂的方式。如下:

                (1)在 /etc/rsyslog.conf 文件末尾添加如下一行:

                           local0.*       /var/log/keepalived.log

                (2)重启日志服务:    /etc/init.d/rsyslog restart

                (3)启动时添加参数:  -D -S 0

            4. 启动 keepalived:      keepalived -D -S 0 -f /etc/keepalived/keepalived.conf

    网上好多都说默认的配置文件地址是 /etc/keepalived/keepalived.conf, 但是我的好像不是,不指定的话,没有用到这个配置文件。对 ubuntu 不熟,上面的命令能执行,但是不知道它到底执行的是哪个目录下的 keepalived 执行文件。

            5. 启动成功后,在主机上运行 ip a 命令,可以发现类似下面的输出,出现了我们上面配置的 192.168.200.88 这个虚拟 IP 地址

               2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:d7:c0:62 brd ff:ff:ff:ff:ff:ff
        inet 192.168.137.48/24 brd 192.168.137.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet 192.168.200.88/24 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fed7:c062/64 scope link

           6. 在主机上运行  killall keepalived,这样原来的副机就变成的主机,在原来的副机上运行第5步中的命令,可以看到 192.168.200.88 这个虚拟IP 地址。

    诡异的事情来了,在别的机器竟然 ping 不通 192.168.200.88!! 网上搜了一下,可以主要检查的几点就是 http://zk2052041.blog.163.com/blog/static/1377237201533287298 里说的几点,可是我的问题依然存在,后来在搜索引擎里翻了几页,才看到有人说虚拟 IP 的网段应该设置成和真实 IP 同一个网段。我真实IP的网段是 192.168.137.XXX,我把上面的192.168.200.88 改成 192.168.137.88 后,终于成功了。

    另外, nginx 的配置文件中的 server_name 应该配置成上面的虚拟 IP 的地址,别人的教程是这么写的,但是奇怪的是我本机配成不一样的地址,仍然可以正常工作,这是因为这里的 server_name 可以看作仅仅是别名,nginx 想要监听某台机器的某个端口,   listen 的值应该配置成  192.168.137.88:80,只写端口号的话,表示的是本机。

    server {
            listen       80;
            server_name  192.168.137.88;

            location / {
                proxy_pass http://loadbalance;
                root   html;
                index  index.html index.htm;
            }

            location /status {
                check_status;
            }

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }

        }

  • 相关阅读:
    rsync命令 SCP命令
    Linux 性能分析 工具命令
    ntp时间服务器 时间同步
    Linux 邮件服务
    linux 手工释放内存 高内存 内存回收 方法思路
    LVM 逻辑卷 (logica volume manager)
    Linux 磁盘原理与管理 (分区 挂载)
    linux中查看nginx、apache、php、mysql配置文件路径
    shell脚本 监控ps 不存在则重启
    Shell脚本 一键重启
  • 原文地址:https://www.cnblogs.com/langfanyun/p/8506785.html
Copyright © 2011-2022 走看看