服务器集群架构图(zookeeper系统结构图)

服务器集群架构图(zookeeper系统结构图)

扫码添加渲大师小管家,免费领取渲染插件、素材、模型、教程合集大礼包!

大家好,今天来介绍服务器集群架构图(greenplum 集群)的问题,以下是渲大师小编对此问题的归纳和整理,感兴趣的来一起看看吧!

Zookeeper架构详解

下图是 Zookeeper 的架构图,ZooKeeper 集群中包含 Leader、Follower 以及 Observer 三个角色:

Client 是 Zookeeper 的客户端,请求发起方。

Observer 能很好的对 Zookeeper 集群进行扩展,Observer 可以提供 Client 读写,但不参与投票。因此,Observer 节点对集群不影响投票耗时,也不影响集群选举。另外,加入 Observer 对读性能是一个很大的提升。

应用通过客户端库来对ZooKeeper实现了调用。客户端库负责与ZooKeeper服务器端进行交互。
下展示了客户端与服务器端之间的关系。每一个客户端导入客户端库,之后便可以与任何ZooKeeper的节点进行通信。
ZooKeeper服务器端运行于两种模式下: 独立模式(standalone) 和 仲裁模式(quorum) 。
独立模式 几乎与其术语所描述的一样: 有一个单独的服务器,ZooKeeper状态无法复制 。
在 仲裁模式下 ,具有 一组 ZooKeeper服务器,我们称为ZooKeeper集合(ZooKeeper ensemble),它们之前可以进行状态的复制,并同时为服务于客户端的请求。
从这个角度出发,我们使用术语“ZooKeeper集合”来表示一个服务器设施,这一设施可以由独立模式的一个服务器组成,也可以仲裁模式下的多个服务器组成。

基于此,如果想搭建一个能够允许 N 台机器 down 掉的集群,那么就要部署一个由 2*N+1 台服务器构成的 ZooKeeper 集群。 因此,如果部署了 3 个 Zookeeper 节点(非 Observer),则如果至少有 2个节点可用则整个集群就可用,意味着 1 个节点故障,不影响 Zookeeper 集群对外提供服务;如果部署了 5 个节点,意味着 2 个节点同时故障,Zookeeper 集群依然能够正常对外提供服务。

部署的节点数一般为奇数个,这里不是说不能为偶数个。

通过以上可以发现,3台服务器和4台服务器都最多允许1台服务器挂掉,5台服务器和6台服务器都最多允许2台服务器挂掉,明显4台服务器成本高于3台服务器成本,6台服务器成本高于5服务器成本。这是由于半数以上投票通过决定的。

在对ZooKeeper集合执行任何请求前,一个客户端必须先与服务建立会话。会话的概念非常重要,对ZooKeeper的运行也非常蠢氏局关键。客户端提交给ZooKeeper的所有操作均关联在一个会话上。 当一个会话因某种原因而中止时,在这个会话期间创建的临时节点将会消失。

会话提供了顺序保障 ,这就意味着同一个会话中的请求会以 FIFO(先进先出) 顺序执行。通常,一个客户端只打开一个会话,因此客户端请求将全部以FIFO顺序执行。如果客户端拥有多个并发的会话,FIFO顺序在多个会话之间未必能够保持。而即使一个客户端中带让连贯的会话并不重叠,也未必能够保证FIFO顺序。

会话的生命周期(lifetime)是指会话从创建到结束的时期,无论会话正常关闭还是因超时而导致过期。
一个会话的主要可能状态大多是简单明了的: CONNECTING 、 CONNECTED 、 CLOSED 和 NOT_CONNECTED 。状态的转换依赖于发生在客户端与服务之间的各种事件(见下图)。

