如何使用Corosync和心脏起搏器配置Openstack高可用性

时间:2020-01-09 10:37:46  来源:igfitidea点击:

在两个控制器之间配置OpenStack高可用性(HA)的步骤。
配置HAProxy并将梯形失真校正服务端点移至loadbalancer的步骤。

默认情况下,如果使用三重配置启动控制器和计算节点,则默认情况下将通过起搏器群集对控制器进行配置。

但是,如果我们使用packstack或者devstack或者通过手动创建所有数据库和服务来手动启动openstack设置,则必须在控制器之间手动配置集群以配置OpenStack High Availability(HA)。

配置OpenStack高可用性(HA)

为了本文的目的,我在Linux服务器上安装的Oracle VirtualBox上运行的" CentOS 7"上,在两个不同的虚拟机上使用packstack引入了两个控制器节点。

在成功完成packstack之后,我们将在根用户的主文件夹中观察keystonerc_admin文件。

安装Pacemaker资源管理器

由于我们将使用起搏器和corosync配置OpenStack高可用性,因此首先我们需要安装集群设置所需的所有rpm。
因此,我们将安装Pacemaker来管理将与HAProxy一起使用的VIP,以使Web服务高度可用。

因此,在所有控制器节点上安装起搏器

[root@controller2 ~]# yum install -y pcs fence-agents-all
[root@controller1 ~]# yum install -y pcs fence-agents-all

通过运行以下命令来验证软件是否已正确安装:

[root@controller1 ~]# rpm -q pcs
pcs-0.9.162-5.el7.centos.2.x86_64
[root@controller2 ~]# rpm -q pcs
pcs-0.9.162-5.el7.centos.2.x86_64

接下来,将规则添加到防火墙以允许群集通信:

[root@controller1 ~]# firewall-cmd --permanent --add-service=high-availability
success
[root@controller1 ~]# firewall-cmd --reload
success
[root@controller2 ~]# firewall-cmd --permanent --add-service=high-availability
success
[root@controller2 ~]# firewall-cmd --reload
success

说明:

如果我们直接使用iptables或者除firewalld以外的其他防火墙解决方案,则只需打开以下端口:TCP端口2224、3121和21064,以及UDP端口5405.

如果在测试过程中遇到任何问题,则可能要完全禁用防火墙和SELinux,直到一切正常为止。
这可能会导致严重的安全问题,因此不应在暴露于外界的计算机上执行此操作,但在受保护主机上进行开发和测试期间可能是适当的。

安装的软件包将使用禁用的密码创建一个" hacluster"用户。
虽然这对于在本地运行" pcs"命令很好,但该帐户需要一个登录密码才能执行诸如同步" corosync"配置或者在其他节点上启动和停止集群的任务。

使用以下命令在每个控制器节点上设置Pacemaker群集的密码:

[root@controller1 ~]# passwd hacluster
Changing password for user hacluster.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@controller2 ~]# passwd hacluster
Changing password for user hacluster.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

在每个节点上启动Pacemaker集群管理器:

[root@controller1 ~]# systemctl start pcsd.service
[root@controller1 ~]# systemctl enable pcsd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.
[root@controller2 ~]# systemctl start pcsd.service
[root@controller2 ~]# systemctl enable pcsd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.

配置Corosync

要配置Openstack High Availability,我们需要在两个节点上都配置corosync,使用pcs cluster auth身份验证为hacluster用户:

[root@controller1 ~]# pcs cluster auth controller1 controller2
Username: hacluster
Password:
controller2: Authorized
controller1: Authorized
[root@controller2 ~]# pcs cluster auth controller1 controller2
Username: hacluster
Password:
controller2: Authorized
controller1: Authorized

说明:

如果我们在此步骤遇到任何问题,请检查firewalld/iptables或者selinux策略

最后,在第一个节点上运行以下命令以创建集群并启动它。
其中我们的集群名称将是" openstack"

[root@controller1 ~]# pcs cluster setup --start --name openstack controller1 controller2
Destroying cluster on nodes: controller1, controller2...
controller1: Stopping Cluster (pacemaker)...
controller2: Stopping Cluster (pacemaker)...
controller1: Successfully destroyed cluster
controller2: Successfully destroyed cluster
Sending 'pacemaker_remote authkey' to 'controller1', 'controller2'
controller1: successful distribution of the file 'pacemaker_remote authkey'
controller2: successful distribution of the file 'pacemaker_remote authkey'
Sending cluster config files to the nodes...
controller1: Succeeded
controller2: Succeeded
Starting cluster on nodes: controller1, controller2...
controller1: Starting Cluster...
controller2: Starting Cluster...
Synchronizing pcsd certificates on nodes controller1, controller2...
controller2: Success
controller1: Success
Restarting pcsd on the nodes in order to reload the certificates...
controller2: Success
controller1: Success

在两个控制器上都启用" pacemaker"和" corosync"服务,以便它们可以在启动时自动启动

