ipvs:内核中的协议栈上实现;
ipvs实现工具:
ipvsadm:用户空间的集群服务管理工具;
实现ipvs功能的:ipvs,以及ipvs上的规则;
四层交换或四层路由;
一个ipvs主机(director)可以同时定义多个cluster service;
一个ipvs服务至少应该有一个rs;
编辑内核的三种模式:
编进内核,编成模块,互编译;
一般针对于性能来说,ipvs是不能编译成模块的,
(1)查看当前系统是否支持ipvs:因为ipvs本身就是内核中的功能,通过一些驱动完成;
grep -i -A 10 ‘IPVS‘ /boot/config-3.10.0-327.el7.x86_64
可以查看ipvs支持的那些调度方法,以及ipvs支持协议;
(2)安装ipvsadm
yum install -y ipvsadm
(3)启动ipvsadm.service(类似于iptables,但这不是一个服务,启动它的主要是为了装在保存在内核中的规则)
[[email protected] yum.repos.d]# rpm -ql ipvsadm/etc/sysconfig/ipvsadm-config #配置文件/usr/lib/systemd/system/ipvsadm.service #开启ipvsadm服务;/usr/sbin/ipvsadm #ipvsadm主程序/usr/sbin/ipvsadm-restore #重载配置到内核中;/usr/sbin/ipvsadm-save #保存规则的/usr/share/doc/ipvsadm-1.27/usr/share/doc/ipvsadm-1.27/README/usr/share/man/man8/ipvsadm-restore.8.gz/usr/share/man/man8/ipvsadm-save.8.gz/usr/share/man/man8/ipvsadm.8.gz
(4)ipvsadm命令的用法:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
#清空或置零
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
[--syncid syncid]
ipvsadm --stop-daemon state
ipvsadm -h
管理集群服务:增、改,删,查
(1)ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A:增,append,add
[[email protected] yum.repos.d]# ipvsadm -A -t 192.168.1.109:80 -s rr[[email protected] yum.repos.d]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.1.109:80 rr-E:修改,edit
-t:tcp
-u:udp
-f:firewall mark
(2)service-address:
-t, tcp, vip:port
-u, udp, vip:port
-f, fwm, mark,即防火墙标记;
(3)-s scheduler:指明其调度方法,默认为wlc;
(4)ipvsadm -D -t|u|f service-address
-D:删除
管理集群上的RS:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a:增加
[[email protected] yum.repos.d]# ipvsadm -a -t 192.168.1.109:80 -r 192.168.1.111 -m -w 1[[email protected] yum.repos.d]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.1.109:80 rr -> 192.168.1.111:80 Masq 1 0 0-e:更改
-e只能修改其属性信息,类似于重新编写要改动的信息,但是地址信息是无法修改的,
但是对于rs的地址是不能进行修改的,因此需要先删除后添加;
-r server-address
RS的地址;
rip[:port]
-g, gateway, dr,相当于网关,默认
-i, ipip,tunnel 隧道模型
-m, masquerade, nat,地址伪装;
-w weight
查看:
ipvsadm -L|l [options]
-n, --numeric:以数字格式显示IP和PORT,默认的是反解端口和主机名到服务端;ipvsadm -Ln #注意其与iptables不同;参数的顺序不能写错;--exact:精确值(不做单位换算);
-c, --connection:显示当前IPVS连接;
--stats:统计数据;
[[email protected] ~]# ipvsadm -Ln --rateIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS -> RemoteAddress:PortTCP 192.168.1.109:80 0 0 0 0 0 -> 192.168.1.111:80 0 0 0 0 0CPS:每秒连接数;InPPS:input pockets per,每秒的入栈报文数;OutPPS:每秒出栈报文数;InBPS:每秒入栈bytes,OutBPS:每秒出栈bytes;
--rate:速率;
清空:
-C:清空;
保存和重载:
保存:
ipvsadm -S > /PATH/TO/SOME_RULE_FILE
ipvsadm-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]
对于不同版本的系统,载入规则也是不同的:
centos6:查看其配置文件;
centos7:查看其unit file-->ipvsadm-service
[[email protected] ~]# cat /usr/lib/systemd/system/ipvsadm.service[Unit]Description=Initialise the Linux Virtual ServerAfter=syslog.target network.target [Service]Type=oneshotExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" #开启ipvsadm时在该文件中读取ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm" #执行stop时,先保存在该文件中,然后清空ExecStop=/sbin/ipvsadm -CRemainAfterExit=yes [Install]WantedBy=multi-user.target
实现开机自动加载ipvs规则:
(1)首先可以把ipvs规则手动更新到/etc/sysconfig/ipvasdm
(2)关闭服务,
(3)chkconfig enabled ipvsadm
设计要点:
(1) DIP与RIP要在同一IP网络,RIP的网关要指向DIP;最好实现director两块网卡在物理上是隔离的
(2) 支持端口映射;
(3) 是否用到共享存储取决业务需求;
实验环境准备:
- 创建一个director,两块网卡,一个桥接,一个因主机模式;
- 创建两个真实服务器,rs1&rs2;
lvs-nat模型实现:
(1)实验环境准备:
序号 | 简称 | ip |
1 | cip | |
2 | vip | 172.18.100.6/24 |
3 | dip | 192.168.10.254/24 |
4 | rs1 | 192.168.10.11/24 |
5 | rs2 | 192.168.10.12/24 |
6 | 外主机 | 192.168.10.22/24 |
(2)iptables -F清除iptables规则;
(3)确保网关间核心转发功能永久有效,编辑/etc/sysctl.conf
[[email protected] ~]# vim /etc/sysctl.conf [[email protected] ~]# cat /etc/sysctl.conf# System default settings live in /usr/lib/sysctl.d/00-system.conf.# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file## For more information, see sysctl.conf(5) and sysctl.d(5).net.ipv4.ip_forward=1[[email protected] ~]# sysctl -pnet.ipv4.ip_forward = 1[[email protected] ~]# cat /proc/sys/net/ipv4/ip_forward1
(4)在rs1中开启web(http)服务,提供一个资源页面(/var/www/html/index.html);启动服务,并且验证(养成习惯)
(5)在真正的演示负载均衡中,rs1和rs2上面的资源应该是相同的,但是为了演示方便,在rs2上执行与(4)一样的步骤,但是提供的i资源页面不一样;
(6)在director上访问rs1,rs2测试是否能正常的访问;
[[email protected] ~]# curl http://192.168.10.11[[email protected] ~]# curl http://192.168.10.12
(7)为ipvs添加规则
ipvsadm -A -t 172.18.100.6:80 -s rripvsadm -a -t 172.18.100.6:80 -r 192.168.10.11:80 -m -w 1ipvsadm -a -t 172.18.100.6:80 -r 192.168.10.12:80 -m -w 2
(8)使用外主机验证lvs-net模型;不断请求director
curl http://172.18.100.6
(9)在director上查看活动连接与非活动连接数量(在rr中权重是什么作用)
[[email protected] ~]ipvsadm -Ln
修改规则属性,使用wrr(权重大的承载的连接数就越多)
ipvsadm -A -t 172.18.100.6:80 -s wrr
查看ipvs规则表
[[email protected] ~]ipvsadm -Ln
负载均衡集群设计时的要点:
(1) session保持
session sticky (ip hash)
session cluster
session server
(2) 数据共享
共享存储:
NAS:Network Attached Storage,文件服务器,访问接口是文件级别(NFS,samba)
自建的samba性能很差,往往带宽成为关键,可是对于没有优化来说,性能依旧是提不上来,一般建议找一写专业的供应商;
SAN:Storage Area Network, 访问接口是块级别;SCSI协议借助于其它网络技术(FC,以太网);
DS:Distributed Storage(分布式存储),访问接口通常是文件级别,接口可是文件系统,也可以API;ceph:内核级分布式存储,已经收进系统内核,但是非常的复杂;
是否使用共享存储,就是要看服务器是否支持写操作;
数据同步:
rsync+inotify
rsync:远程同步能够将两个主机上的两个文件系统彼此之间做同步;有主从,单向的
rsync详细使用见日记
数据格式:
结构化数据:存储于SQL数据库中;
半结构化数据:xml, json, 存储于文件系统或NoSQL;
非结构化数据:文件系统,DS;
注意:(1)dip和rs1与rs2在同一网段中;其中dip是rs1和rs2的网关;
(2)一个主机上建议不要有太多的网关;