集群概述
一 . 集群概念 :
集群: 一组协同工作, 但对外表现为一个整体的一群服务器
分布式 : 同一项任务 , 由多个不同的服务器负责不同的步骤的模式叫做分布式
负载均衡 : 同一类任务 , 由多台服务器共同分担访问压力 , 每台服务器仅负责其中一部分任务的模式
高可用 : 为集群中的单节点设备设置{备用服务器}, 待节点故障时, 能够快速取代故障节点并完成后续任务的模式(自己编写脚本或使用keepalived)
典型的负载均衡 :
DNS轮询解析(淘汰的技术)
Nginx反向代理
amoeba
lvs
存储 :
初级阶段 : 单磁盘管理{分区 , 格式化 , 挂载} , 磁盘阵列{raid} , 本地逻辑卷管理{LVM}
中级阶段 : 网络文件系统{NFS , samba:cifs , }
高级阶段 : 块存储{将底层的存储空间进行共享, 并允许客户端自定义使用方式} 分布式存储{}
监控 : 用专门的监控软件实现服务器的监控, 监控的内容有以下几个方向
1. 系统运行状态
2. 系统各资源的使用
3. 网络流量的占用使用量
4. 应用服务的运行状态等
5. 软硬件参数
安全 : 软件防火墙和硬件防火墙
软件防火墙 : 只能检查数据包的头部信息, 不发识别数据包的内部信息 {Iptables}
硬件防火墙 : 能过滤数据包的内容(防火墙设备上装的杀毒软件的功能, 进行特征库匹配)
SELinux : Linux系统内部安全防护应用软件 , 对用户行为进行约束和限制
一 、集群
1.1 集群基础知识
PV(Page View) : 即页面浏览量或点击量, 是衡量一个网站或网页用户访问量. PV值就是所有访问者在(0-24时)间查看了某个网站多少个页面, 指的是页面的刷新数量
UV(Unique Visitor) : 独立访客, 统计一天内访问某站点的用户数(以cookie为依据);访问网站的一台电脑客户端为一个访客, 可以理解为访问网站的电脑数量
IP : IP可以理解为独立Ip的访问用户, 指1天内使用不同IP地址的用户访问网站的数量, 同一IP无论访问了几个页面, 独立IP数均为1
通常情况下, PV>UV>IP
1.2 集群的基本概念
集群是一组协同工作, 但对外表现为一个整体的服务器. 通过集群技术, 可以在较低成本的情况下获得在性能, 可靠性, 灵活性方面获得较高收益
集群的优点 :
- 高可扩展性 : 可以通过增加服务器数量达到性能扩展
- 高可用性 : 集群中的一个节点失效 , 它的任务可以传递给其他节点 . 可以有效防止单点故障
- 高性能 : 负载均衡允许系统同时接入更多用户
- 高性价比 : 可以采用廉价的硬件服务器构造高性能的系统
二 、负载均衡
2.1 负载均衡集群 LBC (load balancer Cluster)
概念 : 由两个或两个以上的服务实体协调, 配合完成一系列工作的模式, 对外表现为一个整体
目的 : 提高业务性能, 降低单台服务器压力
特性 : 不同节点之间相互独立, 不共享任何硬件资源, 通过一定算法将客户端的访问请求分配到集群的各个节点上, 充分利用每个节点的资源. 负载均衡扩展了网络设备和服务器带宽, 增加吞吐量, 加强网络数据处理能力.
实现方法 :
硬件 : 单独的硬件设备(独立专门的操作系统) -> F5(BigIP) A10(Thunder系列) redware
软件 : DNS , LVS , Nginx , RAC , Haproxy等
LVS : 是Linux Virtual Server的缩写, 名为Linux虚拟服务器, 中国最早的纳入Linux内核的应用程序
RAC: 是real application clusters的缩写, 名为实时应用集群, 是Oracle的负载调用软件
算法 :
RR (RoundR-Robin) : 轮询
WRR (wight-Rount-Robin) : 权重 (加权轮询)
结构 :
agent : 负载调度器
业务层 : 服务器池
存储 : 共享存储
层级
硬件 : 二层 , 四层 , 七层
软件 : 四层负载调度器{LVS , RAC} , 七层负载调度器{LVS , mysql proxy , RAC , nginx , haproxy}
负载均衡的层级 : 负载均衡一般在二层, 四层 , 七层进行
2.2 LVS工作原理

