LVS/DR 模式负载均衡部署实现

零、前言

本文仅做个人记录,如也能为同行人提供帮助,那也是极好的。
[博主并不是主攻运维,所以仅做参考]

部署前推荐查阅:

一、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
DS172.17.0.10
RS1172.17.0.11
RS2172.17.0.12

选取 172.17.0.100 作为 VIP

0.2 LVS/DR 模式网络拓扑图

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产品服务。
这里仅做 运维知识点的了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值