Apache Qpid 高可用集群

一、RHCS

  RHCS是Red Hat Cluster Suite(红帽子集群套件)的缩写。RHCS是一个功能完备的集群应用解决方案,它从应用的前端访问到后端的数据存储都提供了一个行之有效的集群架构实现,不但能保证前端应用持久、稳定的提供服务,同时也保证了后端数据存储的安全。RHCS提供了集群系统中三种集群构架:高可用性集群、负载均衡集群、存储集群

 

RHCS提供的三个核心功能

  高可用集群是RHCS的核心功能。当应用程序出现故障,或者系统硬件、网络出现故障时,应用可以通过RHCS提供的高可用**管理组件自动、快速从一个节点切换到另一个节点,节点故障转移功能对客户端来说是透明的,从而保证应用持续、不间断的对外提供服务。

  RHCS通过LVS(Linux Virtual Server)来提供负载均衡集群。通过LVS的负载调度功能,可以将客户端请求平均的分配到各个服务节点,同时,LVS还提供了服务节点故障转移功能,当某个服务节点不能提供服务时,LVS会自动屏蔽这个故障节点,并从集群中剔除,同时将新来此节点的请求平滑的转移到其它正常节点上来;而当此故障节点恢复正常后,LVS又会自动将此节点加入到集群中去。这一系列切换动作,对用户来说都是透明的。

  RHCS通过GFS(Global File System)分布式文件系统来提供存储集群功能,它允许多个服务同时去读写一个单一的共享文件系统,存储集群通过将共享数据放到一个共享文件系统中从而消除了在应用程序间同步数据的麻烦。

 

RHCS集群架构

图1.1是红帽官方给出的集群架构,每台集群里的计算机配置2个网卡,分别连接外网的交换机和内网的交换机,存储部分由统一的光纤交换机接入存储设备。

图1.2则是集群的工作模式,其中node1和node2共同跑的是service1 ,node3和node4跑的是service2,各个node由fencing device来进行管理。

 

二、     源码安装Apache Qpid

  由于C++ Broker性能较Java Broker强,同时支持HA集群和Federation,故我们选择C++版本的Qpid Broker。目前最新版本为0.32。Qpid 采用 Corosync 作为通信层,利用 Corosync,集群中的每一个 broker 都采用组播通信将自己的状态同步给集群中的其他 broker。

  Qpid 和 RHCS 紧密集成,它可以采用 CMAN 防止集群中的“脑裂”问题,也可以使用 rgmanager 自动重启 failed 的 Qpid。当然,不一定非要使用 RHCS 来搭建您的集群,也可以使用其他的 CRM 集群管理软件来管理 Qpidd。Qpidd 本身只是使用了 Corosync 来完成同步通信,可以使用 CMAN 来防止“脑裂”问题。

  1、从官网下载qpid-cpp-0.32.tar.gz、qpid-python-0.32.tar.gz和qpid-tools-0.32.tar.gz。

[root@node2 Downloads]# ll

total 2396

-rwxr--r--. 1 root root 2226863 Jun 15 18:24 qpid-cpp-0.32.tar.gz

-rwxr--r--. 1 root root  161339 Jun 15 18:24 qpid-python-0.32.tar.gz

-rwxr--r--. 1 root root   60695 Jun 15 18:24 qpid-tools-0.32.tar.gz

[root@node2 Downloads]# tar xvf qpid-cpp-0.32.tar.gz

[root@node2 Downloads]# cd qpid-cpp-0.32

 

  2、查看INSTALL文档可知,先安装依赖库(部分可选的,这里为了方便,全部安装)

[root@node2 qpid-cpp-0.32]# yum -y install cmake boost-devel libuuid-devel pkgconfig gcc-c++ make ruby help2man doxygen graphviz cyrus-sasl-devel nss-devel nspr-devel xqilla-devel xerces-c-devel ruby ruby-devel swig libdb-cxx-devel libaio-devel db4-devel

 

  3、Qpid是用cmake来管理的。在这里只需要编译release版本,新建一个BLD-opt文件夹。

[root@node2 qpid-cpp-0.32]# mkdir BLD-opt

[root@node2 qpid-cpp-0.32]# cd BLD-opt

[root@node2 BLD-opt]# cmake -DCMAKE_BUILD_TYPE=Release ..

[root@node2 BLD-opt]# make all –j4

……

Linking CXX executable server_reconnect

[100%] Built target server_reconnect

Scanning dependencies of target spout

[100%] Building CXX object examples/messaging/CMakeFiles/spout.dir/spout.o

[100%] Building CXX object examples/messaging/CMakeFiles/spout.dir/OptionParser.o

Linking CXX executable spout

[100%] Built target spout

[root@node2 BLD-opt]#

 

  4、执行安装,默认的安装目录为/usr/local/

