Rhcs + Nginx 实现高可用负载均衡

一 . Rhcs介绍

RHCS(Red Hat Cluster Suite,红帽集群套件)是Red Hat公司开发整合的一套综合集群软件组件,提供了集群系统中三种集群构架,分别是高可用性集群、负载均衡集群、存储集群,可以通过在部署时采用不同的配置,以满足你的对高可用性、负载均衡、可扩展性、文件共享和节约成本的需要。

二 . 红帽集群套件RHCS的工作原理

服务器集群:由两台以上服务器组成,加入到集群的服务器被称为”节点”。通常以私有网络作为”心跳”,当集群中tat的一台服务器出现故障时,其他服务器会按照集群中设定的接管机制实现”故障切换(Failover)”。为保证服务器网络及其与外部存储的连接,通常会对网卡进行”网卡绑定”,对外部存储的HBA卡链接进行”多路径绑定”。
心跳:服务器集群中的服务器通过”心跳”机制来判断自身及集群中的其他服务器是否存活,通常”心跳”会通过RJ45接口或COM接口实现。
虚拟IP及公共网络:集群软件或硬件通过TCP/IP协议对客户端可见的公共网络公开了一个虚拟的网络IP,此IP由集群机制管理,指向当前”活动”的集群服务器”节点”。对于客户端而言,集群就相当于一个服务器,可以实现透明访问。
2.1 cman集群管理器
cman是一个基于内核的对称通用集群管理器。它由两部分组成:连接管理器(cnxman),用于处理成员、消息、投票数、事件通知和过渡;服务管理器(SM),用于处理那些需要通过各种方式进行集群管理的应用及外部系统。cman是RHCS中最核心的服务,可通过系统中的serivce命令进行启/停操作;DLM、GFS、CLVM及Fence都依赖于cman群集管理器。
2.2 rgmanager资料组管理器
rgmanager(Resource Group Manager)基于cman并使用DLM动态锁管理机制。与cman一样, rgmanager也是RHCS中的一个核心服务,可通过系统中的serivce命令进行启/停操作;rgmanager 管理并为集群中的Service(服务)和Resources(资源)提供Failover错误切换功能。
2.3 Service(服务)
每个服务都被指定存在于一个Failover Domain中,并与多个Resources(资源)关联。每个服务可以理解为实际操作中的一个应用,如Web服务器、Java中间件、数据库、文件共享系统、邮件系统等。这些应用在运行时不但对应用程序本身有要求(如某个运行指令或多个运行脚本的组合),还要提供对诸如虚拟IP、文件系统等资源的支持。
2.4 Failover Domain(错误切换域)
每个Failover Domain都与两个或两个以上的Node(服务器节点)进行绑定,Failover Domain指定了集群中某个Service运行时的范围,也就是指定此Service将会由哪些服务器提供Failover错误切换功能。每个Node都允许与多个Failover Domain进行绑定,也就是说每个Node都可以为多个 Service服务,因此可以实现”主动/主动(双活动)”方式的集群配置。
2.5 Resources(资源)
Resources指的是组成一个应用所需的各种组件,通常包括:应用程序、虚拟IP、文件系统。 资源与Service组合时,往往还会体现出一定的层次关系,例如:通常系统都要求确认虚拟IP及文件 系统都已经正常连接及挂载后,才可以运行某个应用程序,这个顺序一旦调转,就会使应用程序运行出错。
2.6 Fence机制
在RHCS集群运行时,为了避免因出现不可预知的情况而造成的”脑裂”现象(如:心跳线断连, 此时两台服务器都无法找到对方,无法向对方发出操作指令,都各自认为自己是主节点;又或者主 服务器系统崩溃,系统能接收到备用服务器的操作指令,但无法返回运行情况的确认信号,导致备 用服务器无法获知系统资源的使用情况),系统要求通过Fence机制来保障系统切换时的I/O使用安全。
Fence主要通过服务器或存储本身的硬件管理接口,又或者是外部电源管理设 备,来对服务器或存储发起直接的硬件管理指令,控制服务器或存储链路的开关。因此,Fence机制也被称为”I/O屏障”技术。当”脑裂”发生时彻底断开问题服务器的所有I/O连接,保证问题服务器不 能对集群中的I/O资源(共享的文件系统资源)进行任何操作,严格保证集群环境中企业核心数据的完整性。