如果一个客户端与服务器因超时而断开连接,客户端仍然保持CONNECTING状态。 如果因网络分区问题导致客户端与ZooKeeper集合被隔离而发生连接断开,那么其状态将会一直保持,直到显式地关闭这个会话,或者分区问题修复后,客户端能够获悉ZooKeeper服务器发送的会话已经过期。 发生这种行为是因为ZooKeeper集合对声明核段会话超时负责,而不是客户端负责。直到客户端获悉ZooKeeper会话过期,否则 客户端不能声明自己的会话过期。 然而, 客户端可以选择关闭会话。

创建一个会话时,你需要设置会话超时这个重要的参数,这个参数设置了ZooKeeper服务允许会话被声明为超时之前存在的时间。 如果经过时间t之后服务接收不到这个会话的任何消息,服务就会声明会话过期。 而在客户端侧,如果经过t/3的时间未收到任何消息,客户端将向服务器发送心跳消息。在经过2t/3时间后,ZooKeeper客户端开始寻找其他的服务器,而此时它还有t/3时间去寻找。

在仲裁模式下,客户端有多个服务器可以连接,而在独立模式下,客户端只能尝试重新连接单个服务器。在仲裁模式中,应用需要传递可用的服务器列表给客户端,告知客户端可以连接的服务器信息并选择一个进行连接。

当尝试连接到一个不同的服务器时,非常重要的是, 这个服务器的ZooKeeper状态要与最后连接的服务器的ZooKeeper状态保持最新。
ZooKeeper通过在服务中排序更新操作来决定状态是否最新。 ZooKeeper确保每一个变化相对于所有其他已执行的更新是完全有序的。因此,如果一个客户端在位置i观察到一个更新,它就 不能连接到只观察到i'<i的服务器上。
在ZooKeeper实现中,系统根据每一个更新建立的顺序来分配给事务标识符。下图描述了在重连情况下 事务标识符(zkid) 的使用。当客户端因超时与s1 断开连接后,客户端开始尝试连接s2 ,但s2 延迟于客户端所知的变化。然而,s3 对这个变化的情况与客户端保持一致,所以s3 可以安全连接。

Zookeeper 集群高可用部署详解

Greenplum集群部署和架构优化我总结了5000字的心得

最近对离线数仓体中岁激系进行了扩容和架构改造,也算是一波三折,出了很多小插曲,有一些改进点对我们来说也是真空地带,通过对比和模拟压测总算是得到了预期的结果,这方面尤其值得一提的是郭运凯同学的敬业,很多前置的工作,优化和应用压测的工作都是他完成的。 

整体来说,整个事情的背景是因为服务器硬件过保,刚好借着过保服务器替换的机会来做集群架构的优化和改造。 

1.集群架构改造的目标

在之前也总结过目前存在的一些潜在问题,也是本次部署架构改进的目标:

1)之前 的GP segment数量设计过度 ,因为资源限制,过多考虑了功能和性能,对于集群的稳定性和资源平衡性考虑有所欠缺,在每个物理机节点上部署了10个Primary,10个Mirror,一旦1个服务器节点不可用,整个集群几乎无法支撑业务。

2)GP集群 的存储资源和性能的平衡不够 ,GP存储基于RAID-5,如果出现坏盘,磁盘重构的代价比较高,而且重构期间如果再出现坏盘,就会非常被动,而且对于离线数仓的数据质量要求较高,存储容量相对不是很大,所以在存储容量和性能的综合之上,我们选择了RAID-10。

3)集 群的异常场景的恢复需要完善, 集群在异常情况下(如服务器异常宕机,数据节点不可用,服务器后续过保实现节点滚动替换)的故障恢复场景测试不够充分,导致在一些迁移和改造中,相对底气不足,存在一些知识盲区。

4)集群版本过 ,功能和性能上存在改进空间。毕竟这个集群是4年前的版本,底层的PG节点的版本也比较旧了,在功能上和性能上都有一定的期望,至少能够与时俱进。

5)操作系统版本升 ,之前的操作系统是基于CentOS6,至少需要适配CentOS 7 。

