磁盘高可用解决方案(DBA).md

2022-09-28 16:49:40 浏览数 (1)

文章目录

[TOC]

(1) drbd 高可用解决方案

0x00 Drbd高可用
(1) drbd 介绍

官方网站: Q:什么是Drbd? 答:分布式复制块设备(Drbd,Dirtributed Replicated Block Device)是基于软件的,无共享,复制的存储解决方案以及在块设备在不同高可用服务器对之间同步和镜像数据软件,解决磁盘单点故障(般情况下只支持2个节点),通过它可用实现在网络中两台服务器之间进行块设备级别的实时或异步镜像或者同步复制,类似rsync inotify架构项目软件:

他们之间的对比:

  • inotify -> rsync:在文件系统之上的实际物理文件同步(磁盘IO效率低下);
  • drbd:基于文件系统底层,block层级同步(效率更高),一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案

DRBD需构建在底层设备之上,然后构建出块设备。对用户来说DRBD设备就像是物理磁盘,可在其内创建文件系统; Drbd支持的底层设备块设备分类:

  • 磁盘分区,整块磁盘
  • LVM 逻辑卷
  • soft raid设备
  • EVMS(Enterprise Volume Management System,企业卷管理系统)的卷。

数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)。

1.Drbd工作原理 drbd软件工作在文件系统层级以下,比文件系统更加靠近操作系统内核及IO栈,所以drbd是工作在系统内核之中的;但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃; 原理:基于DRBD的高可用(HA)两台服务器主机中,当我们将数据写入(主)磁盘中时候数据还将被发送到网络上的另外一台主机中(备);以相同的形式记录在磁盘之中,使得本地(Master)与远程主机(slave)的数据实时同步;drbd服务作用类似于磁盘阵列里的RAID1功能,就相当于把网络中两台服务器做成了类似于磁盘阵列里的RAID1一样;

在高可用方案(HA)使用DRBD功能代替了共享盘阵(保存两份-冗余是50%),当Master出现故障时候,远程主机还会保留有一份和主节点相同的数据备份可以继续切换使用(直接接管提供服务,降低岩机修复时间),而不会发与故障前数据不一致的问题;

工作原理图:

WeiyiGeek.drbd工作原理图

一般情况下文件写入磁盘的步骤是: 写操作 –> 文件系统 –> 内存缓存中 –> 磁盘调度器 –> 磁盘驱动器 –> 写入磁盘 ; 而DRBD的工作机制如上图所示数据经过buffer cache后有内核中的DRBD模块(复制写入磁盘的数据)通过tcp/ip协议栈经过网卡和对方服务器DRBD服务建立数据同步。

2.Drbd工作模式与协议 当某一进程对某一文件执行了写操作时,写操作在上图执行到那个过程时就认为文件已经同步完成。

Drbd的三种同步复制协议: 协议的选择将影响流量,从而影响网络延时;

  • 协议A:异步 asynchronous 复制协议(本地写入成功后立即返回,data放在发送的buffer中,可能会丢失) 如上图文件写操作执行到A点是就认为写入磁盘成功(性能好/但是数据可靠性差)
  • 协议B:内存同步(半同步 Semi sync )复制协议(本地写入成功并将数据发送到对方后立即返回,如果双机掉电数据丢失) 如上图文件写操作执行到B点是就认为写入磁盘成功。性能好,数据可靠性介于A和C之间。
  • 协议C:同步复制协议(sync),本地和对端服务器磁盘都写入成功确认后返回成功(如果单机电和单机磁盘损坏则数据不会丢失),drbd默认使用的复制协议; 如上图文件写操作执行到C点是就认为写入磁盘成功。性能差,数据可靠性高。

