第二十八课 搭建高可用集群

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上有一些问题,影响实验效果

  1. keepalived通过VRRP虚拟路由冗余协议(Virtual Router RedundancyProtocl)来实现高可用。

  2. 在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有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协议的。

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 负载均衡集群介绍

负载均衡:简单的说就是让多台服务器均衡地去承载压力。 主流开源软件:

  1. 其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用

  2. keepalived的负载均衡功能其实就是内置lvs

  3. lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如MySQL,而nginx仅仅支持http、https、mail、haproxy也支持MySQL

  4. 相比较来说,LVS这种4层的更稳定,能承受更多的请求,而nginx这种7层的更加灵活,能实现更多的个性化需求,比如针对访问的目录做后端的内容分发。

18.7 LVS介绍

  1. LVS有三种常见的模式:NAT、DR、IP Tunnel
  2. 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模式搭建

  1. 首先在分发器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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值