三 . 进行集群配置

1.虚拟机 两个节点和一个后端服务器
server1 172.25.55.1(配置Nginx、ricci和luci)
server2 172.25.55.2(Apache)
server4 172.25.55.4(配置Nginx、ricci)
2.高可用yum源

[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# vim rhel-source.repo

name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.55.250/source6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[HighAvailability]
name=HighAvailability
baseurl=http://172.25.55.250/source6.5/HighAvailability
gpgcheck=0

[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.55.250/source6.5/LoadBalancer
gpgcheck=0

[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.55.250/source6.5/ResilientStorage
gpgcheck=0

[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.55.250/source6.5/ScalableFileSystem
gpgcheck=0

3 . 由于之前做了虚拟机封装 所以关闭selinux iptables 都已经设置好了

四 . 部署Nginx

编写一个nginx启动脚本,放在/etc/init.d/中
server1 和server4 进行相同操作
root@server1 ~]# vim /etc/init.d/nginx      
#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
start() {
echo -n $"Starting $prog: "
mkdir -p /dev/shm/nginx_temp
daemon $NGINX_SBIN -c $NGINX_CONF
RETVAL=$?
echo
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -TERM
rm -rf /dev/shm/nginx_temp
RETVAL=$?
echo
return $RETVAL
}
reload(){
echo -n $"Reloading $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -HUP
RETVAL=$?
echo
return $RETVAL
}
restart(){
stop
start
}
configtest(){
$NGINX_SBIN -c $NGINX_CONF -t
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
restart
;;
configtest)
configtest
;;
*)
echo $"Usage: $0 {start|stop|reload|
restart|configtest}"
RETVAL=1
esac
exit $RETVAL



[root@server1 ~]# chmod +x /etc/init.d/nginx      #更改文件的执行权限
[root@server1 ~]# chkconfig nginx on              #开机启动
[root@server1 ~]# /etc/init.d/httpd stop          #nginx的端口为80,在开启nginx服务前一定要确保httpd服务是关的
Stopping httpd:                                            [  OK  ]

五. 配置高可用集群

Server1:

[root@server1 ~]# yum install ricci luci -y
[root@server1 ~]# passwd ricci                       #加密
Changing password for user ricci.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@server1 ~]# /etc/init.d/ricci start            #开启ricci服务
Starting oddjobd:                                          [  OK  ]
generating SSL certificates...  done
Generating NSS database...  done
Starting ricci:                                            [  OK  ]
[root@server1 ~]# chkconfig ricci on                 #开机自启
[root@server1 ~]# /etc/init.d/luci start             #开启luci服务
Adding following auto-detected host IDs (IP addresses/domain names), corresponding to `server1' address, to the configuration of self-managed certificate `/var/lib/luci/etc/cacert.config' (you can change them by editing `/var/lib/luci/etc/cacert.config', removing the generated certificate `/var/lib/luci/certs/host.pem' and restarting luci):
    (none suitable found, you can still do it manually as mentioned above)

Generating a 2048 bit RSA private key
writing new private key to '/var/lib/luci/certs/host.pem'
Start luci...                                              [  OK  ]
Point your web browser to https://server1:8084 (or equivalent) to access luci
[root@server1 ~]# chkconfig luci on                  #开机自启

查看做好解析

[root@server1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.55.1          server1
172.25.55.2          server2
172.25.55.3          server3
172.25.55.4          server4

server4解析和server1相同

注意事项
1. 红帽高可用性附加组件最多支持的集群节点数为 16。
2. 使用 luci 配置 GUI。
3. 该组件不支持在集群节点中使用 NetworkManager。如果您已经在集群节点中安装了NetworkManager,您应该删除或者停止该服务。
4. 集群中的节点使用多播地址彼此沟通。因此必须将红帽高可用附加组件中的每个网络切换以及关联的联网设备配置为启用多播地址并支持 IGMP(互联网组管理协议)。请确定红帽高可用附加组件中的每个网络切换以及关联的联网设备都支持多播地址和 IGMP
5. 红帽企业版 Linux 6 中使用 ricci 替换 ccsd。因此必需在每个集群节点中都运行 ricci
6. 从红帽企业版 Linux 6.1 开始,您在任意节点中使用 ricci 推广更新的集群配置时要求输入密码。您在系统中安装 ricci 后,请使用 passwd ricci 命令为用户 ricci 创建密码。
7. 登陆luci的web界面的登陆为luci主机的root用户和密码
8. 创建添加Failover domain 时候 节点的值越小 ,越靠前。
9. 添加某种服务节点上都需要有该服务,创建完成后自动启动

创建集群
在浏览器访问https://server1:8084
修改密码 passwd ricci
这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
Failover Domains故障转移域设置:

这里写图片描述

这里写图片描述
Resource设置 添加nginx启动脚本 :
这里写图片描述

Service Group设置:
这里写图片描述
这里写图片描述

查询集群状态

[root@server1 ~]# clustat
Cluster Status for test5 @ Sat Aug  4 07:50:19 2018
Member Status: Quorate

 Member Name                             ID   Status
 ------ ----                             ---- ------
 172.25.55.1                                 1 Online, Local, rgmanager
 172.25.55.4                                 2 Online, rgmanager

 Service Name                   Owner (Last)                   State         
 ------- ----                   ----- ------                   -----         
 service:xiaozhuang             172.25.55.4                    started     

这里写图片描述
这里写图片描述

测试

在client中加入解析

[root@foundation55 ~]# vim /etc/hosts
172.25.55.100 www.westos.org

这里写图片描述
这里写图片描述
当server1发生故障时由server4接替
这里写图片描述
进行nginx 负载均衡时,节点切换的间隔,和切换后后端服务器,nginx负载均衡的效果

六 、Fence机制

介绍

集群中每个节点之间互相发送探测包进行判断节点的存活性。一般会有专门的线路进行探测,这条线路称为“心跳线”。假设server1的心跳线出问题,则server4会认为server1出问题,然后就会把资源调度在server4或者上运行,但server1会认为自己没问题不让其他节点抢占资源,此时就出现了脑裂(split brain)。
此时如果在整个环境里有一种设备直接把server1断电,则可以避免脑裂的发生,这种设备叫做fence

配置

[root@foundation8 ~]# yum install -y fence-virtd.x86_64 fence-virtd-libvirt.x86_64 fence-virtd-multicast.x86_64
[root@foundation8 ~]# fence_virtd -c                          #fence设置
Module search path [/usr/lib64/fence-virt]: 

Available backends:
    libvirt 0.1
Available listeners:
    multicast 1.2

Listener modules are responsible for accepting requests
from fencing clients.

Listener module [multicast]: 

The multicast listener module is designed for use environments
where the guests and hosts may communicate over a network using
multicast.

The multicast address is the address that a client will use to
send fencing requests to fence_virtd.

Multicast IP Address [225.0.0.12]: 

Using ipv4 as family.

Multicast IP Port [1229]: 

Setting a preferred interface causes fence_virtd to listen only
on that interface.  Normally, it listens on all interfaces.
In environments where the virtual machines are using the host
machine as a gateway, this *must* be set (typically to virbr0).
Set to 'none' for no interface.

Interface [virbr0]: br0                           # 此处根据自己的网卡名设置

The key file is the shared key information which is used to
authenticate fencing requests.  The contents of this file must
be distributed to each physical host and virtual machine within
a cluster.

Key File [/etc/cluster/fence_xvm.key]: 

Backend modules are responsible for routing requests to
the appropriate hypervisor or management layer.

Backend module [libvirt]: 

Configuration complete.

=== Begin Configuration ===
backends {
    libvirt {
        uri = "qemu:///system";
    }

}

listeners {
    multicast {
        port = "1229";
        family = "ipv4";
        interface = "br0";
        address = "225.0.0.12";
        key_file = "/etc/cluster/fence_xvm.key";
    }

}

fence_virtd {
    module_path = "/usr/lib64/fence-virt";
    backend = "libvirt";
    listener = "multicast";
}

=== End Configuration ===
Replace /etc/fence_virt.conf with the above [y/N]? y


[root@foundation8 ~]# systemctl restart fence_virtd.service   #开启fence服务
[root@foundation8 ~]# netstat -anulp |grep :1229              #查看端口
udp    15232      0 0.0.0.0:1229            0.0.0.0:*                           14567/fence_virtd   
[root@foundation8 ~]# mkdir /etc/cluster
[root@foundation8 ~]# cd /etc/cluster                          # 生成随机数key
[root@foundation8 cluster]# dd if=/dev/urandom of=fence_xvm.key bs=128 count=1
1+0 records in
1+0 records out
128 bytes (128 B) copied, 0.000195602 s, 654 kB/s
[root@foundation8 cluster]# systemctl restart fence_virtd.service 

# 把key分发给两个节点
[root@foundation8 cluster]# scp fence_xvm.key root@server1:/etc/cluster/
[root@foundation8 cluster]# scp fence_xvm.key root@server4:/etc/cluster/

将Fence加入节点中

这里写图片描述
这里写图片描述
这里写图片描述
在物理机查看server1信息 server4 也同样
这里写图片描述
测试

测试:此时nginx在server1上运行,模拟内核崩溃

[root@server1 ~]# fence_node server4            #测试server4有没有添加到server1上(也可以在servre4上测server1)
fence server4 success
[root@server1 ~]# clustat
Cluster Status for lippy @ Thu Aug  2 14:32:16 2018
Member Status: Quorate

 Member Name                      ID   Status
 ------ ----                      ---- ------
 server1                              1 Online, Local, rgmanager
 server4                              2 Online

 Service Name            Owner (Last)            State         
 ------- ----            ----- ------            -----         
 service:xiaozhuang           server1                 started       
[root@server1 ~]# /etc/init.d/network stop            #关闭网络
Shutting down interface eth0:  Write failed: Broken pipe



[root@server4 ~]# clustat
Cluster Status for lippy @ Thu Aug  2 14:33:38 2018
Member Status: Quorate

 Member Name                      ID   Status
 ------ ----                      ---- ------
 server1                              1 Online
 server4                              2 Online, Local, rgmanager

 Service Name            Owner (Last)            State         
 ------- ----            ----- ------            -----         
 service:xiaozhuang           (server4)               stopped     #显示接替状态关闭状态



server1会自动重启
[root@server4 ~]# clustat
Cluster Status for lippy @ Thu Aug  2 14:35:06 2018
Member Status: Quorate

 Member Name                         ID   Status
 ------ ----                         ---- ------
 server1                                 1 Online, rgmanager
 server4                                 2 Online, Local, rgmanager

 Service Name               Owner (Last)               State         
 ------- ----               ----- ------               -----         
 service:xiaozhuang             server4                    starting  #正在接替


[root@server4 ~]# clustat
Cluster Status for lippy @ Thu Aug  2 14:36:25 2018
Member Status: Quorate

 Member Name                      ID   Status
 ------ ----                      ---- ------
 server1                              1 Online, rgmanager
 server4                              2 Online, Local, rgmanager

 Service Name            Owner (Last)            State         
 ------- ----            ----- ------            -----         
 service:xiaozhuang           server4                 started       #接替完成

猜你喜欢

转载自blog.csdn.net/hello_xiaozhuang/article/details/81406909