INPUT :入站规则 , 只处理以本机作为目标的数据包
OURPUT : 出向规则 , 本机产生的数据包发出时匹配的规则
FORWARD : 转发规则 , 数据包通过自己转发的数据包的入向规则
PREROUTING : 路由转发前的数据规则 , 数据包通过本机转发, 进入本机前匹配的规则
POSTROUTING : 数据包进入本机, 进行转发后, 数据包出本机匹配的规则
2.3 LVS工作原理 : ipvs/ipvsadm
IPVS : 钩子函数, 内核机制, (用于在请求没有到达目的地址前, 捕获并取得优先控制权的函数)
IPVSADM : 工作在用户空间, 负责为ipvs内核框架编写规则, 定义谁是集群服务, 谁是后端真是的服务器
ipvsadm 是内核空间ipvs和我们沟通的一个媒介 , 本身并不是ipvsadm发挥功能
iptables 只是防火墙内核和我们沟通的一个媒介 , 本身并不是iptables发挥防火墙的功能
名词 :
CIP : 客户端IP
DIP : 负载调度器IP
VIP : 集群IP
RIP : 真实服务器IP
查看IPVS是否开启 : m代表开启
[root@localhost ~]# grep -i "ipvs" /boot/config-3.10.0-1160.el7.x86_64
CONFIG_NETFILTER_XT_MATCH_IPVS=m
# IPVS transport protocol load balancing support
# IPVS scheduler
# IPVS SH scheduler
# IPVS application helper
2.4 使用ipvsadm创建集群, 并添加真实服务器
2.4.1安装 ipvsadm
yum install ipvsadm
ipvsadm -ln # -l:以数字形式输出IP地址和端口
# -A # 创建一体个新的集群
# -t # 指定TCP协议
# -s # 指定负载调度器的调度算法(rr:轮询 , wrr:加权轮询)
# -r # 用来指定应用服务器的IP地址和端口
# -m, g # LVS集群的工作模式 {m: NAT ; g:DR}
# -l # list
# -n # 显示ip和port端口时数据化
# -D # 删除集群服务器
# -d # 删除应用服务器
# -w [num] 在添加集群真实设备时且在加权模式下 使用-w分配权重
`创建集群`
ipvsadm -A -t 192.168.10.20:80 -s rr
`向已创建的集群内添加应用服务器`
ipvsadm -a -t 192.168.10.20:80 -r 192.168.11.30:80 -m
ipvsadm -a -t 192.168.10.20:80 -r 192.168.11.40:80 -m
`查看集群`
ipvsadm -ln
`删除集群`
ipvsadm -D -t 182.168.10.20:80
`删除指定集群内的指定服务器`
ipvsadm -d -t 192.168.10.20:80 -r 192.168.11.30:80
`修改服务器的算法`
ipvsadm -E -t 192.168.10.20:80 -s wrr
`修改集群服务器的工作模式为指定模式`
ipvsadm -e -t 192.168.10.20:80 -r 192.168.11.30:80 -g
2.4.2 LVS负载均衡软件支持的模式
NAT模式 : 转发IP地址的方式实现
DR模式 : 路由模式, 转发MAC地址实现
TUN模式 : 隧道模式, 高级版的DR模式, 可以实现跨地域的服务器隧道链接模式
2.4.2.1 LVS-NAT
其中4为客户端访问整个集群的入口, 通常是一个公网地址, 也称为VIP集群IP
其中5为负载调度IP(通常是一个私网地址), 通过调度规则在此端口将任务发放给不同服务器
规划如下
| 主机 | IP地址1 | 网关 |
|---|---|---|
| 客户端 | 192.168.10.10 | 192.168.10.20 |
| 负载调度器+路由器 | 192.168.10.20 ; 192.168.11.20 | |
| 应用服务器1-httpd | 192.168.11.30 | 192.168.11.20 |
| 应用服务器2-httpd | 192.168.11.40 | 192.168.11.20 |
192.168.10.0/24 网段我们使用 VMnet10
192.168.11.0/24 网段我们使用 VMnet11
负载调度器开启ipv4转发
`添加第11行`
[root@averserver /]# vim /etc/sysctl.conf
1 # sysctl settings are defined through files in
2 # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
3 #
4 # Vendors settings live in /usr/lib/sysctl.d/.
5 # To override a whole file, create a new file with the same in
6 # /etc/sysctl.d/ and put new settings there. To override
7 # only specific settings, add a file with a lexically later
8 # name in /etc/sysctl.d/ and put new settings there.
9 #
10 # For more information, see sysctl.conf(5) and sysctl.d(5).
11 net.ipv4.ip_forward=1
[root@averserver /]# sysctl -p
net.ipv4.ip_forward = 1
[root@averserver /]#
两台服务器安装 httpd 服务
[root@httpd_server1 ~]# yum -y install httpd
[root@httpd_server2 ~]# yum -y install httpd
修改两台服务器的 /var/www/html/index.html 的内容区别显示两台服务器
# --------------------------server1 -> vim /var/www/html/index.html -------------------------
<h1>Hello World I'am HTTP_SERVER-1</h1>
# --------------------------server2 -> vim /var/www/html/index.html -------------------------
<h1>Hello World I'am HTTP_SERVER-2</h1>
测试页面的工具
curl : 仅仅是下载对应目标文件的源码, 命令加载访问页面的源码
elinks : 字符界面版本的浏览器 : 加载页面的格式, 仅显示内容
ipvsadm管理命令
`创建集群`
ipvsadm -A -t 192.168.10.20:80 -s rr
`向已创建的集群内添加应用服务器`
ipvsadm -a -t 192.168.10.20:80 -r 192.168.11.30:80 -m
ipvsadm -a -t 192.168.10.20:80 -r 192.168.11.40:80 -m
`查看集群`
ipvsadm -ln
测试服务器进行测试
[root@testcustorm ~]# curl 192.168.10.20
<h1>Hello World I'am HTTP_SERVER-2"</h1>
[root@testcustorm ~]# curl 192.168.10.20
<h1>Hello World I'am HTTP_SERVER-1</h1>
[root@testcustorm ~]# curl 192.168.10.20
<h1>Hello World I'am HTTP_SERVER-2"</h1>
[root@testcustorm ~]# curl 192.168.10.20
<h1>Hello World I'am HTTP_SERVER-1</h1>
[root@testcustorm ~]# curl 192.168.10.20
<h1>Hello World I'am HTTP_SERVER-2"</h1>
2.4.2.2 LVS-DR
1-4 客户端解析DNS后访问路由器公网IP地址
5-6 路由器进行NAT地址转换后(一般为公网转私网), 将目的地址指定为负载均衡调度器IP地址
7 负载均衡调度器将接收到的请求包的目的MAC修改为应用服务器1-2的目的MAC以实现负载均衡
8-9 应用服务器要创建一个loopback端口, 因为如果接收目的IP没有路由表或不是本机IP的数据包会将其丢弃掉
10 应用服务器将相应数据直接返回给默认网关, 路由器私网IP地址
注意:负载均衡调度器LVS要求设备必须就有两个IP, 因此我们要创建出一个子接口, 而应用服务器为保证能接收数据包则必须配置Loopback端口
规划如下
| 主机 | IP地址1 | 网关 |
|---|---|---|
| 客户端 | 192.168.10.4 | 192.168.10.10 |
| 路由器 | 192.168.10.10 ; 192.168.11.10 | |
| 负载调度器 | ens33:192.168.11.20 ; ens33-0:192.168.11.100 | 192.168.11.10 |
| 应用服务器1-httpd | 192.168.11.30 ; Loopback0: 192.168.11.100 | 192.168.11.10 |
| 应用服务器2-httpd | 192.168.11.40 ; Loopback0: 192.168.11.100 | 192.168.11.10 |
192.168.10.0/24 网段我们使用 VMnet10
192.168.11.0/24 网段我们使用 VMnet11
路由器开启IPv4地址转发功能
#---- vi /etc/sysctl.conf --> 在最后一行添加如下信息
net.ipv4.ip_forward=1
修改ARP通告级别 应用服务器 LoopBack关闭响应ARP报文(提前做)
忽略此条会导致192.168.11.100地址同时被3台设备响应, 甚至会出现IP地址冲突, 配不上IP的状况
负载均衡调度器发送请求给 应用服务器时 , 应用服务器识别到MAC是自己物理网卡的MAC, 而IP地址是环回口的IP地址, 默认丢弃, 因此我们要修改服务器ARP通告级别
修改ARP的通告级别, 允许接收mac和ip非绑定状态下的请求
#---------- vim /etc/sysctl.conf 修改如下参数中的2条即可
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
#刷新配置
sysctl -p

