1 规划设计
组网拓扑主机 | 业务网 | 心跳网 | 存储网 |
---|---|---|---|
node1 | 192.168.234.129 | 172.16.1.231 | 10.0.1.231 |
node2 | 192.168.234.130 | 172.16.1.232 | 10.0.1.232 |
storage | 192.168.234.250 | 10.0.1.235 |
本例中,使用的存储只做一个STONITH设备,虚拟机的磁盘文件存储在个计算节点的DRBD网络Raid 1硬盘上。
集群资源依赖关系
DLM--->|
|->CLVM->File System(GFS2)->Virtual Domain
DRBR->|
2 节点准备
安装虚拟化软件(计算节点)
yum groups install -y "Virtualization Platform "
yum groups install -y "Virtualization Hypervisor "
yum groups install -y "Virtualization Tools "
yum groups install -y "Virtualization Client "
安装集群软件(计算节点)
yum install pacemaker corosync pcs psmisc policycoreutils-python fence-agents-all -y
安装DRBD管理软件(计算节点)
#添加key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#添加ELrepo源
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
#安装drbd管理软件
yum install kmod-drbd84 drbd84-utils -y
安装CLVM(计算节点)
yum -y install lvm2-cluster
安装GFS2集群文件系统,dlm分布式锁(计算节点)
yum -y install gfs2-utils dlm
安装Linux IO软件(存储节点)
yum -y install targetcli
设置hosts添加各主机的域名解析(所有节点)
[root@node1 ~]$ cat /etc/hosts
192.168.234.129 node1
192.168.234.130 node2
10.0.1.231 node1-stor
10.0.1.232 node2-stor
10.0.1.235 stor
172.16.1.231 node1-sync
172.16.1.232 node2-sync
配置ssh免密认证(计算节点)
ssh-keygen -t rsa -P ''
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1 #到自己免密码
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2 #到node2免密码(双向)
设置定时同步时间(所有节点)
yum install ntpdate -y
crontab -e
*/30 * * * * /usr/sbin/ntpdate time.windows.com &> /dev/null
设置防火墙(所有节点)
#允许集群服务通过防火墙
firewall-cmd --permanent --add-service=high-availability
#允许心跳及存储网络通过防火墙
firewall-cmd --zone=trusted --add-source=10.0.1.0/24 --permanent
firewall-cmd --zone=trusted --add-source=172.16.1.0/24 --permanent
#允许动态迁移
firewall-cmd --permanent --add-port=16509/tcp
firewall-cmd --permanent --add-port=49152-49215/tcp
#允许虚拟机vnc端口,方便virt-manager远程连接
firewall-cmd --permanent --add-service=vnc-server
#存储上放行iscsi-target端口
firewall-cmd --permanent --add-service=iscsi-target
firewall-cmd --reload
3 配置存储服务器
过程省略,与上个实验中配置存储服务器一样,提供一个fileio文件给计算节点作为stonith设备。
4 DRBD概述及配置
drbd示意图4.1 DRBD概述
Distributed Replicated Block Device(分布式复制块设备)
是一种基于软件的,无共享,复制的存储解决方案,在服务器之间对块设备(磁盘,分区,逻辑卷等)进行镜像,可以认为是基于网路的RAID1
DRBD镜像数据:
- 实时性:当应用对磁盘的数据进行修改时,复制立即发生
- 透明性:应用程序的数据存储在镜像设备上是透明和独立的,数据可存储在不同的服务器上
- 同步镜像和异步镜像:
同步镜像,当本地发申请进行写操作时,同步写到两台服务器上
异步镜像,当本地写申请已经完成对本地的写操作时,开始对对应服务器进行写操作
DRBD是在Linux内核中实现的,Linux 2.6.33版本以后内置了DRBD功能,使用时直接把DRBD装在到内核中就可以,只是需要安装额外的管理工具方便管理。
4.2 DRBD核心特性
复制模式:
协议A:
异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点
协议B:
内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘
协议C:
同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽
一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议
资源角色:
1、DRBD的主从模式
这种模式下,其中一个节点作为主节点,另一个节点作为从节点。其中主节点可以执行读、写操作;从节点不可以挂载文件系统,因此,也不可以执行读写操作。在这种模式下,资源在任何时间只能存储在主节点上。这种模式可用在任何的文件系统上(EXT3、EXT4、XFS等等)。默认这种模式下,一旦主节点发生故障,从节点需要手工将资源进行转移,且主节点变成从节点和从节点变成主节点需要手动进行切换。不能自动进行转移,因此比较麻烦。
为了解决手动将资源和节点进行转移,可以将DRBD做成高可用集群的资源代理(RA),这样一旦其中的一个节点宕机,资源会自动转移到另一个节点,从而保证服务的连续性。
2、DRBD的双主模式
这是DRBD8.0之后的新特性
在双主模式下,任何资源在任何特定的时间都存在两个主节点。这种模式需要一个共享的集群文件系统,利用分布式的锁机制进行管理,如GFS和OCFS2。部署双主模式时,DRBD可以是负载均衡的集群,这就需要从两个并发的主节点中选取一个首选的访问数据。这种模式默认是禁用的,如果要是用的话必须在配置文件中进行声明。
4.3 DRBD资源准备
准备用于同步的LV(双节点)
在每个节点上准备相同大小的lv,创建pv、vg、lv
#创建pv
pvcreate /dev/sdb1
#创建vg
vgcreate drbdvg0 /dev/sdb1
#创建lv
lvcreate -L 5G -n drbdlv0 drbdvg0
配置DRBD参数文件(双节点)
修改全局配置文件
vi /etc/drbd.d/global_common.conf
usage-count yes; 改成no,这是使用计数,drbd团队收集互联网上有多少在使用drbd
创建新资源的配置文件,文件后缀是.res,放在/etc/drbd.d/目录下
resource r0{
protocol C;
meta-disk internal;
device /dev/drbd0;
disk /dev/drbdvg0/drbdlv0;
syncer {
verify-alg sha1;
}
on node1 {
address 10.0.1.231:7789;
}
on node2 {
address 10.0.1.232:7789;
}
# protocol C复制模式使用协议C
# meta-disk 元数据存储位置
# device 操作系统层面生成的drbd块设备
# disk 参与drbd复制的设备
# syncer 校验算法
# node1和node2是节点的hostname,不能搞错,之前配成了节点存储地址的域名node1-stor、node2-stor创建资源时会报错不成功
#下面是双主节点配置时需要添加的配置,单主节点不用
net {
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
disk {
fencing resource-and-stonith;
}
handlers {
fence-peer "usr/lib/drbd/crm-fence-peer.sh";
after-resync-target "/usr/lib/drbd/crm-unfence-peer.sh";
}
}
# net部分
# allow-two-primaries 允许一个集群中有两个primary node
# after-sb-0pri 裂脑已经被探测到,但是现在没有resource 处于 primary role
# discard-zero-changes 没有改变数据的节点被抛弃,也就是说如果某个节点没有改变数据,说明这个节点发生了故障,要作为从节点。
# after-sb-1pri 裂脑已经被探测到,现有有一个节点处于primary role
# discard-secondary 把从节点直接当做脑裂受害者,把另一个节点当做主节点进行数据同步,注意,如果此节点有新数据的话也直接丢弃了。
# after-sb-2pri 有两个节点都是主节点的脑裂情况
# disconnect 直接退出集群,即两个节点均不再参与数据同步,成为孤立节点
# disk部分
# fencing resource-and-stonith
# 在此策略下,如果一个节点处于split brain状态,它将停止I/O操作,并调用fence-peer处理器。
# 处理器通过其它通信路径到达对等节点,并在这个对等节点上调用DRBDadm outdate res命令。
# 如果无法到达对等节点,它将向对等端发送关机命令。
# 一旦问题解决,I/O操作将重新进行。如果处理器失败,你可以使用resume-io命令来重新开始I/O操作。
DRBD初始化及同步(双节点)
创建元数据
drbdadm create-md r0
# r0是之前配置文件定义的resource名字
内核加载drbd模块
#手动加载
modprobe drbd
#配置每次开机自动加载
echo drbd > /etc/modules-load.d/drbd.conf
加载drbd资源r0
drbdadm up r0
查看drbd状态信息,两个节点初始状态是Secondary状态,数据状态是Inconsistent不一致状态
[root@node1 ~]$ cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05 02:58:18
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
进行初步数据同步,强制提升一个节点为primary
#只需在一个节点上执行
drbdadm primary r0 --force
5 配置STONITH(DISK)
同上一个实验一样,使用IP SAN上的共享存储作为stonith设备,步骤略。
[root@node1 ~]$ pcs status
Cluster name: cluster1
Stack: corosync
Current DC: node1-sync (version 1.1.21-4.el7-f14e36fd43) - partition with quorum
Last updated: Sun Oct 11 15:16:12 2020
Last change: Sat Oct 10 21:00:35 2020 by root via cibadmin on node1-sync
2 nodes configured
1 resources configured
Online: [ node1-sync node2-sync ]
Full list of resources:
scsi-shooter (stonith:fence_scsi): Started node2-sync
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
6 配置DLM分布式锁
方法1:通过更改拷贝文件,再push的方式写入
pcs cluster cib dlm_cfg
pcs -f dlm_cfg resource create dlm ocf:pacemaker:controld op monitor interval=30s on-fail=fence
#资源名称是dlm;类型是ocf:pacemaker:controld;
#op代表operation,op的动作是monitor,间隔是30s,检测到资源fail时对node进行fence
pcs -f dlm_cfg resource clone dlm clone-max=2 clone-node-max=1
#clone-max=2代表最多克隆为2份,clone-node-max=1代表每个node上最多由1个资源
pcs cluster cib-push dlm_cfg
方法2:直接通过命令创建
pcs resource create dlm ocf:pacemaker:controld \
op monitor interval=30s on-fail=fence \
clone interleave=true ordered=true
#clone参数讲解
#1、interleave
Changes the behavior of ordering constraints (between clones/masters) so that
copies of the first clone can start or stop as soon as the copy on the same node of
the second clone has started or stopped (rather than waiting until every instance of
the second clone has started or stopped). Allowed values: false, true. The default
value is false.
#2、order
Should the copies be started in series (instead of in parallel).
Allowed values: false, true. The default value is false.
配置后查看pcs 状态,能够看到dlm在2个节点上启动
[root@node1 ~]$ pcs status
Cluster name: cluster1
Stack: corosync
Current DC: node1-sync (version 1.1.21-4.el7-f14e36fd43) - partition with quorum
Last updated: Sun Oct 11 16:17:47 2020
Last change: Sat Oct 10 21:00:35 2020 by root via cibadmin on node1-sync
2 nodes configured
3 resources configured
Online: [ node1-sync node2-sync ]
Full list of resources:
scsi-shooter (stonith:fence_scsi): Started node2-sync
Clone Set: dlm-clone [dlm]
Started: [ node1-sync node2-sync ]
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
7 向集群添加DRBD资源(双Primary模式)
前置条件,需要两个节点都为Secondary,同步状态为UpToDate。
[root@node1 ~]$ cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05 02:58:18
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
添加DRBD资源
#先将配置文件拷贝出来
pcs cluster cib drbd_cfg
#修改拷贝出来的配置文件
#创建一个普通的drbd资源
pcs -f drbd_cfg resource create VMData ocf:linbit:drbd \
drbd_resource=r0 op monitor interval=60s
#基于刚才的drbd资源,创建一个master/slave类型的clone资源
pcs -f drbd_cfg resource master VMDataClone VMData \
master-max=2 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
#master-max=2 最多有几个master;master-node-max=1 每个节点上最多有1个master;notify 当停止或启动资源时,通知其他节点
#将配置文件push到现有配置中
pcs cluster cib-push drbd_cfg
添加成功后,可以看到资源在两个节点上都是Primary状态
resource状态
drbd状态
8 配置CLVM(集群化的LVM)
8.1 修改CLVM的锁定方式
使用lvm配置工具lvmconf修改
lvmconf --enable-cluster
reboot
8.2 在集群中添加CLVM资源
在集群的每个节点上添加clvmd,所以以克隆的方式添加
pcs resource create clvmd ocf:heartbeat:clvm \
op monitor interval=30s on-fail=fence \
clone interleave=true ordered=true
#资源名称是clvmd,资源类型是ocf:heartbeat:clvm,参数设置说明可以参考之前dlm的参数设置
8.3 添加顺序和位置约束
因为约束关系,clvmd必须在dlm启动后启动,且启动clvmd和dlm必须在同一节点上,所以添加两种约束
pcs constraint order start dlm-clone then start clvmd-clone
pcs constraint colocation add clvmd-clone with dlm-clone
clvmd同时还依赖于DRBD提供的块设备,所以还需添加DRBD和clvmd之间的约束关系
pcs constraint order promote VMDataClone then start clvmd-clone
#promote the resource from a slave resource to a master resource.
pcs constraint colocation add clvmd-clone with VMDataClone
8.4 创建LV
做LV过滤
因为/dev/drbd0这个drbd块设备实际上是由/dev/drbdvg0/drbdlv0整个lv创建的,再将/dev/drbd0创建为pv时,会由于uuid一致而导致冲突,这时候就要修改lvm的配置,让lvm看不到/dev/drbdvg0/drbdlv0这个块设备。
修改/etc/lvm/lvm.conf
[root@node1 ~]$ vim /etc/lvm/lvm.conf
filter = [ "a|/dev/sd.*|","a|/dev/drbd*|","r|.*/|" ]
#修改filter属性,a代表accept,r代表reject,后面||之间时正则表达式,表示lvm接受和拒绝的块设备
创建LV
修改后/dev/drbdvg0/drbdlv0不在lvm的接收范围内,可以正常由/dev/drbd0创建pv、vg和lv,创建pv、vg、lv的动作在任意节点上做就行
#创建pv
pvcreate /dev/drbd0
#创建vg
vgcreate vmvg0 /dev/drbd0
#创建lv
lvcreate -l 100%FREE -n vmlv0 vmvg0
9 配置GFS2文件系统
9.1 格式化lv为GFS2
下面格式化刚刚创建的lv为GFS2文件系统
mkfs.gfs2 -p lock_dlm -j 2 -t cluster1:labkvm1 /dev/mapper/vmvg0-vmlv0
#-p protocol 代表锁协议
#-j journals 代表文件系统日志数目,最好设置为使用文件系统的集群节点数
#-t clustername:lockspace clustername必须为集群名字,lockspace必须是一个用于在集群中表示这个文件系统的独一无二的名字
9.2 向集群添加GFS2文件系统资源
在集群的每个节点上添加GFS2文件系统,即在每个节点上均挂载文件系统,所以以克隆的方式添加,且需要事先准备好用于挂载的文件夹/vm
pcs resource create VMFS ocf:heartbeat:Filesystem \
device="/dev/vmvg0/vmlv0" directory="/vm" fstype="gfs2" clone
#资源名称是VMFS,类型是ocf:heartbeat:Filesystem
9.3 添加顺序和位置约束
因为约束关系,GFS2必须在CLVMD启动后启动,且启动GFS2和CLVMD必须在同一节点上,所以添加两种约束
pcs constraint order start clvmd-clone then start VMFS-clone
pcs constraint colocation add VMFS-clone with clvmd-clone
10 配置虚拟机
创建虚拟机磁盘文件、virt-install安装虚拟机、虚拟机迁移测试、拷贝虚拟机配置文件和磁盘文件至DRBD存储的过程省略。
10.1 向集群添加虚拟机资源
pcs resource create centos6 ocf:heartbeat:VirtualDomain \
hypervisor="qemu:///system" \
config="/vm/qemu_config/centos6.xml" \
migration_transport=ssh \
meta allow-migration="true" priority="100" \
op start timeout="120s" \
op stop timeout="120s" \
op monitor timeout="30" interval="10" \
op migrate_from interval="0" timeout="120s" \
op migrate_to interval="0" timeout="120s"
配置后查看pcs 状态
[root@node1 ~]$ pcs status
Cluster name: cluster1
Stack: corosync
Current DC: node2-sync (version 1.1.21-4.el7-f14e36fd43) - partition with quorum
Last updated: Fri Oct 16 20:09:58 2020
Last change: Wed Oct 14 19:58:16 2020 by root via cibadmin on node1-sync
2 nodes configured
10 resources configured
Online: [ node1-sync node2-sync ]
Full list of resources:
centos6 (ocf::heartbeat:VirtualDomain): Started node1-sync
scsi-shooter (stonith:fence_scsi): Started node2-sync
Clone Set: dlm-clone [dlm]
Started: [ node1-sync node2-sync ]
Master/Slave Set: VMDataClone [VMData]
Masters: [ node1-sync node2-sync ]
Clone Set: clvmd-clone [clvmd]
Started: [ node1-sync node2-sync ]
Clone Set: VMFS-clone [VMFS]
Started: [ node1-sync node2-sync ]
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
10.2 添加顺序和位置约束
因为约束关系,虚拟机必须在GFS2文件系统启动后启动,且虚拟机和文件系统要在同一节点上,所以添加两种约束
pcs constraint order start VMFS-clone then start centos6
pcs constraint colocation add centos6 with VMFS-clone
10.3 迁移测试
Centos自带的kvm版本,使用libvirt迁移支持在线迁移,使用pcs无法在线迁移,虚拟机会先shutdown,再在目标节点上开机。
#节点standby
pcs cluster standby node1-sync
#手工move,不写目标节点会自动在源节点产生constraint
pcs cluster resource move centos6
#手工move,写目标节点不会产生constraint;
#即使目标节点有constraint,手工move后disable的constraint会变为enable,虚拟机可以正常启动
pcs cluster resource move centos6 node1-sync
#停止节点集群服务
pcs cluster stop node2
网友评论