Jusene's Blog

负载均衡集群之LVS NAT DR模型实战

字数统计: 1.2k阅读时长: 5 min
2017/04/23 Share

ipvsadm

ipvs/ipvsadm

ipvs是内核协议栈上的实现,ipvsadm是用户空间的集群服务管理工具,想要使用lvs就必须先要知道linux内核是否已经编译进了ipvs的代码,查看:

1
~]#grep -i ipvs -A 10 /boot/config-`uname -r`

绝大多数的linux发行版已经将lvs的代码自动编译进内核中,接下来我们只要使用ipvsadm来管理ipvs规则即可。

管理集群服务

ipvsadm -A|E -t|u|f service-address [-s scheduler]

  • -A: 增加
  • -E: 修改
  • -t: tcp
  • -u: udp
  • -f: firwall mark

service-address:

  • -t,tcp,vip:port
  • -u,udp,udp:port
  • -f,fwrm,mark

-s scheduler:默认为wlc

管理集群上的RS

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

  • -a:增
  • -e:改
  • -g,gateway,dr
  • -i,ipip,tun
  • -m,masquerade,nat
  • -w,weight

查看集群配置

ipvsadm -L|l [options]

  • -n,–numeric:数字形式
  • –exact:精确值
  • -c,–connection:显示IPVS连接
  • –stats:统计数据
  • –rate:速率

清空集群配置

-C:clear

集群配置保存和重载

保存:
ipvsadm -S > /PATH/TO/SOME_RULE_FILE
ipvasdm-save > /PATH/TO/SOME_RULE_FILE

重载:
ipvsadm -R < /PATH/TO/SOME_RULE_FILE
ipvsadm-restore < /PATH/TO/SOME_RULE_FILE

清空计数器:

ipvsadm -Z [-t|u|f service-address]

负载均衡集群设计时的要点

负载均衡集群中为了保证数据的一致性,我们往往需要涉及就是共享存储:

  • NAS:Network Attached Storage, 文件服务器,访问接口是文件级别(nfs,samba)
  • SAN:Storage Area Network,访问接口是块级别;scsi协议借助于其他网络技术(fc,以太网)
  • DS:Distributed Storage,分布式存储,访问接口通常是文件级别,接口可是文件系统,也可以api
    或者我们也可以实时进行数据同步:
    rsync+inotify

常见数据格式:

  • 结构化数据:存储于sql数据库
  • 半结构化数据:xml,json,存储于文件系统或者NoSQL
  • 非结构化数据:文件系统,DS

LVS-NAT

设计要点:
(1)dip与rip要在同一个ip网络,rip的网关要指向dip
(2)支持端口转发
(3)是否用到共享存储取决于业务需求

LVS-NAT

目的:采用lvs-nat模型部署wordpress应用服务
vip:10.211.55.39
dip:10.37.129.8
rip: 10.37.129.10 10.37.129.11

nfs server

1
~]# yum install -y rpcbind nfs_utils
2
~]# mkdir -p /www /mysql
3
~]# chown -R apache.apache /www
4
~]# chown -R mysql.mysql /mysql
5
~]# systemctl start rpcbind
6
~]# systemctl start nfs
7
~]# cat /etc/exports
8
/www 10.37.129.0/24 (rw,sync,no_root_squash)
9
/mysql 10.37.129.0/24 (rw,sync,no_root_squash)
10
~]# exportfs -rv

real server

1
~]# showmount -e 10.37.129.12
2
~]# mkdir /www
3
~]# mkdir /mysql
4
~]# mount -t nfs 10.37.129.12:/mysql /mysql
5
~]# mount -t nfs 10.37.129.12:/www  /www
6
将mysql的数据目录和httpd的程序目录分别放到/mysql和/www
7
~]# systemctl start mysql
8
~]# systemctl start httpd

程序测试完成后进行负载均衡配置
两台real server

1
~]# ip route add default gw 10.37.129.8

lvs

1
~]# sysctl -w net.ipv4.ip_forward=1
2
~]# ipvsadm -A -t 10.211.55.39:80 -s sh
3
~]# ipvsadm -a -t 10.211.55.39:80 -r 10.37.129.10:80 -m
4
~]# ipvsadm -a -t 10.211.55.39:80 -r 10.37.129.11:80 -m

LVS-DR

在各主机(director)均要配置vip;因此,需要解决地址的冲突问题,目标是让各rs上的vip不可见,仅用于接收目标地址为vip的报文,同时可作为响应报文的源地址。
(1)在前端的网关接口上静态绑定
(2)在各rs上使用arptable
(3)在各rs上修改内核参数,来限制arp响应和通告
限制响应级别:arp_ignore

  • 0:使用本地任意接口上配置的地址进行响应

  • 1:仅在请求的目标ip配置在本地主机的接入报文接口上时,才给予响应

  • 2-8:
    限制通告级别:arp_announce

  • 0:默认,把本机的所以接口信息向每个接口通告

  • 1:尽量避免向非本网络通告

  • 2:总是避免

    设计要点:
    (1)各主机一个接口即可,但需要在同一物理网络中
    (2)rip的网关不能指向dip;rip和dip通常应该在同一网络,但此二者必定会与vip在同一网络
    (3)各rs需要先设置内核参数,再设置vip和路由

vip:10.37.129.12
dip:10.37.129.8
rip: 10.37.129.10 10.37.129.11

服务的配置不再累赘

直接负载均衡配置dr模型
两台real server

1
~]# echo 1> /proc/sys/net/ipv4/conf/all/arp_ignore
2
~]# echo 1> /proc/sys/net/ipv4/conf/lo/arp_ignore
3
~]# echo 2> /proc/sys/net/ipv4/conf/all/arp_announce
4
~]# echo 2> /proc/sys/net/ipv4/conf/lo/arp_announce
5
~]# ifconfig lo:0 10.37.129.12 netmask 255.255.255.255 broadcast 10.37.129.12
6
~]# route add -host 10.37.129.12 dev lo:0

lvs配置

1
~]# sysctl -w net.ipv4.ip_forward=1
2
~]# ifconfig eth0:0 10.37.129.12 netmask 255.255.255.255 broadcast 10.37.129.12
3
~]# route add -host 10.37.129.12 dev eth0:0
4
~]# ipvsadm -A -t 10.37.129.12:80 -s sh
5
~]# ipvsadm -a -t 10.37.129.12:80 -r 10.37.129.10:80 -g
6
~]# ipvsadm -a -t 10.37.129.12:80 -r 10.37.129.11:80 -g
CATALOG
  1. 1. ipvsadm
    1. 1.1. 管理集群服务
    2. 1.2. 管理集群上的RS
    3. 1.3. 查看集群配置
    4. 1.4. 清空集群配置
    5. 1.5. 集群配置保存和重载
    6. 1.6. 清空计数器:
  2. 2. 负载均衡集群设计时的要点
    1. 2.1. LVS-NAT
    2. 2.2. LVS-DR