Keepalived + LVS集群架构
1. 集群介绍
集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。
集群的特点:高性能(Performance)、价格有效(Cost-effectiveness)、可伸缩性(Scalability)、高可用性(Availability)、透明性(Traansparency)、可管理性(Manageability)、可编程性(Programmability)
什么是集群
多台机器一起提供服务,这些机器的集合就是集群。
集群分类
高可用
不存在单点,即,如果一个机器宕机不影响服务。
常见开源软件:keepalived heartbeat
负载均衡
把负载均衡地分担到多台机器上。论坛服务器1台不够了,我们再加1台,用户请求会分摊到这两台机器上。
常见开源软件:LVS Nginx haproxy
分布式集群
它实际上是集合了高可用和负载均衡为一体的一种集群。它的特点是,可以无限制的横向扩容。
2. keepalived集群介绍
使用 keepalived 来实现高可用集群,因为 heartbeat 在 centos6 上有一些问题,影响实验效果,而且 heartbeat 软件在2010年停止更新;因此着重讲解 keepalived
keepalived 通过 VRRP(Virtual Router Redundancy Protocl)来实现高可用。
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有 1 个 master 角色和N(N>=1)个backup 角色。
master 会通过组播的形式向各个 backup 发送 VRRP 协议的数据包,当 backup 收不到 master 发来的 VRRP 数据包时,就会认为 maste r宕机了。此时就需要根据各个 backup 的优先级来决定谁成为新的 mater
Keepalived 要有三个模块,分别是 core、check 和 vrrp。其中 core 模块为 keepalived 的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check 模块负责健康检查,vrrp 模块是来实现 VRRP 协议的。
3. 用keepalived配置高可用集群
实验准备
准备两台机器 test01 作为 master,test02 作为 backup
两台机器都执行 yum install -y keepalived
两台机器都需要安装 nginx
1. 在 MASTER 上配置:
- 给 master、slave 两台机器都安装 Keepalived,安装命令如下
yum install -y keepalived
- 把 keepalived 原配置文件清空,并添加新配置
[root@test01 ~]# ls /etc/keepalived/keepalived.conf #查看keepalived配置文件路径
/etc/keepalived/keepalived.conf
[root@test01 ~]# > /etc/keepalived/keepalived.conf #清空原有内容
[root@test01 ~]# vim /etc/keepalived/keepalived.conf #编辑新内容
global_defs {
notification_email {
sunchen88vip@163.com #定义接收邮件人
}
notification_email_from #定义发邮件地址(实际没有)
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" #此脚本为检查nginx服务的是否正常
interval 3
}
vrrp_instance VI_1 {
#定义相关 master 的信息
state MASTER #角色叫 master 从机上叫 backup
interface ens33 #网卡的名称
virtual_router_id 51 #定义路由器的 id
priority 100 #权重,主角色和从角色的权重是不一样的
advert_int 1
authentication {
auth_type PASS #认证相关信息
auth_pass 123 #定义密码
}
virtual_ipaddress {
192.168.85.100 #定义 一个公有的 vip
}
track_script {
chk_nginx #定义监控脚本,这里和上面 vrr_script 后面的字符串保持一致
}
}
- 定义监控 nginx 的脚本
这是检查 Nginx 是否正常的一个 shell 脚本
[root@test01 ~]# 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
- 给 nginx 脚本赋予 755 权限
[root@test01 ~]# ls -l /usr/local/sbin/check_ng.sh
-rw-r--r--. 1 root root 575 Jun 4 10:24 /usr/local/sbin/check_ng.sh
[root@test01 ~]# chmod 755 /usr/local/sbin/check_ng.sh #赋予权限,否则无法被 keepalived 调用
[root@test01 ~]# ls -l /usr/local/sbin/check_ng.sh
-rwxr-xr-x. 1 root root 575 Jun 4 10:24 /usr/local/sbin/check_ng.sh
- 开启 keepalived 服务,查看日志,查看网卡,停止防火墙,关闭 SElinux
1. systemctl start keepalived #启动keepalived
2. ps aux |grep keep #查看keepalived的进程
3. /etc/init.d/nginx stop #暂停nginx
4. ps aux |grep nginx #nginx的进程还是会启动
5. less /var/log/messages #查看日志内容
6. ip add #查看网卡有没有vip
7. systemctl stop firewalld #关闭防火墙
8. getenforce 0 #关闭SELinux
9. iptables -nvL #查看表
- 修改 nginx 启动页面
[root@test01 ~]# cd /usr/local/nginx/html/
[root@test01 html]# mv index.html index.html.1
[root@test01 html]# vim index.html
MASTER!
2. 在 BACKUP 上配置:
- 把 keepalived 原配置文件清空,并添加新配置
[root@test02 ~]# > /etc/keepalived/keepalived.conf
[root@test02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
sunchen88vip@163.com
}
notification_email_from
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 #从机是 backup
interface ens33
virtual_router_id 51
priority 90 #比主的权重少一些
advert_int 1
authentication {
auth_type PASS
auth_pass 123
}
virtual_ipaddress {
192.168.85.100
}
track_script {
chk_nginx
}
}
- 定义监控 nginx 的脚本
[root@test02 ~]# 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
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
- 给 nginx 脚本赋予 755 权限
[root@test02 ~]# chmod 755 /usr/local/sbin/check_ng.sh
[root@test02 ~]# ll /usr/local/sbin/check_ng.sh
-rwxr-xr-x. 1 root root 635 Jun 4 11:13 /usr/local/sbin/check_ng.sh
- 开启 keepalived 服务,停止防火墙,关闭 SElinux
[root@test01 ~]# systemctl start keepalived #启动 keepalived
[root@test01 ~]# ps aux |grep keep #查看 keepalived 的进程
[root@test01 ~]# /etc/init.d/nginx stop #暂停 nginx
[root@test01 ~]# ps aux |grep nginx # nginx 的进程还是会启动
[root@test01 ~]# systemctl stop firewalld #关闭防火墙
[root@test01 ~]# getenforce 0 #关闭 SELinux
[root@test01 ~]# iptables -nvL #查看表
- 修改 nginx 启动页面
[root@test02 ~]# cd /usr/local/nginx/html/
[root@test02 html]# mv index.html index.html.1
[root@test02 html]# vim index.html
BACKUP!
3. 测试阶段:
现在把个机器梳理一下:
192.168.85.130 为 master 机,test01
192.168.85.131 为 backup 机,test02
192.168.85.100 为 VIP
- 用 ip add 命令查看,此时 VIP 192.168.85.100 在 test01 上
- 分别测试 test01 (master) 和 test02 (backup) 是否可以运行,并且测试 vip 是否可以运行
master 使用 ens33 ip 访问
backup 端访问页面
master 使用虚拟 vip 测试访问
- master 停止 keepalived 服务
实验让 test01 (master) 宕机; 关闭 keepalived 服务,在 masters 查看 VIP 是否还存在
[root@test01 ~]# systemctl stop keepalived
[root@test01 ~]# ps aux |grep keep
root 17406 0.0 0.0 9088 672 pts/1 S+ 14:39 0:00 grep --color=auto keep
[root@test01 ~]# 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
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:88:e3:ff 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
inet 192.168.94.150/24 brd 192.168.94.255 scope global noprefixroute ens33:0
valid_lft forever preferred_lft forever
inet6 fe80::67cd:2d8d:3614:6d99/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:88:e3:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.1/24 brd 192.168.100.255 scope global noprefixroute ens37
valid_lft forever preferred_lft forever
inet6 fe80::7c5b:18cc:d832:7525/64 scope link noprefixroute
valid_lft forever preferred_lft forever
显示已经不存在 虚拟 ip 了
- 在 backup 上查看,此时 VIP 完美转移到 backup 上面
4. 负载均衡集群介绍
首先我们先介绍一下什么是负载均衡: 负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。这是来自维基百科的介绍。负载均衡的目的,就在于平衡计算机的负载,给用户提供优质,可靠,稳定的服务。日常生活中到处都能看到“负载均衡”,一个超市的收营员高峰期只能服务10位顾客,当做活动时有20位顾客需要服务的话可能就会排长队,这样购物体验将会很差(就像客户抱怨系统/网站访问太慢)。最简单的办法就是再招个营业员,重新开通一个出口。负载均衡的核心就是“分摊压力”。
应用服务器并不直接与用户相连, 用户连接负载均衡服务器,然后由负载均衡服务器把消息转发给实际应用服务器。负载均衡器内部会根据应用服务器的负载情况,决定把消息转发给哪台服务器处理。同时负载均衡器还可以对用户屏蔽应用服务器失效,只要把用户的消息转发到非失效服务器即可。
提到负载均衡,就不能不介绍另外一个概念: 集群。集群就是一组部署有相同应用的服务器。例如web 服务器。用户的请求无论连接到哪台服务器上,都能得到相同的处理。这样我们实现一种服务器,可以将用户的请求根据特定规则转发到应用服务器上进行处理。就实现了完整的集群处理系统。这个服务器如果实现了后台服务器感知和配置功能,能够了解后台服务器的可用情况。就可以被称作为负载均衡器。
负载均衡在目前网络服务规模越来越庞大的情况下,成为一个大型服务器系统必须要面对的问题。随着用户和业务的增多,来自用户的访问量和数据流量不断增大,对服务器的计算能力和储存要求也在不断增加,单台服务器根本无法承担这么庞大的数据处理请求。这个时候,我们必须利用集群技术,采用一组服务器对来自用户的请求进行处理,服务器的数量要能够不断的扩充。在集群的前端,我们采用负载均衡技术,平均分散用户的请求到不同的处理服务器,并且能够在集群中某个服务失效时,即时感知,屏蔽,将消息转发到其他可用服务器上。
可以实现负载均衡集群的开源软件有:LVS、keepalived、haproxy、nginx等,其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用。
LVS在第四层,所以可以通过TCP/IP协议,与其他端口进行通信。而在第七层的nginx只能支持http,https,mail等协议,不能自由地与其他端口进行通信。这两种类型的软件都各有优点,例如LVS比较稳定能承载的并发量比较高,而nginx则是灵活,由于在第七层所以能够实现一些复杂的功能,能实现更多的个性化需求。
1. LVS集群介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。使用LVS可以达到的技术目标是:通过LVS达到的负载均衡技术和Linux操作系统实现一个高性能高可用的Linux服务器群集,它具有良好的可靠性,可拓展性和可操作性。从而以低廉的成本实现最优的性能。现在LVS已经是Linux内核标准的一部分了,LVS从1998年开始,发展到现在已经是一个比较成熟的项目了。利用LVS技术可以实现高性能,高可压缩的网路服务,例如WWW服务,FTP服务,MAIL服务等。比较著名的就是www.linux.com以及www.real.com。
LVS的官方网站: http://www.linuxvirtualserver.org/
特点:
可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP