lvs + keepalived 安装及配置

lvs + keepalived 基本配置


介绍:LVS(Linux Virtual Server),即Linux虚拟服务器。通过keepalived + nginx,实现服务的高可用。

一、安装

  1. 准备keepalived安装包

    官网下载地址

  2. 安装keepalived

    安装必要工具

     yum install -y gcc openssl-devel popt-devel
    

    安装keepalived

     tar xzf keepalived-1.4.3.tar.gz
     cd keepalived-1.4.3
     ./configure --prefix=/usr/local/keepalived/
     make && make install
    

二、配置

修改 keepalived.conf 文件

  1. 全局定义块

     global_defs
     {
     	#邮件通知
     	#指定keepalived在发生切换时需要发送email到的对象,一行一个
     	notification_email
     	{
     		acassen@firewall.loc;
     		failover@firewall.loc;
     		sysadmin@firewall.loc;
     	}
     	#指定发件人
     	notification_email_from Alexandre.Cassen@firewall.loc
     	#指定smtp服务器地址
     	smtp_server 192.168.200.1
     	#指定smtp连接超时时间
     	smtp_connect_timeout 30
    
     	#在局域网内应该是唯一的(与backup节点区分开)。
     	router_id KEEPALIVED.192.168.80.110
     }
    
  2. 监控服务(监控脚本)

     vrrp_script chk_nginx
     {
     	#执行脚本的路径
     	script "/etc/nginx/check_nginx.sh"
     	#调用脚本两次之间的间隔,默认为1秒
     	interval 1
     	#第二次调用脚本后多长时间没有回应的超时时间
     	timeout 10
     	weight 10 
     }
    

    check_nginx.sh 文件内容

     #!/bin/bash
     if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
     then
     	/usr/local/nginx/sbin/nginx 
     	sleep 5
     	if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
     	then
     		killall keepalived
     	fi
     fi
    

    注意:/usr/local/nginx/sbin/nginx 确保 nginx 启动的正确性。可修改为/usr/local/nginx/sbin/nginx -c /home/nginx/nginx-1.13.7/conf/nginx.conf

  3. vrrp实例

     vrrp_instance VI_1
     {
     	#状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。
     	state BACKUP
     	#设置实例绑定网卡
     	interface eht0
     	#虚拟路由标识,同一个vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。
             # 取值 1 ~ 255
     	virtual_router_id 110
     	#优先级,同一个vrrp_instance的MASTER优先级必须比BACKUP高。
     	priority 101 
     	#MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。
     	advert_int 1
     	#设置为不抢占(这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高)
     	#nopreempt 
    
     	#设置认证
     	authentication
     	{
     		auth_type PASS
     		auth_pass 1111
     	}
    
     	#虚拟ip(vip)地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的 vip 相一致!
     	virtual_ipaddress
     	{
     		192.168.80.200
     	}
    
     	#调用监控脚本
     	track_script
     	{
     		chk_nginx
     	}
     }
    

    查看网卡使用情况命令

     watch cat /proc/net/dev
    
  4. 虚拟服务器定义

     #VIP地址,要和vrrp_instance模块中的virtual_ipaddress地址一致
     virtual_server 192.168.80.200 443 
     {
     	#设置运行情况检查时间,单位是秒
     	delay_loop 6
     	#lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
     	#rr,即轮询算法
     	lb_algo rr
     	#负载均衡转发规则NAT|DR|TUN 
     	lb_kind NAT
     	#会话保持时间
     	persistence_timeout 50
     	#使用的协议TCP|UDP
     	protocol TCP
    
     	real_server 192.168.32.103 443 {
     		weight 3
     		#realserver的状态检测设置部分
     		#TCP_CHECK {            
         	#	connect_timeout 10
         	#	nb_get_retry 3        
         	#	delay_before_retry 3    
         	#	connect_port 80
     		#}
    
     		SSL_GET {
         		url {
     			#	#检查url   
           			path /
     			#   #检查后的摘要信息
           			digest de189aa6fbe0f5890e75fc8d8bcf4f90  
         		}  
         		connect_timeout 5  
         		nb_get_retry 3  
         		delay_before_retry 3  
     		}
     	}
    
     	real_server 192.168.32.104 443 {
     		weight 3
     		#realserver的状态检测设置部分
     		#TCP_CHECK {            
         	#	connect_timeout 10
         	#	nb_get_retry 3        
         	#	delay_before_retry 3    
         	#	connect_port 80
     		#}
    
     		SSL_GET {   
         		connect_timeout 5  
         		nb_get_retry 3  
         		delay_before_retry 3  
     		} 
     	}
     }
    