安装ipvsadm软件
yum -y install ipvsadm
创建集群及添加应用服务器
# 添加集群
ipvsadm -A -t 192.168.11.100:80 -s rr
# 在集群中添加应用服务器
ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.30:80 -g
ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.40:80 -g
路由器开启NAT地址转换
#将任何访问192.168.10.10:80的数据目的地址转换成192.168.11.100:80
iptables -t nat -A PREROUTING -i ens33 -d 192.168.10.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.100:80
iptables -t nat -A POSTROUTING -o ens33 -s 192.168.11.10/24 -p tcp --sport 80 -j SNAT --to-source 192.168.10.10
负载均衡调度器关闭路由重定向功能
#------------ vim /etc/sysctl.conf 最后一行添加如下任意一条
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
#刷新配置
sysctl -p
添加应用服务器的物理网卡和环回网卡的通讯路由记录(我的CentOS7不加也能通信)
chmod +x /etc/rc.local
chmod +x rc.d/rc.local
#先执行一遍, 立即生效
route add -host 192.168.11.100 dev lo:0
#--------- vim /etc/rc.local 添加如下内容, 设置开机自启
route add -host 192.168.11.100 dev lo:0
使用ab进行压力测试
# 192.168.10.240 : 如下命令
ab -c 100 -n 1000 http://192.168.10.10/index.html
#192.168.11.20 : 查看匹配条数
[root@localhost /]# 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.11.100:80 rr
-> 192.168.11.30:80 Route 1 0 500
-> 192.168.11.40:80 Route 1 0 500
三. 负载均衡+Keepalived
keepalived 设计的初衷就是为了保存LVS的配置文件信息的

