RHCS套件和nginx实现高可用负载均衡机群

2023-12-27 21:38

本文主要是介绍RHCS套件和nginx实现高可用负载均衡机群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原理:server1做h1,server9为h2,两个调度器作为高可用节点,集群主机必须所有的配置相同
新开server9主机:172.25.92.9

server1上:作为h1,并作为集群管理节点

[root@server1 ~]# scp /etc/yum.repos.d/rhel-source.repo 172.25.92.9:/etc/yum.repos.d
[root@server1 ~]# scp -r /usr/local/nginx/ 172.25.92.9:/usr/local/
yum install -y luci ricci
[root@server1 ~]# chkconfig luci on
[root@server1 ~]# chkconfig ricci on
[root@server1 ~]# passwd ricci
[root@server1 ~]# /etc/init.d/ricci start
netstat -antlp | grep ricci
tcp        0      0 :::11111                    :::*                        LISTEN      11789/ricci 

server9上,仅作为h2:

[root@server9 ~]# yum clean all
[root@server9 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@server9 ~]# useradd -u 800 nginx   #必须同server1上[root@server9~]# nginx
[root@server9 ~]# netstat -antlp | grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      1054/nginx          
tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      1054/nginx          
可以看见80443端口
yum install -y ricci
[root@server9 ~]# chkconfig ricci on
[root@server9 ~]# passwd ricci
[root@server9 ~]# /etc/init.d/ricci start
netstat -antlp | grep ricci    #ricci的开启端口为11111
tcp        0      0 :::11111                    :::*                        LISTEN      11789/ricci   

查看RHCS管理界面:
需要做解析:测试机(本地物理机),server1,server9都做同样的dns解析

vim /etc/hosts
172.25.92.1     server1
172.25.92.9     server9

在浏览器访问:https://server1:8084,luci自动开启8084端口接受集群节点的11111端口的数据包
使用server1的root密码登陆
这里写图片描述
创建集群并添加集群节点:
这里写图片描述
注意;1)Use the Same Password for All Nodes的前面如果有对号,则表示集群节点的密码相同,集群节点的密码为刚才为 ricci 的设定的密码
2) Download Packages:表示自动下载需要的安装包
3)Use Locally Installed Packages:表示根据本地已下载的安装包来下载
4)Reboot Nodes Before Joining Cluster:创建集群后会重启动集群节点,所以之前要将集群管理工具(luci和ricci设置为开机自启动)
5)Enable Shared Storage Support:开启集群共享存储功能
这里写图片描述
可以通过查看进程知道,两个集群节点开始安装集群套件,之后重启后加入集群中
这里写图片描述
这里写图片描述

使用keepalived配置高可用的话,不同的keepalived之间通过vrrp协议通信,若果因为网络等问题导致某一个keepalived挂掉的话,
可能会造成数据丢失,也可能产生脑裂问题。

为什么使用fence’设备?
如果集群中一个节点通信失效,那么集群中的其他节点必须能够保证将已经失效的节点与其正在访问的共享资源(比如共享存储)隔离开,出问题的集群节点 本身无法做到这一点,因为该集群节点在此时可能已经失去响应(例如发生hung机),因此需要通过外部机制来实现这一点。这种方法被称为带有fence代 理的隔离。

不配置隔离设备,我们没有办法知道之前断开连接的集群节点使用的资源是否已经被释放掉。如果我们没有配置隔离代理(或者设备),系统可能错误的认为集群节点已经释放了它的资源,这将会造成数据损坏和丢失。 没有配置隔离设备,数据的完整性就不能够被保证,集群配置将不被支持。

当隔离动作正在进行中时,不允许执行其他集群操作。这包括故障转移服务和获取GFS文件系统或GFS2文件系统的新锁。 在隔离动作完成之前或在该集群节点已经重启并且重新加入集群之前,集群不能恢复正常运行。

