CentOS 7上具有Pacemaker,Corosync和DRBD的主动/被动群集

时间:2020-03-21 11:43:57  来源:igfitidea点击:

该系列将介绍Pacemaker,Corosync,Apache,DRBD和VMware STONITH代理的安装和配置。

在我们开始之前

我们将使用DRBD来存储Apache的Web内容。
可能需要告知我们,这是DRBD可能不是满足存储需求的最佳选择的情况之一(有关更多信息,请参见此处:https://fghaas.wordpress.com/2007/06/26/when-不使用drbd /)。
很棒的rsync会很好的。
在生产中,我们想将DRBD用于后端存储而不是前端。

该系列中遵循的约定是[ALL]表示需要在所有群集计算机上运行的命令。

使用DRBD复制群集存储

尽管不是严格要求,但建议我们通过专用连接运行DRBD复制。

由于明显的性能缺陷(不利地影响吞吐量和延迟),通常不建议通过路由器运行DRBD复制。

在本文中,我们为DRBD使用了专用VLAN。

DRBD安装

导入ELRepo软件包签名密钥,启用存储库并使用实用程序安装DRBD内核模块:

[ALL]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[ALL]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[ALL]# yum install -y kmod-drbd84 drbd84-utils

为了暂时避免SELinux出现问题,我们将免除SELinux控制中的DRBD流程:

[ALL]# semanage permissive -a drbd_t

DRBD的LVM卷

为DRBD创建一个新的256MB逻辑卷:

[ALL]# vgcreate vg_drbd /dev/sdb
[ALL]# lvcreate --name lv_drbd --size 256M vg_drbd

DRBD功能:单主要和双重主要模式

在单主模式下,资源在任何给定时间仅在一个集群成员上担任主角色。
由于可以确保任何时刻只有一个群集节点可以处理数据,因此该模式可以与任何常规文件系统(ext4,XFS)一起使用。

在单主模式下部署DRBD是高可用性(具有故障转移功能)集群的典型方法。
这是我们将在故障转移群集中使用的模式。

在双主模式下,资源在任何给定时间在两个群集节点上都担当主要角色。
由于因此可以同时访问数据,因此此模式要求使用利用分布式锁管理器的共享群集文件系统。
示例包括GFS和OCFS2.

对于需要从两个节点进行并发数据访问的负载平衡群集,首选的方法是在双主模式下部署DRBD。
默认情况下,此模式是禁用的,并且必须在DRBD的配置文件中显式启用。

DRBD复制模式

DRBD支持三种不同的复制模式,允许三种复制同步度。

  • 协议A。异步复制协议。一旦本地磁盘写入完成,并且复制数据包已放置在本地TCP发送缓冲区中,就认为主节点上的本地写入操作已完成。
  • 协议B。内存同步(半同步)复制协议。一旦发生本地磁盘写入,并且复制数据包到达对等节点,就认为在主节点上的本地写入操作已完成。
  • 协议C。同步复制协议。仅在确认本地和远程磁盘写入后,才认为在主节点上的本地写入操作已完成。

DRBD设置中最常用的复制协议是协议C。

配置DRBD

配置DRBD,将单主模式与复制协议C配合使用。

[ALL]# cat << EOL > /etc/drbd.d/webdata.res
resource webdata {
 protocol C;
 meta-disk internal;
 device /dev/drbd0;
 disk   /dev/vg_drbd/lv_drbd;
 handlers {
  split-brain "/usr/lib/drbd/notify-split-brain.sh root";
 }
 net {
  allow-two-primaries no;
  after-sb-0pri discard-zero-changes;
  after-sb-1pri discard-secondary;
  after-sb-2pri disconnect;
  rr-conflict disconnect;
 }
 disk {
  on-io-error detach;
 }
 syncer {
  verify-alg sha1;
 }
 on pcmk01 {
  address  172.16.22.11:7789;
 }
 on pcmk02 {
  address  172.16.22.12:7789;
 }
}
EOL

我们有一个名为webdata的资源,该资源使用'/dev/vg_drbd/lv_drbd'作为较低级别的设备,并配置了内部元数据。

资源使用TCP端口7789进行网络连接,并分别绑定到IP地址172.16.22.11和172.16.22.12.

如果遇到问题,我们必须确保在防火墙上为DRBD接口打开了TCP 7789端口,并且资源名称与文件名匹配。

为DRBD资源创建本地元数据:

[ALL]# drbdadm create-md webdata

确保已加载DRBD内核模块:

[ALL]# lsmod|grep drbd
drbd

392583  0
libcrc32c

12644  1 drbd

最后,调出DRBD资源:

[ALL]# drbdadm up webdata

为了保持数据一致性,请告知DRBD哪个节点应被视为具有正确的数据(可以在任何节点上运行,因为此时两个节点都具有垃圾):

[pcmk01]# drbdadm primary --force webdata

现在应该同步:

[pcmk01]# watch -n.5 'cat /proc/drbd'

在DRBD设备上创建文件系统,如果需要,请进行调整:

[pcmk01]# mkfs.ext4 -m 0 -L drbd /dev/drbd0
[pcmk01]# tune2fs -c 200 -i 180d /dev/drbd0

填充DRBD内容

挂载新创建的磁盘,并用Web文档填充它:

[pcmk01]# mount /dev/drbd0 /mnt
[pcmk01]# cat << EOL >/mnt/index.html
DRBD backend test
EOL

我们需要提供与Web文档根目录相同的SELinux策略。
显示安全上下文:

[pcmk01]# ls -ldZ /var/www/html/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

httpd策略在“/var/www”目录下存储具有多种不同文件上下文类型的数据。
如果要将数据存储在其他目录中,可以使用semanage命令创建等效映射。

[pcmk01]# semanage fcontext --add --equal /var/www /mnt
[pcmk01]# restorecon -R -v /mnt

请注意,使用chcon命令进行的更改不能在重新标记文件系统或者执行restorecon命令后继续存在。
始终使用管理功能。

[pcmk01]# umount /dev/drbd0

DRBD设备的群集配置

为DRBD设备创建一个名为my_webdata的群集资源,并创建一个另外的克隆资源MyWebClone,以允许该资源同时在两个节点上运行:

[pcmk01]# pcs cluster cib drbd_cfg
[pcmk01]# pcs -f drbd_cfg resource create my_webdata ocf:linbit:drbd \
  drbd_resource=webdata op monitor interval=10s
[pcmk01]# pcs -f drbd_cfg resource master MyWebClone my_webdata \
  master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 \
  notify=true

验证资源并提交:

[pcmk01]# pcs -f drbd_cfg resource show
 Resource Group: my_webresource

my_VIP     (ocf::heartbeat:IPaddr2):

Started pcmk01-cr

my_website (ocf::heartbeat:apache):

Started pcmk01-cr
 Master/Slave Set: MyWebClone [my_webdata]

Stopped: [ pcmk01-cr pcmk02-cr ]
[pcmk01]# pcs cluster cib-push drbd_cfg

检查集群状态:

[pcmk01]# pcs status
Cluster name: test_webcluster
Last updated: Sun Dec 13 15:16:31 2014

Last change: Sun Dec 13 15:16:21 2014 by root via cibadmin on pcmk01-cr
Stack: corosync
Current DC: pcmk02-cr (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 4 resources configured
Online: [ pcmk01-cr pcmk02-cr ]
Full list of resources:
 Resource Group: my_webresource

my_VIP     (ocf::heartbeat:IPaddr2):

Started pcmk01-cr

my_website (ocf::heartbeat:apache):

Started pcmk01-cr
 Master/Slave Set: MyWebClone [my_webdata]

Masters: [ pcmk01-cr ]

Slaves: [ pcmk02-cr ]
PCSD Status:
  pcmk01-cr: Online
  pcmk02-cr: Online
Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

集群的文件系统配置

我们有一个工作正常的DRBD设备,现在我们需要挂载它的文件系统。

为文件系统创建一个名为my_webfs的集群资源:

[pcmk01]# pcs cluster cib fs_cfg
[pcmk01]# pcs -f fs_cfg resource create my_webfs Filesystem \
  device="/dev/drbd0" directory="/var/www/html" fstype="ext4"

文件系统资源需要与MyWebClone资源在同一节点上运行。
由于一个集群服务依赖于在同一节点上运行的另一个集群服务,因此我们需要为约束分配一个无穷分数:

[pcmk01]# pcs -f fs_cfg constraint colocation add my_webfs with MyWebClone \
  INFINITY with-rsc-role=Master
[pcmk01]# pcs -f fs_cfg constraint order promote MyWebClone then start my_webfs
Adding MyWebClone my_webfs (kind: Mandatory) (Options: first-action=promote then-action=start)

告诉集群虚拟IP需要与文件系统在同一台计算机上运行,并且在VIP启动之前它必须处于活动状态:

[pcmk01 ~]# pcs -f fs_cfg constraint colocation add my_VIP with my_webfs INFINITY
[pcmk01 ~]# pcs -f fs_cfg constraint order my_webfs then my_VIP
Adding my_webfs my_VIP (kind: Mandatory) (Options: first-action=start then-action=start)

这样,仅在文件系统和VIP均可用时才启动Apache。

验证更新的配置:

[pcmk01]# pcs -f fs_cfg constraint
Location Constraints:
Ordering Constraints:
  promote MyWebClone then start my_webfs (kind:Mandatory)
  start my_webfs then start my_VIP (kind:Mandatory)
Colocation Constraints:
  my_webfs with MyWebClone (score:INFINITY) (with-rsc-role:Master)
  my_VIP with my_webfs (score:INFINITY)
[pcmk01]# pcs -f fs_cfg resource show
 Resource Group: my_webresource

my_VIP     (ocf::heartbeat:IPaddr2):

Started pcmk01-cr

my_website (ocf::heartbeat:apache):

Started pcmk01-cr
 Master/Slave Set: MyWebClone [my_webdata]

Masters: [ pcmk01-cr ]

Slaves: [ pcmk02-cr ]
 my_webfs

(ocf::heartbeat:Filesystem):    Stopped

提交更改并检查集群状态:

[pcmk01]# pcs cluster cib-push fs_cfg
[pcmk01]# pcs status
Cluster name: test_webcluster
Last updated: Sun Dec 13 15:19:01 2014

Last change: Sun Dec 13 15:18:55 2014 by root via cibadmin on pcmk01-cr
Stack: corosync
Current DC: pcmk02-cr (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 5 resources configured
Online: [ pcmk01-cr pcmk02-cr ]
Full list of resources:
 Resource Group: my_webresource

my_VIP     (ocf::heartbeat:IPaddr2):

Started pcmk01-cr

my_website (ocf::heartbeat:apache):

Started pcmk01-cr
 Master/Slave Set: MyWebClone [my_webdata]

Masters: [ pcmk01-cr ]

Slaves: [ pcmk02-cr ]
 my_webfs

(ocf::heartbeat:Filesystem):    Started pcmk01-cr
PCSD Status:
  pcmk01-cr: Online
  pcmk02-cr: Online
Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

以下是群集资源的列表:

# pcs resource show --full
 Group: my_webresource
  Resource: my_VIP (class=ocf provider=heartbeat type=IPaddr2)
   Attributes: ip=10.247.50.213 cidr_netmask=32
   Operations: start interval=0s timeout=20s (my_VIP-start-interval-0s)

stop interval=0s timeout=20s (my_VIP-stop-interval-0s)

monitor interval=10s (my_VIP-monitor-interval-10s)
  Resource: my_website (class=ocf provider=heartbeat type=apache)
   Attributes: configfile=/etc/httpd/conf/httpd.conf statusurl=http://localhost/server-status
   Operations: start interval=0s timeout=40s (my_website-start-interval-0s)

stop interval=0s timeout=60s (my_website-stop-interval-0s)

monitor interval=10s (my_website-monitor-interval-10s)
 Master: MyWebClone
  Meta Attrs: master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
  Resource: my_webdata (class=ocf provider=linbit type=drbd)
   Attributes: drbd_resource=webdata
   Operations: start interval=0s timeout=240 (my_webdata-start-interval-0s)

promote interval=0s timeout=90 (my_webdata-promote-interval-0s)

demote interval=0s timeout=90 (my_webdata-demote-interval-0s)

stop interval=0s timeout=100 (my_webdata-stop-interval-0s)

monitor interval=10s (my_webdata-monitor-interval-10s)
 Resource: my_webfs (class=ocf provider=heartbeat type=Filesystem)
  Attributes: device=/dev/drbd0 directory=/var/www/html fstype=ext4
  Operations: start interval=0s timeout=60 (my_webfs-start-interval-0s)

stop interval=0s timeout=60 (my_webfs-stop-interval-0s)

monitor interval=20 timeout=40 (my_webfs-monitor-interval-20)