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
注:根据马哥视频做的学习笔记,如有错误,欢迎指正;侵删;