6)集群TPCH 压测验收 ,集群在完成部署之后,需要做一次整体的TPCH压测验收,如果存在明显的问题需要不断调整配置和架构,使得达到预期的性能目标。

此外在应用层面也有一些考虑,总而言之,是希望能够解决绝大多数的痛点问题,无论是在系统层面,还是应用层面,都能上一个台阶。

2.集群规划设计的选型和思考

明确了目标,就是拆分任务来规划设计了,在规划设计方面主要有如下的几个问题:

1)Greenplum的版本选择 ,目前有两个主要的版本类别,一个是开源版(Open Source distribution)和Pivotal官方版,它们的其中一个差异就是官方版需要注册,签署协议,在此基础上还有GPCC等工具可以用,而开源版本可以实现源码编译或者rpm安装,无法配置GPCC。综合来看,我们选择了 开源版本的6.16.2 ,这其中也询问了一些行业朋友,特意选择了几个涉及稳定性bug修复的版本。

2)数据集市的技术选型 ,在数据集市的技术选雀纯型方面起初我是比较坚持基于PostgreSQL的模式,而业务侧是希望对于一些较为复杂的逻辑能够通过GP去支撑,一来二去之后,加上我咨询了一些行业朋友的意见,是可以选择基于GP的方案,于是我们就抱着试一试的方式做了压测,所以数据仓库和和数据集市会是两个不同规模体量的GP集群来支撑。

3)GP的容量规划 ,因为之前的节点设计有些过度,所以在数量上我们做了缩减,每台服务器部署12个segment节点,比如一共12台服务器,其中有10台服务器是Segment节点,每台上面部署了6个Primary,6个Mirror,另外2台部署了Master和Standby,就是即(6+6)*10+2,整体的配置情况类似下面的模式。

4)部署架构方案选型 ,部署架构想起来比较容易,但是落实起来有很多的考虑细节,起初考虑GP的Master和Standby节点如果混用还是能够节省一些资源,所以设计的数据仓卖袜库和数据集市的部署架构是这样考虑的,但是从走入部署阶段之后,很快就发现这种交叉部署的模式是不可行的,或者说有一些复杂度。

除此之外,在单个GP集群的部署架构层面,还有4类方案考虑。

  方案1 :Master,Standby和segment混合部署
  方案2 :Master,Standby和segment独立部署,整个集群的节点数会少一些
  方案3 :Segment独立部署,Master,Standby虚拟机部署
  方案4 :最小化单节点集群部署(这是数据集市最保底的方案)  

这方面存在较大的发挥空间,而且总体来说这种验证磨合的成本也相对比较高,实践给我上了一课, 越是想走捷径,越是会让你走一些弯路 ,而且有些时候的优化其实我也不知道改怎么往下走,感觉已经无路可走,所以上面这4种方案其实我们都做了相关的测试和验证。

3.集群架构的详细设计和实践

1)设计详细的部署架构图

在整体规划之上,我设计了如下的部署架构图,每个服务器节点有6个Primary,6个Mirror,服务器两两映射。

2)内核参数优化

按照官方文档的建议和具体的配置情况,我们对内核参数做了如下的配置:

vm.swappiness=10
vm.zone_reclaim_mode = 0
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
vm.dirty_background_ratio = 0 # See System Memory
vm.dirty_ratio = 0
vm.dirty_background_bytes = 1610612736
vm.dirty_bytes = 4294967296
vm.min_free_kbytes = 3943084
vm.overcommit_memory=2
kernel.sem = 500 2048000 200 4096

4.集群部署步骤

1)首先是配置/etc/hosts,需要把所有节点的IP和主机名都整理出来。 

2)配置用户,很常规的步骤

groupadd  gpadmin

useradd gpadmin -g gpadmin

passwd gpadmin

3)配置sysctl.conf和资源配置

4)使用rpm模式安装

# yum install -y apr apr-util bzip2 krb5-devel  zip

# rpm -ivh open-source-greenplum-db-6.16.2-rhel7-x86_64.rpm