Drbd支持的两种模式:

  1. 实时同步模式 当数据写入到本地磁盘和远端所有服务器磁盘都成功后才会返回成功写入;防止本地与远端的数据丢失不一致,生产环境中常用(DRBD服务协议C级别即该种同步模式)
  2. 异步同步模式 当数据写入到本地服务器成功后就返回成功写入,不管远端服务死否写入成功;还可能是数据写入到本地服务器或远端的Buffer成功后返回;(DRBD服务协议a/b级别)

提示:nfs网络系统文件也有类似的参数(sync/async)与功能;实时同步与异步同步;

DRBD的工作模式:

  1. 主从模型 master/slave(primary/secondary) | 单主模式 在某一时刻只允许有一个主节点,主节点的作用是可以挂在使用与写入数据等;从节点知识作为主节点的镜像是主节点的备份。
  • 优点:有效的避免磁盘出现单点故障,文件系统不会错乱
  • 缺点: 主节点读取/使用,而备节点只做备份使用(不能同上进行读取/写入)导致资源的浪费

WeiyiGeek.主备模式

  1. 双主模型 dula primary(primary/primary)[DRBD8.0之后的新特性] 所谓双主模型是2个节点都可以当做主节点来挂载使用;需要采用共享的cluster文件系统,如GFS和OCFS2用于需要从2个节点并发访问数据的场合,需要特别配置;

WeiyiGeek.主主模式

那么思考当第一个主节点对某一文件正在执行写操作,此时另一个节点也正在对同一文件也要执行写操作,结果会如何呢? 答:一般这种情况会造成文件系统的错乱,导致数据不能正常使用。 原因是:对文件的加速机制是由操作系统内核所管理的,一个节点对文件加速之后,另一个节点并不知道对方的锁信息。 解决办法是:使用集群文件系统,集群文件系统使用分布式文件锁管理器,当一个节点对文件加锁之后会通过某种机制来通知其他节点锁信息,从而实现文件锁共享。

补充知识点: Oracle的dg服务模式分为两种

  • 一种是逻辑上如SQL语句执行方法,8i~10g 备节点不提供服务
  • 另一种就是物理的如block块级模式,Oracle 11g 支持主库写从库读的方式

(2) drbd 应用场景

生产环境中Drbd常用于高可用服务器之间的数据同步解决方案; 如Heartbeat drbd nfs/mfs/gfs ; heartbeat drbd mysql/Oracle等等,实际上可以结合任意需要数据同步的所有服务的应用场景;

相关数据同步工具介绍: (1) rsync [实时同步工具,但效率不高] (2) scp [实时同步工具,但效率不高] (3) nc / nfs (网络文件系统) (4) union 双机同步 (5) csync2 多机同步 (6) 软自身同步机制 (mysql,oracle,mongdb,ttserver,redis) 文件放到数据库,同步到从库再把文件拿出来; (7) drbd 高可用


(3) drbd的安装

Drbd软件分类:

  • Centos5.x 适合drbd 8.3 YUM
  • Centos6.x 适合drbd 8.4
  • Centos7.x 适合源码编译安装

配置目标:两台服务器分别配置号drbd服务,实现Master-data1机器上/dev/sdb/分区上写入数据,数据会实时同步到Master-data2j机器上;一旦服务器出现异常,瞬间接替损坏数据或宕机的机器,实现数据异机实时同步,达到数据高可用无业务影响的目的;

配置提示:

  • 配置的是drbd主备模式,及应用时只在主的一端写入数据,备的一端仅处于数据热备状态;
  • 备节点drbd的分区是不可见的,也是处于非活动状态,不能人为写入数据;
  • 多drbd分区主主双向同步模式,在实际生产环境中配置成为主主模式即如上面图所示:

drbd 服务网卡以及资源配置:

代码语言:javascript复制
##机器1 Master-data1 
管理IP :               ETH1:192.168.1.100/24
DRBD管理名称与挂载目录:  data /data
DRBD逻辑设备:           /dev/drbd0             #关键点
心跳连接以及数据同步:   ETH2:192.168.2.100/24  #不要配网关/也不要与局域网内其他机器起冲突
DRBD 存储设备:         /dev/sdb1
DRBD Meta设备:         /dev/sdb2[0]
虚拟IP(VIP) :          ETH1:192.168.1.10


