集群
集群的分类:
- 负载均衡:提高效率
- 高可用:保证关键性业务的可靠性
- 高性能
负载均衡
负载均衡的有点:
- 提高系统的整体性能
- 提高系统的扩展性
- 提高系统的可用性
负载均衡集群实现方式:
lvs
lvs的三种模式:
lvs arch
- 调度器:director
- RS:Real Server
Client IP:CIP(客户端IP) Director Virutal IP:VIP(调度器虚拟IP) Director IP:DIP(调度器IP) Real Server IP:RIP(真实服务器IP)
NAT模式工作原理
工作原理 lvs-nat模式通过修改请求报文的目标IP地址(同时可能会修改目标端口)至挑选出来的某RS的RIP地址实现转发
lvs-nat的特点:
- RS和DIP应该使用私网地址,且RS的网关要指向DIP
- 请求和响应报文都要经由director转发,所以配置时需要将director的转发功能开启,极高负载的场景中,director可能会成为系统性能瓶颈
- 支持端口映射
- RS可以使用任意OS(任意系统)
- RS的RIP和Director的DIP必须在同一IP网络
TUN模式工作原理
lvs-dr(direct routing):lvs的默认模式,gateway 工作原理 lvs-tun模式不修改请求报文的ip首部,而是通过在原有的ip首部(CIP<–>VIP)之外再封装一个ip首部(DIP<–>RIP)
lvs-tun的特点:
- RIP,DIP,VIP必须是公网地址
- RS的网关不能指向DIP
- 请求报文必须经由director调度,但响应报文必须不能经由director
- 不支持端口映射
- RS的OS(系统)必须支持隧道功能
DR模式工作原理
lvs-dr(direct routing):lvs的默认模式,gateway
工作原理 lvs-dr模式通过修改请求报文的目标MAC地址进行转发 Director:调度器要配置VIP,DIP RSs:所有的Real Server都要配置RIP,VIP
lvs-dr的特点:
- 保证前端路由器将目标IP为VIP的请求报文发送给director,解决方案有以下三种:
- 静态绑定(存在于理想状态中,很难实现)
- arptables(使用防火墙,降低效率,很难实现)
- 修改RS主机内核的2个参数:
- arp_announce:是否接收并记录别人的通告以及是否通告自己的mac地址给别人
- arp_announce有三个可选值,0,1,2
- 0(default,默认值为0):通告自己所拥有的所有地址
- 1:尽量不通告与自己不在同一个网段的地址,比如不通告2.0网段的地址给1.0网段,不通告3.0网段的地址给1.0网段等,但是是尽量不通告,有可能还是会通告的
- 2:总是不通告与自己不在同一个网段的地址,比如不通告2.0网段的地址给1.0网段,不通告3.0网段的地址给1.0网段等,绝对不会通告
- arp_ignore:是否响应arp请求
- arp_ignore有9个可选值,0,1,2,3,4,5,6,7,8
- 0(default,默认值为0):回应任何网络接口上对任何本地IP地址的arp查询请求
- 1:请求报文从哪个接口进入的且请求的目标地址就是此接口配置的地址才予以响应,否则不响应
- 2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
- 3:不回应该网络接口的arp请求,而只对设置的唯一和连接地址做出回应
- 4-7:保留未使用
- 8:不回应所有(本地地址)的arp查询
- RS的RIP可以使用私有地址,也可以使用公网地址
- RS跟Director必须在同一物理网络中,中间不能有路由器相隔
- 请求报文经由Director调度,但响应报文一定不能经由Director
- 不支持端口映射
- RS可以是大多数OS
- RS的网关不能指向DIP
lvs scheduler:lvs调度器,即lvs挑选RS的算法
- 静态方法:仅根据算法本身进行调度
- RR:round robin,轮调、轮询
- WRR:weighted rr,加权的rr,根据一定的比例进行轮调,比如每次RS1给2个请求,RS2给1个请求
- SH:source hash,源地址hash,实现session保持的机制,将来自于同一个IP的请求始终调度至同一RS,每个服务单独调度
- DH:destination hash,目标地址hash,将对同一个目标(资源)的请求始终发往同一个RS
- 动态方法:根据算法及各RS的当前负载状态进行调度,根据指定的算法算出overhead(负载),最终挑选出overhead值最小的则为被选中的RS
ipvs的集群服务:
- TCP
- UDP
- AH,EST,AH_EST,SCTP等诸多协议
ipvsadm的用法
管理集群服务:
//管理集群服务(调度器DR)
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] //新增或编辑
ipvsadm -D -t|u|f service-address //删除
常见的service-address:
tcp:-t ip:port
udp:-u ip:port
fwm:-f mark
-s scheduler:默认为wlc
-p [timeout]:定义持久连接,timeout不指定时默认为300秒
//管理集群服务中的RS
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]
server-address:ip[:port]
lvs-type:
-g:gateway,dr模式
-i:ipip,tun模式
-m:masquerade,nat模式
-w:设定权重,可为0到正无穷数值,设为0时不会被调度,默认为1
权重值越大则表示性能越好,被调度的资源也会更多
//清空和查看:
ipvsadm -C 清空
ipvsadm -L|l [options] 查看
options:
-n:numeric,基于数字格式显示地址和端口
-c:connection,显示当前ipvs连接
--stats:统计数据
--rate:输出速率信息
--exact:显示精确值,不做单位换算
//保存和重载:
ipvsadm -R 重载
ipvsadm -S [-n] 保存
DR模式配置http负载均衡
主机名 | IP |
---|
DR | 192.168.218.130 | RS1 | 192.168.218.132 | RS2 | 192.168.218.133 |
[root@DR ~]# systemctl disable --now firewalld
[root@DR ~]# vi /etc/selinux/config
SELINUX=disabled
[root@DR ~]# reboot
[root@RS1 ~]# systemctl disable --now firewalld
[root@RS1 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@RS1 ~]# reboot
[root@RS2 ~]# systemctl disable --now firewalld
[root@RS2 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@RS2 ~]# reboot
//安装服务
[root@RS1 ~]# yum -y install httpd
[root@RS2 ~]# yum -y install httpd
//配置页面
[root@RS1 ~]# cd /var/www/html/
[root@RS1 html]# ls
[root@RS1 html]# echo 'test rs1' > index.html
[root@RS2 ~]# cd /var/www/html/
[root@RS2 html]# ls
[root@RS2 html]# echo 'test rs2' > index.html
//启动服务
[root@SR1 ~]# systemctl enable --now httpd
//修改配置文件
[root@SR1 ~]# cd /etc/httpd/conf
[root@SR1conf]# vi httpd.conf
取消前面的#号
ServerName www.example.com:80
//重启服务
[root@SR1 conf]# systemctl restart httpd
//SR2和SR1一样的操作
网页查看
//查看IP
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:9e:92:e1 brd ff:ff:ff:ff:ff:ff
inet 192.168.218.130/24 brd 192.168.218.255 scope global dynamic noprefixroute ens160
valid_lft 1626sec preferred_lft 1626sec
inet6 fe80::d68f:1be3:2ad4:4605/64 scope link noprefixroute
valid_lft forever preferred_lft forever
//安装ipvsadm包
[root@DR ~]# yum -y install ipvsadm
//添加网卡到lo
[root@DR ~]# ip addr add 192.168.218.250/32 dev lo
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.218.250/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:9e:92:e1 brd ff:ff:ff:ff:ff:ff
inet 192.168.218.130/24 brd 192.168.218.255 scope global dynamic noprefixroute ens160
valid_lft 1575sec preferred_lft 1575sec
inet6 fe80::d68f:1be3:2ad4:4605/64 scope link noprefixroute
valid_lft forever preferred_lft forever
//测试能否ping通
[root@DR ~]# ping 192.168.218.250
PING 192.168.218.250 (192.168.218.250) 56(84) bytes of data.
64 bytes from 192.168.218.250: icmp_seq=1 ttl=64 time=0.015 ms
64 bytes from 192.168.218.250: icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from 192.168.218.250: icmp_seq=3 ttl=64 time=0.039 ms
^C
--- 192.168.218.250 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 43ms
rtt min/avg/max/mdev = 0.015/0.042/0.074/0.025 ms
- 配置RS,(编辑物理网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0)此时已经在同网段省略配置
//修改RS上的网卡内核参数
[root@SR1 ~]# vi /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1 //添加此行
net.ipv4.conf.all.arp_announce = 2 //添加此行
[root@RS1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
//RS2相同操作
[root@SR2 ~]# vi /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1 //添加此行
net.ipv4.conf.all.arp_announce = 2 //添加此行
[root@SR2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
- 在RS上配置vip地址
注意: 此处必须先修改网卡内核参数然后再配置vip,因为如果先配vip,vip配好后就会立马通告给别人,而修改内核参数就是为了不通告
//RS1添加vip
[root@RS1 ~]# ip addr add 192.168.218.250 dev lo
[root@RS1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.218.250/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:bf:07:4a brd ff:ff:ff:ff:ff:ff
inet 192.168.218.132/24 brd 192.168.218.255 scope global dynamic noprefixroute ens160
valid_lft 1346sec preferred_lft 1346sec
inet6 fe80::de23:cbad:4ba:e181/64 scope link noprefixroute
valid_lft forever preferred_lft forever
//RS2添加vip
[root@SR2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.218.250/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:03:ca:ed brd ff:ff:ff:ff:ff:ff
inet 192.168.218.133/24 brd 192.168.218.255 scope global dynamic noprefixroute ens160
valid_lft 1489sec preferred_lft 1489sec
inet6 fe80::6faa:c998:4390:2ee4/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@DR ~]# route add -host 192.168.218.250 dev lo
[root@RS1 ~]# route add -host 192.168.218.250 dev lo
[root@SR2 ~]# route add -host 192.168.218.250 dev lo
[root@DR ~]# ipvsadm -A -t 192.168.218.250:80 -s wrr
[root@DR ~]# ipvsadm -a -t 192.168.218.250:80 -r 192.168.218.132:80 -g
[root@DR ~]# ipvsadm -a -t 192.168.218.250:80 -r 192.168.218.133:80 -g
PS C:\WINDOWS\system32> curl http://192.168.218.132
Content : test rs1
PS C:\WINDOWS\system32> curl http://192.168.218.133
Content : test rs2
NAT模式配置http负载均衡
主机名 | IP |
---|
DR | 192.168.218.130 | RS1 | 192.168.218.132 | RS2 | 192.168.218.133 |
[root@DR ~]# systemctl disable --now firewalld
[root@DR ~]# vi /etc/selinux/config
SELINUX=disabled
[root@DR ~]# reboot
[root@RS1 ~]# systemctl disable --now firewalld
[root@RS1 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@RS1 ~]# reboot
[root@RS2 ~]# systemctl disable --now firewalld
[root@RS2 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@RS2 ~]# reboot
//安装服务
[root@RS1 ~]# yum -y install httpd
[root@RS2 ~]# yum -y install httpd
//配置页面
[root@RS1 ~]# cd /var/www/html/
[root@RS1 html]# ls
[root@RS1 html]# echo 'test rs1' > index.html
[root@RS2 ~]# cd /var/www/html/
[root@RS2 html]# ls
[root@RS2 html]# echo 'test rs2' > index.html
//启动服务
[root@SR1 ~]# systemctl enable --now httpd
//修改配置文件
[root@SR1 ~]# cd /etc/httpd/conf
[root@SR1conf]# vi httpd.conf
取消前面的#号
ServerName www.example.com:80
//重启服务
[root@SR1 conf]# systemctl restart httpd
//SR2和SR1一样的操作
//查看IP
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:9e:92:e1 brd ff:ff:ff:ff:ff:ff
inet 192.168.218.130/24 brd 192.168.218.255 scope global dynamic noprefixroute ens160
valid_lft 1366sec preferred_lft 1366sec
inet6 fe80::d68f:1be3:2ad4:4605/64 scope link noprefixroute
valid_lft forever preferred_lft forever
安装ipvsadm包
[root@DR ~]# yum -y install ipvsadm
//添加网卡到lo
[root@DR ~]# ip addr add 192.168.218.250/32 dev lo
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.218.250/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:9e:92:e1 brd ff:ff:ff:ff:ff:ff
inet 192.168.218.130/24 brd 192.168.218.255 scope global dynamic noprefixroute ens160
valid_lft 1231sec preferred_lft 1231sec
inet6 fe80::d68f:1be3:2ad4:4605/64 scope link noprefixroute
valid_lft forever preferred_lft forever
//测试能否ping通
[root@DR ~]# ping 192.168.218.250
PING 192.168.218.250 (192.168.218.250) 56(84) bytes of data.
64 bytes from 192.168.218.250: icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from 192.168.218.250: icmp_seq=2 ttl=64 time=0.020 ms
64 bytes from 192.168.218.250: icmp_seq=3 ttl=64 time=0.020 ms
^C
--- 192.168.218.250 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 57ms
rtt min/avg/max/mdev = 0.020/0.020/0.020/0.000 ms
[root@DR ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1 //添加此行
[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1
//配置RS1
[root@SR1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
BROWSER_ONLY=no
BOOTPROTO=static
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.218.132
NETMASK=255.255.255.0
GATEWAY=192.168.218.130
[root@SR1 ~]# nmcli c reload
//配置RS2
[root@SR2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
BROWSER_ONLY=no
BOOTPROTO=static
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.218.133
NETMASK=255.255.255.0
GATEWAY=192.168.218.130
[root@SR2 ~]# nmcli c reload
[root@DR ~]# ipvsadm -A -t 192.168.218.250:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.218.250:80 -r 192.168.218.132:80 -m
[root@DR ~]# ipvsadm -a -t 192.168.218.250:80 -r 192.168.218.133:80 -m
//查看规则
[root@DR ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.218.250:80 rr
-> 192.168.218.132:80 Masq 1 0 0
-> 192.168.218.133:80 Masq 1 0 0
//保存
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# curl http://192.168.218.132
test rs1
[root@DR ~]# curl http://192.168.218.133
test rs2
|