隔离代理(或设备)是一个外部设备,这个设备可以被集群用于限制异常节点对共享存储的访问(或者硬重启此集群节点。

fence设备如何实现?
利用libvitr,构建模拟fence。libvirt可以管理虚拟机的开关。
在本地物理主机上:

yum install fence-virtd-multicast-0.3.2-2.el7.x86_64(实现广播同系机制)
fence-virtd-libvirt-0.3.2-2.el7.x86_64(将libvirt变为fence)
fence-virtd-0.3.2-2.el7.x86_64(模拟fence)
#创建fence:
[root@foundation92 cluster]# fence_virtd -c
#Module search path [/usr/lib64/fence-virt]: /usr/lib64/fence-virtAvailable backends:libvirt 0.1
Available listeners:multicast 1.2Listener modules are responsible for accepting requests
from fencing clients.#Listener module [multicast]: multicastThe 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 [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]: libvirtConfiguration complete.
#[root@foundation92 cluster]# cat /etc/fence_virt.conf 
#得到如下配置文件即可;
listeners {multicast {key_file = "/etc/cluster/fence_xvm.key";interface = "br0";port = "1229";address = "225.0.0.12";family = "ipv4";}}fence_virtd {backend = "libvirt";listener = "multicast";module_path = "/usr/lib64/fence-virt";
}
#创建/etc/cluster/fence_xvm.key
mdir /etc/cluster/
cd /etc/cluster/
dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=128 count=1file fence_xvm.key      #查看文件类型,数据文件systemctl start fence_virtdnetstat -anulp | grep fence_virtd  udp        0      0 0.0.0.0:1229            0.0.0.0:*                           18908/fence_virtd   
scp fence_xvm.key 172.25.92.1:/etc/cluster
scp fence_xvm.key 172.25.92.9:/etc/cluster
在server1和server9上查看:
ls /etc/cluster/   #可以看到fence_xvm.key#注意:fence_xvm.key用于fence连接集群节点的认证

注意:以下步骤server1和server9都要完成。

在浏览端添加fence:
这里写图片描述
这里写图片描述
为server1和server9分别添加fence
这里写图片描述

这里写图片描述

指定主fence:
这里写图片描述

这里写图片描述

如果集群节点的名称和真实server的主机名称不对应该怎么办呢?本次实验碰巧是对应的。
虚拟机的名称是domainame,而集群是hostname,可以利用主机的UUID做映射,将集群节点的名称和相应的主机对应。
这里写图片描述

以上步骤在server9上也做
完成后在server1的shell命令行端:

root@server1 mnt]# cat /etc/cluster/cluster.conf 
<?xml version="1.0"?>
<cluster config_version="10" name="westos_ha">  #集群名称<clusternodes><clusternode name="server1" nodeid="1"> #server1为节点1<fence><method name="fence1"> #fence1<device domain="8d6a8938-56a7-4970-b7dd-1e1f38ca5f5c" name="vmfence"/></method></fence></clusternode><clusternode name="server9" nodeid="2"><fence><method name="fence9"><device domain="6d73a452-bc4e-4d77-bcdb-49e37573224e" name="vmfence"/></method></fence></clusternode></clusternodes><cman expected_votes="1" two_node="1"/><fencedevices><fencedevice agent="fence_xvm" name="vmfence"/></fencedevices><rm><failoverdomains><failoverdomain name="nginx_fail" nofailback="1" ordered="1" restricted="1"><failoverdomainnode name="server1" priority="1"/><failoverdomainnode name="server9" priority="2"/></failoverdomain></failoverdomains><resources><ip address="172.25.92.100/24" sleeptime="10"/><script file="/etc/init.d/nginx" name="nginx"/></resources><service domain="nginx_fail" exclusive="1" name="nginx" recovery="relocate"><ip ref="172.25.92.100/24"/><script ref="nginx"/></service></rm>
</cluster>
可以看出来在浏览器的操作全部记录在/etc/cluster/cluster.conf 文件中fence_node server9    #模拟集群直接停掉server9,可以看见server9类似force off一样直接关机

在浏览器添加Failover Domains:用来做节点格里,或业务切换
这里写图片描述
添加共享服务:
VIIP:
这里写图片描述
nginx:
这里写图片描述
这里写图片描述
注意:nginx本身没有启动脚本的,所以要自己制作nginx脚本,可以从源码包里修改脚本

将添加的资源放在一个资源组里:
注意:添加的资源顺序就是集群启动后服务启动的顺序,所以要先添加vip,再添加nginx
这里写图片描述
这里写图片描述

在shell端:
clustat #可以看见nginx已经自动启动
ps ax #可以看见nginx进程
同时可以测试nginx的负载均衡,停掉一个server上的nginx,另一台server的nginx就自动启动

这篇关于RHCS套件和nginx实现高可用负载均衡机群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/544357

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很