[root@controller1 ~]# systemctl enable pacemaker
Created symlink from /etc/systemd/system/multi-user.target.wants/pacemaker.service to /usr/lib/systemd/system/pacemaker.service.
[root@controller1 ~]# systemctl enable corosync
Created symlink from /etc/systemd/system/multi-user.target.wants/corosync.service to /usr/lib/systemd/system/corosync.service.
[root@controller2 ~]# systemctl enable corosync
Created symlink from /etc/systemd/system/multi-user.target.wants/corosync.service to /usr/lib/systemd/system/corosync.service.
[root@controller2 ~]# systemctl enable pacemaker
Created symlink from /etc/systemd/system/multi-user.target.wants/pacemaker.service to /usr/lib/systemd/system/pacemaker.service.

使用起搏器验证集群

在两个节点上使用以下命令验证集群是否已成功启动:

[root@controller1 ~]# pcs status
Cluster name: openstack
Stack: corosync
Current DC: controller2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Tue Oct 16 11:51:13 2016
Last change: Tue Oct 16 11:50:51 2016 by root via cibadmin on controller1
2 nodes configured
0 resources configured
Online: [ controller1 controller2 ]
No resources

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled
[root@controller2 ~]# pcs status
Cluster name: openstack
WARNING: no stonith devices and stonith-enabled is not false
Stack: corosync
Current DC: controller2 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Mon Oct 15 17:04:29 2016
Last change: Mon Oct 15 16:49:09 2016 by hacluster via crmd on controller2
2 nodes configured
0 resources configured
Online: [ controller1 controller2 ]
No resources

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

如何启动集群

现在已经配置了" corosync",现在该启动集群了。
以下命令将在集群中的两个节点上启动corosync和心脏起搏器。
如果我们从与之前运行pcs cluster auth命令不同的节点发出了start命令,则必须在登录的当前节点上进行身份验证,然后才能启动集群。

[root@controller1 ~]# pcs cluster start --all

使用`pcs cluster start --all'命令的一种替代方法是在集群中的每个节点上分别发出以下任一命令序列:

[root@controller1 ~]# pcs cluster start
Starting Cluster...

或者

[root@controller1 ~]# systemctl start corosync.service
[root@controller1 ~]# systemctl start pacemaker.service

验证Corosync安装

首先,使用" corosync-cfgtool"来检查集群通信是否令人满意:

[root@controller2 ~]#  corosync-cfgtool -s
Printing ring status.
Local node ID 2
RING ID 0
        id      = 192.168.122.22
        status  = ring 0 active with no faults

因此,将所有固定IP地址(而不是127.0.0.x环回地址)列为ID,一切看起来都很正常,并且状态没有任何问题。
如果我们看到不同的内容,则可能首先要检查节点的网络,防火墙和SELinux配置。

接下来,检查成员资格和仲裁API:

[root@controller2 ~]# corosync-cmapctl | grep members
runtime.totem.pg.mrp.srp.members.1.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(192.168.122.20)
runtime.totem.pg.mrp.srp.members.1.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.1.status (str) = joined
runtime.totem.pg.mrp.srp.members.2.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.2.ip (str) = r(0) ip(192.168.122.22)
runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.2.status (str) = joined

检查corosync服务的状态

[root@controller2 ~]# pcs status corosync
Membership information
---------------------
    Nodeid      Votes Name
         1          1 controller1
         2          1 controller2 (local)

我们应该看到两个节点都已加入集群。

在两个控制器上重复相同的步骤以验证corosync服务。

验证集群配置

在进行任何更改之前,最好检查一下配置的有效性。

[root@controller1 ~]# crm_verify -L -V
   error: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
   error: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
   error: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
Errors found during check: config not valid

如我们所见,该工具发现了一些错误。

为了保证数据的安全性,默认情况下启用[5]防护(也称为" STONITH")。
但是,它也知道何时未提供STONITH配置,并将其报告为问题(因为如果出现需要进行节点防护的情况,集群将无法继续运行)。

我们将暂时禁用此功能,并在以后进行配置。
要禁用STONITH,请将两个控制器节点上的stonston-enabled集群选项设置为false:

[root@controller1 ~]# pcs property set stonith-enabled=false
[root@controller1 ~]# crm_verify -L
[root@controller2 ~]# pcs property set stonith-enabled=false
[root@controller2 ~]# crm_verify -L
With the new cluster option set, the configuration is now valid.

警告:

使用stonith-enabled = false完全不适合生产集群。
它告诉集群简单地假装发生故障的节点已安全地处于关闭状态。
一些供应商将拒绝支持已禁用STONITH的群集。

我将继续本文,即在单独的部分中配置OpenStack高可用性。
在下一部分中,我将分享"配置HAProxy"的步骤,并将其作为资源进行管理。

另外,详细步骤是将OpenStack API端点移到群集负载均衡器之后。

`