Nginx + keepalived 实现高可用HA 【主从架构】

来源:互联网 发布:画柜子软件 编辑:程序博客网 时间:2024/06/18 00:45

1) Keepalived 主从配置环境


        135与136的机器上安装了Nginx与Keepalived

        137与138的机器上安装了JDK1.8与Tomcat环境


2) Nginx 代理, 实现负载均衡

          2.1 ) 通过 conf/nginx.conf 配置实现
                    #注意: proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
                    #keys_zone=cache_one:200m 表示zone名称为cache_one, 分配的内存大小为200MB
                    #levels=1:2 表示缓存目录的第一级目录1个字符, 第二级目录是2个字符, 即/data/proxy_cache_dir/
                    #inactive=1d 表示这个zone中的缓存文件如果在1天内都没有被访问, 那么文件会被cache_manager进程删除掉
                    #max_size=30g 表示zone的硬盘容量为30GB
  
          2.2)  在conf/nginx.conf文件内容的server{.....}上面加上以下代码实现负载
                    
                    upstream backend_server {   // Name: backend_server                              server 192.168.73.137:8080 weight=1 max_fails=2 fail_timeout=30s;                              server 192.168.73.138:8080 weight=1 max_fails=2 fail_timeout=30s;                    }                    server {                              location {                                        .....                                        .....                                        proxy_pass http://backend_server;   // Name: 即上面的节点名称                                        .....                                        .....                              }                    }





3) Nginx + keepalived 实现高可用HA方法原理

   3.1) 下载keepalived

      -- #wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz      -- keepalived 1.3.x 我试过n次, 发现安装后, 在/usr/local/keepalived/etc目录下找不到rc.d目录, 所以后继文档记录, 以1.2.x版本介绍      #wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz


   3.2) 安装keepalived, 前提很在/usr/local目录下创建好keepalive目录

     #./configure --prefix=/usr/local/keepalived     如果安装出现以下错误提示:     !!! OpenSSL is not properly installed on your system. !!!     !!! Can not include OpenSSL headers files. !!!     请执行:     #yum -y install openssl-devel

   3.3) 编译  

      #make 编译 (make的过程是把各种语言写的源码文件,变成可执行文件和各种库文件)      #make install 安装 (make install是把这些编译出来的可执行文件和库文件复制到合适的地方)      也可以      #make; make install
  

  3.4) 复制文件

拷贝执行文件 #cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ 将init.d文件拷贝到etc下,加入开机启动项#cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived 将keepalived文件拷贝到etc下 #cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 创建keepalived文件夹 #mkdir -p /etc/keepalived 将keepalived配置文件拷贝到etc下 #cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf  添加可执行权限#chmod +x /etc/init.d/keepalived
     

   3.5) 设置keepalived服务开机启动

   #chkconfig keepalived on   #service keepalived start   #启动服务   #service keepalived stop    #停止服务   #service keepalived restart #重启服务


        另外需要注意的一点是,keepalived启动时不会检查配置文件的语法是否正确,所以我们在编写配置文件时要特别小心,别写错了,否则会出现一些意想不到的现象。
  
        使用service keepalived start命令启动服务时,默认会将/etc/sysconfig/keepalived文件中KEEPALIVED_OPTIONS参数作为keepalived服务启动时的参数,并从/etc/keepalived/目录下加载keepalived.conf配置文件,或用-f参数指定配置文件的位置。

# Options for keepalived. See `keepalived --help' output and keepalived(8) and# keepalived.conf(5) man pages for a list of all options. Here are the most# common ones :## --vrrp               -P    Only run with VRRP subsystem.# --check              -C    Only run with Health-checker subsystem.# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.# --dump-conf          -d    Dump the configuration data.# --log-detail         -D    Detailed log messages.日志默认输出在/var/log/message文件中# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)#KEEPALIVED_OPTIONS="-D"
  
        运行keepalived --help可以查看启动时的可选参数,这些可选参数都可以配置在/etc/sysconfig/keepalived文件中的KEEPALIVED_OPTIONS选项中,作为服务启动时的参数。


        keepalived正常运行后,会启动3个进程,其中一个是父进程,负责监控其子进程。一个是vrrp子进程,另外一个是checkers子进程。
#ps -ef | grep keepalivedroot       831     1  0 11:22 ?        00:00:00 keepalived -Droot       840   831  0 11:22 ?        00:00:00 keepalived -Droot       841   831  0 11:22 ?        00:00:00 keepalived -D

到此keepalived就安装完成了。


   3.6) 卸载keepalived程序