##机器2 Master-data2 
管理IP :               ETH1:192.168.1.101/24
DRBD管理名称与挂载目录:  data /data
DRBD逻辑设备:           /dev/drbd0             #关键点 通过 逻辑设备写到磁盘里面
心跳连接以及数据同步:   ETH2:192.168.2.101/24  #不要配网关/也不要与局域网内其他机器起冲突
DRBD 存储设备:         /dev/sdb1
DRBD Meta设备:         /dev/sdb2[0]
虚拟IP(VIP) :          ETH1:192.168.1.11


#推荐操作【把心跳地址写入/etc/hosts文件中】
192.168.2.100 Master-data1
192.168.2.101 Master-data2

安装环境:CentOS release 6.10 (Final) - 基础环境操作参看高可用服务解决方案(DBA)

DRBD 配置步骤:

代码语言:javascript复制
1. 安装drbd以及磁盘分区,加载modproed内核
2. 配置资源文件(定义资料名称,磁盘,节点信息,同步限制等)
3. 将drbd加入到系统服务chkconfig --add drbd 
4. 初始化资源组 drbdadm create-md resource_name
5. 启动服务 service drbd start
6. 设置primary主机并同步数据
7. 分区、格式化/dev/drbd*
8. 一个节点进行挂载
9. 查看状态cat /proc/drbd

DRBD 安装流程:(跳过上面配置IP与hosts文件,添加主机路由)

代码语言:javascript复制
###### Step 1. 公共安装#########
service iptables stop                       //关闭iptables
setenforcing 0                                 //暂时关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux      //永久关闭selinux
ntpdate -u asia.pool.ntp.org # 时间同步

###### Step 2. drbd服务安装 (编译安装/yum安装)########
#drbd共有两部分组成:内核模块和用户空间的管理工具。
#其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此如果内核版本高于此版本的话,只需要安装管理工具即可;否则您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。
#yum 安装需要找到相应的源 
[root@Master-data1/2 drbd]$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@Master-data1/2 drbd]$ yum install https://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
#yum install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm (external link)
#keepcache = 1 yum配置文件就会保存下载的rpm
$ yum makecache
$ yum install kernel-devel kernel-header flex drbd84-utils kmod-drbd84  parted -y
Installed:
  drbd84-utils.i686 0:9.5.0-1.el6.elrepo              flex.i686 0:2.5.35-9.el6
  kernel-devel.i686 0:2.6.32-754.12.1.el6             kmod-drbd84.i686 0:8.4.11-1.el6_10.elrepo
Complete!  #表示安装成功
### 忽略以下内容
# 对应的内核模块的名字分别为 drbd-kmod
# 注意:drbd和drbd-kmdl的版本要对应;另一个是drbd-kmdl的版本要与当前系统的内核版本(uname -r)相对应。
#下载地址: http://www.rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/
#          https://www.linbit.com/en/drbd-community/drbd-download/
# [root@Master-data2 drbd]# wget https://www.linbit.com/downloads/drbd/utils/drbd-utils-9.6.0.tar.gz

############ Step3. 加载模块到内核 ###########
[root@Master-data1/2 ]$ modprobe drbd && lsmod | grep drbd  #临时生效,重启由需要添加 可用加入到 /etc/rc.local
drbd                  485533  0
libcrc32c                841  1 drbd
echo "modprobe drbd" >> /etc/rc.d/rc.local  #加载drbd到内核
echo "modprode drbd > /dev/null 2>&1" > /etc/sysconfig/modules/drbd.modules


####### Step4. 建立一个磁盘分区  #######
#【重要】需要VirtualBox为虚拟机添加一块磁盘 选择磁盘格式为 SCSI 分配 0.5 GB
主节点:512MB 
备节点:1024MB

