一、DRBD简介 
DRBD的全称为:Distributed ReplicatedBlock Device(DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群.其实现方式是通过网络来镜像整个设备.你可以把它看作是一种网络RAID.它允许用户在远程机器上建立一个本地块设备的实时镜像. 
1.DRBD是如何工作的呢? 
(DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary).另一个主机再将数据存到自己的磁盘中.目前,DRBD每次只允许对一个节点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了.有可能以后的版本支持两个节点进行读写存取. 
2.DRBD与HA的关系 
一个DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备(/dev/drbd*).在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中.现在大部分的高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要太多的硬件的投资.因为它在TCP/IP网络中运行,所以,利用DRBD作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错 
二、DRBD复制模式 
1.协议A: 
异步复制协议.一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的.在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列.尽管,在故障转移节点上的数据是一致的,但没有及时更新.这通常是用于地理上分开的节点 
2.协议B: 
内存同步(半同步)复制协议.一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的.数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘 
3.协议C: 
同步复制协议.只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成.没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽 
一般使用协议C,但选择C协议将影响流量,从而影响网络时延.为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议

三、 DRBD工作原理图 
DRBD是linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据.类似于一个网络RAID-1的功能

四、安装配置 (节点1上操作)

两个节点ha-node1和ha-node2均为centos7系统,每个节点两块磁盘,一块用作根分区一块用作drbd

关闭防火墙(每个节点都需执行)

192.168.94.11 ha-node1

192.168.94.22 ha-node2

节点1
[root@DaMoWang ~]# hostnamectl set-hostname ha-node1
[root@DaMoWang ~]# su -l
上一次登录:日 9月 :: CST 2018从 192.168..1pts/ 上
[root@ha-node1 ~]#
节点2
[root@DaMoWang ~]# hostnamectl set-hostname ha-node2
[root@DaMoWang ~]# su -l
上一次登录:日 9月 :: CST 2018从 192.168..1pts/ 上
[root@ha-node2 ~]#

创建lvm(每个节点都需执行)

[root@ha-node1 ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
[root@ha-node1 ~]# vgcreate data /dev/sdb
Volume group "data" successfully created
[root@ha-node1 ~]# lvcreate --size 2G --name mysql data
Logical volume "mysql" created.
[root@ha-node1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda : 20G disk
├─sda1 : 1G part /boot
└─sda2 : 19G part
├─centos-root : 17G lvm /
└─centos-swap : 2G lvm [SWAP]
sdb : 20G disk
└─data-mysql : 2G lvm
sr0 : .2G rom

配置主机名映射(每个节点都需要执行)

[root@ha-node1 ~]# echo -e "192.168.94.11 ha-node1 \n192.168.94.22 ha-node2" >> /etc/hosts

配置ssh互信(每个节点都需执行)

[root@ha-node1 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -N "" -q
[root@ha-node1 ~]# ssh-copy-id ha-node1
[root@ha-node1 ~]# ssh-copy-id ha-node2

安装drbd (每个节点都安装)

[root@ha-node1 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@ha-node1 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@ha-node1 ~]# yum install -y kmod-drbd84 drbd84-utils

配置文件说明

/etc/drbd.conf #主配置文件 
/etc/drbd.d/global_common.conf #全局配置文件 

[root@ha-node1 ~]# grep -Ev '^$|#' /etc/drbd.d/global_common.conf
global {
usage-count no; #是否参加DRBD使用统计,默认为yes。官方统计drbd的装机量
}
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 {
}
options {
}
disk {
on-io-error detach; # 配置I/O错误处理策略为分离
}
net {
}
syncer {
rate 1024M; # 设置主备节点同步时的网络速率
}
}

注释 : on-io-error 策略可能为以下选项之一 
detach 分离:这是默认和推荐的选项,如果在节点上发生底层的硬盘I/O错误,它会将设备运行在Diskless无盘模式下 
pass_on:DRBD会将I/O错误报告到上层,在主节点上,它会将其报告给挂载的文件系统,但是在此节点上就往往忽略(因此此节点上没有可以报告的上层) 
-local-in-error:调用本地磁盘I/O处理程序定义的命令;这需要有相应的local-io-error调用的资源处理程序处理错误的命令;这就给管理员有足够自由的权力命令命令或是脚本调用local-io-error处理I/O错误 

定义一个资源

创建/etc/drbd.d/mysql.res并写入

[root@ha-node1 ~]# 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 ha-node1 {
disk /dev/data/mysql; # drbd1使用的磁盘分区为"mysql"
address 192.168.94.11:; # 设置DRBD监听地址与端口
}
on ha-node2 {
disk /dev/data/mysql;
address 192.168.94.22:;
}
} 注意 : 该配置文件里不能注释 , 否则会报错

将配置文件拷贝到node2上

[root@ha-node1 ~]# cp -rp  /etc/drbd.d/* ha-node2:/etc/drbd.d/

启用drbd(节点一)

[root@ha-node1 ~]# drbdadm create-md mysql
initializing activity log
initializing bitmap ( KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
[root@ha-node1 ~]# modprobe drbd
[root@ha-node1 ~]# drbdadm up mysql
[root@ha-node1 ~]# drbdadm -- --force primary mysql

查看状态

 [root@ha-node1 ~]# cat /proc/drbd
 version: 8.4.11-1 (api:1/proto:86-101)
 GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-04-26 12:10:42

 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
 ns:5068 nr:0 dw:0 dr:7188 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2091984
 [>....................] sync'ed: 0.4% (2091984/2097052)K
 finish: 0:20:06 speed: 1,688 (1,688) K/sec

[root@ha-node1 ~]# cat /proc/drbd
version: 8.4.- (api:/proto:-)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, -- :: : cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----s
ns: nr: dw: dr: al: bm: lo: pe: ua: ap: ep: wo:f oos:

配置另一节点

[root@ha-node1 ~]# ssh ha-node2 'drbdadm create-md mysql'
initializing bitmap ( KB) to all zero
initializing activity log
Writing meta data...
New drbd meta data block successfully created.
[root@ha-node1 ~]# ssh ha-node2 'modprobe drbd'
[root@ha-node1 ~]# ssh ha-node2 'drbdadm up mysql'

格式化设备并挂载

[root@ha-node1 ~]# mkfs.xfs /dev/drbd1
meta-data=/dev/drbd1 isize= agcount=, agsize= blks
= sectsz= attr=, projid32bit=
= crc= finobt=, sparse=
data = bsize= blocks=, imaxpct=
= sunit= swidth= blks
naming =version bsize= ascii-ci= ftype=
log =internal log bsize= blocks=, version=
= sectsz= sunit= blks, lazy-count=
realtime =none extsz= blocks=, rtextents=
[root@ha-node1 ~]# mkdir /data
[root@ha-node1 ~]# vim /etc/my.cnf
修改mysql的数据存放位置 datadir=/data
[root@ha-node1 ~]# chown -R mysql.mysql /data/
[root@ha-node1 ~]# mount /dev/drbd1 /data/
[root@ha-node1 ~]# systemctl start mariadb
[root@ha-node1 ~]# mysql
MariaDB [(none)]> create database mingming;
MariaDB [(none)]> show databases;
+---------------------+
| Database |
+---------------------+
| information_schema |
| #mysql50#lost+found |
| mingming |
| mysql |
| performance_schema |
| test |
+---------------------+
rows in set (0.00 sec)

查看资源连接状态

[root@ha-node1 ~]# drbdadm cstate 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)暂停了同步 
VerifyS:以本地节点为验证源的线上设备验证正在执行 
VerifyT:以本地节点为验证目标的线上设备验证正在执行 

查看资源角色命令

[root@ha-node1 ~]# drbdadm role  mysql
Primary/Secondary

Parimary 主:资源目前为主,并且可能正在被读取或写入,如果不是双主只会出现在两个节点中的其中一个节点上 
Secondary 次:资源目前为次,正常接收对等节点的更新 
Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态

查看硬盘状态命令

[root@ha-node1 ~]# 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:一致的最新的数据状态,这个状态为正常状态 

手动禁用、启用资源

[root@ha-node1 ~]# drbdadm down mysql    # 禁用资源
[root@ha-node1 ~]# drbdadm up mysql # 启动资源

资源名称也可以使用all表示[停用|启用]所有资源

升级和降级资源

[root@ha-node1 ~]# drbdadm primary mysql # 升级为主节点
[root@ha-node1 ~]# drbdadm secondary mysql # 降级为次节点

在单主模式下的DRBD,两个节点同时处于连接状态,任何一个节点都可以在特定的时间内变成主;但两个节点中只能一为主,如果已经有一个主,需先降级才可能升级;在双主模式下没有这个限制 

初始化设备同步 
选择一个初始同步源;如果是新初始化的或是空盘,这个选择可以是任意的,但是如果其中的一个节点已经在使用并包含有用的数据,那么选择同步源是至关重要的;如果选错了初始化同步方向,就会造成数据丢失,因此需要十分小心 
启动初始化完全同步,这一步只能在初始化资源配置的一个节点上进行,并作为同步源选择的节点上

[root@ha-node1 ~]# drbdadm -- --overwrite-data-of-peer primary mysql

创建文件系统 
文件系统只能挂载在主(Primary)节点上,因此在设置好主节点后才可以对DRBD设备进行格式化操作 
格式化文件系统

[root@ha-node1 ~]# mkfs.ext4 /dev/drbd1

挂载文件系统

[root@ha-node1 ~]# mount /dev/drbd1 /data/

切换主备节点 

[root@ha-node1 ~]# systemctl stop mariadb
[root@ha-node1 ~]# umount /data/
[root@ha-node1 ~]# drbdadm secondary mysql [root@ha-node2 ~]# drbdadm primary mysql
[root@ha-node2 ~]# drbd-overview
NOTE: drbd-overview will be deprecated soon.
Please consider using drbdtop. :mysql/ Connected Primary/Secondary UpToDate/UpToDate /data ext4 .0G 36M .8G %
[root@ha-node2 ~]# mount /dev/drbd1 /data/
[root@ha-node2 ~]# chown -R mysql.mysql /data/
[root@ha-node2 ~]# systemctl start mariadb
[root@ha-node2 ~]# mysql
MariaDB [(none)]> show databases;
+---------------------+
| Database |
+---------------------+
| information_schema |
| #mysql50#lost+found |
| mingming |
| mysql |
| performance_schema |
| test |
+---------------------+
rows in set (0.00 sec)

在同步磁盘之前 应该先把每个次节点提升为主节点 然后格式化磁盘 再将为次节点同步数据 , 否则同步完数据后 没办法再格式化了

CentOS 7 MySQL HA之DRBD的更多相关文章

  1. 理解 OpenStack 高可用(HA) (6): MySQL HA

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...

  2. 如何基于Azure平台实现MySQL HA(方法论篇)

    我们都知道,相较于传统的数据中心,Pulic cloud也有劣势,比如说数据库的HA,很多熟悉公有云平台的读者都知道,因为出于安全性性考虑以及一些技术条件的限制,很多本地数据中心的mysql HA方法 ...

  3. MySQL HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS[转]

    MySQL HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS 简介 目前Mysql高可用的方案有好多,比如MMM,heartbeat+drbd,Cluster等,还有per ...

  4. MySQL高可用解决方案(MySQL HA Solution)

    http://blog.sina.com.cn/s/blog_7e89c3f501012vtr.html 什么是高可用性?很多公司的服务都是24小时*365天不间断的.比如Call Center.这就 ...

  5. CentOS 下 MySQL DateBasic 抢救

    CentOS 下 MySQL DateBasic 抢救 强 Kill 数据库进程. 分析问题:确定报错内容 报错信息:The server quit without updating PID file ...

  6. centos安装 mysql

    centos安装 mysql 1. 下载mysqlmysql被oracle收购后现在退出了企业版和社区版本,社区版本是开源的,企业版是收费的.社区版可以下载源码也可以下载二进制文件包.源码安装比较麻烦 ...

  7. centOS安装Mysql指南

    centOS安装Mysql指南 说明:使用操作系统centOS6.4 32位系统:mysql:mysql-5.7.10-linux-glibc2.5-i686.tar.gz; 一.准备 下载mysql ...

  8. windows下的mysql客户端mysqlworkbench链接虚拟机上CentOS的mysql服务器

    本人在虚拟机上CentOS的Linux环境下安装了mysql服务器,在本地Windows下安装了mysql的客户端mysqlworkbench ,所以就想让windows下的mysql客户端mysql ...

  9. 【Linux】Centos部署MySQL

    将CentOS部署MySQL需要本地配置环境.本地编译MySQL,耗时较长的情况,优化为编译成型MySQL并打包,推送并按配置部署. 首先需要在一台机器配置好环境,搭个YUM源,并将所需要的包取出备用 ...

随机推荐

  1. 解决ubuntu下firefox无法在线播放音频和视频的问题

    原因 Ubuntu 为了规避专利和版权问题,很多东西没有预装,比如音视频解码器AAC. 那么为什么明明 Ubuntu 上没有AAC解码器, Chrome 却可以正常播放呢,自然的想法是 Chrome ...

  2. 在Linux下用gcc编译hello world

    1. 确保Linux系统里已经装好了gcc 测试:输入gcc后是如下的结果就说明已经安装成功 2. 创建HelloWorld.c 使用 touch 创建一个空文件; 用vim编辑 按下A或者I 插入 ...

  3. PHP 根据子ID递归获取父级ID,实现逐级分类导航效果

    代码: //当前路径 $cate=M('wangpan_class')->select(); function get_top_parentid($cate,$id){ $arr=array() ...

  4. spring Cache注解详解

    @CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置.在这里@CacheConfig(cacheNames = "users"):配置了该数据访问对象中返回的内容 ...

  5. JavaScript继承的几种模式

    原型链 让一个类的原型对象指向另一个类的实例

  6. postgresql----JOIN之多表查询

    JOIN用于多张表的关联查询,如SELECT子句(SELECT A.a,A.b,B.a,B.d)中既有表A的字段,同时还有B表的字段,此时使用单独使用FROM A或FROM B已经解决不了问题了,使用 ...

  7. shell - shift

    Shell编程中Shift的用法 位置参数可以用shift命令左移.比如 shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shi ...

  8. python mysql 单表查询 多表查询

    一.外键 变种: 三种关系: 多对一 站在左表的角度: (1)一个员工 能不能在 多个部门? 不成立 (2)多个员工 能不能在 一个部门? 成立 只要有一个条件成立:多 对 一或者是1对多 如果两个条 ...

  9. Python3.6 提示 ModuleNotFoundError: No module named '_ssl' 模块问题

    国内 163 yum 源挺好用 (中科大的也不错) http://mirrors.163.com/.help/CentOS6-Base-163.repo yum install openssl-dev ...

  10. request之额外路径

    谈到额外路径 ,首先要明白映射路径,映射路径是servlet处理的路径,在web.xml中配置.比如配置一个/emp的映射路径,意味着客户端可以通过http:+项目路径+/emp访问服务器的项目,而所 ...