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模型部署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_announce0:默认,把本机的所以接口信息向每个接口通告
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 |