1) 进入keepalived的源码包#cd /usr/local/src/keepalived      #源码所在目录(根据实际情况进入对应目录)

2) 执行卸载程序#make uninstall

3) 删除相关文件#rm -f /usr/local/sbin/keepalived #rm -f /usr/local/etc/rc.d/init.d/keepalived#rm -f /usr/local/etc/sysconfig/keepalived#rm -rf /usr/local/etc/keepalived#rm -f /usr/local/bin/genhash

   3.7) keepalived.conf配置文件说明

        keepalived服务安装完成之后,后面的主要工作就是在keepalived.conf文件中配置HA和负载均衡。一个功能比较完整的常用的keepalived配置文件,主要包含三块:全局定义块、VRRP实例定义块和虚拟服务器定义块。全局定义块是必须的,如果keepalived只用来做ha,虚拟服务器是可选的。下面是一个功能比较完整的配置文件模板:
#全局定义块global_defs {    # 邮件通知配置    notification_email {        email1        email2    }    notification_email_from email    smtp_server host    smtp_connect_timeout num    lvs_id string    router_id string    ## 标识本节点的字条串,通常为hostname}#VRRP 实例定义块vrrp_sync_group string {     group {        string        string    }}vrrp_instance string {    state MASTER|BACKUP    virtual_router_id num    interface string    mcast_src_ip @IP     priority num    advert_int num    nopreempt    smtp_alert    lvs_sync_daemon_interface string     authentication {        auth_type PASS|AH        auth_pass string    }    virtual_ipaddress {  # Block limited to 20 IP addresses @IP        @IP        @IP    }}#虚拟服务器定义块virtual_server (@IP PORT)|(fwmark num) {     delay_loop num    lb_algo rr|wrr|lc|wlc|sh|dh|lblc     lb_kind NAT|DR|TUN    persistence_timeout num     protocol TCP|UDP    real_server @IP PORT {         weight num        notify_down /path/script.sh        TCP_CHECK {             connect_port num             connect_timeout num        }    }    real_server @IP PORT {        weight num        MISC_CHECK {            misc_path /path_to_script/script.sh(or misc_path “/path_to_script/script.sh <arg_list>”)        }    }    real_server @IP PORT {        weight num        HTTP_GET|SSL_GET {            url {                 # You can add multiple url block path alphanum                digest alphanum            }            connect_port num            connect_timeout num             nb_get_retry num             delay_before_retry num        }    }}


   3.8) 全局定义块

1、email通知(notification_email、smtp_server、smtp_connect_timeout):用于服务有故障时发送邮件报警,可选项,不建议用。需要系统开启sendmail服务,建议用第三独立监控服务,如用nagios全面监控代替。 2、lvs_id:lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。 3、router_id:用户标识本节点的名称,通常为hostname 4、花括号{}:用来分隔定义块,必须成对出现。如果写漏了,keepalived运行时不会得到预期的结果。由于定义块存在嵌套关系,因此很容易遗漏结尾处的花括号,这点需要特别注意。

   3.9) VRRP实例定义块

1) vrrp_sync_group:同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪2) group:至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致3) vrrp_instance:vrrp实例名    A) state:实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的服务会自动把它的状态由BACKUP切换到MASTER状态。当失效的MASTER所在的服务恢复时,BACKUP从MASTER恢复到BACKUP状态。    B) interface:对外提供服务的网卡接口,即VIP绑定的网卡接口。如:eth0,eth1。当前主流的服务器都有2个或2个以上的接口(分别对应外网和内网),在选择网卡接口时,一定要核实清楚。    C) mcast_src_ip:本机IP地址    D) virtual_router_id:虚拟路由的ID号,每个节点设置必须一样,可选择IP最后一段使用,相同的 VRID 为一个组,他将决定多播的 MAC 地址。    E) priority:节点优先级,取值范围0~254,MASTER要比BACKUP高    F) advert_int:MASTER与BACKUP节点间同步检查的时间间隔,单位为秒    G) lvs_sync_daemon_inteface:负载均衡器之间的监控接口,类似于 HA HeartBeat 的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口    H) authentication:验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用PASS类型,据说AH使用时有问题。验证密码为明文,同一vrrp 实例MASTER与BACKUP使用相同的密码才能正常通信。    I) smtp_alert:有故障时是否激活邮件通知    G) nopreempt:禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。    H) virtual_ipaddress:虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致。



   3.10) 虚拟服务器virtual_server定义块

