nfs高可用部署 nfs+keepalived+drbd
一、主机信息
hostname | ip |
nfs1 | 192.168.63.148 |
nfs2 | 192.168.63.150 |
二、部署drbd
1、drbd介绍
1 DRBD基本功能
Distributed Replicated Block Device(DRBD)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等)进行镜像。
DRBD是将不同机器上的两块大小相同的硬盘或是两个分区让它们的每一位都对齐,从而当用户空间有数据要存储到主节点磁盘时,工作在内核空间的DRBD会监控数据,一旦发现数据是要存储到定义了DRBD的分区上后,就会把数据复制一份通过网络传送到备用节点上来。备用节点上运行一个服务时刻可以接收对方发来的数据,然后接到内核中,内核中的DRBD接收到数据后通过内核保存到磁盘上。双方式通过DRBD协议按位存储数据。
在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。本地(主节点)与远程主机(备节点)的数据可以保证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。需要说明一点的是DRBD只支持两个节点不支持多节点。
2、DRBD部署模式
①、主从模式
DRBD主从架构中,主节点可以读写数据而从节点不能读写,连挂载都不允许,否则会造成文件系统崩溃,但是主从的节点可以相互切换,如可以把主节点分区卸载后把主节点转为从,然后把分区挂在到从节点上,再把从转为主。
②、双主模式
由于DRBD是在两台独立的机器上实现数据块同步,所以单凭在一个节点上写数据时施加锁机制而另外一个节点要写数据时看不到对方施加的锁,因此会照成数据损坏。但是如果把DRBD用在高可用集群中就可以实现双主模型,在高可用中把DRBD定义成主从资源基于分布式文件锁DLM加集群文件系统gfs或ocfs,这样一来当一端在写入数据时因为是DLM+GFS,所以就会通知给另外一端的DRBD从而避免数据损坏(双主模型并不是并行读写)。
3、DRBD数据同步模式
由于DRBD将数据发送给对端服务器之后还要确定对方的回应以确定数据是否安全存储,然后DRBD程序才退出,最终应用程序完成数据存储。这样一来DRBD发送数据并接收到回应的时间就是应用程序执行的过程时间。所以又涉及到了数据安全跟性能之间平衡了,DRBD提供了异步、半同步、同步等工作方式。
①、异步复制
异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点。
②、半同步复制
内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘。
③、同步复制
同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽。
一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议。
2、准备两台虚拟机nfs1和nfs2(此处不做介绍)
3、两台虚拟机分别添加一块100G硬盘(此处不做介绍,vmware操作)
4、分别设置主机名
#nfs1
hostnamectl set-hostname nfs1
#nfs2 hostnamectl set-hostname nfs2
5、两台主机分别关闭防火墙以及selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config systemctl stop firewalld systemctl disable firewalld setenforce 0
6、查看新增磁盘信息
[root@nfs1 ~]# fdisk -l|grep sdb 磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区 [root@nfs2 ~]# fdisk -l|grep sdb 磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
7、分别修改hosts文件
[root@nfs2 ~]# cat << EOF >> /etc/hosts 192.168.63.148nfs1 192.168.63.150nfs2 EOF
8、安装drbd
#安装可能需要的依赖 yum install -y glib2-devel libxml2-devel bzip2-devel flex-devel bison-devel OpenIPMI-devel net-snmp-devel ipmitool ipmiutil ipmiutil-devel asciidoc #安装yum源 rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm #安装drbd yum -y install drbd90-utils kmod-drbd90 #让内核加载 drbd 模块 modprobe drbd #查看drbd模块 lsmod |grep drbd #加入开机启动 echo "modprobe drbd">>/etc/rc.local chmod +x /etc/rc.d/rc.local
9、配置文件
/etc/drbd.conf #主配置文件 /etc/drbd.d/global_common.conf #全局配置文件 /etc/drbd.conf说明
10、更改配置文件
mv /etc/drbd.d/global_common.conf /etc/drbd.d/global_common.conf.bak cat > /etc/drbd.d/global_common.conf << EOF # DRBD is the result of over a decade of development by LINBIT. # In case you need professional services for DRBD or have # feature requests visit http://www.linbit.com global { usage-count no; #是否参加DRBD使用统计,默认为yes。官方统计drbd的装机量,改为no # Decide what kind of udev symlinks you want for "implicit" volumes # (those without explicit volume <vnr> {} block, implied vnr=0): # /dev/drbd/by-resource/<resource>/<vnr> (explicit volumes) # /dev/drbd/by-resource/<resource> (default for implict) udev-always-use-vnr; # treat implicit the same as explicit volumes # minor-count dialog-refresh disable-ip-verification # cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600; } common { protocol C; #使用DRBD的同步协议,添加这一行 handlers { # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when choosing your poison. pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; # quorum-lost "/usr/lib/drbd/notify-quorum-lost.sh root"; } startup { # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb } options { # cpu-mask on-no-data-accessible # RECOMMENDED for three or more storage nodes with DRBD 9: # quorum majority; # on-no-quorum suspend-io | io-error; } disk { on-io-error detach; #配置I/O错误处理策略为分离 #size on-io-error fencing disk-barrier disk-flushes # disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-target c-fill-target c-max-rate # c-min-rate disk-timeout } net { # protocol timeout max-epoch-size max-buffers # connect-int ping-int sndbuf-size rcvbuf-size ko-count # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri # after-sb-1pri after-sb-2pri always-asbp rr-conflict # ping-timeout data-integrity-alg tcp-cork on-congestion # congestion-fill congestion-extents csums-alg verify-alg # use-rle } syncer { rate 1024M; #设置主备节点同步时的网络速率 } } EOF 注释: on-io-error 策略可能为以下选项之一 detach 分离:这是默认和推荐的选项,如果在节点上发生底层的硬盘I/O错误,它会将设备运行在Diskless无盘模式下 pass_on:DRBD会将I/O错误报告到上层,在主节点上,它会将其报告给挂载的文件系统,但是在此节点上就往往忽略(因此此节点上没有可以报告的上层) -local-in-error:调用本地磁盘I/O处理程序定义的命令;这需要有相应的local-io-error调用的资源处理程序处理错误的命令;这就给管理员有足够自由的权力命令命令或是脚本调用local-io-error处理I/O错误 定义一个资源
11、创建资源文件
cat > /etc/drbd.d/data.res << EOF resource data { #资源名称 protocol C; #使用协议 meta-disk internal; device /dev/drbd1; #DRBD设备名称 syncer { verify-alg sha1;# 加密算法 } net { allow-two-primaries; } on nfs1 { disk /dev/sdb; address 192.168.63.148:7789; #设置DRBD监听地址与端口 } on nfs2 { disk /dev/sdb; address 192.168.63.150:7789; } } EOF
12、启用drbd
drbdadm create-md data drbdadm up data 报错:Command 'drbdmeta 1 v08 /dev/vdb internal apply-al' terminated with exit code 255 解决:dd if=/dev/zero of=/dev/sdb bs=1M count=100
13、配置nfs1
drbdadm primary data --force
14、创建文件系统
文件系统只能挂载在主(Primary)节点上,因此在设置好主节点后才可以对DRBD设备进行格式化操作格式化文件系统 Primary:当前节点为主;在前面为当前节点 Secondary:备用节点为次 查看当前节点角色 [root@nfs1 ~]# drbdadm role data Primary [root@nfs2 ~]# drbdadm role data Secondary 由此可知Primary在nfs1上
格式化/dev/drbd1
[root@nfs1 ~]# mkfs.ext4 /dev/drbd1 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 6553600 inodes, 26213591 blocks 1310679 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=2174746624 800 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成
挂载/dev/drbd1并查看状态
mkdir /data mount /dev/drbd1 /data #查看drbd状态 [root@nfs1 ~]# drbdadm status data role:Primary disk:UpToDate nfs2 role:Secondary replication:SyncSource peer-disk:Inconsistent done:55.27
15、切换主备测试是否同步成功
#在nfs1上创建文件并进行降级操作,切换为备用节点 touch /data/testfile.{1..4} ll /data umount /data drbdadm secondary data #在nfs2上进行升级操作,切换为主节点 drbdadm primary data drbdadm role data [root@nfs2 ~]# drbdadm status data role:Primary disk:Inconsistent nfs1 role:Secondary replication:SyncTarget peer-disk:UpToDate done:91.24
[root@nfs2 ~]# mkdir /data
[root@nfs2 ~]# mount /dev/drbd1 /data
[root@nfs2 ~]# ll /data/
总用量 16
drwx------ 2 root root 16384 1月 2 17:34 lost+found
-rw-r--r-- 1 root root 0 1月 2 17:41 testfile.1
-rw-r--r-- 1 root root 0 1月 2 17:41 testfile.2
-rw-r--r-- 1 root root 0 1月 2 17:41 testfile.3
-rw-r--r-- 1 root root 0 1月 2 17:41 testfile.4
未完待续。。。