5)配置两个host文件,也是为了后面进行统一部署方便,在此建议先开启gpadmin的sudo权限,可以通过gpssh处理一些较为复杂的批量操作

6)通过gpssh-exkeys来打通ssh信任关系,这里需要吐槽这个ssh互信,端口还得是22,否则处理起来很麻烦,需要修改/etc/ssh/sshd_config文件

gpssh-exkeys -f hostlist

7)较为复杂的一步是打包master的Greenplum-db-6.16.2软件,然后分发到各个segment机器中,整个过程涉及文件打包,批量传输和配置,可以借助gpscp和gpssh,比如gpscp传输文件,如下的命令会传输到/tmp目录下

gpscp -f /usr/local/greenplum-db/conf/hostlist /tmp/greenplum-db-6.16.2.tar.gz =:/tmp

或者说在每台服务器上面直接rpm -ivh安装也可以。

8)Master节点需要单独配置相关的目录,而Segment节点的目录可以提前规划好,比如我们把Primary和Mirror放在不同的分区。 

mkdir -p /data1/gpdata/gpdatap1

mkdir -p /data1/gpdata/gpdatap2

mkdir -p /data2/gpdata/gpdatam1

mkdir -p /data2/gpdata/gpdatam2

9)整个过程里最关键的就是gpinitsystem_config配置了,因为Segment节点的ID配置和命名,端口区间都是根据一定的规则来动态生成的,所以对于目录的配置需要额外注意。

10)部署GP集群最关键的命令是

gpinitsystem -c gpinitsystem_config -s 【standby_hostname】

其中文件gpinitsystem_config的主要内容如下:

MASTER_HOSTNAME=xxxx

declare -a DATA_DIRECTORY=(/data1/gpdata/gpdatap1  /data1/gpdata/gpdatap2 /data1/gpdata/gpdatap3 /data1/gpdata/gpdatap4 /data1/gpdata/gpdatap5 /data1/gpdata/gpdatap6)

TRUSTED_SHELL=ssh

declare -a MIRROR_DATA_DIRECTORY=(/data2/gpdata/gpdatam1  /data2/gpdata/gpdatam2 /data2/gpdata/gpdatam3 /data2/gpdata/gpdatam4 /data2/gpdata/gpdatam5 /data2/gpdata/gpdatam6)

MACHINE_LIST_FILE=/usr/local/greenplum-db/conf/seg_hosts

整个过程大约5分钟~10分钟以内会完成,在部署过程中建议要查看后端的日志查看是否有异常,异常情况下的体验不是很好,可能会白等。

5.集群部署问题梳理

集群部署中还是有很多细节的问题,太基础的就不提了,基本上就是配置,目录权限等问题,我提另外几个:

1) 资源配置问题 ,如果/etc/security/limits.conf的资源配置不足会在安装时有如下的警告:

2) 网络问题 ,集群部署完成后可以正常操作,但是在查询数据的时候会抛出错误,比如SQL是这样的,看起来很简单:select count(*) from customer,但是会抛出如下的错误:

这个问题的主要原因还是和防火墙配置相关,其实不光需要配置INPUT的权限,还需要配置OUTPUT的权限。 

对于数据节点可以开放略大的权限,如:

入口的配置:

-A INPUT -p all -s xxxxx    -j ACCEPT

出口的配置:

-A OUTPUT -p all -s xxxxx    -j ACCEPT

3)网络配置问题 ,这个问题比较诡异的是,报错和上面是一样的,但是在排除了防火墙配置后,select count(*) from customer;这样的语句是可以执行的,但是执行的等待时间较长,比如表lineitem这表比较大,过亿的数据量,,在10个物理节点时,查询响应时间是10秒,但是4个物理节点,查询响应时间是在90秒,总体删感觉说不过去。

为了排查网络问题,使用gpcheckperf等工具也做过测试,4节点和10节点的基础配置也是相同的。

