集群
集群介绍
- 根据功能划分为两大类:高可用和负载均衡
1.高可用集群,即“HA"集群,也常称作“双机热备”,用于关键业务。核心原理都是通过心跳线连接两台服务器,一台用于提供服务,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务,实现高可用的开源软件有:heartbeat、keepalived。
2.负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2台,实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F5、Netscaler。
keepalived介绍
- 在这里我们使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题,影响实验效果。
- keepalived通过VRRP(Virtual Router Redundancy Protocl,虚拟路由冗余协议)来实现高可用。
1.它是实现路由高可用的一种通信协议,在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。
2.master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的mater。
3.Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
用keepalived配置高可用集群
生产环境中,很多企业把Nginx作为负载均衡器来用,它的重要性很高,一旦宕机会导致整个站点不能访问,所以有必要再准备一台备用Nginx,Keepalived用在这种场景下非常合适。
准备
最少需要两台虚拟机
Master:
系统:CentOS7.4 最小化安装
IP:10.1.1.61
主机名:master
yum安装好两个软件包:keepalived、nginx
关闭防火墙和selinux
Backup:
系统:CentOS7.4 最小化安装
IP:10.1.1.62
主机名:backup
yum安装好两个软件包:keepalived、nginx
关闭防火墙和selinux
直接通过 yum install nginx
肯定是不行的,因为yum没有nginx,所以首先把 nginx 的源加入 yum 中。
将nginx放到yum repro库中
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
使用yum安装ngnix yum install nginx
查看nginx信息 yum info nginx
启动nginx service nginx start
查看nginx版本nginx -v
定义一个VIP 10.1.1.60
VIP的英文名字是“Virtual IP",即“虚拟IP",也有人把它叫作“浮动IP”,因为这个IP是由Keepalived给服务器配置上的,服务器靠这个VIP对外提供服务,当master机器宕机,VIP被分配到backup上,这样用户看来是无感知的。
将nginx默认主页的内容修改为各自的ip
// Master
# echo '10.1.1.61' > /usr/share/nginx/html/index.html
# nginx
# curl 10.1.1.61
10.1.1.61
// Backup
# echo '10.1.1.62' > /usr/share/nginx/html/index.html
# nginx
# curl 10.1.1.62
10.1.1.62
Master配置
修改的keepalived配置文件/etc/keepalived/keepalived.conf
# ls /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
# vi /etc/keepalived/keepalived.conf
# > !$ //清空配置文件内容
# vim /etc/keepalived/keepalived.conf
//增加如下配置内容,按需求更改部分配置:
global_defs { //全局定义参数
notification_email {
aming@aminglinux.com //定义接收告警的人
}
notification_email_from root@aminglinux.com //定义发邮件地址(实际上没用)
smtp_server 127.0.0.1 //定义发邮件地址,若为127.0.0.1则使用本机自带邮件服务器发送
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx { //chk_nginx为自定义名字,后面还会用到它
script "/usr/local/sbin/check_ng.sh" //自定义脚本,该脚本为监控nginx服务的脚本
interval 3 //每隔3S执行一次该脚本
}
vrrp_instance VI_1 {
state MASTER //角色为master
interface ens33 //针对哪个网卡监听VIP
virtual_router_id 51
priority 100 //权重为100,master要比backup大
advert_int 1
authentication {
auth_type PASS
auth_pass 123456 //定义密码,这个密码自定义
}
virtual_ipaddress {
10.1.1.60 //定义VIP
}
track_script {
chk_nginx //定义监控脚本,这里和上面vrr_script后面的字符串保持一致
}
}
编辑nginx监控脚本 /usr/local/sbin/check_ng.sh 内容如下
# vim /usr/local/sbin/check_ng.sh
//脚本名字是自定义的,与keepalived配置文件要一致
编辑脚本增加如下内容:
#!/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
最后给脚本755权限,再启动keepalived
# chmod 755 /usr/local/sbin/check_ng.sh
//需要给它权限,否则无法被keepalived调用加载
# systemctl start keepalived
//启动master上的keepalived,如果nginx服务没有启动,它会自动拉起来,并监听VIP
# ps -ef | grep keep
root 3182 1 0 15:29 ? 00:00:00 /usr/sbin/keepalived -D
root 3183 3182 0 15:29 ? 00:00:00 /usr/sbin/keepalived -D
root 3184 3182 0 15:29 ? 00:00:00 /usr/sbin/keepalived -D
两台机器都查看防火墙及SElinux是否开启,开启需要关闭
# setenforce 0 //临时关闭SELinux
//开机关闭SELinux
编辑/etc/selinux/config文件,将SELINUX的值设置为disabled
# getenforce //查看SElinux是否关闭
Disabled
# systemctl stop firewalld.service //关闭防火墙
# iptables -nvL //查看防火墙
Chain INPUT (policy ACCEPT 0 packets, 0 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 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Backup机配置
# ls /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
# > !$ //清空配置
> /etc/keepalived/keepalived.conf
# 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
}
vrrp_instance VI_1 {
state BACKUP //这个需要改,说明是从的状态
interface ens33
virtual_router_id 51
priority 90 //这个权重比master少
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
10.1.1.60 //这个跟master一样
}
track_script {
chk_nginx
}
}
编辑监控nginx脚本 /usr/local/sbin/check_ng.sh 内容如下
# vim /usr/local/sbin/check_ng.sh
编辑增加如下配置内容:
#时间变量,用于记录日志
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
给脚本755权限,再启动keepalived
# chmod 755 /usr/local/sbin/chech_ng.sh
# systemctl start keepalived
# ps -ef | grep keepalived
root 10994 1 0 15:31 ? 00:00:00 /usr/sbin/keepalived -D
root 10995 10994 0 15:31 ? 00:00:00 /usr/sbin/keepalived -D
root 10996 10994 0 15:31 ? 00:00:00 /usr/sbin/keepalived -D
keepalived配置文件说明
// 1:全局定义 global definitions 部分
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
} #大括号用来分隔去看,需要成对出现,如果漏掉了也不会出错,但是得不到想要的结果
// 2:检测模块,可以通过制定的脚本来检测对应的服务是否正常
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh" # 指定自定义检测nginx服务的脚本
interval 3 # 检测的间隔时间
}
// 3:VRRP实例定义区块
# 这部分主要用来定义具体服务去实例配置,包括Keepalived主备状态、接口、优先级、认证方式和IP等信息。
vrrp_instance VI_1 {
# 上面这行定义了一个vrrp_instance实例,名字是VI_1,MASTER和BACKUP的实例名必须相同,可以定义多个实例
state BACKUP
# state表示当前实例的状态,MASTER为正式工作状态,BACKUP为备用状态。
interface ens33
# interface :指定网卡名称,CentOS一般都是ens开头
virtual_router_id 51
# virtual_router_id 表示虚拟路由ID表示,这个表示最好是一个数字,
# 如果一个配置文件中有多个vrrp_instance实例,则不能出现相同的vrtual_router_id,
# 但是MASTER和BACKUP配置中相同实例的virtual_router_id必须一致,否则会出现脑裂问题。
priority 90
# priority 为优先级,指定的数字越大,表示实例的优先级越高,
# 在同一个vrrp_instance实例中 MASTER的优先级配置要高于BACKUP
advert_int 1
# advert_int 为同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为妙,默认为1
authentication {
# authentication 为权限认证配置块,包含认证类型,和认证密码
auth_type PASS
# auth_type 为认证类型,有PASS和AH两种认证类型,一般使用PASS,验证密码为明文的方式
auth_pass 123456
# auth_pass 指定认证的密码, BACKUP必须和MASTER一致才能通信
}
virtual_ipaddress {
# virtual_ipaddress 虚拟IP地址配置,通常称之为VIP。可以配置多个IP
# 每个IP占一行,这里的虚拟IP就是在工作中需要和域名绑定的IP。
# 即和配置对应的高可用服务监听的ip要保持一致(这里的高可用服务是Nginx 也可以是其他服务)
10.1.1.60
# 指定的虚拟ip
}
track_script { #加载指定的服务检测区块。
chk_nginx
}
}
测试效果
// 先查看MASTER和BACKUP的网卡状态
// 注只能用 ip addrress 查看才能看到MASTER和BACKUP的具体的差别
// MASTER:
# ip address show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:09:51:04 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.61/24 brd 10.1.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet 10.1.1.60/32 scope global ens33 #这一行就是Keepalived服务设置的VIP了
valid_lft forever preferred_lft forever
inet6 fe80::73d1:f0bd:e404:d27d/64 scope link
valid_lft forever preferred_lft forever
// BACKUP:
# ip address show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:92:e2:80 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.62/24 brd 10.1.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::f860:8d99:5ffa:9f8f/64 scope link
valid_lft forever preferred_lft forever
// MASTER和BACKUP用curl请求访问10.1.1.60,结果都是10.1.1.61
# curl 10.1.1.60
10.1.1.61
# curl 10.1.1.60
10.1.1.61
// 现在模拟故障,将MASTER的Keepalived服务关闭掉
# systemctl stop keepalived
# ps -ef | grep keepalived | grep -v grep
// 没有输出,表示keepalive服务d已经关闭了
// 再次查看MASTER和BACKUP的网卡状态
// MASTER:
# ip address show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:09:51:04 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.61/24 brd 10.1.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::73d1:f0bd:e404:d27d/64 scope link
valid_lft forever preferred_lft forever
// BACKUP:
# ip address show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:92:e2:80 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.62/24 brd 10.1.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet 10.1.1.60/32 scope global ens33 #10.1.1.60这个IP被自动设置到了BACKUP的网卡上面
valid_lft forever preferred_lft forever
inet6 fe80::f860:8d99:5ffa:9f8f/64 scope link
valid_lft forever preferred_lft forever
// 现在MASTER与BACKUP访问10.1.1.60,的结果都是10.1.1.62了
# curl 10.1.1.60
10.1.1.62
# curl 10.1.1.60
10.1.1.62
// 将MASTER的keepalived服务开启然后访问10.1.1.60,结果又变回10.1.1.61了
# systemctl start keepalived
# curl 10.1.1.60
10.1.1.61
# curl 10.1.1.60
10.1.1.61
负载均衡集群介绍
- 主流开源软件LVS、keepalived、haproxy、nginx等;
- 其中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层的更加灵活,能实现更多的个性化需求;
LVS介绍
- LVS是由国人章文嵩开发;
- 流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高;
- LVS最新版本基于Linux内核2.6,有好多年不更新了;
- LVS有三种常见的模式:NAT、DR、IP Tunnel;
- LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs);
LVS NAT模式
- 这种模式借助iptables的nat表来实现
- 用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去
- rs需要设定网关为分发器的内网ip
- 用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈
- 在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源
LVS IP Tunnel模式介绍
- 这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip;
- 客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上;
- rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己;
LVS DR 模式介绍
-
这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip
-
和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址
-
rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
LVS调度算法
介绍
-
轮询 Round-Robin rr (重点)
非常简单的一种高度算法,就是按顺序把请求依次发送给后端的服务器,它不管后端服务器的处理速度和响应时间怎样。当后端服务器性能不一致时,用这种调度算法就不合适过了。 -
加权轮询 Weight Round-Robin wrr (重点)
比第一种算法多了一个权重的设置,权重越高的服务器被分配到的请求就越多,这样后端服务器被分配到的请求就越多,这样后端服务器性能不一致时,就可以给配置低的服务器较小的权重。 -
最小连接 Least-Connection lc (重点)
这种算法会根据各真实服务器上的连接数来决定把新的请求分配给谁,连接数少说明服务器是空闲的,这样把新的请求分配到空闲服务器上才更加合理。 -
加权最小连接 Weight Least-Connection wlc (重点)
在最小连接高度的基础上再增加一个权重设置,这样就可以人为地去控制哪些服务上多分配请求,哪些少分配请求。 -
基于局部性的最小连接 Locality-Based Least Connections lblc
这种算法简称LBLC,是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。算法的设计目标是在服务器的负载基本平衡的情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率。 -
带复制的基于局部性最小连接 Locality-Based Least Connections with Replication lblcr
该算法简称LBLCR,也是针对目标IP地址的负载均衡,它与LBLC算法的不同之处是:它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法是维护从一个目标IP地址到一台服务器的映射。LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,则将请求发送到该服务器;若服务器超载,则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。 -
目标地址散列调度 Destination Hashing dh
该算法也是针对目标IP地址的负载均衡的,但它是一种静态映射算法,通过一个散列(hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(hash key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 -
源地址散列调度 Source Hashing sh
该算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它的算法流程与目标地址散列调度算法的基本相似,只不过将请求的目标IP地址换成请求的源IP地址。
LVS相关术语
- DS:Director Server。指的是前端负载均衡器节点。
- RS:Real Server。后端真实的工作服务器。
- VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
- DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
- RIP:Real Server IP,后端服务器的IP地址。
- CIP:Client IP,访问客户端的IP地址。
LVS NAT模式搭建
环境准备
# 实验需要三台机器
# 三台都需要关闭firewalld服务, 并且安装iptables-serives服务,
# 启动iptables服务,并清空iptables规则
# 分发器,也叫调度器(简写为dir)
主机名:dir
内网网卡IP:192.168.10.10 VMware网卡模式调整为LAN区段模式,与rs在同一个LAN区段
外网网卡IP:10.1.1.28 VMware网卡模式为桥接,也可以NAT或者仅主机模式
# Real Server 1
主机名:rs1
内网:192.168.10.11 VMware网卡模式调整为LAN区段模式,与dir在同一个LAN区段
设置网关为:192.168.10.10
# Real Server 2
主机名:rs2
内网:192.168.10.12 VMware网卡模式调整为LAN区段模式,与dir在同一个LAN区段
设置网关为:192.168.10.10
在dir上关闭Firewalld 安装iptables-service和ipvsadm
// 关闭防火墙
# systemctl stop firewalld
# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
// 安装 ipvsdam, ipvsadm是类似于iptables的工具,用于设置LVS的规则
# yum install -y ipvsadm
在dir上编写LVS脚本,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防火墙
systemctl start iptables
iptables -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
// director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.147.144:80 -s rr
$IPVSADM -a -t 192.168.147.144:80 -r 192.168.10.11:80 -m -w 1
$IPVSADM -a -t 192.168.147.144:80 -r 192.168.10.12:80 -m -w 1
// 编辑完脚本就执行这个脚本
ipvsadm选项说明
-C 清除内核虚拟服务器表中的所有记录
-A 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器
-a 在内核虚拟服务器表的一条记录里添加一条新的 rs 服务器记录。
-t 指定虚拟服务器提供的是 tcp 的服务,格式为:vip:port -r rip:port
-r 指定 rs 服务器ip
-m 指定 LVS 的工作模式为NAT 模式
-p 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台rs处理。timeout 的默认值为300 秒。
-g 指定LVS 的工作模式为DR模式(也是LVS 默认的模式)
-i 指定LVS 的工作模式为隧道模式
rs机设置
// 两台rs上都安装nginx,关闭firewalld,安装iptables-services,
// 启动iptables 并清空iptables规则
// 将两台rs的默认主页的内容修改为各自的ip
# echo '192.168.10.11' > /usr/share/nginx/html/index.html
# echo '192.168.10.12' > /usr/share/nginx/html/index.html
测试效果
curl请求访问10.1.1.28,多访问几次看结果差异
// rr算法 ,均匀分配rs处理访问请求
# curl 10.1.1.28
192.168.10.12
# curl 10.1.1.28
192.168.10.11
# curl 10.1.1.28
192.168.10.12
# curl 10.1.1.28
// wrr 算法, 192.168.10.11 权重为3
# curl 10.1.1.28
192.168.10.11
# curl 10.1.1.28
192.168.10.11
# curl 10.1.1.28
192.168.10.11
# curl 10.1.1.28
192.168.10.12