[root@Master-data1/data2 ~]$ fdisk -l
Disk /dev/sda: 536 MB, 536870912 bytes
Disk /dev/sda: 1073 MB, 1073741824 bytes

# drbd服务 需要创建两个分区
/dev/sdb1  /data           存储数据目录           256MB / 768MB (数)
/dev/sdb2  mete data分区   存储drbd同步信息    总大小减去上面的大小

#注意:
1.这里的meta data 分区一定不能个数建立文件系统
2.分浩的分区现在不能进行挂载(mount)
3.生产环境中DRBD meta data 分区一般设置为1~2G

#【注意】 分区步骤 (注意如果 raid 磁盘阵列 超过2T 该命令不能使用 请是使用 parted)
[root@Master-data1 ~]# fdisk /dev/sda
Command (m for help): p
Disk /dev/sda: 536 MB, 536870912 bytes
   Device Boot      Start         End      Blocks   Id  System
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1 #注意分区编号1
First cylinder (1-512, default 1): 1
Last cylinder,  cylinders or  size{K,M,G} (1-512, default 512):  256M

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2  #注意这里是2
First cylinder (386-512, default 386): #默认回车即可
Last cylinder,  cylinders or  size{K,M,G} (386-512, default 512):

Command (m for help): p  #显示分区信息
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         385      394224   83  Linux   #存储数据 256
/dev/sdb2             386         512      130048   83  Linux   #drbd状态信息

w #分区写入

[root@Master-data2 ~]$ fdisk /dev/sda  #同上
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          99      795186   83  Linux  #768M
/dev/sdb2             100         130      249007   83  Linux  #缺省就行(回车)

$ partprobe #执行写入分区表刷新磁盘

####### Step5.[分区完成后可能需要重启] 下面不需要操作 ##########
# 在两端主机内创建分区: 出现5月 14 14:57:19 Mzabbix drbd[4097]: adjust disk: data:failed(apply-al:1)错误时候方法
# 数据区:     parted /dev/sda mklabel gpt && parted /dev/sdb mkpart logical ext4 700M 300M
#重读分区:  partprobe && cat /proc/partions
#数据盘/dev/sdb1进行格式化  #meta盘/dev/sdb2不用进行格式化直接挂载
[root@Master-data1/2 ~]$ mkfs.ext4 /dev/sda1   #执行的时候注意自己的磁盘名称(巨坑)
# tune2fs -c -1 /dev/sdb1  #让磁盘被被检测

WeiyiGeek.建立一个磁盘分区

补充:drbd磁盘采用parted分区[master/slave都执行]

代码语言:javascript复制
#BACKUP 机器上,分区大小不同是有目的的,为后面的扩容做准备;
[root@data2 ~]$ fdisk -l #查看本地磁盘
[root@data2 ~]$ parted /dev/sdb mkpart primary 0 600
[root@data2 ~]$ parted /dev/sdb mkpart primary 600 1073
[root@data2 ~]$ parted /dev/sdb p
Number  Start   End     Size   File system  Name     Flags
 1      17.4kB  600MB   600MB               primary
 2      600MB   1073MB  473MB               primary

#对于新添加的磁盘快速分区方法
# echo -e "nnpnlnn 600Mnnnpn2nn 400Mnw" | fdisk /dev/sdb
partprobe #执行写入分区表刷新磁盘 #[重点]不重启系统添加磁盘并让kernel读取分区信息 yum -y install parted
(4) drbd的配置文件

修改配置文件流程:

代码语言:javascript复制
########## Step 5. 默认配置文件与目录 ###############
global {
    usage-count no;  #是否参加DRBD使用者统计,默认是参加
}