gpcheckperf -f /usr/local/greenplum-db/conf/seg_hosts -r N -d /tmp

$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1      localhost localhost.localdomain localhost6 localhost6.localdomain6
#127.0.0.1    test-dbs-gp-128-230
xxxxx.128.238 test-dbs-gp-svr-128-238
xxxxx.128.239 test-dbs-gp-svr-128-239

其中127.0.0.1的这个配置在segment和Master,Standby混部的情况是存在问题的,修正后就没问题了,这个关键的问题也是郭运凯同学发现的。


5.集群故障恢复的测试

集群的故障测试是本次架构设计中的重点内容,所以这一块也是跃跃欲试。

整体上我们包含两个场景,服务器宕机修复后的集群恢复和服务器不可用时的恢复方式。

第一种场景相对比较简单,就是让Segment节点重新加入集群,并且在集群层面将Primary和Mirror的角色互换,而第二种场景相对时间较长一些,主要原因是需要重构数据节点,这个代价基本就就是PG层面的数据恢复了,为了整个测试和恢复能够完整模拟,我们采用了类似的恢复方式,比如宕机修复使用了服务器重启来替代,而服务器不可用则使用了清理数据目录,类似于一台新配置机器的模式。

1)服务器宕机修复后集群恢复

select * from gp_segment_configuration where status!='u';

gprecoverseg  -o ./recov

gprecoverseg -r

select * from gp_segment_configuration where status='u'

2)服务器不可用时集群恢复

重构数据节点的过程中,总体来看网络带宽还是使用很充分的。

select * from gp_segment_configuration where status='u'

select * from gp_segment_configuration where status='u' and role!=preferred_role;

gprecoverseg -r

select * from gp_segment_configuration where status='u' and role!=preferred_role;

经过测试,重启节点到数据修复,近50G数据耗时3分钟左右

6.集群优化问题梳理

1)部署架构优化和迭代

对于优化问题,是本次测试中尤其关注,而且争议较多的部分。 

首先在做完初步选型后,数仓体系的部署相对是比较顺利的,采用的是第一套方案。

数据集市的集群部分因为节点相对较少,所以就选用了第二套方案

实际测试的过程,因为配置问题导致TPCH的结果没有达到预期。

所以这个阶段也产生了一些疑问和怀疑,一种就是折回第一种方案,但是节点数会少很多,要不就是第三种采用虚拟机的模式部署,最保底的方案则是单节点部署,当然这是最牵强的方案。

这个阶段确实很难,而在上面提到的修复了配置之后,集群好像突然开悟了一般,性能表现不错,很快就完成了100G和1T数据量的TPCH测试。

在后续的改造中,我们也尝试了第三套方案,基于虚拟机的模式,通过测试发现,远没有我们预期的那么理想,在同样的数据节点下,Master和Standby采用物理机和虚拟机,性能差异非常大,这个是出乎我们预料的。比如同样的SQL,方案3执行需要2秒,而方案2则需要80秒,这个差异我们对比了很多指标,最后我个人理解差异还是在网卡部分。

所以经过对比后,还是选择了方案2的混合部署模式。

2)SQL性能优化的分析

此外整个过程的TPCH也为集群的性能表现提供了参考。比如方案2的混合部署模式下,有一条SQL需要18秒,但是相比同类型的集群,可能就只需要2秒钟左右,这块显然是存在问题的。 

在排除了系统配置,硬件配置的差异之后,经典的解决办法还是查看执行计划。

性能较差的SQL执行计划:

# explain analyze select count(*)from customer;

QUERY PLAN   

Aggregate  (cost=0.00..431.00 rows=1 width=8) (actual time=24792.916..24792.916 rows=1 loops=1)

   ->  Gather Motion 36:1  (slice1; segments: 36)  (cost=0.00..431.00 rows=1 width=1) (actual time=3.255..16489.394 rows=150000000 loops=1)

         ->  Seq Scan on customer  (cost=0.00..431.00 rows=1 width=1) (actual time=0.780..1267.878 rows=4172607 loops=1)

