Linux DRBD 存储的类型: DAS:direct Attached Storage IED,USB,STAT,SCSI,SAS NAS:Network Attached Storage 传输速度慢 SAN:Storage Area Network 价格比较贵 DRBD:Distributed Replicated Block Device,分布式复制块设备; 工作于内核中,跨主机的,基于软件实现的,非共享模式的,通过基于网络的镜像方式进行数据同步的块级别的存储设备; 工作过程:当我们要存数据时,会向内核发起系统调用,通过进程调度器进行调度以后加载相应的文件系统驱动程序,然后就可以获得磁盘上的数据了;DRBD就是在系统调用和驱动程序之间插了一脚,当有写相关的系统调用时,信号到达DRBD以后,会将数据分成两份,其中一份用来调用本机的相关驱动程序,而另一份会通过网卡设备发送到其他DRBD设备,其他DRBD设备通过网卡接收到以后,就会将数据交给自己的DRBD模块,然后由这个模块来讲数据写到自己本机的磁盘中,这个过程就像数据在两个主机之间复制一样; DRBD特性: 实时镜像 对用户透明 可以基于同步或异步模式进行工作 DRBD的三种模式: DRBD有三种模式用来确定数据是否已经同步到其他DRBD设备中;其中A模式是:由DRBD模块将数据发送到本机的网卡队列中就认为已经同步到其他DRBD设备中;B模式是:数据到达其他DRBD主机的网卡接收队列时,就认为已经同步到其他DRBD设备中;C模式是:数据到达其他DRBD设备的磁盘中时,才认为已经同步到其他DRBD设备中; 其中A为异步模式,性能最好,但是可靠性比较差;B为半同步模式,性能和可靠性居中;C为同步模式,性能比较差,但是可靠性最高; DRBD设备一般为主从模式,同时只有一台DRBD设备可以读写数据相应的服务进程也只能在同一台主机上运行;

