第十七章 Linux集群架构(一)

一、 集群介绍
二、 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测试

 

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试