Planning time: 4.466 ms

   (slice0)    Executor memory: 680K bytes.

   (slice1)    Executor memory: 218K bytes avg x 36 workers, 218K bytes max (seg0).

Memory used:  2457600kB

Optimizer: Pivotal Optimizer (GPORCA)

Execution time: 24832.611 ms

(9 rows)

Time: 24892.500 ms

性能较好的SQL执行计划:

# explain analyze select count(*)from customer;                            

QUERY PLAN

Aggregate  (cost=0.00..842.08 rows=1 width=8) (actual time=1519.311..1519.311 rows=1 loops=1)

   ->  Gather Motion 36:1  (slice1; segments: 36)  (cost=0.00..842.08 rows=1 width=8) (actual time=634.787..1519.214 rows=36 loops=1)

         ->  Aggregate  (cost=0.00..842.08 rows=1 width=8) (actual time=1473.296..1473.296 rows=1 loops=1)

               ->  Seq Scan on customer  (cost=0.00..834.33 rows=4166667 width=1) (actual time=0.758..438.319 rows=4172607 loops=1)

Planning time: 5.033 ms

   (slice0)    Executor memory: 176K bytes.

   (slice1)    Executor memory: 234K bytes avg x 36 workers, 234K bytes max (seg0).

Memory used:  2457600kB

Optimizer: Pivotal Optimizer (GPORCA)

Execution time: 1543.611 ms

(10 rows)

Time: 1549.324 ms

很明显执行计划是被误导了,而误导的因素则是基于统计信息,这个问题的修复很简单:

analyze customer;

但是深究原因,则是在压测时,先是使用了100G压测,压测完之后保留了原来的表结构,直接导入了1T的数据量,导致执行计划这块没有更新。

3)集群配置优化

此外也做了一些集群配置层面的优化,比如对缓存做了调整。 

gpconfig -c statement_mem -m 2457600 -v 2457600

gpconfig -c gp_vmem_protect_limit -m 32000 -v 32000

7.集群优化数据

最后来感受下集群的性能:

1)10个物理节点,(6+6)*10+2

tpch_1t=# iming on

Timing is on.

tpch_1t=# select count(*)from customer;

   count   

-----------

150000000

(1 row)

Time: 1235.801 ms

tpch_1t=# select count(*)from lineitem;

   count    

------------

5999989709

(1 row)

Time: 10661.756 ms

2)6个物理节点,(6+6)*6

# select count(*)from customer;
   count   
-----------
 150000000
(1 row)
Time: 1346.833 ms

# select count(*)from lineitem;
   count    
------------
 5999989709
(1 row)
Time: 18145.092 ms

3)4个物理节点,(6+6)*4

# select count(*)from customer;
   count   
-----------
 150000000
(1 row)
Time: 1531.621 ms

# select count(*)from lineitem;
   count    
------------
 5999989709
(1 row)
Time: 25072.501 ms

4)TPCH在不通架构模式下的性能比对 ,有19个查询模型,有个别SQL逻辑过于复杂暂时忽略,也是郭运凯同学整理的列表。

在1T基准下的基准测试表现:

Zookeeper集群中的三种角色简单介绍

把复杂的东西简单化,是不变的技术追求。在过去,很多大型系统依赖一个类似的系统来进行分布式协调,一旦运行这个系统的服务器宕机,那么整个分布式系统将无法正常运行,为了解决这个问题,雅虎的开发人员就试图开发一个通用的无单点帆团问题的分布式协调框架,解决分布式集群中应用系统的一致性问题,例如如何避免同时操作同一数据造成脏读的问题等。

Zookeeper对外提供一个类似于文件系统的层次化的数据存储服务,为了保证整个Zookeeper集群的容错性和高性能,每一个Zookeeper集群都是由多台服务器节点(Server)组成,这些节点通过复制保证各个服务器节点之间的数据一致。只要当这些服务器节点过半数节点可用,那么整个Zookeeper集群就可用。下面我们来学习Zookeeper的集群架构,如图1所示。