3.1 在负载均衡DR实验基础上扩展服务器
| 主机 | IP地址1 | 网关 |
|---|---|---|
| 客户端 | 192.168.10.240 | 192.168.10.10 |
| 路由器 | 192.168.10.10 ; 192.168.11.10 | |
| 负载调度器 | ens33:192.168.11.20 ; ens33-0:192.168.11.100 | 192.168.11.10 |
| 应用服务器1-httpd | 192.168.11.30 ; Loopback0: 192.168.11.100 | 192.168.11.10 |
| 应用服务器2-httpd | 192.168.11.40 ; Loopback0: 192.168.11.100 | 192.168.11.10 |
| 负载均衡调度器_bak | ens33:192.168.11.21 ; ens33-0:192.168.11.100 | 192.168.11.10 |
负载均衡调度器_bak 安装ipvsadm
两台负载均衡调度器关闭IP地址冲突检测
#-------------- vim /etc/sysconfig/network-scripts/ifup-eth
`搜索arping后, 注释掉如下几行`
# if [ $? = 1 ]; then
# ARPINGMAC=$(echo $ARPING | sed -ne 's/.*\[\(.*\)\].*/\1/p')
# net_log $"Error, some other host ($ARPINGMAC) already uses address ${ipaddr[$idx]}."
# exit 1
# fi
负载均衡调度器安装keepalived, 并配置和主调度器相同的配置
yum -y install keepalived
yum -y install ipvsadm
ipvsadm -A -t 192.168.11.100:80 -s rr
ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.30:80 -g
ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.40:80 -g
修改两台负载均衡调度器keepalived的配置文件
#--------------- vim /etc/keepalived/keepalived.conf , 关注如下内容
1 ! Configuration File for keepalived
2
3 global_defs {
# 4 notification_email {
# 5 acassen@firewall.loc
# 6 failover@firewall.loc
# 7 sysadmin@firewall.loc
# 8 }
# 9 notification_email_from Alexandre.Cassen@firewall.loc
# 10 smtp_server 192.168.200.1
# 11 smtp_connect_timeout 30
12 router_id LVS_Master # Keepalived 本机角色(昵称)
# 13 vrrp_skip_check_adv_addr
# 14 vrrp_strict
# 15 vrrp_garp_interval 0
# 16 vrrp_gna_interval 0
17 }
18
19 vrrp_instance VI_1 {
20 state MASTER #本机角色(主服务器:MASTER)
21 interface ens33 #绑定哪个网卡
22 virtual_router_id 51 #虚拟路由ID, 类似于频道, 主备服务器要使用同一个ID
23 priority 100 #本机vrrp优先级, 优先级越大则会抢夺资源作为主服务器
24 advert_int 1
25 authentication {
26 auth_type PASS #认证密码, 一般不设置, 会增加复杂度
27 auth_pass 1111
28 }
29 virtual_ipaddress {
30 192.168.200.16
31 192.168.200.17
32 192.168.200.18
33 }
34 }
35
36 virtual_server 192.168.11.100 80 { #VRRP虚拟IP, 即负载调度器IP
37 delay_loop 6
38 lb_algo rr #负载均衡调度模式
39 lb_kind NAT #负载均衡实现模式 {NAT模式/DR路由模式}
40 persistence_timeout 0 #此处设置为0
41 protocol TCP
42
43 real_server 192.168.11.30 80 { #真实服务器1
44 weight 1
# 45 SSL_GET { #SSL : https使用的内容, http可以忽略掉
# 46 url {
# 47 path /
# 48 digest ff20ad2481f97b1754ef3e12ecd3a9cc
# 49 }
# 50 url {
# 51 path /mrtg/
# 52 digest 9b3a0c85a887a256d6939da88aabd8cd
# 53 }
54 connect_timeout 3
55 nb_get_retry 3
56 delay_before_retry 3
# 57 }
58 }
43 real_server 192.168.11.40 80 { #真实服务器1
44 weight 1
# 45 SSL_GET { #SSL : https使用的内容, http可以忽略掉
# 46 url {
# 47 path /
# 48 digest ff20ad2481f97b1754ef3e12ecd3a9cc
# 49 }
# 50 url {
# 51 path /mrtg/
# 52 digest 9b3a0c85a887a256d6939da88aabd8cd
# 53 }
54 connect_timeout 3
55 nb_get_retry 3
56 delay_before_retry 3
# 57 }
58 }
59 }
60
61 virtual_server 10.10.10.2 1358 {
62 delay_loop 6
63 lb_algo rr
64 lb_kind NAT
65 persistence_timeout 50
66 protocol TCP
67
68 sorry_server 192.168.200.200 1358
69
70 real_server 192.168.200.2 1358 {
71 weight 1
72 HTTP_GET {
73 url {
74 path /testurl/test.jsp
75 digest 640205b7b0fc66c1ea91c463fac6334d
76 }
77 url {
78 path /testurl2/test.jsp
79 digest 640205b7b0fc66c1ea91c463fac6334d
80 }
81 url {
82 path /testurl3/test.jsp
83 digest 640205b7b0fc66c1ea91c463fac6334d
84 }
85 connect_timeout 3
86 nb_get_retry 3
87 delay_before_retry 3
88 }
89 }
90
91 real_server 192.168.200.3 1358 {
92 weight 1
93 HTTP_GET {
94 url {
95 path /testurl/test.jsp
96 digest 640205b7b0fc66c1ea91c463fac6334c
97 }
98 url {
99 path /testurl2/test.jsp
100 digest 640205b7b0fc66c1ea91c463fac6334c
101 }
102 connect_timeout 3
103 nb_get_retry 3
104 delay_before_retry 3
105 }
106 }
107 }
108
109 virtual_server 10.10.10.3 1358 {
110 delay_loop 3
111 lb_algo rr
112 lb_kind NAT
113 persistence_timeout 50
114 protocol TCP
115
116 real_server 192.168.200.4 1358 {
117 weight 1
118 HTTP_GET {
119 url {
120 path /testurl/test.jsp
121 digest 640205b7b0fc66c1ea91c463fac6334d
122 }
123 url {
124 path /testurl2/test.jsp
125 digest 640205b7b0fc66c1ea91c463fac6334d
126 }
127 url {
128 path /testurl3/test.jsp
129 digest 640205b7b0fc66c1ea91c463fac6334d
130 }
131 connect_timeout 3
132 nb_get_retry 3
133 delay_before_retry 3
134 }
135 }
136
137 real_server 192.168.200.5 1358 {
138 weight 1
139 HTTP_GET {
140 url {
141 path /testurl/test.jsp
142 digest 640205b7b0fc66c1ea91c463fac6334d
143 }
144 url {
145 path /testurl2/test.jsp
146 digest 640205b7b0fc66c1ea91c463fac6334d
147 }
148 url {
149 path /testurl3/test.jsp
150 digest 640205b7b0fc66c1ea91c463fac6334d
151 }
152 connect_timeout 3
153 nb_get_retry 3
154 delay_before_retry 3
155 }
156 }
157 }
三. ab命令
ab -c 100 -n 1000 http://192.168.10.10
-c 并发数量
-n 访问数量
2369

被折叠的 条评论
为什么被折叠?



