lvs + keepalived 基本配置
介绍:LVS(Linux Virtual Server),即Linux虚拟服务器。通过
keepalived + nginx
,实现服务的高可用。
一、安装
-
准备keepalived安装包
-
安装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 文件
-
全局定义块
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 }
-
监控服务(监控脚本)
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
。 -
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
-
虚拟服务器定义
#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 } } }
三、启动
-
启动keepalived
执行命令
./keepalived -f /usr/local/keepalived/etc/keepalived.conf
-
查看虚拟ip
在主节点执行命令
ip a
如果在列表中查看到vip地址,则启动成功。(主机MASTER启动,备机BACKUP上虚拟ip则不生效)
-
日志默认位置
/var/log/messages
-
启动进程3个
- 父进程,负责监控其子进程
- vrrp子进程
- checkers子进程
-
查询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
-
四、测试
- 测试环境 CentOS 6.5
- 启动主/备机上keepalived,主机vip生效,备机vip未生效。
- 停掉主机keepalived,备机vip生效,主机vip失效。
- 启动主机keepalived,主机vip生效,备机vip失效。
- 测试过程中,vip地址均可正常访问,则测试通过。
五、问题解决
-
因文件格式导致脚本报错(syntax error near unexpected token `fi')
执行命令:
vim check_nginx.sh
查看脚本格式
:set ff
将dos格式修改为unix
:set ff=unix
保存退出
:wq
-
脚本无可执行权限
切换管理员帐号:
su root
添加可执行权限:
chmod +x check_nginx.sh
-
直接删除
/var/log/messages
日志文件,导致keepalived
无法启动解决方法:恢复日志
-
报错
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
生成适用
https
的digest
值./genhash -s 192.168.1.100 -p 443 -u /index.html --use-ssl
-
主备同时出现相同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
-
-
安装报错
configure: error: libnfnetlink headers missing
yum install -y libnfnetlink-devel
-
vip 可以
ping
通,但偶尔telnet
不通端口(50%概率)-
导致原因:keepalived与nginx配置在同一台服务器
-
解决方法:
virtual_server
中只保留本机 nginx 的real_server
配置。
-
六、补充
-
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)
-
-
负载均衡转发规则
-
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地址,可以直接路由至客户端 |