common {
    protocol C;    
    startup {
        degr-wfc-timeout 240;
    }
    disk {
        on-io-error detach;
    }
    net { 
        cram-hmac-alg md5; #DRBD同步时使用的验证方式和密码
        shared-secret "testdrbd";
    }
    syncer {
        rate 100M;      #主节点和备用节点同步时最大的网络速率 工作中是100M~1000M
        verify-alg crc32c; #验证算法
    }
}
#资源设置
resource data{
    disk {
        on-io-error detach;  #磁盘出现IO错误处理
    }
    #两台主备节点配置 (关键点)
    on Mzabbix {
        device /dev/drbd0;  #drbd写设备有自己对应的分区
        disk /dev/sdb1;        #本地数据分区1
        address  192.168.56.103:7788;  #心跳/数据传输接口 (建议把这个地址设置到hosts中改成心跳线的网卡)
        meta-disk /dev/sdb2[0];  #meta data数据分区2
    }
    on data2 {
        device /dev/drbd0;
        disk /dev/sdb1;
        address  192.168.56.102:7788;
        meta-disk /dev/sdb2[0];
    }
}

然后将上面的配置复制到 Master-data2 上的 /etc/drbd.conf 中即可;

(5) drbd的启动运行

Drbd高可用运行案例:

代码语言:javascript复制
####### Step 6. 然后在两台机器都启动服务 ##########
#step0.建议先执行防止create-md失败
dd if=/dev/zero of=/dev/sdb{1..2} bs=1M count=100;sync

#Step1.初始化DRBD的metadat(Create Device metadata)
#创建提供DRBD记录的信息的metadata分区
$ drbdadm create-md data
New drbd meta data block successfully created. drbd
#也可单独创建resource资源名称直接用;drbdadm create-md all,其中all表示我们在drbd.conf里定义所有的资源名称;

#Step2.启动DRBD
/etc/init.d/drbd start
$ drbdadm up data
#或者采用$ drbdadm up all

#Step3.查看drbd状态
$ drbdadm status
    data role:Secondary
    disk:Inconsistent
    peer connection:Connecting

$ cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@Build64R6, 2018-09-28 19:36:27
#看到drbd状态已经变化,此时状态是正确的 ro:Secondary/Secondary表示两端都是从,处于无主primary状态

WeiyiGeek.drbd状态

同步drbd数据到对端Server使数据保持一致,指定一个要同步的资源同步数据到对端: (1) 如果为空磁盘可以随意执行操作不需要考虑数据 (2) 如果两边数据不一样(注意同步数据的方向否则可能会丢失数据)

代码语言:javascript复制
#Step4.配置主从同步
#一个资源自能在一端执行同步数据到对端命令 ;将 Master-data1 服务同步到 Master-data2 分区中;
$ drbdsetup /dev/drbd0 primary --force  #设置主节点
#$ drbdadm  -- --overwrite-data-of-peer primary data
# 只是在Master-data1执行,如果从端为空数据直接执行
$ drbdadm primary data   #会自动开始同步数据 [主节点执行]

#Step5.同步模式查看
[root@Master-data1/2  ~]$ cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
 0: (连接状态)cs:Connected (角色)ro:Secondary/Primary ds(数据状态):UpToDate/UpToDate(同步状态) C r-----
    ns(网络发送):0 nr(网络接收):292952 dw(磁盘写):292952 dr(磁盘读):0 al(活动日志):16 bm():0 lo():0 pe():0 ua:0 ap:0 ep:1 wo:f oos:0  #正常情况下是一致的

[root@Master-data1 ~]$ drbdadm status
data role:Primary
  disk:UpToDate
  peer role:Secondary  #对端角色name
    replication:Established peer-disk:UpToDate