图1 Zookeeper集群架构图

从图1我们可以看出,Zookeeper集群是一个主从集群,它一般是由一个Leader(领导者)和多个Follower(跟随者)组成。此外,针对访问量比较大的Zookeeper集群,还可新增Observer(观察者)。Zookeeper集群中的三种角色各司其职,共同完成分布式协调服务。下面我们针对Zookeeper集群中的三种角色进行简单介绍。

1.Leader

它是Zookeeper集群工作的核心,也是事务性请求(写操作)的唯一调度和处理者,它保证集群事务处理的顺序性,同时负责进行投票的发起和决议,以及更新系统状态。

2.Follower

它负责处理客户端的非事务(读操作)请求,如果接收到客户端发来的事务性请求,则会转发给Leader,让Leader进行处理,同时还负责在Leader选举过程中参与投票。

3.Observer

它负责观察Zookeeper集群的最新状态的变化,并且将这些状态没轿指进行同步。对于非事务性请求可以进行独立处理;对于事务性请求,则会转发给Leader服务器进行处理。它不会参与任何形式的投票,只提供非事务性的服务,通常用于在不影响集群事务处理能力的前提下,提升集群的非事务处理能枯配力(提高集群读的能力,也降低了集群选主的复杂程度)。
转自: http://www.itheima.com/news/20201103/141303.html

RabbitMQ 的4种集群架构

    也称为 Warren (兔子窝) 模式。实现 rabbitMQ 的高可用集群,一般在并发和数据量不高的情况下,这种模式非常的好用且简单。

    也就是一个主/备方案,主节点提供读写,备用节点不提供读写。如果主节点挂了,就切换到备用节点,原来的备用节点升级为主节点提供读写服务,当原来的主节点恢复运行后,原来的主节点就变成备用节点,和 activeMQ 利用 zookeeper 做主/备一样,也可以一主多备。

HaProxy 配置:

listen rabbitmq_cluster

bind 0.0.0.0:567  # 配置 tcp 模式

mode tcp  # 简单的轮询

balance roundrobin  # 主节点 roundrobin  随机

server 你的76机器 hostname  192.168.11.76:5672 check inter 5000 rise 2 fall 2

server 你的77机器 hostname  192.168.11.77:5672 backup check inter 5000 rise 2 fall 2  # 备用节点

    注意了,上面的 rabbitMQ 集群节点配置 # inter 每隔 5 秒对 mq 集群做健康检查, 2 次正确证明服务可用,2 次失败证明服务器不可用,并且配置主备机制

    远程模式可以实现双活的一种模式,简称 shovel 模式,所谓的 shovel 就是把消息进行不同数据中心的复制工作,可以跨地域的让两个 MQ 集群互联,远距离通信和复制。

    Shovel 就是我们可以把消息进行数据中心的复制工作,我们可以跨地域的让两个 MQ 集群互联。

如图所示,有两个异地的 MQ 集群(可以是更多的集群),当用户在地区 1 这里下单了,系统发消息到 1 区的 MQ 服务器,发现 MQ 服务已超过设定的阈值,负载过高,这条消息就会被转到 地区 2 的 MQ 服务器上,由 2 区的去执行后面的业务逻辑,相当于分摊我们的服务压力。

    在使用了 shovel 插件后,模型变成了近端同步确认,远端异步确认的方式,大大提高了订单确认速度,并且还能保证可靠性。

    如上图所示,当我们的消息到达 exchange,它会判断当前的负载情况以及设定的阈值,如果负载不高就把消息放到我们正常的 warehouse_goleta 队列中,如果负载过高了,就会放到 backup_orders 队列庆困中。backup_orders 队列通过 shovel 插件与另外的 MQ 集群进行同步数据,把消息发到第二个 MQ 集群上。

    这是 rabbitMQ 比较早期的架构模型了,现在很少使用了。

