集群就是多台设备一起提供服务
集群分类:
-
高可用(不存在单点,即,如果一个机器宕机不影响服务。常见开源软件:keepalived heartbeat )
-
负载均衡(把负载均衡地分担到多台机器上。论坛服务器1台不够了,我们再加1台,用户请求会分摊到这两台机器上。常见开源软件:LVS Nginx haproxy)
-
分布式集群(它实际上是集合了高可用和负载均衡为一体的一种集群。它的特点是,可以无限制的横向扩容。)
实验环境准备:
- 克隆一台虚拟机(修改IP(删除uuid)、修改hostname);
主机一(192.168.85.129);主机二(192.168.85.130);主机三(192.168.85.128) - 两台机器上都开启nginx服务,并设置开机自启模式,停止httpd服务(提供tomcat);
- 克隆的虚拟机上关闭mysql数据库服务(保证nginx访问的是同一个数据库)—实际上可以指定任意一台mysql数据库服务器,可以提供对nginx服务的访问和数据存储即可
- 修改配置文件
[root@linux2019_03 config]# head /data/wwwroot/bbs.aibenwoniu.xyz/config/config_global.php
$_config['db']['1']['dbhost'] = '192.168.85.129';
[root@linux2019_03 config]# head /data/wwwroot/bbs.aibenwoniu.xyz/config/config_ucenter.php
define('UC_DBHOST', '192,168.85.129');
[root@linux2019_03 data]# head /data/wwwroot/bbs.aibenwoniu.xyz/uc_server/data/config.inc.php
define('UC_DBHOST', '192.168.85.130');
- 为克隆主机访问数据库授权(之前在创建bbs论坛的时候创建bbs数据库和用户,指定了“127.0.0.1”的主机)
MariaDB [(none)]> show grants for 'bbs'@'127.0.0.1';
+------------------------------------------------------------------------------------------------------------+
| Grants for [email protected] |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'bbs'@'127.0.0.1' IDENTIFIED BY PASSWORD '*931AD2E74512C7C5BDB6022A98F9587C6B50F45A' |
| GRANT ALL PRIVILEGES ON `bbs`.* TO 'bbs'@'127.0.0.1' |
+------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
MariaDB [(none)]> GRANT USAGE ON *.* TO 'bbs'@'192.168.85.130' IDENTIFIED BY PASSWORD '*931AD2E74512C7C5BDB6022A98F9587C6B50F45A';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON `bbs`.* TO 'bbs'@'192.168.85.130';
Query OK, 0 rows affected (0.001 sec)
- 测试从克隆主机上远程登录129主机的数据库(-h 指定主机)
- 测试网页登录(分别修改hosts文件中bbs论坛对应的主机域名),同时查看是否有相应的nginx登录日志出现在对应的主机上
搭建LVS负载均衡–DR模式
准备三台机器:
- 192.168.85.129:RS1
- 192.168.85.130:RS2
- 192.168.85.128:DIR
- 192.168.85.100:VIP
实验步骤:
- DIR机器安装LVS程序
[root@linux2019_2 ~]# yum install -y ipvsadm
- 在DIR机器上编辑脚本(默认80端口,因为之前nginx做了ssl配置所以采用443端口)
[root@linux2019_2 ~]# vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
ipv=/usr/sbin/ipvsadm
vip=192.168.85.100
rs1=192.168.85.129
rs2=192.168.85.130
#注意这里的网卡名字
#之所以要先重启ens33网卡,是为了防止脚本重复执行时和之前的配置冲突
ifdown ens33
ifup ens33
#增加ens33:1虚拟网卡,并把vip配置在ens33:1上
ifconfig ens33:1 $vip broadcast $vip netmask 255.255.255.255 up
#增加路由
route add -host $vip dev ens33:1
#-C表示清空之前的规则
$ipv -C
#-A表示增加规则,-t指定vip以及port,-s指定调度算法,这里还有一个-p选项,后面跟时间(单位s),表示保持长连接
$ipv -A -t $vip:443 -s wrr
#-a表示增加rs,-r指定具体的rsip和port,-g表示使用dr模式(-i表示ip tunnel模式,-m表示NAT模式),-w指定权重
$ipv -a -t $vip:443 -r $rs1:443 -g -w 1
$ipv -a -t $vip:443 -r $rs2:443 -g -w 1
[root@linux2019_2 ~]# sh /usr/local/sbin/lvs_dr.sh #执行脚本
成功断开设备 'ens33'。
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@linux2019_2 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.85.128 netmask 255.255.255.0 broadcast 192.168.85.255
inet6 fe80::35d4:3dec:89e4:7e95 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:b3:6d:0e txqueuelen 1000 (Ethernet)
RX packets 3717 bytes 3991477 (3.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1558 bytes 139291 (136.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.85.100 netmask 255.255.255.255 broadcast 192.168.85.100
ether 00:0c:29:b3:6d:0e txqueuelen 1000 (Ethernet)
- 在两台RS上编辑脚本
oot@linux2019_01 ~]# vim /usr/local/sbin/lvs_rs.sh
#!/bin/bash
vip=192.168.85.100
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档https://www.imooc.com/article/79661
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
scp /usr/local/sbin/lvs_rs.sh [email protected]:/usr/local/sbin/lvs_rs.sh
- 两台RS机器上分别执行脚本
[root@linux2019_01 ~]# sh /usr/local/sbin/lvs_rs.sh
[root@linux2019_01 ~]# ip add
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.85.100/32 brd 192.168.85.100 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:4e:e9:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.85.129/24 brd 192.168.85.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::f042:4787:70bc:4ac4/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@linux2019_03 ~]# sh /usr/local/sbin/lvs_rs.
[root@linux2019_03 ~]# ip add
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.85.100/32 brd 192.168.85.100 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:25:48:a2 brd ff:ff:ff:ff:ff:ff
inet 192.168.85.130/24 brd 192.168.85.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::12ad:1e34:d1ac:ad70/64 scope link noprefixroute
valid_lft forever preferred_lft forever
- 网页测试访问(需要把VIP绑定host),同时监测两台RS机器上的nginx访问日志,也可以使用tcpdump命令抓包查看
[root@linux2019_2 ~]# yum install -y tcpdump
[root@linux2019_2 ~]# tcpdump -i ens33 -nn port 80
[root@linux2019_2 ~]# 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.85.100:443 wrr
-> 192.168.85.129:443 Route 1 0 0
-> 192.168.85.130:443 Route 1 0 0
网页测试发现bbs打不开,lvs的活动连接数量也没有变化,排查发现是DIR机器的防火墙没有对443端口放通
[root@linux2019_2 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports: 10050/tcp 80/tcp 8080/tcp 8005/tcp 9999/tcp 873/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@linux2019_2 ~]# firewall-cmd --add-port=443/tcp --permanent
success
[root@linux2019_2 ~]# firewall-cmd --reload
success
[root@linux2019_2 ~]# 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.85.100:443 wrr
-> 192.168.85.129:443 Route 1 13 0
-> 192.168.85.130:443 Route 1 14 0
查看两台RS机器的nginx登录日志也都有不通数量的日志更新,且活动的IP也是指定的VIP
LVS负载均衡介绍
参考LVS三种模式(http://www.it165.net/admin/html/201401/2248.html)
- NAT模式(Network address translation)
用iptables的NAT表实现网络地址转换,数据包目标IP为DIP,DIR将目标IP地址转换为RS的IP,这样请求的包就到了RS上,而RS返回的数据包本来是到DIP的,也会经过DIR转换,把目标IP转换为客户端的IP - DR模式(direct routing)
DIR会改请求报文中的MAC地址,本来请求的包中的MAC地址为DIR的MAC地址,但是却被修改成了RS的MAC地址,这样数据包就到了RS上。由于数据包的源IP为客户端IP,所以它在返回数据包的时候,可以直接发给客户端,而不再经过DIR。 - Tunnel模式(ip tunneling)
客户端请求的数据包发给DIR,DIR会近一步把包封装,加上了一个新的目标IP(RS的IP),这样数据包到了RS后再将封装的包拆开,获得原始数据包。返回数据包的时候也是直接发给了客户端。
LVS八种调度算法
- 轮叫(round Robin)
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
- 加权轮叫(Weighted Round Robin)
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
- 最少链接(Least Connections)
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。
- 加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
- 基于局部性的最少链接(Locality-Based Least Connections)
“基于局部性的最少链接” 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。
- 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,
将最忙的服务器从服务器组中删除,以降低复制的 程度。
- 目标地址散列(Destination Hashing)
"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,
若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
- 源地址散列(Source Hashing)
"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,
若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。