#Step6.创建同步文件夹及挂载drbd分区
#drbd实例利用主备模式进行实时同步数据到从服务器上面(Master-data2):
[root@Master-data1 ~]$ mkfs -t ext4 -b 4096 /dev/drbd0 #挂载前格式
[root@Master-data1 ~]$ mkdir /drbddata
[root@Master-data1 ~]$ mount /dev/drbd0 /drbddata/  #注意这里是drbd逻辑分区
[root@Master-data1 ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/drbd0            256M  792K  709M   1% /drbddata  #挂载成功


#Step7. 测试是否能进行文件同步
[root@Master-data1  ]$ touch `seq 0 10`  #在主中进行建立文件测试
[root@Master-data2 ~]$ drbdadm down data #由于是主备模式,必须down才能让您挂载物理分区
[root@Master-data2 ~]$ mount /dev/sdb1 /mnt/  #注意从服务器上是挂载的sdb1
[root@Master-data2 ~]$ ls /mnt/
0  1  10  11  12  13  14  15  16  17  18  19  2  20  3  4  5  6  7  8  9  lost found
[root@Master-data2 ~]$ umount /mnt/  #退出挂载
[root@Master-data2 ~]$ drbdadm up data  #启动资源池
[root@Master-data2 ~]$ df -h  #注意这里存在一个坑 明明有768但是只显示有256M可用(备节点-课后坐月)
/dev/sdb1             256M  792K  709M   1% /mnt

补充:CentOS7实例:

代码语言:javascript复制
## MASTER 机器上
[root@data1 ~]$parted /dev/sdb mkpart primary 0 300  #300MB
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? ignore
Information: You may need to update /etc/fstab.

[root@data1 ~]$parted /dev/sdb mkpart primary 300 536  #236MB
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? ignore
Information: You may need to update /etc/fstab.

[root@data1 ~]$parted /dev/sdb p
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 537MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name     Flags
 1      17.4kB  300MB  300MB               primary
 2      300MB   536MB  236MB               primary
 
#(1) 建立数据存储m目录
##--overwrite-data-of-peer 覆盖对端的数据
drbdadm  -- --overwrite-data-of-peer primary data  #设置data1为主
#drbd配置完成并启动后的效果 (data1 == 主 primary/ data2 = 从 Secondary)
$ cat /proc/drbd
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
[root@data1/2 ~]$ mkdir /data -p #在启用drbd时候

#使用/dev/drbd0分区必须格式化她drbd
#[root@data1 ~]$ mkfs -t ext4 -b 4096 /dev/drbd0
#[root@data1 ~]$ mount /dev/drbd0 /data  #挂载
mkfs.ext4 /dev/drbd0 && mount /dev/drbd0/data       #只需将数据写入/dData,drbd即把其同步到backupNode的/dev/sda2(仅需挂载逻辑设备,不挂载其下层的分区而由DRBD后台挂载用)


#(2) 从库查看同步的数据 (这时重启格式化/dev/drbd0就没有数据注意备份)
[root@data2 ~]$ drbdadm down data      #【备节点必须执行down数据名称】
[root@data2 ~]$ mount /dev/sdb1 /mnt   #【备节点挂载 sdb1 到/mnt中国】
[root@data2 ~]$ ls  #查看数据 (注意不能写入数据)
[root@data2 ~]$ umount /mnt  #取消挂载
[root@data2 ~]$ drbdadm up data        #启动drbd备节点(重新进行同步)
# 补充:drbd可以自启动而heartbeat不用进行自启动


#(3)主备切换 (做HA高可用的时候)
[root@Master-data1 ~]umount /mnt #先将主上面的磁盘卸载掉并降级
[root@Master-data1 ~]drbdadm secondary data

[root@Master-data2 ~]drbdadm primary data  #在备机上升级为主机
[root@Master-data2 ~]mount /dev/drbd0 /mnt # 挂载磁盘
(7) 附录补充

DRBD配置工具:

  • drbdadm: 高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令
  • drbdsetup: 配置装载进kernel的DRBD模块,平时很少用
  • drbdmeta: 管理META数据结构,平时很少用

6.1 drbd命令解析 (1)drbdadm 命令:

代码语言:javascript复制
$ drbdadm up all  #相当于如下三个命令组合 all 代表所有的资源池
drbdadm attach all
drbdadm syncer all
drbdadm connnect all

$ drbdadm down all  #down掉所有的资源同步
$ drbdadm disconnect data  #断开data资源池的同步

$ drbdadm status  #查看drbd状态
$ drbdadm role 资源名   #查看节点的角色:

##--overwrite-data-of-peer 覆盖对端的数据
$ drbdadm  -- --overwrite-data-of-peer primary data #配置主从同步模式(主执行) 
$ drbdadm primary data #会自动开始同步数据(主节点运行)
$ drbdadm secondary data #会自动开始同步数据(从节点运行)

$ drbdadm -- --discard-my-data connect data  #重新连接资源池
$ drbd-overview   #查看同步状态

drbdsetup 命令:

代码语言:javascript复制
drbdsetup /dev/drbd0 primary --force #将drbd1主机配置为主节点:(node1)

6.2 drbd状态的意义

代码语言:javascript复制
输出文件上面最开始是drbd的版本信息,然后就是数据同步的一些状态信息:
cs — connection state
st — node state (local/remote)
ld — local data consistency
ds — data consistency
ns — network send
nr — network receive
dw — disk wr
ite
dr — disk read
pe — pending (waiting for ack)
ua — unack’d (still need to send ack)
al — access log write count


#资源的连接状态;一个资源可能有以下连接状态中的一种
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)暂停了同步
VerifyS:以本地节点为验证源的线上设备验证正在执行
VerifyT:以本地节点为验证目标的线上设备验证正在执行