shovel 集群的配置,首先启动 rabbitmq 插件,命令如下:

    rabbitmq-plugins enable amqp_client

    rabbitmq-plugins enable  rabbitmq_shovel

    在 /etc/rabbitmq/ 目录下创建 rabbitmq.config 文件。注意,我们源服务器和目的地服务器都使用这个相同的配置文件。

    橡盯具体配置如下

    非常经典的 mirror 镜像模式,保证 100% 数据不丢失。在实际工作中也是用得最多的,并且实现非常的简单,一般互联网大厂都会构建这种镜像集群模式。

    mirror 镜像队列,目的是为了保证 rabbitMQ 数据的高可靠性解决方案,主要就是实现数据的同步,一般来讲是 2 - 3 个节点实现数据同步。对于 100% 数据可靠性解决方誉如念案,一般是采用 3 个节点。

    集群架构如下

    如上图所示,用 KeepAlived 做了 HA-Proxy 的高可用,然后有 3 个节点的 MQ 服务,消息发送到主节点上,主节点通过 mirror 队列把数据同步到其他的 MQ 节点,这样来实现其高可靠。

    也是实现异地数据复制的主流模式,因为 shovel 模式配置比较复杂,所以一般来说,实现异地集群的都是采用这种双活 或者 多活模型来实现的。这种模式需要依赖 rabbitMQ 的 federation 插件,可以实现持续的,可靠的 AMQP 数据通信,多活模式在实际配置与应用非常的简单。

    rabbitMQ 部署架构采用双中心模式(多中心),那么在两套(或多套)数据中心各部署一套 rabbitMQ 集群,各中心的rabbitMQ 服务除了需要为业务提供正常的消息服务外,中心之间还需要实现部分队列消息共享。

多活集群架构如下:

    federation 插件是一个不需要构建 cluster ,而在 brokers 之间传输消息的高性能插件,federation 插件可以在 brokers 或者 cluster 之间传输消息,连接的双方可以使用不同的 users 和 virtual hosts,双方也可以使用不同版本的 rabbitMQ 和 erlang。federation 插件使用 AMQP 协议通信,可以接受不连续的传输。federation 不是建立在集群上的,而是建立在单个节点上的,如图上黄色的 rabbit node 3 可以与绿色的 node1、node2、node3 中的任意一个利用 federation 插件进行数据同步。

    如上图所示,federation exchanges 可以看成 downstream 从 upstream 主动拉取消息,但是并不是拉取所有消息,必须是在 downstream 上已经明确定义 Bingdings 关系的 exchange,也就是有实际的物理 queue 来接收消息,才会从 upstream 拉取消息到 downstream 。

    它使用 AMQP 协议实现代理间通信,downstream 会将绑定关系组合在一起,绑定/解绑命令将发送到 upstream 交换机。因此,federation exchange 只接收具有订阅的消息。

在容器内使用bes时该容器的应用端口是哪个

在容器内使用bes时该容器的应用端口碧乎是1BES调试端口。BES服务器实例的架构图服务器衡慧梁架构介绍服务器架构介绍,集群篇集群篇BES服务器集群架构图咐运BES集群由多个服务器实例组成。

分享到 :
相关推荐

win7服务器租用多少钱(服务器租用大概多少钱)

win7服务器租用多少钱?对于服务器租用其实是没有固定的收费标准的。因为影响服务器租...

如何判断香港vps云服务器的好坏

判断香港vps云服务器好坏的方法:1。看线路的快慢。如果是CN2直连线路的。网站打开...

香港服务器如何备案(香港服务器如何备案登录)

香港服务器不可以备案的。虽然按照工信部的相关规定。建设网站是必须要进行备案的。但在香...

公有云服务器是什么(公有云服务器是什么意思)

公有云服务器是指许多用户共享的物理服务器集群。用户可根据需要创建和销毁它们。并且用户...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注