LVS+Keepalived小试牛刀
一、LVS
1、基本命令操作
1.1)添加规则
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout] [-M netmast] [--pepersistence_engine] [-b sched-flags]
1.2)删除规则
ipvsadm -D -t|u|f service-address
1.3)清空定义的所有内容
ipvsadm -C
1.4)重载
ipvsadm -R
1.4)保存
ipvsadm -S [-n]
1.5)增、改RS规则
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
1.6)删除RS规则
ipvsadm -d -t|u|f service-address -r server-address
1.7)查看规则列表
ipvsadm -Ln|l [options] --numeric, -n: 以数字形式输出地址和端口号 --exact: 扩展信息,精确值 --stats: 统计信息 --rate: 输出速率信息
1.8)清空计数器
ipvsadm -Z [-t|u|f service-address]
1.9)ipvs规则
/proc/net/ip_vs
2.0)ipvs连接
/proc/net/ip_vs_conn
2、保存及重载规则
2.1)保存:建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save -n > /PATH/TO/IPVSADM_FILE ipvsadm -Sn > /PATH/TO/IPVSADM_FILE systemctl stop ipvsadm.service
2.2)重载:
ipvsadm-restore < /PATH/TO/IPVSADM_FILE ipvsadm -R < /PATH/TO/IPVSADM_FILE systemctl restart ipvsadm.service
3、NAT模式
设计要点:
1)RIP与DIP在同一IP网络,RIP的网关要指向DIP
2)支持端口映射
3)Director要打开核心转发功能
配置:
4.管理集群服务:增,改,删
4.1)增、改:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout]
4.2)删除:
ipvsadm -D -t|u|f service-address
4.3)service-address:
-t|u|f: -t:TCP协议的端口,VIP:TCP_PORT -u:UDP协议的端口,VIP:UDP_PORT -f:firewall MARK,标记,一个数字 [-s scheduler]:指定集群的调度算法:默认为wlc
5.管理集群上的RS:增、改、删
5.1)增、改:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
5.2)server-address:
rip[:port] 如省略port,不作端口映射
5.3)选项:
lvs类型:
-g:gateway, dr类型,默认 -i:ipip, tun类型 -m:masquerade,nat类型 -w weight:权重
6.ipvs scheduler
6.1)ipvs scheduler:根据其调度是否考虑各RS当前的负载状态
两种:静态方法和动态方法
6.2)静态方法:仅根据算法本身进行调度
1、RR: roundrobin, 轮训 2、WRR: Weighted RR, 加权轮训 3、SH: Source Hashing, 实现session sticky, 源IP地址hash; 将来自同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定 4、DH: Destination Hashing; 目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS, 典型使用场景是正向代理缓存场景中的负载均衡,如:带宽运营商
实验:实现NAT模式的LVS(必须原路返回)
ip_forward=1 route add default gw 192.168.0.201 # -t:tcp, -s wrr:加权 轮训 ipvsadm -A -t 172.20.0.200:80 -s wrr # -m: NAT模式;默认:DR模式,不支持映射到不同端口;-w:权重,默认是1 ipvsadm -a -t 172.20.0.200:80 -r 192.168.30.17:8080 -m -w 3 ipvsadm -a -t 172.20.0.200:80 -r 192.168.30.27:8080 -m 2.router:路由器配置 ip_forward=1 route add default gw 192.168.0.200
4、DR模式
1.DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
1.1) 在前端网关做静态绑定 1.2) 在各RS使用arptables 1.3) 在各RS修改内核参数,来限制arp响应和通告的级别
2.限制响应级别:arp_ignore
2.1) 0:默认值,表示可使用本地任意接口上配置在任意地址响应
2.2) 1:仅在请求目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
3.限制通告级别:arp_announce
3.1) 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通知 3.2) 1:尽量避免将接口信息向非直接连接网络进行通知 3.3) 2:必须避免将接口信息向非网络进行通告
实验:实现DR模式的LVS(不原路返回)
步骤一:准备3台虚拟机
步骤二:先配置3台虚拟机的网络
1)eth0 配置在一个网段 2)DIP,RIP配置在一个网段
步骤三:配置lvs的VIP
1)ifconfig ens33:0 192.168.182.100/24 2)echo "1" > /proc/sys/net/ipv4/ip_forward
步骤四(RS):调整RS的响应,通告级别(每一台RS都配)
1)echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore 2)echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 3)echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce 4)echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
步骤五:在RS上配置VIP
1)ifconfig lo:8 192.168.182.100 netmask 255.255.255.255
步骤六:启动RS上的httpd服务
1)yum install httpd -y 2)cd /var/www/html vi index.html from ooxxip 3)service httpd start 客户端验证:RIP:80能显示 VIP:80不能显示
步骤七:LVS---ipvsadm
1)yum install ipvsadm -y # -t:tcp, -s rr:轮训 2)ipvsadm -A -t 192.168.182.100:80 -s rr # -m: NAT模式;默认:DR模式,不支持映射到不同端口;-w:权重,默认是1;-g:DR模型,-m:NET模型 3)ipvsadm -a -t 192.168.182.128:80 -r 192.168.182.129 -g ipvsadm -a -t 192.168.182.128:80 -r 192.168.182.130 -g 4)ipvsadm -ln 5)浏览器刷新:访问vip 6)ipvsadm -lnc 7)netstat -natp
5、TUN模式
6、FULL-NAT模式
二、Keepalived
2.1)安装以及基本操作
# 安装
yum install keepalived -y
# 启动
service keepalived start
# 配置文件位置
/etc/keepalived/keepalived.conf
# 查看日志
tail /var/log/message
2.2)具体配置步骤
步骤一:至少准备四台虚拟机 步骤二:调整RS的响应,通告级别(每一台RS都配) echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 步骤三:在RS上配置VIP,切记(DR模式)不要忘了在RS配置VIP,要不然数据包会被丢弃 ifconfig lo:8 192.168.182.100 netmask 255.255.255.255 步骤四:在RS安装启动httpd服务 1)yum install httpd -y 2)cd /var/www/html vi index.html from ooxxip 3)service httpd start 步骤五:给两台keepalived机子安装keepalived(一主一备) 1)yum -y install keepalived 2)yum -y install ipvsadm 步骤六:配置keepalived配置文件 # 先备份 1)cp -a /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak 2)cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr # vrrp_strict 如果还是访问不了VIP,可以把这行注释掉 vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { # 主 state MASTER # 备 state BACKUP interface ens33 virtual_router_id 51 # 主 priority 100 # 备 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.182.100/32 dev ens33 label ens33:7 } } virtual_server 192.168.182.100 80 { delay_loop 6 lb_algo rr lb_kind DR
nat_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 192.168.182.130 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.182.131 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
3)复制一份修改好的配置到从主机
cd /etc/keepalived/ && scp ./keepalived.conf root@192.168.182.129:`pwd`
4)启动
/bin/systemctl start keepalived.service
5)RS切记关闭防火墙,如果web也访问不了,lvs也可以关闭防火墙试试
systemctl stop firewalld
5)查看是否配置了VIP
6)查看是否配置了规则
7)主未挂,备则会自动配置规则,但是不会配置VIP,保证只有一个VIP对外提供服务
一旦主挂了,则备接管(测试,down掉主网卡:ifconfig ens33 down)
缺点:脑裂问题
分析原因:keepalived自身不是高可用,主进程可能会被杀死,但是进程杀死后,没有回收VIP,导致主keepalived无法广播,备keepalived得不到主的广播信号,导致备也会配上VIP,使得主备都有VIP,最后CIP访问VIP的三次握手可能会被打散到主备keepalived上,无法建立连接,导致无法访问。
解决方案:1.写一个自动脚本,定时巡检主keepalived进程是否还存活,如果被杀死,则重启主keepalived服务
2.换用更高级的高可用技术(zookeeper),后续会有zookeeper相应的文章
最后附上keepalived配置文件说明:
! Configuration File for keepalived global_defs { #全局定义部分 notification_email { #设置报警邮件地址,可设置多个 acassen@firewall.loc #接收通知的邮件地址 } notification_email_from test0@163.com #设置 发送邮件通知的地址 smtp_server smtp.163.com #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25) smtp_connect_timeout 30 #设置 连接 smtp server的超时时间 router_id LVS_DEVEL #主机标识,用于邮件通知 vrrp_skip_check_adv_addr vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播 vrrp_garp_interval 0 vrrp_gna_interval 0 script_user keepalived_script #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。 } vrrp_script chk_nginx_service { #VRRP 脚本声明 script "/etc/keepalived/chk_nginx.sh" #周期性执行的脚本 interval 3 #运行脚本的间隔时间,秒 weight -20 #权重,priority值减去此值要小于备服务的priority值 fall 3 #检测几次失败才为失败,整数 rise 2 #检测几次状态为正常的,才确认正常,整数 user keepalived_script #执行脚本的用户或组 } vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称 state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP interface ens33 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息 virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致 priority 100 #定义优先级,数字越大,优先级越高。 advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样 authentication { #设置验证类型和密码,两个节点必须一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个 192.168.119.130 } track_script { #脚本监控状态 chk_nginx_service #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20 } notify_master "/etc/keepalived/start_haproxy.sh start" #当前节点成为master时,通知脚本执行任务 notify_backup "/etc/keepalived/start_haproxy.sh stop" #当前节点成为backup时,通知脚本执行任务 notify_fault "/etc/keepalived/start_haproxy.sh stop" #当当前节点出现故障,执行的任务; } virtual_server 192.168.119.130 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开 delay_loop 6 #每隔6秒查询realserver状态 lb_algo rr #后端调试算法(load balancing algorithm) lb_kind DR #LVS调度类型NAT/DR/TUN #persistence_timeout 60 同一IP的连接60秒内被分配到同一台realserver protocol TCP #用TCP协议检查realserver状态 real_server 192.168.119.120 80 { weight 1 #权重,最大越高,lvs就越优先访问 TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒无响应超时 retry 3 #重连次数3次 delay_before_retry 3 #重连间隔时间 connect_port 80 #健康检查realserver的端口 } } real_server 192.168.119.121 80 { weight 1 #权重,最大越高,lvs就越优先访问 TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒无响应超时 retry 3 #重连次数3次 delay_before_retry 3 #重连间隔时间 connect_port 80 #健康检查realserver的端口 } } } vrrp_instance VI_2 { #vrrp 实例部分定义,VI_1自定义名称 state BACKUP #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP 分别表示(主|备) interface ens33 #网卡设置,绑定vip的子接口,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息 virtual_router_id 52 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致 priority 90 #定义优先级,数字越大,优先级越高。 advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样 authentication { #设置验证类型和密码,两个节点必须一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个 192.168.119.131 } } virtual_server 192.168.119.131 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开 delay_loop 6 #每隔6秒查询realserver状态 lb_algo rr #后端调试算法(load balancing algorithm) lb_kind DR #LVS调度类型NAT/DR/TUN #persistence_timeout 60 #同一IP的连接60秒内被分配到同一台realserver protocol TCP #用TCP协议检查realserver状态 real_server 192.168.119.120 80 { weight 1 #权重,最大越高,lvs就越优先访问 TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒无响应超时 retry 3 #重连次数3次 delay_before_retry 3 #重连间隔时间 connect_port 80 #健康检查realserver的端口 } } real_server 192.168.119.121 80 { weight 1 #权重,最大越高,lvs就越优先访问 TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒无响应超时 retry 3 #重连次数3次 delay_before_retry 3 #重连间隔时间 connect_port 80 #健康检查realserver的端口 } } }