18.1 集群介绍
集群:在生产环境中,多数企业会使用多台服务器搭建成一个集群来运行程序,这样不仅可以避免单点故障,还能提升服务器的承载能力。
根据功能划分为两大类:高可用和负载均衡
高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 - 高可用衡量标准,4个九,就是99.99%,表示一个比例,在一年时间内99.99%的时间都是在线的,不允许宕机,不允许服务不可用。另外还有的是5个九,6个九 实现高可用的开源软件有:heartbeat、keepalived heartbeat软件,在centos6中有很多bug,而且很久没有更新版本了,不建议继续使用 keepalived软件,不仅有高可用的功能,还有负载均衡的功效,配置也非常简单
负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2 实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F5、Netscaler 商业的负载均衡器,相当于是一台设备,成本高昂 商业的负载均衡器,优势 在于有更高的并发量,也有很好的稳定性
18.2 keepalived介绍
使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题,影响实验效果
-
keepalived通过VRRP虚拟路由冗余协议(Virtual Router RedundancyProtocl)来实现高可用。
-
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。
-
master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的mater。
-
Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
18.3/18.4/18.5 用keepalived配置高可用集群
实验准备
1. 准备两台机器11和22,11作为master,22作为backup
2. 两台机器都执行yum install -y keepalived
3. 两台机器都安装nginx,其中11上已经编译安装过nginx,22上需要yum安装nginx: yum install -y nginx
配置msater keepallived配置文件
1. 清空初始的配置文件
[root@localhost ~]# > /etc/keepalived/keepalived.conf
2. 粘贴以下配置文件
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
aming@aminglinux.com #给邮箱发送报警邮件
}
notification_email_from root@aminglinux.com #从哪一个邮箱发邮件
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh" #使用这个脚本检测服务是否正常,需要另外编写指定
interval 3 #检测时间3s一次
}
vrrp_instance VI_1 {
state MASTER #定义角色,master或backup
interface ens33 #通过哪一个网卡进行发送vrrp广播
virtual_router_id 51 #定义路由器ID,master和backup保持一致
priority 100 # 定义权重,主和从不一致
advert_int 1
authentication {
auth_type PASS #定义密码认证
auth_pass 000000 #定义密码字符串
}
virtual_ipaddress {
192.168.188.100 # master和backup共有ip,域名解析用
}
track_script {
chk_nginx
}
}
定义master监控脚本
[root@localhost ~]# vim /usr/local/sbin/check_ng.sh
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
[root@localhost ~]# chmod 755 /usr/local/sbin/check_ng.sh
[root@localhost ~]# ip add 查看vip
启动keepalived服务
[root@localhost ~]# systemctl start keepalived
[root@localhost ~]# chkconfig keepalived on
配置backup keepallived配置文件
[root@Centos 7 ~]# > /etc/keepalived/keepalived.conf
global_defs {
notification_email {
aming@aminglinux.com
}
notification_email_from root@aminglinux.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 000000
}
virtual_ipaddress {
192.168.1.100
}
track_script {
chk_nginx
}
}
配置backup监控脚本
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
systemctl start nginx ##根据实际情况写启动命令
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
[root@Centos 7 ~]# chmod 755 /usr/local/sbin/check_ng.sh
启动keepalived服务
[root@Centos 7 ~]# systemctl start keepalived
[root@Centos 7 ~]# chkconfig keepalived on
测试高可用
1. 确定两台机器nginx差异
2. 关闭master、backup防火墙和selinux
3. 关闭master keepalived服务,查看master vip:ip add是否为192.168.1.100。否为正常。
4. 然后再查看backup vip:vip:ip add是否为192.168.1.100。是为正常
18.6 负载均衡集群介绍
负载均衡:简单的说就是让多台服务器均衡地去承载压力。 主流开源软件:
-
其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用
-
keepalived的负载均衡功能其实就是内置lvs
-
lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如MySQL,而nginx仅仅支持http、https、mail、haproxy也支持MySQL
-
相比较来说,LVS这种4层的更稳定,能承受更多的请求,而nginx这种7层的更加灵活,能实现更多的个性化需求,比如针对访问的目录做后端的内容分发。
18.7 LVS介绍
- LVS有三种常见的模式:NAT、DR、IP Tunnel
- LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)
LVS NAT 模式:
用户访问-----分发器接收请求(load balancer)----然后转发给内网的服务器处理(RS)---再返回给分开器---分发器返回给用户。
缺点:当用户请求量大的时候,分发器就成了主要角色,接收和返回数据都是要经过分发器,导致分开器处理请求缓慢。
优点:服务器不需要公网IP,只需要内网即可,分发器担任公网IP角色,从而节省公网资源。
LVS IP Tunnel模式:
1.这种模式分发器只需要担任一名转发请求和更改数据包的角色。
2.服务器(rs)直接返回数据给用户不需要经过分发器
3.需要一个公共的IP配置在分发器和所有RS服务器上
4.原理:用户发送数据包----数据包中有来源IP---分发器接收到数据包后把来源IP作为一个更改为RS的IP-----RS接收到后数据包处理返回给用户
LVS DR模式:
1.这种模式分发器只需要担任一名转发请求和更改数据包的角色。
2.服务器(rs)直接返回数据给用户不需要经过分发器
3.他跟ip tunnel不同的是:IP tunnel是修改来源IP,他是修改来源mac并修改为rs服务器的mac进行传输,最后返回给用户
18.8 LVS调度算法
常用:
轮询 round-Robin (rr)——按顺序把请求依次发送给后端的服务器,它不管后端服务器的处理速度和响应时间。
加权轮询 weight Round-Robin (wrr) ---看服务器(rs)权重分配,那个权重大就多分一点
最小连接 least-Connection (lc) --根据各真实服务器上的连接数来决定把新的请求分配给谁,连接数少说明服务器是空的,这样就会把新的请求分发到空闲服务器上。
加权最小连接 weight Least-Connection (wlc)--加权重分发,那个最小分发那个
不常用:
基于局部性的最小连接 Locality-Based Least Connections 简称: lblc 带复制的基于局部性最小连接 Locality-Based Least Connections with Replication 简称: lblcr 目标地址散列调度 Destination Hashing 简称:dh 源地址散列调度 Source Hashing 简称: sh
18.9/18.10 LVS NAT模式搭建
NAT模式搭建 – 准备工作
三台机器 分发器,也叫调度器(简写为dir) 内网:180.134,外网:142.144(vmware仅主机模式) rs1 内网:180.135,设置网关为180.134 rs2 内网:180.138,设置网关为180.134 三台机器上都执行执行 systemctl stop firewalld; systemc disable firewalld systemctl start iptables-services; iptables -F; service iptables save
NAT模式搭建
在dir上安装ipvsadm yum install -y ipvsdam 在dir上编写脚本,vim /usr/local/sbin/lvs_nat.sh//内容如下
#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,阿铭的两个网卡分别为ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.180.0/24 -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.142.144:80 -s wlc -p 3
$IPVSADM -a -t 192.168.142.144:80 -r 192.168.180.135:80 -m -w 1
$IPVSADM -a -t 192.168.142.144:80 -r 192.168.180.138:80 -m -w 1
NAT模式效果测试 两台rs上都安装nginx 设置两台rs的主页,做一个区分,也就是说直接curl两台rs的ip时,得到不同的结果 浏览器里访问192.168.142.144,多访问几次看结果差异
LVS NAT模式搭建
准备工作
NAT模式是通过iptables实现的,所以必须配置一些iptables规则 在配置前准备三台机器,一台作为分发器,也叫做调度器,简称 dir,另外两台就是real server,用来处理用户请求的服务器,rs1、rs2(克隆虚拟机步骤) 克隆虚拟机的注意点 A机器IP为192.168.180.134、B机器IP为192.168.180.135,C机器IP为192.168.180.138
A机器增加一块网卡,并启动查看网段为192.168.142(根据自己机器来设置),设置新的网卡IP为192.168.142.144,并在物理机访问这个IP地址,看是否正常通信 增加新的网卡需要更改IP,然后重启网卡,并重启网络服务 PS:网关最后设置,否则包无法下载
B机器和C机器的网关必须设置成分发器(即A机器)的内网IP,若不设置成它的网关,是没法通信的
这时B、C机器就无法上网了
网卡配置文件中更改(即本机器)
vi /etc/sysconfig/network-scripts/ifcfg-ens33
更改完之后重启网络服务
systemctl restart network
[root@yong-02 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.180.134 0.0.0.0 UG 100 0 0 ens33
192.168.180.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
三台机器设置完成后,关闭三台机器的防火墙
关闭firewalld服务
systemctl stop firewalld
使firewalld服务不再开机启动
systemctl disable firewalld
机器B、机器C 下载安装iptables-services 包
yum install -y iptables-services
有时下载包的时候特别慢,就是epel.repo源的原因导致的,这里可以临时关闭,就是直接更改名字即可(因为epel.repo源是国外的资源,所以很慢)
机器B、机器C 启动iptables服务 systemctl start iptables
机器B
[root@yong-02 ~]# systemctl start iptables
机器C
[root@yong-03 ~]# systemctl start iptables
机器B、机器C 设置开机启动
systemctl enable iptables iptables -F service iptables save
机器B
[root@yong-02 ~]# systemctl start iptables
[root@yong-02 ~]# systemctl enable iptables
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@yong-02 ~]# iptables -F
[root@yong-02 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 确定 ]
[root@yong-02 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 74 packets, 4884 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 42 packets, 3952 bytes)
pkts bytes target prot opt in out source destination
机器C同上
清空并查看机器A的规则
[root@yong-01 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 27 packets, 1888 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 20 packets, 1968 bytes)
pkts bytes target prot opt in out source destination
关闭机器机器A,机器B,机器C,三台机器的selinux
setenforce 0 //临时关闭selinux
getenforce //查看selinux是否关闭
为了保险起见,在配置文件中永久关闭selinux
vi /etc/selinux/config
SELINUX=enforcing更改为SELINUX=disabled
准备工作结束,NAT模式搭建
- 首先在分发器dir上(即A机器),安装ipvsadm ,这个是实现 lvs 的一个重要的工具,缺少这个工具,将没有办法实现 lvs 的功能 yum install -y ipvsadm 2.在分发器(A机器)上编写一个脚本(LVS全都是以脚本的方式去执行的,这样比较方便进行维护不用一条命令一条命令的进行操作)
[root@yong-01 ~]# vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward //对内核参数修改,打开路由转发
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects //伪装操作,不然不能转发rs的数据
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects //伪装操作,不然不能转发rs的数据
# 注意区分网卡名字,dir机器的两块网卡分别为ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.180.0/24 -j MASQUERADE //MASQUERADE实现同网段的机器去上网,路由器使用的就是这个功能
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm' //设置一个变量,方便下面命令引用
$IPVSADM -C //清空规则
$IPVSADM -A -t 192.168.142.144:80 -s lc -p 3 //用来定义lvs 的模式;wlc,为算法,可以按需求选择 lvs 里面适合的算法
$IPVSADM -a -t 192.168.142.144:80 -r 192.168.180.135:80 -m -w 1 //小规则,-r 指定dir机器IP,-m 指定nat模式,-w指定rs权重
$IPVSADM -a -t 192.168.142.144:80 -r 192.168.180.138:80 -m -w 1 //小规则,-r 指定dir机器IP,-m 指定nat模式,-w指定rs权重
IPVSADM -A -t 192.168.142.144:80 -s lc -p 3 : -A增加一个规则,-t 制定lvs 模式,之后IP 就是dir的IP,-s 指定算法;-p 指定超时时间,(数据包转发超时时间) 超时时间解释: 用户1访问的是a机器,-p 的意思就是在同一个时间,一直在同一台机器上进行请求 3.执行脚本,若是没输出,表示脚本没有错误 sh /usr/local/sbin/lvs_nat.sh
NAT模式效果测试
NAT模式效果测试 两台rs上都安装nginx 设置两台rs的主页,做一个区分,也就是说直接curl两台rs的ip时,得到不同的结果 浏览器里访问192.168.142.144,多访问几次看结果差异 首先查看B机器和C机器上的nginx服务是否开启 启动nginx 设置两台rs的主页,做一个区分,也就是说直接curl两台rs的ip时,得到不同的结果 编辑B机器的索引页
[root@yong-02 ~]# vim /usr/share/nginx/html/index.html
[root@yong-02 ~]# curl localhost
yongge02.
编辑c机器的索引页
[root@yong-03 ~]# vim /usr/local/nginx/html/index.html
[root@yong-03 ~]# curl localhost
yongge03.
这时浏览器访问模拟的公网IP,即192.168.142.144,若是浏览器访问不成功,可用curl测试
[root@yong-01 ~]# curl 192.168.142.144
yongge02.
[root@yong-01 ~]# curl 192.168.142.144
yongge03.
查看A机器上的nat规则
[root@yong-01 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 29 packets, 5245 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 25 packets, 1610 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1 76 MASQUERADE all -- * * 192.168.180.0/24 0.0.0.0/0
查看 ipvsadm 规则
[root@yong-01 ~]# 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.142.144:80 rr
-> 192.168.180.135:80 Masq 1 0 6
-> 192.168.180.138:80 Masq 1 0 6