DRBD简介:DRBD(Distributed Replicated Block Device)
分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像。与心跳连接结合使用,也可以把它看作是一种网络RAID。
DRBD负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中。目前,DRBD每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。以后的版本将支持两个节点进行读写存取。
一个DRBD系统由两个以上节点构成,与HA集群类似,也有主用节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备。
在主节点写入的数据通过drbd设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点相应的drbd设备,最终写入备用节点的磁盘设备中,在备用节点上,drbd只是将数据从drbd设备写入到备用节点的磁盘设备中。
大部分现行高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要任何硬件的投资。因为它在IP网络中运行,因此,利用DRBD作为共享存储设备,要节约很多成本,因为在价格上IP网络要比专用的存储网络经济的多。
DRBD搭建
环境:
操作系统环境:CentOS7
192.168.149.131 node1.chunge.com node1
192.168.149.132 node2.chunge.com node2
第一步:双机ssh互信,并让node1与node2的时间一致
ssh双机互信 与时间同步服务在这里不多做介绍
第二步:安装,由于我的系统是CentOS用的是yum源安装,注意这边两台机器都要安装好
下载rpm包,请去官网查看详细版本需要安装什么https://www.linuxidc.com/
rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
安装完上面的两个包,请关机重启
yum install kmod-drbd84 drbd84-utils kernel* -y
第三步:在node1与node2上配置各配置一个分区,使该分区的大小一致
若该分区已经格式化过,将该文件系统删除
删除命令如下
dd if=/dev/zero of=/dev/sdb1 bs=1M count=1
第四步: 修改node1与node2的drbd配置文件
配置文件地址: /etc/drbd.conf
全局配置文件地址: /etc/drbd.d/global_common.conf
修改全局配置文件global_common.conf
global {
usage-count no; #是否参加DRBD使用统计,默认为yes。官方统计drbd的装机量,改为no
}
common {
protocol C; #使用DRBD的同步协议,添加这一行
handlers {
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";
}
# 默认handlers下面的这三条内容是注释的,请把注释去掉
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
}
syncer {
rate 1024M; ##设置主备节点同步时的网络速率,添加这个选项
}
}
第五步:创建资源配置文件
root# vim /etc.drbd.d/mysql.res ##这个文件需要自己创建
resource mysql{ ##资源名称
protocol C; ##使用协议
meta-disk internal;
device /dev/drbd1; ##drbd的设备名称
syncer{
verify-alg sha1; ##加密算法
net{
allow-two-primaries;
}
on node1.chunge.com{
##一定要设置的与hostname一样,不然下一步会报错的
disk /dev/sdb1; #drbd1使用的磁盘分区为
address 192.168.149.131:7789; ##设置drbd监听地址与端口
}
on node2.chunge.com{
disk /dev/sdb1;
address 192.168.149.132:7789;
}
}
}
第六步:在node1与node2上面启动mysql
node1操作如下
drbdadm create-md mysql
modprode drbd
lsmod |grep drbd
drbdadm up mysql
drbdadm --force primary mysql #设为主的
cat /proc/drbd #查看状态
node2操作如下
drbdadm create-md mysql
modprode drbd
lsmod |grep drbd
drbdadm up mysql
cat /proc/drbd #查看状态
第七步:格式化并挂在磁盘
mkfs.xfs /dev/drbd1
mount /dev/drbd1 /drbd_data
第八步:查看各个状态
查看资源链接的状态
drbdadm cstate mysql
查看资源角色命令
drbdadm role mysql
查看硬盘状态
drbdadm dstate mysql
第九步:若要将drbd的主从更改
1、关闭在该drbd的这个硬盘上执行的任务
2、卸载drbd umount
3、将主结点 改为备节点
drbdadm secondary mysql
4、将备节点,提升为主节点
drbdadm primary mysql
5、挂载drbd 并启动服务
drbdadm up mysql
drbdadm –force primary mysql
关于drbd的常用命令
1、查看状态
rbdadm cstate mysql //资源的连接状态(mysql是资源)
显示状态的解释:
Connected:资源的连接状态;一个资源可能有以下连接状态中的一种
StandAlone 独立的:网络配置不可用;资源还没有被连接或是被管理断开(使用 drbdadm disconnect 命令),或是由于出现认证失败或是脑裂的情况
Disconnecting 断开:断开只是临时状态,下一个状态是StandAlone独立的
Unconnected 悬空:是尝试连接前的临时状态,可能下一个状态为WFconnection和WFReportParams
Timeout 超时:与对等节点连接超时,也是临时状态,下一个状态为Unconected悬空
BrokerPipe:与对等节点连接丢失,也是临时状态,下一个状态为Unconected悬空
NetworkFailure:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
ProtocolError:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
TearDown 拆解:临时状态,对等节点关闭,下一个状态为Unconected悬空
WFConnection:等待和对等节点建立网络连接
WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包
Connected 连接:DRBD已经建立连接,数据镜像现在可用,节点处于正常状态
StartingSyncS:完全同步,有管理员发起的刚刚开始同步,未来可能的状态为SyncSource或PausedSyncS
StartingSyncT:完全同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID
WFBitMapS:部分同步刚刚开始,下一步可能的状态为SyncSource或PausedSyncS
WFBitMapT:部分同步刚刚开始,下一步可能的状态为WFSyncUUID
WFSyncUUID:同步即将开始,下一步可能的状态为SyncTarget或PausedSyncT
SyncSource:以本节点为同步源的同步正在进行
SyncTarget:以本节点为同步目标的同步正在进行
PausedSyncS:以本地节点是一个持续同步的源,但是目前同步已经暂停,可能是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
PausedSyncT:以本地节点为持续同步的目标,但是目前同步已经暂停,这可以是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
VerifyT:以本地节点为验证目标的线上设备验证正在执行
2、资源角色
drbdadm role mysql
Parimary 主:资源目前为主,并且可能正在被读取或写入,如果不是双主只会出现在两个节点中的其中一个节点上
Secondary 次:资源目前为次,正常接收对等节点的更新
Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态
3、硬盘状态
## mysql为资源
drbdadm dstate mysql
显示状态的解释:
UpToDate/UpToDate: 本地和对等节点的硬盘有可能为下列状态之一:
Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离
Attaching:读取无数据时候的瞬间状态
Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘
Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态
Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态
Outdated:数据资源是一致的,但是已经过时
DUnknown:当对等节点网络连接不可用时出现这种状态
Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated
UpToDate:一致的最新的数据状态,这个状态为正常状态
4、启用/升级资源手动启动资源
启用和禁用资源
## 手动启用资源
drbdadm up resource
## 手动禁用资源
drbdadm down resource
注:resource:为资源名称;当然也可以使用all表示[停用|启用]所有资源
升级和降级资源
## 升级资源
drbdadm primary resource
## 降级资源
drbdadm secondary resource
5、初始化同步
初始化设备同步选择一个初始同步源;如果是新初始化的或是空盘,这个选择可以是任意的,但是如果其中的一个节点已经在使用并包含有用的数据,那么选择同步源是至关重要的;如果选错了初始化同步方向,就会造成数据丢失,因此需要十分小心
启动初始化完全同步,这一步只能在初始化资源配置的一个节点上进行,并作为同步源选择的节点上;
root# drbdadm -- --overwrite-data-of-peer primary mysql ##mysql是资源