LVS/DR 模式负载均衡实现
零、前言
本文仅做个人记录,如也能为同行人提供帮助,那也是极好的。
[博主并不是主攻运维,所以仅做参考]
部署前推荐查阅:
- LVS 项目的官方中文文档(项目背景了解项目必读!!):http://www.linuxvirtualserver.org/zh/lvs1.html
- keepalived 官方网站:https://www.keepalived.org/
一、lvs 部署
(0)、部署说明
0.0 可以查看当前虚拟机对 lvs 的支持
grep -i -C 10 ipvs /boot/config-3.10.0-862.14.4.el7.x86_64
ps: 文件 config-xxxxxxxxxx.x86_64 请以虚拟机为准,如果不知,可通过
ls /boot
命令查看。
0.1 本次部署环境
服务器 | IP |
---|---|
DS | 172.17.0.10 |
RS1 | 172.17.0.11 |
RS2 | 172.17.0.12 |
选取 172.17.0.100
作为 VIP
0.2 LVS/DR 模式网络拓扑图
(1)、DS 服务器设置
1.0 服务器配置
-
添加虚拟IP(VIP)
ip addr add 172.17.0.100/20 dev eth0 label eth0:0 # 也可以使用如下写法 # ifconfig eth0:0 172.17.0.100 netmask 255.255.240.0 # 使用以下其中一种方式进行查看校验,是否添加成功 ip addr show ifconfig -a
请注意,以上两种都属于临时设置,network重启后消失
-
配置IP转发
cat /proc/sys/net/ipv4/ip_forward # 该文件表示是否发开IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 0 表示不转发, 1 表示转发,默认为 0
1.1 安装 ipvsadm
- Step 1. 检查yum源,并安装
yum list ipvsadm # 检查 yum 源的安装包 yum install -y ipvsadm # 安装 ipvsadm rpm -ql ipvsadm # 查看 ipvsadm 相关套件是否被安装
1.2 配置 ipvsadm
-
ipvsadm 配置语法说明:
·添加虚拟服务器 语法: ipvsadm -A [-t|u|f] [vip_addr:port] [-s:指定算法] 参数: -A: 添加 -t: TCP协议 -u: UDP协议 -f: 防火墙标记 -D: 删除虚拟服务器记录 -E: 修改虚拟服务器记录 -C: 清空所有记录 -L: 查看 ================================================================================ ·添加RS(RealServer) 语法: ipvsadm -a [-t|u|f] [vip_addr:port] [-r ip_addr] [-g|i|m] [-w 指定权重] 参数: -a: 添加 -t: TCP协议 -u: UDP协议 -f: 防火墙标记 -r: 指定后端realserver的IP -g: DR模式 -i: TUN模式 -m: NAT模式 -w: 指定权重 -d: 删除realserver记录 -e: 修改realserver记录 -l: 查看
配置后,可以使用如下命令进行查看刚才所配置的参数
ipvsadm -l ipvsadm -ln # 采取数字ip的方式显示配置
如有错误,使用如下命令进行清除
ipvsadm -C systemctl restart network # 清理完后重启网络
-
进行配置
# 接下来配置 LVS-DR 模式 ipvsadm -A -t 172.17.0.100:80 -s rr # 创建DR,并指定调度算法采用 rr ipvsadm -a -t 172.17.0.100:80 -r 172.17.0.11 -g # 添加RS ipvsadm -a -t 172.17.0.100:80 -r 172.17.0.12 -g # 添加RS ipvsadm -ln # 检查
(2)、RS 服务器设置(RS每台机子同样的操作)
1.0 安装 apache 的 httpd
这里的 httpd 仅用于 lvs 部署的直观测试,可以使 Nignx 等其他服务
yum list httpd #检查 yum 上 httpd 版本
yum install httpd #安装 httpd
systemctl start httpd #启动命令
systemctl stop httpd #定制命令
cd /etc/httpd/conf #配置文件的路径,可修改端口等信息,这里不做修改,默认 80
cd /var/www/html #静态页面存放路径
可以写入有区分的标识性内容,例如:
-
RS1
cd /var/www/html vim index.html 172.17.0.11
-
RS2
cd /var/www/html vim index.html 172.17.0.12
设置完后进行测试是否能够访问
curl 172.17.0.11
curl 172.17.0.12
1.1 RS服务器自身配置
-
Step.1 抑制ARP
# 抑制 ARP echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce # 默认 0 echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce # 默认 0 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore # 默认 0 echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore # 默认 0
-
Step.2 绑定VIP到lo
ifconfig lo:0 172.17.0.100 netmask 255.255.255.255
这里的子网掩码必须为
255.255.255.255
,避免产生请求死循环
抑制ARP说明
作用: 在 lvs/DR 部署模式中,主要为了防止 真实服务器 响应VIP的请求
-
arp_ignore
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询 -
arp_announce
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
(3)、测试有效性
curl 172.17.0.100 # 命令多执行几次,检查内容是否有交替性变更(因为是rr策略)
DS 服务器端也可以通过 ipvsadm
命令查看内容
ipvsadm -ln
ipvsadm -lnc # 具体到记录
二、配合 keepalived 实现高可用
DS服务器端
-
Step.0 前置准备
如
一、lvs部署
章节中一致,配置 VIP、安装好 ipvsadm 即可。
ipvsadm 的配置交给 keepalived 应用。 -
Step1. keepalived 的安装
yum list keepalived # 检查 yum 源的安装包 yum install keepalived # 安装
-
Step2. 配置文件路径
cd /etc/keepalived # 配置文件所在路径
-
Step3. 配置文件内容
global_defs { notification_email { # 事故通知邮箱 example@example.com # 收件人 } notification_email_from Alexandre.Cassen@firewall.loc # 发件人 smtp_server 172.17.0.1 # 邮件服务器地址 smtp_connect_timeout 30 # 邮件服务器超时时间 router_id LVS_01 # 全局唯一标识 } vrrp_instance VI_1 { state MASTER # keepalived 角色, MASTER 或 BACKUP interface eth0 # 通信接口,将下面的virtual_ipaddress(VIP)绑定到这个网卡 virtual_router_id 51 # vrrp_instance的唯一标识 priority 100 # keepalived权重,数值越大权重越大,MASTER应大于BACKUP advert_int 1 # 发送心跳间隔,如果backup1秒收不到心跳就接管,单位是秒 authentication { # 节点之间通信验证类型、密码 ,同一 VRRP 实例中,MASTER / BACKUP 必须使用相同的密码才可以通信 auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.17.0.100/20 # VIP,如果有多个,直接每行一个即可 } } virtual_server 172.17.0.100 80 { # 定义虚拟服务器 delay_loop 6 # 健康检查时间周期,单位 秒 lb_algo wrr # 调度算法 rr/wrr/lc/wlc/lblc/sh/dh/... lb_kind DR # 负载模式 DR/TUN/NAT net_mask 255.255.240.0 # 子网掩码 #persistence_timeout 50 # 会话保持时间,单位是秒;在这个时间内,连接都会跑到当前服务上 protocol TCP # 转发协议类型,支持 TCP 、UDP real_server 172.17.0.11 80 { # 定义真实节点服务器 weight 1 # 节点权重 TCP_CHECK { # 健康检测方式,支持 HTTP_GET 、SSL_GET 、TCP_CHECK 、SMTP_CHECK 、MISC_CHECK connect_timeout 10 # 无响应超时时间,单位 秒 nb_get_retry 3 # 重试次数 delay_before_retry 3 # 重试间隔,单位 秒 connect_port 80 # 检测端口,不指定时默认为 real_server 指定的端口 } real_server 172.17.0.12 80 { # 定义真实节点服务器 weight 1 # 节点权重 TCP_CHECK { # 健康检测方式,支持 HTTP_GET 、SSL_GET 、TCP_CHECK 、SMTP_CHECK 、MISC_CHECK connect_timeout 10 # 无响应超时时间,单位 秒 nb_get_retry 3 # 重试次数 delay_before_retry 3 # 重试间隔,单位 秒 connect_port 80 # 检测端口,不指定时默认为 real_server 指定的端口 }
-
Step4. 启动 keepalived
systemctl start keepalived ipvsadm -
三、lvs 快速部署的脚本文件
-
DS 脚本(如果配合 keepalived 应用,则将 ipvsadm 配置部分删除)
VIP=172.17.0.100 # lb暴露IP RIP1=172.17.0.11 # real server1 的 IP RIP2=172.17.0.12 # real server2 的 IP . /etc/rc.d/init.d/functions case "$1" in start) echo "start LVS of DirectorServer" #Set the Virtual IP Address /sbin/ifconfig eth0:1 $VIP netmask 255.255.240.0 up # 给均衡器添加一个内网IP #Set the ip forward echo "1" > /proc/sys/net/ipv4/ip_forward #Clear IPVS Table /sbin/ipvsadm -C # 手工清空原来表内容 #Set Lvs /sbin/ipvsadm -A -t $VIP:80 -s rr # -A添加地址,-t指定VIP TCP端口,-s指定调度算法:rr轮询算法 /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g # -a指定真实服务器, -t lvs上VIP,-r真实服务器ip及端口,-g先择DR模式(-m为NAT模式) /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g #Run Lvs /sbin/ipvsadm -ln ;; stop) /sbin/ipvsadm -C /bin/ifconfig eth0:1 down echo "0" > /proc/sys/net/ipv4/ip_forward echo "close LVS Directorserver" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac
-
RS 脚本
VIP=172.17.0.100 . /etc/rc.d/init.d/functions case "$1" in start) echo "reparing for Real Server" echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce /sbin/ifconfig lo:0 ${VIP} netmask 255.255.255.255 broadcast ${VIP} up /sbin/route add -host ${VIP} dev lo:0 ;; stop) /sbin/ifconfig lo:0 down echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "clear Real Server" ;; *) echo "Usage: lvs {start|stop}" exit 1 esac
四、部署校验会用到的shell命令
netstat -natp
# 抓包验证
tcpdump -i eth0 tcp port 80 -n # 仅看端口 80
tcpdump -i eth0 -e -nn 'dst port 80' # 精确目标端口
sudo tcpdump -i eth0 -e -nn -s 0 -c 50 'dst port 80' and src net 172.17.0.11 -w ./test.cap # 生成cap文件,可用于 wireshark 查看
五、其他碎碎念
一些云服务 VPC 下并不好部署 lvs/DR 模式。
原因主要在于存储在 arp 的映射表中的地址统一为 网关地址,结果修改上去的 MAC 是网关地址,造成 RS 无法接收到信息。
在中小企业需要负载均衡时,建议走云服务的lb产品服务。
这里仅做 运维知识点的了解。