6.3 drbd配置文件 DRBD配置文件:DRBD的主配置文件为/etc/drbd.conf 为了管理的便捷性通常会将些配置文件分多个部分,但都保存至/etc/drbd.d目录。主配置文件中仅使用”include”指令将这些配置文件片断整合。 通常/etc/drbd.d中的文件为global_common.conf和所有以.res结尾的文件。其中:

  • global_common.conf中主要定义global段和common段
  • 每个.res文件用于定义一个资源

一个DRBD设备(即/dev/drbdX),叫做一个”资源”。里面包含DRBD设备的主备节点的ip信息,底层存储设备名称及设备大小,meta信息存放方式,drbd对外提供的设备名等: DRBD资源:

  • Resource name: 除空白字符的任意的ACSII码字符
  • DRBD device: 在双方节点上,此DRBD设备的设备文件;一般为/dev/drbdN,其主设备号147
  • Disk configuration: 在双方节点上各自提供的存储设备
  • Nerwork configuration: 双方数据同步时所使用的网络属性
代码语言:javascript复制
$vim /etc/drbd.d/global_common.conf

#在配置文件中global段仅出现一次,且若所有配置信息都保存至同一个配置文件中而不分开为多个文件的话则global段必须位于配置文件最开始处
    目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
global {
    usage-count no;  #是否参加DRBD使用者统计,默认是参加
}


#用于定义被每一个资源默认继承的参数,可在资源定义中使用的参数都可在common定义。实际应用中common段并非必须但建议将多个资源共享的参数定义在common段以降低配置复杂度
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";
  }
  startup {
    wfc-timeout          60;
    degr-wfc-timeout     60; #启动时连接资源的超时时间
    outdated-wfc-timeout 06;
  }
  disk {
    on-io-error detach; #磁盘出现IO错误处理
  }
  net { 
    cram-hmac-alg sha1;    #DRBD网络同步时使用的验证方式和密码
    shared-secret "testdrbd";
    max-buffers 2048;
    max-epoch-size 2048; 
  }
  #同步时的速率限制及数据的验证算法   
  syncer {
    rate 30M;      #主节点和备用节点同步时最大的网络速率 工作中是100M~1000M
    verify-alg crc32c; #验证算法
  }
}


