Linux运维 第五阶段(五)drbd
一、相关概念:
drbd(distributed replicated block device,www.linbit.com,通过网络将不同主机上磁盘中的分区做成镜像,块级别镜像,可理解为主机级别的RAID,默认只能通过一个node挂载,而备node不能挂载使用)
DAS(SCSI总线,支持7-16个设备,controller内置在主板上的芯片,adapter通过PCI插槽或PCI-E连接的卡,如RAID卡)
NAS(file-server)
SAN(SCSI报文借助FC或TCP/IP隧道,可实现远距离传输)
在有些场景下,DAS、NAS、SAN都不适用,采用DRBD
RAID1:mirror,两磁盘空间一样大,两磁盘内部之间是按位逐一对应起来,关键这两块磁盘要在同一主机
drbd:是内核功能,内核模块,类似ipvs,需要时载入内核并启用规则drbd能将两个主机上的两个磁盘分区做成镜像设备,通过网络将两磁盘分区按位对应起来
drbd有主从primary/secondary概念:
在某一时刻仅允许当前的primary-node挂载,有读写操作,而secondary绝不能挂载(也就是同一时刻两个node中一个为primary,另一个必定是secondary);
仅允许两个node(要么主从,要么双主);
作为主从资源可自动切换
drbd支持双主模型(dual master),两个node可同时挂载,前提要基于CFS(cluster filesystem,DLM,distributed lock manager)完成(OCFS2或GFS2);dual master对效率提升并没有帮助(不是并行读写,是阻止了另一node写),只是实现了多机可以使用同一个FS
在高可用集群场景中,使用pacemaker将drbd被定义为资源(drbd作为高可用集群服务),若使用双主模型,FS要格式化为CFS,DLM要定义为集群资源
service<-->FS(用户空间进程向内核请求FS相关的系统调用,API(open()、read()、write()等),通过内核的API输出给用户空间)
注:不同的FS,系统调用的名称会不一样,所接受的参数也会不一样,参数个数也不一样,通过VFS将不同的FS弥合起来
FS<-->buffer cache<-->disk scheduler(内核会在内存中找一段空间,用于buffer cache(缓存源数据、数据等),对文件的读写是在buffer cache中完成的;对于读,buffer cache中放的是文件的附本,这段内存若被清空,下次访问到该文件再读取即可;对于写,先存在buffer cache中,过一会系统会安排自动同步到磁盘上,若是机械硬盘要等到对应的磁道和扇区转过来才开始写,若有多个写操作通过disk scheduler将相邻的磁道或扇区上的操作进行合并和排序,从而提高性能)
注:disk scheduler,磁盘调度器,合并读请求,合并写请求,将多个IO合并为较少IO,对于机械式硬盘,将随机读写转为顺序读写,性能提升会非常明显
disk<-->driver(任何驱动一般都在内核中执行(至关重要),驱动完成具体的读写操作,驱动知道读或写的地址在哪(哪个磁道,哪个扇区))
drbd(可理解为过滤器,对于非drbd的操作它不管,不做任何处理)
三种数据同步协议(返回告知app已完成):
A模型(发至本地的TCP/IP协议栈时就返回成功,异步async,对于性能来说此模型靠谱,性能靠谱)
B模型(发至对方TCP/IP协议栈返回成功,半同步semi-sync)
C模型(存储到对方磁盘后返回成功,同步sync,数据靠谱,默认使用C模型)
考虑到的问题?千兆网卡,加密传输
一个主机内只要不是相同的分区可以做多个drbd,各自都要定义好用哪个磁盘,通过哪个网络,要不要加密,占据多少带宽,如某个drbd,primary,secondary角色会随时转换,每个主机上都要运行app并监听在socket上(双方的port,使用的硬盘,使用的网卡要规划好)
定义一组drbd设备(drbd的资源),drbd resource包含四个属性:
resource name(可以是除空白字符外的任意ASCII码字符);
drbd device(在双方node上,此drbd设备的设备文件一般为/dev/drbdNUM,其主设备号为147,次设备号用于标识不同的设备,类似RAID中/dev/md{0,1});
disk configuration(磁盘,在双方node上,各自提供的存储设备);
network configuration(双方数据同步时所使用的网络属性)
user space administration tools:
drbdadm(high-level,类似ipvsadm,从/etc/drbd.conf中读取配置,这个文件仅定义了要读取/etc/drbd.d/下的*.conf和*.res所有文件)
drbdsetup(low-level(底层,选项和参数使用复杂),没drbdadm简单)
drbdmeta(low-level,底层,操作drbd的源数据(与文件的源数据不是一回事),是维护drbd设备所用到的源数据,drbd的源数据可放在本地磁盘内(internal一般使用)也可放在另一磁盘)
二、操作:
环境redhat5.8 i386 2.6.18-308.el5,两个节点node1、node2
准备软件包(http://mirrors.163.com/centos/5/extras/i386/RPMS/):
drbd83-8.3.15-2.el5.centos.i386.rpm(工具包)
kmod-drbd83-8.3.15-3.el5.centos.i686.rpm(内核模块)
注:内核2.6.33后才整合到内核中,centos提供了内核模块及用户空间的工具包
准备环境(参照集群第二篇heartbeatV2)有:时间同步、ssh双机互信、主机名、/etc/hosts文件、两节点都准备一个2G分区,不要格式化
node1-side:
#scp /root/*.rpm root@node2:/root/
#for I in {1..2};do ssh node$I ‘yum -y --nogpgcheck localinstall /root/*.rpm’;done
#rpm -ql drbd83
/etc/drbd.conf
/etc/drbd.d/global_common.conf
/etc/ha.d/resource.d/drbddisk
/etc/ha.d/resource.d/drbdupper
/sbin/drbdadm
/sbin/drbdmeta
/sbin/drbdsetup
/usr/sbin/drbd-overview(显示drbd简要信息)
#cp /usr/share/doc/drbd83-8.3.15/drbd.conf /etc/drbd.conf
#vim /etc/drbd.conf
include"drbd.d/global_common.conf";
include "drbd.d/*.res";(*.res是定义的资源)
#vim /etc/drbd.d/global_common.conf
global {
usage-count no;(主机若在互联网上,开启此项会自动发信息给原作者用于统计装机量等)
}
common {(提供默认属性定义,多个node中的资源若相同可放在common段)
protocol C;(数据同步协议,ABC三种模型)
handlers{(处理程序,若drbd故障如脑裂,要让某一方舍弃,通过脚本实现不同的策略,如谁写的少谁舍弃或谁刚成为主节点谁舍弃等策略)
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";
}
startup{(drbd设备刚启动时要同步,若当前主联系不上从,此处定义timeout及degrade降级的timeout等)
#wfc-timeout 120;
# degr-wfc-timeout 120;
}
disk{(不同的drbd,disk不同)
on-io-error detach;
#fencing resource-only;
}
net {
cram-hmac-alg "sha1";(定义加密)
shared-secret "mydrbd";
}
syncer {
rate 1000M;
}
}
#vim /etc/drbd.d/mydrbd.res
resource mydrbd {
device /dev/drbd0;
disk /dev/sdb1;
meta-disk internal;
on node1.magedu.com {
address 192.168.41.129:7789;
}
on node2.magedu.com {
address 192.168.41.130:7789;
}
}
#scp -r /etc/drbd* node2:/etc/
#drbdadm help
#drbddam create-md mydrbd(初始化drbd,两个节点都要初始化)
node2-side:
#drbdadm create-md mydrbd
node1-side:
[root@node1 ~]# cat /proc/drbd(查看状态inconsistent为不一致状态)
version: 8.3.15 (api:88/proto:86-97)
GIT-hash:0ce4d235fc02b5c53c1c52c53433d11a694eab8c build [email protected], 2013-03-27 16:04:08
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:b oos:2096348
[root@node1 ~]# drbd-overview(查看状态)
0:mydrbd Connected Secondary/Secondary Inconsistent/Inconsistent C r-----
[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary mydrbd(将当前node设为主,注意该命令只在一个node上执行,也可用命令#drbdsetup /dev/drbd0 primary -o)
[root@node1 ~]# drbd-overview(有了主从,且数据同步正在进行,也可用命令#watch -n 1 ‘cat /proc/drbd’实时查看状态)
0:mydrbd Sync Source Primary/Secondary UpToDate/Inconsistent C r---n-
[==>.................]sync'ed: 16.3% (1760348/2096348)K
[root@node1 ~]# drbd-overview
0:mydrbd Connected Primary/Secondary UpToDate/UpToDate C r-----
node2-side:
[root@node2 ~]# drbd-overview(以下显示的Secondary/Primary,前面的属于自己的状态,后面的是另一node的状态)
0:mydrbd Connected Secondary/Primary UpToDate/UpToDate C r-----
node1-side:
[root@node1 ~]# mke2fs -j /dev/drbd0
[root@node1 ~]# mkdir /mydata
[root@node1 ~]# mount /dev/drbd0 /mydata
[root@node1 ~]# ls /mydata
lost+found
[root@node1 ~]# cp /etc/issue /mydata
[root@node1 ~]# umount /mydata(注意:重要,将当前node转为从之前要先卸载FS)
[root@node1 ~]# drbdadm secondary mydrbd(将当前node转为从)
[root@node1 ~]# drbd-overview
0:mydrbd Connected Secondary/Secondary UpToDate/UpToDate C r-----
node2-side:
[root@node2 ~]# drbdadm primary mydrbd(将当前node转为主)
[root@node2 ~]# drbd-overview
0:mydrbd Connected Primary/Secondary UpToDate/UpToDate C r-----
[root@node2 ~]# mkdir /mydata
[root@node2 ~]# mount /dev/drbd0 /mydata
[root@node2 ~]# ls /mydata
issue lost+found
以上是学习《马哥运维课程》做的笔记。
本文出自 “Linux运维重难点学习笔记” 博客,谢绝转载!