[root@node2 BLD-opt]# make install

[root@node2 BLD-opt]# qpidd -v

qpidd (qpid-cpp) version 0.32

 

在这里,说明已经Apache Qpid安装成功。

 

  5、再分别安装qpid-python-0.32、qpid-tools-0.32和qpid-qmf-0.32工具包。

[root@node2 Downloads]# tar xvf qpid-python-0.32.tar.gz

[root@node2 Downloads]# cd qpid-python-0.32

[root@node2 qpid-python-0.32]# ./setup.py build

[root@node2 qpid-python-0.32]# ./setup.py install --record install_log

 

[root@node2 Downloads]# tar xvf qpid-tools-0.32.tar.gz

[root@node2 Downloads]# cd qpid-tools-0.32

[root@node2 qpid-tools-0.32]# ./setup.py build

[root@node2 qpid-tools-0.32]# ./setup.py install --record install_log

       注意,其中install_log是方便卸载而记录安装过程而用的。

 

  6、修改HA集群所需要的配置文件

[root@node2 Downloads]# vim /usr/local/etc/qpid/qpidd.conf

目前为了方便测试,需要关闭认证。配置如下:

auth=0

ha-cluster=yes

ha-brokers-url= node1.example.com,node2.example.com

 

  7、分别修改qpidd和qpidd-primary脚本

[root@node2 Downloads]# vim /usr/local/etc/rc.d/init.d/qpidd

[root@node2 Downloads]# vim /usr/local/etc/rc.d/init.d/qpidd-primary

分别将

QPID_HA=/usr/local/bin/qpid-ha

修改为:

QPID_HA=/usr/bin/qpid-ha

保存

 

  8、添加用户qpidd,并赋予root权限。

[root@node2 Downloads]# useradd qpidd

修改 /etc/passwd 文件,找到如下的一行,把用户ID修改为 0(这个方法其实并不推荐)

[root@node2 Downloads]# vim /etc/passwd

qpidd:x:501:501::/home/qpidd:/bin/bash

修改为:

qpidd:x:0:501::/home/qpidd:/bin/bash

保存即可

 

  9、最后新建一个目录/var/lib/qpidd

[root@node2 Downloads]# mkdir /var/lib/qpidd

 

三、     实现Apache Qpid高可用集群

  RHCS提供了多种集群配置和管理工具,常用的有基于GUI的system-config-cluster和基于web的Conga(luci+ricci)等。在这里我们采用Conga。因为Qpid每个节点服务的存储空间是独立的,所以这里不需要实现共享储存GFS+ISCSI。使用到的RHCS套件的工具主要包括luci、ricci、cman、rgmanager和fence等等。

 

操作系统:Centos 6.5 i386(Microsoft windows 7 旗舰版 64位+ vmware workstation 10)

由于机器性能有限,Qpid主服务和RHCS管理端共用一台主机。

主机名

IP地址

主要用途

虚拟IP

所需软件

node1.example.com

192.168.15.16

Qpid主服务+RHCS管理端

192.168.15.30

luci+ricci+cman+rgmanager

node2.example.com

192.168.15.69

Qpid备用服务

ricci+cman+rgmanager

 

  1、修改管理主机和每个节点的hosts文件,为每个节点主机名增加域名表示,保证所有主要的hosts文件一样