Disk Scheduler(磁盘调度器)实现的功能是将同一方向的操作(比如读和写就使不同方向),合并在一起然后统一进行操作,这样可以增加性能; DRBD只是内核中的一段代码,就像iptables一样,如果想使用它就需要对其进行配置,所以我们一会儿会用到相应的客户端软件来完成具体配置; 工具: drbdadm:对用户友好的配置工具; DRBD一般都会与集群一起使用,每组DRBD设备都由“drbd resourse”进行定义: Resource name:资源名称,使用ASCII命令,且必须唯一; DRBD device:DRBD专有的设备文件/dev/drbd#,且主设备号(major)一般为147,次设备号从零开始依次递增; Disk configuration:磁盘配置,各个主机上用于组成此drbd设备的磁盘或分区;且磁盘或分区大小应该相同; Network configuration:网络配置,DRBD设备是通过网络接口来进行数据同步的,所以为了避免其占用太多的带宽导致其他数据拥塞,所以一般会对其带宽进行限制,并且定义其什么时候同步以及如何同步 ; 配置案例:关闭防火墙,(iptables -F) 配置前提:时间同步,基于主机名访问 安装软件包: vim /etc/yum.repos.d/drbd.repo [drbd] name=drbd baseurl=https://elrepo.org/linux/elrepo/el6/x86_64/ enabled=1 gpgcheck=0 yum install kmod-drbd84 drbd84-utils 配置文件: /etc/drbd.conf /etc/drbd.d/global_common.conf global { }:为全局配置属性,定义DRBD自己的工作特性; common{ }:为通用属性,定义多组DRBD设备通用特性; *.res:资源特有的配置; 配置过程: iptables -F fdisk /dev/sdb 在各个设备上分别创建一个大小相同的磁盘分区,分区过程略! openssl rand -base64 16 生成随机数,作为配置文件中消息校验的密钥; vim /etc/drbd.d/global_common.conf disk { on-io-error detach; 当磁盘IO发生错误时就将其拆除; resync-rate 512M; 设置数据同步速率; } net { cram-hmac-alg "sha1"; 做消息校验时使用的算法; shared-secret "c6O0ughi37L8DQoav9DNRA=="; 算法所使用的密钥; } vim /etc/drbd.d/mystore.res 添加DRBD设备资源; resource mystore { 指定资源名称 device /dev/drbd0; 指定drbd设备 disk /dev/sdb1; 指定作为drbd设备的分区,根据分区不同,可能会有变化; meta-disk internal; 指定元数据存储在本地磁盘 on clone1 { address 192.168.80.131:7789; 指定节点地址 } on clone2 { address 192.168.80.134:7789; } } scp /etc/drbd.d/* root@clone2:/etc/drbd.d/ 将本机的drbd配置文件复制到其他drbd设备上一份; drbdadm create-md mystore 使用drbdadm创建drbd设备; service drbd start cat /proc/drbd version: 8.4.11-1 (api:1/proto:86-101) GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@Build64R6, 2018-09-28 19:18:36 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:5253020 根据输出结果可以得知:现在都是从节点,没有主节点,ds:Inconsistent/Inconsistent表示两个drbd设备中的数据还没有按位对齐; drbdadm primary --force mystore 设置本节点为主节点 cat /proc/drbd version: 8.4.11-1 (api:1/proto:86-101) GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@Build64R6, 2018-09-28 19:18:36 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- ns:678748 nr:0 dw:0 dr:680608 al:0 bm:0 lo:0 pe:1 ua:2 ap:0 ep:1 wo:f oos:4575132 [=>..................] sync'ed: 13.1% (4464/5128)M finish: 0:01:54 speed: 39,872 (39,872) K/sec 输出信息显示:已经区分主从节点,并且正在进行数据同步更新; version: 8.4.11-1 (api:1/proto:86-101) GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@Build64R6, 2018-09-28 19:18:36 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:5253020 nr:0 dw:0 dr:5253692 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0 上面信息是数据同步完成以后的内容; mkfs.ext4 /dev/drbd0 mount /dev/drbd0 /media/ cp /etc/issue /media/ umount /media drbdadm secondary mystore 将自己从主节点降为从节点 drbd-overview 查看DRBD状态 切换到另一个节点: drbdadm primary mystore 将自己从从节点升为主节点 drbd-overview 查看DRBD状态 mount /dev/drbd0 /media/ ls /media/ 查看是否有之前复制到DRBD设备中的issue文件 Note:这两个文件可不是同一个文件,而是镜像的两个独立的文件; Note:因为演示的是主从模式所以DRBD文件系统同时只能让主节点挂载使用,从节点无法进行任何操作;一般主主模式只在集群中使用; 更多的配置信息可以通过man drbd.conf来查看; 集群中实现DRBD primary节点故障以后自动切换到从节点,继续通过存储服务: 当主节点故障以后,从节点将自己升级为主节点,然后在自己本身启动之前的那个主节点上的那个进行写操作的进程;这个过程可以通过pacemaker来自动实现;下面将以mysql为例进行说明; service corosync start crm(live)ra# info ocf:linbit:drbd 查看集群中配置drbd的帮助信息 drbd_resource:指定DRBD设备名 start timeout=240 reload timeout=30 promote timeout=90 DRBD从secondary到primary demote timeout=90 DRBD从primary到secondary notify timeout=90 stop timeout=100 monitor_Slave timeout=20 interval=20 相当于secondary monitor_Master timeout=20 interval=10 相当于primary 在集群中设置主从资源时,需要首先定义一个primitive资源,然后对这个primitive进行clone,就可以出现多份资源了;并且在定义DRBD资源时还要设置一些meta信息(比如:一共克隆几份,每个节点上能运行几份克隆资源,几主几从等): clone-max:设置克隆的最大数量 clone-node-max:设置单个节点上克隆资源的最大数量 master-max:设置主资源的最大数量 master-node-max:设置单个节点上主资源的最大数量 crm(live)configure# primitive mystor ocf:linbit:drbd params drbd_resource="mystore" op monitor role="Master" interval=10s timeout=20s op monitor role="Slave" interval=20s timeout=20s op start timeout=240s op stop timeout=100s 设置primitive资源 crm(live)# ms ms_mystor mystor meta clone-max="2" clone-node-max="1" master-max="1" master-node-max="1" notify="true" 设置clone资源 crm(live)configure# verify crm(live)configure# commit crm(live)# status 2 nodes configured (2 expected votes) 2 resources configured Online: [ clone1 clone2 ] Full list of resources: Master/Slave Set: ms_mystor [mystor] Masters: [ clone2 ] Slaves: [ clone1 ] 资源已经启动 [root@clone2 ~]# drbd-overview NOTE: drbd-overview will be deprecated soon. Please consider using drbdtop. 0:mystore/0 Connected Primary/Secondary UpToDate/UpToDate 现在DRBD可以通过集群自动完成节点之间主从切换了,接下来就是使其自动挂载文件系统了; crm(live)configure# primitive mydata ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/MYDRBD" fstype="ext4" op monitor interval=20s timeout=40s op start timeout=60s op stop timeout=60s 添加一个文件系统资源 crm(live)configure# colocation mydata_with_ms_mytor_master inf: mydata ms_mystor:Master 配置文件系统资源依赖主从资源中的MASTER节点 crm(live)configure# order ms_mystor_master_then_mydata Mandatory: ms_mystor:promote mydata:start 配置当DRBD设备节点故障发生资源转移到其他节点时,首先完成DRBD从节点的提权(也就是从secondary到primary)然后再挂在文件系统; crm(live)configure# verify crm(live)configure# commit crm(live)# status 2 nodes configured (2 expected votes) 3 resources configured Online: [ clone1 clone2 ] Full list of resources: Master/Slave Set: ms_mystor [mystor] Masters: [ clone2 ] Slaves: [ clone1 ] mydata (ocf::heartbeat:Filesystem): Started clone2 crm(live)# node standby clone2 crm(live)# status 2 nodes configured (2 expected votes) 3 resources configured Node clone2: standby Online: [ clone1 ] Full list of resources: Master/Slave Set: ms_mystor [mystor] Masters: [ clone1 ] Stopped: [ clone2 ] mydata (ocf::heartbeat:Filesystem): Started clone1 crm(live)# node online clone2 Note:这个集群搭建完成以后,就算手动误操作将主节点上的DRBD设备服务停掉(service drbd stop),从节点也会顶替主节点继续提供服务;停掉以后建议的操作是:首先查看DRBD的状态(drbd-overview),如果状态没有发生错误(Secondary/Primary)直接执行 crm node clearstate node_name,将节点的错误信息清理一下即可,防止节点信息错乱发生更复杂的问题;如果发生了更严重的错误(状态为Secondary/Unknown或Primary/Unknown),则可以查看下面的错误总结进行修复; 接下来是将mariabd加入集群中: 当前为主节点的主机:clone1 yum install mysql groupadd -r -g 306 mysql useradd -r -u 306 -g mysql mysql mkdir /MYDRBD/data chown -R mysql:mysql /MYDRBD/data/ tar xf mariadb-5.5.62-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local/ ln -sv mariadb-5.5.62-linux-x86_64/ mysql cd mysql/ chown -R root.mysql ./* scripts/mysql_install_db --user=mysql --datadir=/MYDRBD/data/ ls /MYDRBD/data/ cp support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld off mkdir /etc/mysql mv /etc/my.cnf /etc/my.cnf.bak cp support-files/my-large.cnf /etc/mysql/my.cnf vim /etc/mysql/my.cnf datadir = /MYDRBD/data/ innodb_file_per_table = on skip_name_resolve = on service mysqld start mysql mysql>GRANT ALL ON *.* TO 'root'@'192.168.80.%' IDENTIFIED BY 'guowei'; mysql> FLUSH PRIVILEGES; service mysqld stop crm node standby 将自己将为从节点 scp -r /etc/mysql/ root@clone2:/etc/ 当前为主节点的主机:clone2 yum install mysql groupadd -r -g 306 mysql useradd -r -u 306 -g mysql mysql mkdir /MYDRBD/data chown -R mysql:mysql /MYDRBD/data/ tar xf mariadb-5.5.62-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local/ ln -sv mariadb-5.5.62-linux-x86_64/ mysql cd mysql/ chown -R root.mysql ./* cp support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld off mkdir /etc/mysql mv /etc/my.cnf /etc/my.cnf.bak service mysqld start mysql mysql> CREATE DATABASE TESTDB; 创建了一个名为TESTDB的数据库; mysql> SHOW DATABASES; 以上配置:mariadb已经共享存储数据库了! 接下来在集群中添加一个mysql资源: crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip="192.168.80.12" op monitor interval=10s timeout=20s 添加一个ip资源,使之作为被外部主机访问的IP地址 crm(live)configure# primitive myserver lsb:mysqld op monitor interval=20s timeout=20s 添加一个msqld资源 crm(live)configure# colocation myip_with_ms_mystor_master inf: myip ms_mystor:Master 设置一个排列约束,使ip地址与DRBD主设备在一起 crm(live)configure# colocation myserver_with_mydata inf: myserver mydata 设置一个排列约束,使mysql和被挂载的文件系统在一起 crm(live)configure# order mydata_then_myserver Mandatory: mydata myserver 设置一个顺序约束,先挂载文件系统,然后再启动mysqld crm(live)configure# order myip_then_myserver Mandatory: myip myserver 设置一个顺序约束,先设置ip地址,然后再启动mysqld crm(live)configure# verify crm(live)configure# commit crm(live)# status 2 nodes configured (2 expected votes) 5 resources configured Online: [ clone1 clone2 ] Full list of resources: Master/Slave Set: ms_mystor [mystor] Masters: [ clone2 ] Slaves: [ clone1 ] mydata (ocf::heartbeat:Filesystem): Started clone2 myip (ocf::heartbeat:IPaddr): Started clone2 myserver (lsb:mysqld): Started clone2 大体情况就是:IP地址和被挂载的文件系统会先启动(其中DRBD设备的提权会在挂载文件系统之前),然后启动mysqld;文件系统资源和IP地址会跟DRBD主节点在一起,mysqld服务会跟文件系统资源在一起,当然也就跟DRBD主节点在一起啦! mysql -uroot -h192.168.80.12 -p 进入mysql,查看之前创建的数据库TESTDB是否还在; 错误总结: 主节点信息: [root@clone1 ~]# drbd-overview NOTE: drbd-overview will be deprecated soon. Please consider using drbdtop. 0:mystore/0 StandAlone Primary/Unknown UpToDate/DUnknown /MYDRBD ext4 4.9G 11M 4.6G 1% 从节点信息: [root@clone2 ~]# service drbd status drbd driver loaded OK; device status: version: 8.4.11-1 (api:1/proto:86-101) GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@Build64R6, 2018-09-28 19:18:36 m:res cs ro ds p mounted fstype 0:mystore StandAlone Secondary/Unknown UpToDate/DUnknown r----- 本端无法识别对端的DRBD设备时,可以通过重新构建元数据的方式,事双方重新同步数据; 解决办法: 从节点操作: [root@clone2 ~]# service drbd stop [root@clone2 ~]# drbdadm create-md mystore [root@clone2 ~]# drbd-overview NOTE: drbd-overview will be deprecated soon. Please consider using drbdtop. 0:mystore/0 SyncTarget Secondary/Secondary Inconsistent/UpToDate [>....................] sync'ed: 4.9% (4884/5128)M 接下来等待数据同步完成就好停止,然后再进行上面的初始化; Note:最好是在先将各个集群节点定 更多信息请查看官网:http://clusterlabs.org/pacemaker/doc/en-US/Pacemaker/2.0/html-single/Pacemaker_Explained/index.html
注:根据马哥视频做的学习笔记,如有错误,欢迎指正;侵删; |