三、启动

  1. 启动keepalived

    执行命令

     ./keepalived -f /usr/local/keepalived/etc/keepalived.conf
    
  2. 查看虚拟ip

    在主节点执行命令

     ip a
    

    如果在列表中查看到vip地址,则启动成功。(主机MASTER启动,备机BACKUP上虚拟ip则不生效)

  3. 日志默认位置

     /var/log/messages
    
  4. 启动进程3个

    • 父进程,负责监控其子进程
    • vrrp子进程
    • checkers子进程
  5. 查询vip绑定情况

    • 查看日志

      执行命令

        tail -f /var/log/messages
      

      结果

        Registering new address record for 192.168.80.200 on eth0.IPv4.
      

      需等待地址注册成功后(配置地址较多,会比较慢),虚拟地址才可正常访问。

    • 查看vip绑定情况

      执行命令

        ipvsadm -L
      

        ipvsadm -L -n --stats
      

      ipvsadm安装

四、测试

  • 测试环境 CentOS 6.5
  • 启动主/备机上keepalived,主机vip生效,备机vip未生效。
  • 停掉主机keepalived,备机vip生效,主机vip失效。
  • 启动主机keepalived,主机vip生效,备机vip失效。
  • 测试过程中,vip地址均可正常访问,则测试通过。

五、问题解决

  1. 因文件格式导致脚本报错(syntax error near unexpected token `fi')

    执行命令:

     vim check_nginx.sh 
    

    查看脚本格式

     :set ff
    

    将dos格式修改为unix

     :set ff=unix
    

    保存退出

     :wq
    
  2. 脚本无可执行权限

    切换管理员帐号:

     su root
    

    添加可执行权限:

     chmod +x check_nginx.sh
    
  3. 直接删除/var/log/messages日志文件,导致keepalived无法启动

    解决方法:恢复日志

  4. 报错 MD5 digest error to server

    digest的值用genhash生成,genhash由keepalived自带,一般位于安装目录中的bin目录,生成方法:

     ./genhash -s [realserverIP] -p [port] -u [url]
    

    例,

     ./genhash -s 192.168.1.100 -p 80 -u /index.html
    

    参数查看

     ./genhash -h
    

    生成适用httpsdigest

     ./genhash -s 192.168.1.100 -p 443 -u /index.html --use-ssl
    
  5. 主备同时出现相同vip

    • 问题解释:备节点收不到主节点的通告,认为主节点故障,切换状态,发布VIP。

    • 导致原因:两节点的上联交换机禁用了组播;防火墙没有允许vrrp或者组播流量;

    • 设置vrrp单播通告

      修改主备机 keepalived.conf 文件,在 vrrp_instance 中添加如下配置:

        ## source ip
        unicast_src_ip  192.168.32.104
        ## dest ip       
        unicast_peer {
        	192.168.32.103               
        }
      
    • 配置iptables

      执行命令

        vim /etc/sysconfig/iptables
      

      添加

        -A INPUT -p vrrp -j ACCEPT
      

      或者

        -A INPUT -m pkttype --pkt-type multicast -j ACCEPT
      

      重启iptables

        service iptables restart
      
  6. 安装报错 configure: error: libnfnetlink headers missing

     yum install -y libnfnetlink-devel
    
  7. vip 可以 ping 通,但偶尔 telnet 不通端口(50%概率)

    • 导致原因:keepalived与nginx配置在同一台服务器

    • 解决方法:virtual_server中只保留本机 nginx 的real_server配置。

六、补充

参考

  1. lvs调度算法

    • rr:轮循(Round Robin)

    • wrr:加权轮循(Weighted Round Robin)

    • lc:最少连接数(Least Connection)

    • wlc:加权最少连接(Weighted Least Connection)

    • lblc:基于局部性的最少链接(Locality-Based Least Connections)

    • sh:源地址散列(Source Hashing)

    • dh:目标地址散列(Destination Hashing)

  2. 负载均衡转发规则

    • NAT:网络地址转换(Network Address Translation)

    • DR:直接路由(Direct Routing)

    • TUN:IP隧道(IP tunneling)

比较:

NAT TUN DR
服务器节点要求 任何操作系统 必须支持IP隧道模式 服务结点支持虚拟网卡设备,能够禁用设备的ARP响应
网络要求 可以是拥有私有IP地址的局域网络 拥有合法IP地址的局域网或广域网 拥有合法IP地址的局域网,服务结点与均衡器必须在同一个网段
支持节点数 10~20个,视负载均衡器处理能力而定 可支持到100个服务结点 可支持到100个服务结点
网关 负载均衡器即为服务器节点网关 服务结点同自己的网关或路由器连接,不经过负载均衡器 服务结点同自己的网关或路由器连接,不经过负载均衡器
服务结点安全性 采用内部IP,服务节点隐蔽 采用公网IP地址,结点完全暴露 采用公网IP地址,结点完全暴露
IP要求 仅需一个合法IP地址作为VIP 除VIP外,每个服务结点需拥有合法的IP地址,可以直接路由至客户端 除VIP外,每个服务结点需拥有合法的IP地址,可以直接路由至客户端
原文地址:https://www.cnblogs.com/wscy/p/8867959.html