一、 集群介绍
二、 keepalived介绍
三、 用keepalived配置高可用集群
四、 负载均衡集群介绍
五、 LVS介绍
六、 LVS调度算法
七、 LVS NAT模式搭建
一、 集群介绍
集群功能划分:
1:高可用:
高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务。
实现高可用的开源软件有:heartbeat、keepalived
2:负载均衡
负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2。
实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx
商业的有F5、Netscaler
二、 keepalived介绍
keepalived是实现高可用的一种轻量级的技术手段,主要用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生。
1.keepalived通过VRRP(Virtual Router Redundancy Protocl)来实现高可用。
2.在VRRP协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。
3.master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的mater。
4.Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
三、 用keepalived配置高可用集群
实验环境准备:
需要准备两台虚拟机,分别都装上nginx。 注意:克隆的虚拟机需要将网卡配置文件中的UUID删除掉,否则会有冲突。
此次实验的环境是两台CentOS7.3系统的虚拟机
主(Master):
是之前做LNMP实验时的系统,里面已经装好了nginx
主机名:Linux01
IP:192.168.239.128
关闭防火墙和selinux
从(Backup) :
克隆的主系统,CentOS7.3系统
主机名:mysql-slave
IP:192.168.239.138
关闭防火墙和selinux
nginx+keepalived高可用安装过程:
主(Master)配置:
1. 在主(Master)和从(Backup)上都安装nginx和keepalived
[root@Linux01 ~]# yum install -y keepalived
[root@mysql-slave ~]# yum install -y keepalived
2. 编辑主(Master)上keepalived的配置文件
内容参考:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf
[root@Linux01 ~]# vim /etc/keepalived/keepalived.conf //删除之前的内容,或者备份,把参考里的复制进来,修改虚拟IP为100
3. 新建监控脚本
内容参考:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_check_ng.sh
[root@Linux01 ~]# vim /usr/local/sbin/check_ng.sh
授予脚本755权限
[root@Linux01 ~]# chmod 755 /usr/local/sbin/check_ng.sh
[root@Linux01 ~]# ls -l /usr/local/sbin/check_ng.sh
4. 启动主(Master)上的keepalived
[root@Linux01 ~]# systemctl start keepalived.service
[root@Linux01 ~]# ps aux | grep keepalived
keepalived配置文件说明:
# 1:全局定义 global definitions 部分
global_defs {
notification_email {
dong@wenyang.com
}
notification_email_from root@wenyang.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 wenyang>com
# auth_pass 指定认证的密码, BACKUP必须和MASTER一致才能通信
}
virtual_ipaddress {
# virtual_ipaddress 虚拟IP地址配置,通常称之为VIP。可以配置多个IP
# 每个IP占一行,这里的虚拟IP就是在工作中需要和域名绑定的IP。
# 即和配置对应的高可用服务监听的ip要保持一致(这里的高可用服务是Nginx 也可以是其他服务)
192.168.239.100
# 指定的虚拟ip
}
track_script { #加载指定的服务检测区块。
chk_nginx
}
}
从(Backup)配置:
1. 编辑从(Backup)上的配置文件
内容参考:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_keepalived.conf
[root@mysql-slave ~]# vim /etc/keepalived/keepalived.conf
//删除之前的内容,或者备份,把参考里的复制进来,修改虚拟IP为100
2. 新建监控脚本
内容参考:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_check_ng.sh
[root@mysql-slave ~]# vim /usr/local/sbin/check_ng.sh
授予脚本755权限
[root@mysql-slave ~]# chmod 755 /usr/local/sbin/check_ng.sh
[root@mysql-slave ~]# ls -l /usr/local/sbin/check_ng.sh
4. 启动从(Backup)上的keepalived
[root@mysql-slave ~]# systemctl start keepalived
[root@mysql-slave ~]# ps aux | grep keepalived
测试:
将nginx默认主页的内容修改为各自的ip,便于在做实验时区分是哪台机器在工作
主:
[root@Linux01 ~]# cat /usr/local/nginx/conf/vhost/aaa.com.conf //在nginx虚拟主机里查看默认主机及默认页面
[root@mysql-slave ~]# echo '192.168.239.128'>/data/wwwroot/www.default.com/index.html
从:
[root@mysql-slave ~]# cat /data/wwwroot/www.default.com/index.html
[root@mysql-slave ~]# echo '192.168.239.138'>/data/wwwroot/www.default.com/index.html
测试1.关闭主(master)上的nginx服务
[root@Linux01 ~]# /etc/init.d/nginx stop
因为监控脚本有写自动重启的指令,所以手工重启后监控脚本又自动把nginx服务开启了。
测试2. 在主(master)上增加iptabls规则(开启防火墙,添加规则,主备上都做)
[root@Linux01 ~]# systemctl start firewalld
[root@Linux01 ~]# iptables -I OUTPUT -p vrrp -j DROP
此时keepalived是正常的,虚拟ip(公有IP)在主、从上都有绑定,但是访问到的还是主的默认页面,不能达到切换资源的目的。
测试3. 关闭主(master)上的keepalived服务
[root@Linux01 ~]# systemctl stop keepalived.service
达到资源切换的目的。
测试4. 重新启用主(master)上的keepalived服务
[root@Linux01 ~]# systemctl start keepalived.service
查看主从的日志:
[root@Linux01 ~]# tail /var/log/messages
[root@mysql-slave ~]# tail /var/log/messages
在切换过程存在延时,并且VIP在主、从之间漂移。
四、 负载均衡集群介绍
负载均衡建立在现有网络结构之上,它提供了一种廉价、有效、透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
主流开源软件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是由国人章文嵩开发的一款4层负载均衡开源软件
流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高
LVS最新版本基于Linux内核2.6,有好多年不更新了
LVS有三种常见的模式:NAT、DR、IP Tunnel
LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)。
LVS三种模式:
1.LVS NAT模式
-
这种模式借助iptables的nat表来实现
-
用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去
-
rs需要设定网关为分发器的内网ip
-
用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈,在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源
2.LVS IP Tunnel模式
-
这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip
-
客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上
-
rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
3.LVS DR模式
-
这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip
-
和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址
-
rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
六、 LVS调度算法
针对不同的网络服务需求和服务器配置,IPVS调度器实现了如下八种负载调度算法:
轮叫(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)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
LVS调度算法:
Round-Robin rr # 轮询算法,均衡的将用户请求分发到每一个rs上
Weight Round-Robin wrr # 加权轮询 ,带权重的轮循,依照指定的权重比来分发请求
Least-Connection lc # 最小连接 ,将请求分发到连接数比较少的rs上
Weight Least-Connection wlc # 带权重的最小连接,
Locality-Based Least Connections lblc # 基于局部性的最小连接
Locality-Based Least Connections with Replication lblcr # 带复制的基于局部性最小连接
Destination Hashing dh # 目标地址散列调度
Source Hashing sh # 源地址散列调度
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)
主机名:lvs-lb
内网:192.168.239.133,外网:192.168.44.150(仅主机)
主机名:rs1
内网:192.168.239.137,网关:192.168.239.133
主机名:rs2
内网:192.168.239.139,网关:192.168.239.133
1. 在三台虚拟机上停用firewalld,启用iptables
//停用firewalld
systemctl stop firewalld
systemctl disable firewalld
//如果未安装iptables,用yum安装一下
yum -y install iptables-services
systemctl start iptables-services
//清空、保存规则
iptables -F; service iptables save
2. 在分发器上安装ipvsdam
[root@dir ~]# yum -y install ipvsadm
# 安装 ipvsadm, ipvsadm是类似于iptables的工具,用于设置LVS的规则
3. 在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.239.0/24 -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.44.150:80 -s rr # rr算法 ,均匀分配rs处理访问请求
$IPVSADM -a -t 192.168.44.150:80 -r 192.168.239.137:80 -m -w 1
$IPVSADM -a -t 192.168.44.150:80 -r 192.168.239.139:80 -m -w 1
启动ipvsadm.service服务:
[root@dir ~]# systemctl start ipvsadm.service
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 的工作模式为隧道模式
4. 测试
两台rs上都安装nginx,将默认主页的内容修改为各自的ip
[root@dir ~]# curl 192.168.44.150
# rr算法 ,均匀分配rs处理访问请求。也可以在脚本修改权重
多curl几次,查看结果。
浏览器可能会因为内核问题,不好测试,建议使用命令行curl测试