1.virtual_server:定义一个虚拟服务器,这个ip是virtual_ipaddress中定义的其中一个,后面一个空格,然后加上虚拟服务的端口号。    A) delay_loop:健康检查时间间隔,单位:秒    B) lb_algo:负载均衡调度算法,互联网应用常用方式为wlc或rr    C) lb_kind:负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。    D) persistence_timeout:http服务会话保持时间,单位:秒    E) protocol:转发协议,分为TCP和UDP两种2.real_server:真实服务器IP和端口,可以定义多个    A) weight:负载权重,值越大,转发的优先级越高    B) notify_down:服务停止后执行的脚本    C) TCP_CHECK:服务有效性检测       * connect_port:服务连接端口       * connect_timeout:服务连接超时时长,单位:秒       * nb_get_retry:服务连接失败重试次数       * delay_before_retry:重试连接间隔,单位:秒





4) Nginx + keepalived 动手练习

        基于上面的拓扑图练习, Nginx1(别名Master1)与Nginx2(别名Master2)。
        在Master1与Master2两台Linux机器上,都要配置好 /etc/keepalived/keepalived.conf 文件与 /data/sh/check_nginx.sh 两个文件, 在Master1上写好这些配置文件,可通过scp /etc/keepalived/keepalived.conf root@192.168.73.136:/etc/keepalived 跨Linux电脑拷贝。

        4.1) 在Master1与Master2机器上创建并修改文件: /etc/keepalived/keepalived.conf

#全局定义块  global_defs {      # 邮件通知配置      notification_email {          1349594420@qq.com    }    notification_email_from 1349594420@qq.com      smtp_server 127.0.0.1      smtp_connect_timeout 30     router_id LVS_DEVEL    ## 标识本节点的字条串,通常为hostname  }vrrp_script chk_nginx {script "/data/sh/check_nginx.sh"  ## 检查Nginx是否存活的一个角本interval 2                        ## 重试两次weight 2                          ## 权重}#VIP 1vrrp_instance VI_1 {state BACKUP                     ## 状态,表示开机启动的状态interface eth0                   ## 网卡(注意, 去CentOS系统中看一下网卡名称是多少, CentOS安装默认叫Auto eth1, 用#ip addr list命令查看一下)lvs_sync_daemon_interface eth0   ## 互联通讯的网卡virtual_router_id 151            ## 路由ID, 局域网内的路由ID,必须唯一性priority 100                     ## 优先级(Master1机器如设置为100, Master2机器得设置为90)advert_int 5          nopreempt                        ## 不抢占        authentication {                 ## 认证auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.73.100           ## 前调用户访问就是这个IP (在Master1与Master2两台电脑的eth0网卡上虚拟一个IP地址)}track_script {chk_nginx}}

        4.2) 配置Nginx的运行信号进程检查check_nginx.sh

#mkdir -p /data/sh/#vi check_nginx.sh##!/bin/bash##auto check nginx process##2017-08-20 Tobinkillall -0 nginx  ##不是杀掉,而是检测nginx信号是否正常运行中if [[ $? -ne 0 ]];then      /etc/init.d/keepalived stop  ## 注意:这里千万不要用pkill或其它方式杀,因为用keepalived停止它会先检查一下信号进程,如果是pkill他的信号进程来不急检查, 就会造成它的VIP来不急推掉. 这时就导致两台服务器都有相同的VIP地址, 结果会造成客户端无法访问.fi
#chmod o+x check_nginx.sh

        4.3) 过程的测试常用命命令

#/etc/init.d/keepalived restart   -- 启动 keepalived#tail -fn 100 /var/log/messages   -- 查看 keepalived 状态日志

Aug 20 20:49:13 localhost Keepalived_healthcheckers[3922]: Registering Kernel netlink command channel
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) removing protocol VIPs.
Aug 20 20:49:13 localhost Keepalived_healthcheckers[3922]: Opening file '/etc/keepalived/keepalived.conf'.
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: Using LinkWatch kernel netlink reflector...
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: IPVS: Protocol not available
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) Entering BACKUP STATE
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(11,12)]
Aug 20 20:49:13 localhost Keepalived_healthcheckers[3922]: Using LinkWatch kernel netlink reflector...
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: VRRP_Script(chk_nginx) succeeded
Aug 20 20:49:18 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) Effective priority = 102
Aug 20 20:49:28 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) Transition to MASTER STATE
Aug 20 20:49:33 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) Entering MASTER STATE

Aug 20 20:49:33 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) setting protocol VIPs.
Aug 20 20:49:33 localhost Keepalived_vrrp[3923]: Sending gratuitous ARP on eth1 for 192.168.73.100
Aug 20 20:49:33 localhost Keepalived_healthcheckers[3922]: Netlink reflector reports IP 192.168.73.100 added