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 TCPreal_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 serverdigest的值用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 missingyum 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地址,可以直接路由至客户端 |
posted on
浙公网安备 33010602011771号