#资源设置|主从模式 一个资源 / 还能添加资源就是 data2 / data3
#资源在定义时必须为其命名每个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义
resource data{
    meta-disk internal; #meta-data和数据存放在同一个底层
    #两台主备节点配置 (关键点)
    on data1 {
        device /dev/drbd0;  #drbd写设备有自己对应的分区
        disk /dev/sdb1;        #本地数据分区1
        address  192.168.2.100:7788;  #心跳/数据传输接口 (建议把这个地址设置到hosts中改成心跳线的网卡)
        meta-disk /dev/sdb2[0];  #meta data数据分区2
    }
    on data2 {
        device /dev/drbd0;  #drbd写设备有自己对应的分区
        disk /dev/sdb1;        #数据
        address  192.168.2.101:7788;  #心跳/数据传输接口
        meta-disk /dev/sdb2[0];  #meta data数据分区
    }
}


# 用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。
cat /etc/drbd.d/nfsdrbd.res
resource nfsdrbd {
       on pz142 {
              device /dev/drbd0;
              disk   /dev/vg1/lv1;
              address 192.168.1.142:7789;
              meta-disk internal;
       }
       on pz144 {
              device /dev/drbd0;
              disk   /dev/vg1/lv1;
              address 192.168.1.144:7789;
              meta-disk internal;
       }
}

6.4 drbd入坑计 Q:问题 drbdadm create-md data失败? 问题:/etc/drbd.conf:6: Parse error: ‘a syncer option keyword’ expected,but got ‘rate’ 解决方法:yum install gcc gcc-c make glibc flex kernel kernel-devel kernel-headers

Q:问题 drbdadm up all 失败? 问题:

代码语言:javascript复制
0: Failure: (119) No valid meta-data signature found.
        ==> Use 'drbdadm create-md res' to initialize meta-data area. <==
Command 'drbdsetup-84 attach 0 /dev/sdb1 /dev/sdb2 0 --on-io-error=detach --resync-rate=30M' terminated with exit code 10

解决办法:查看分区是否错误,分区后重启系统再启动; dd if=/dev/zero bs=1M count=1 of=/dev/sdb{1..2};sync

dd if=/dev/zero bs=1M count=1 of=/dev/sda{1..2};sync

Q:同步状态出现异常? 问题:

代码语言:javascript复制
0: cs:WFConnection ro:Secondary(本端角色)/Unknown ds:Inconsistent/DUnknown(问题点) C r----s
    ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:795188

解决办法:

检测两台drbd服务器物理网络链接或者IP及主机路由是否正确

停止iptables防火墙或者放行drbd(指定IP形式)

Secondary/Unkonwn 可能是发生裂脑导致的结果

代码语言:javascript复制
#在从节点执行:
modprobe drbd
drbdadm secondary data
drbdadm up data
drbdadm disconnect data
drbdadm -- --discard-my-data connect data

Q:如何解决drbd裂脑问题?

代码语言:javascript复制
##备用节点:
#b.主节点查看drbd状态如果 cs:WFConnection 不是该状态需要手动进行链接
[root@ pz142 ~]# drbdadm secondary r0
[root@ pz142 ~]# drbdadm disconnect all
[root@ pz142 ~]# drbdadm -- --discard-my-data connect r0

##主节点:
[root@ pz144 ~]# drbdadm disconnect al
[root@ pz144 ~]# drbdadm connect r0
[root@ pz144 ~]# drbdsetup /dev/drbd0 primary
[root@ pz144 ~]# mount /dev/drbd0 /data/

#c.cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C
drbdadm -- --overwrite-data-of-peer primary drbd   #

Q:drbd主节点无法进行挂载mount

代码语言:javascript复制
#原因由于/dev/drbd0 未进行初始
[root@data1 log]# mount /dev/drbd0 /data
mount: /dev/drbd0 is write-protected, mounting read-only
mount: unknown filesystem type '(null)'

#解决方法
mkfs -t ext4 -b 4096 /dev/drbd0

0 人点赞