[root@node1 ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain

::1         localhost localhost.localdomain

192.168.15.16     node1.example.com

192.168.15.69     node2.example.com

[root@node1 ~]# scp /etc/hosts  root@192.168.15.69:/etc/hosts

 

  2、每个节点上分别关闭selinux、iptables和NetworkManager

[root@node1 ~]# iptables -F

[root@node1 ~]# service iptables stop

iptables: Setting chains to policy ACCEPT: nat mangle filte [  OK  ]

iptables: Flushing firewall rules:                       [  OK  ]

iptables: Unloading modules:                            [  OK  ]

[root@node1 ~]# chkconfig iptables off

[root@node1 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

[root@node1 ~]# setenforce 0

[root@node1 ~]# service NetworkManager stop

Stopping NetworkManager daemon:                [  OK  ]

[root@node1 ~]# chkconfig NetworkManager off

 

  3、在每个节点分别安装ricci、rgmanager、cman,并配置开机自动启动

[root@node1 ~]# yum -y install ricci rgmanager cman

[root@node1 ~]# chkconfig ricci on

[root@node1 ~]# chkconfig rgmanager on

[root@node1 ~]# chkconfig cman on

 

  4、在每个节点分别启动ricci,并设置用于luci连接的认证密码,帐号默认为系统用户名

[root@node1 ~]# service ricci start

Starting ricci:                                            [  OK  ]

[root@node1 ~]# passwd ricci

Changing password for user ricci.

New password:

BAD PASSWORD: it is too simplistic/systematic

Retype new password:

passwd: all authentication tokens updated successfully.

 

  5、在管理端安装luci并启用luci

[root@node1 ~]# yum -y install luci

[root@node1 ~]# chkconfig luci on

[root@node1 ~]# service luci start

Start luci...                                              [  OK  ]

Point your web browser to https://node1.example.com:8084 (or equivalent) to access luci

 

  6、集群配置文件内容

集群文件当然可以手动配置生成。也可以通过配置工具自动生成,这就需要按照下面的步骤通过luci配置工具的使用生成下面内容的配置文件。

<?xml version="1.0"?>

<cluster config_version="36" name="qpid-test">

        <clusternodes>

                <clusternode name="node1.example.com" nodeid="1"/>

                <clusternode name="node2.example.com" nodeid="2"/>

        </clusternodes>

        <cman expected_votes="1" two_node="1"/>

        <rm>

                <failoverdomains>

                        <failoverdomain name="node1-domain" ordered="1" restricted="1">

                                <failoverdomainnode name="node1.example.com" priority="1"/>

                        </failoverdomain>

                        <failoverdomain name="node2-domain" ordered="1" restricted="1">

                                <failoverdomainnode name="node2.example.com" priority="1"/>

                        </failoverdomain>

                </failoverdomains>

                <resources>

                        <ip address="192.168.15.100/24" sleeptime="10"/>

                        <script file="/usr/local/etc/rc.d/init.d/qpidd" name="qpidd"/>

                        <script file="/usr/local/etc/rc.d/init.d/qpidd-primary" name="qpidd-primary"/>

                </resources>

                <service autostart="0" domain="node1-domain" name="node1-qpidd-service" recovery="restart">

                        <script ref="qpidd"/>

                </service>

                <service autostart="0" domain="node2-domain" name="node2-qpidd-service" recovery="restart">

                        <script ref="qpidd"/>

                </service>

                <service autostart="0" name="qpidd-primary-service" recovery="relocate">

                        <ip ref="192.168.15.100/24"/>

                        <script ref="qpidd-primary"/>

                </service>

        </rm>

</cluster>

 

  7、集群web管理界面配置

通过浏览器访问https://192.168.15.16:8084/,就可以打开luci登录界面。现在就通过配置工具来生成上面的配置文件。

浏览器打开https://192.168.15.16:8084 输入root和root密码进行登陆。

 

创建集群

node name就hosts定义的名字,其中password为刚才设置ricci的密码,ricci端口保持默认。

因为之前在两个节点上都安装了ricci、cman、rgmanager等包,故勾选use locally installed package和Reboot Nodes Before Joining Cluster。因为没有用到GFS,所以不用勾选enable shared storage support。

点击Create Cluster,创建过程luci管理端正在为ricci的HA节点上自动检查和安装所需要的包,安装完会自动重启。

重启完后,再次进入luci界面,可以发现,每个节点都已经成功连接加入集群。

创建故障转移域

分别为两个Qpid服务单独创建故障转移域

 

创建资源

创建Qpid的启动脚本qpidd,路径为 /usr/local/etc/rc.d/init.d/qpidd

 

创建Qpid的启动脚本qpidd-primary,路径为 /usr/local/etc/rc.d/init.d/qpidd-primary

 

创建IP地址资源,用作对外服务的虚拟IP地址(注意:这里一定要填写没有被使用的空闲IP地址),这里用192.168.15.100/24

 

创建服务组

分别为每个Qpid服务节点node1和node2创建服务服node1-qpidd-service和node2-qpidd-service,勾选Automatically Start This Service, 故障转移域选择分别对应的node1-domain和node2-domain,Recovery Policy选择Restart,并分别添加脚本资源qpidd

 

 

创建qpidd-primary服务组,勾选Automatically Start This Service, 故障转移域选None,Recovery Policy选择Relocate,并添加脚本资源qpidd-primary和IP地址资源192.168.16.100/24,最后提交。

 

 

fence设备在实机环境下需要配置,vmware虚拟机可以暂时不需要。

 

最后,三个服务组正常启动。至此,Apache Qpid 高可用集群部署已经完成。

 

测试:

从luci界面看到,目前node2节点处理active状态,node1为ready/standby状态。使用qpid的命令行工具测试一下虚拟IP 192.168.15.100是否正常工作。

 

然后关闭node2节点主机,模拟宕机,可以见到node1会自动切换为active状态。

这时候,再次使用命令行工具测试一下虚拟IP是否正常工作。

这说明HA集群内部切换服务主机,对客户端来说是完全透明的。

posted @ 2015-06-15 23:33  流雨飞雪  阅读(2437)  评论(0编辑  收藏  举报