CentOS 7 MySQL HA之DRBD
一、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的更多相关文章
- 理解 OpenStack 高可用(HA) (6): MySQL HA
本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...
- 如何基于Azure平台实现MySQL HA(方法论篇)
我们都知道,相较于传统的数据中心,Pulic cloud也有劣势,比如说数据库的HA,很多熟悉公有云平台的读者都知道,因为出于安全性性考虑以及一些技术条件的限制,很多本地数据中心的mysql HA方法 ...
- MySQL HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS[转]
MySQL HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS 简介 目前Mysql高可用的方案有好多,比如MMM,heartbeat+drbd,Cluster等,还有per ...
- MySQL高可用解决方案(MySQL HA Solution)
http://blog.sina.com.cn/s/blog_7e89c3f501012vtr.html 什么是高可用性?很多公司的服务都是24小时*365天不间断的.比如Call Center.这就 ...
- CentOS 下 MySQL DateBasic 抢救
CentOS 下 MySQL DateBasic 抢救 强 Kill 数据库进程. 分析问题:确定报错内容 报错信息:The server quit without updating PID file ...
- centos安装 mysql
centos安装 mysql 1. 下载mysqlmysql被oracle收购后现在退出了企业版和社区版本,社区版本是开源的,企业版是收费的.社区版可以下载源码也可以下载二进制文件包.源码安装比较麻烦 ...
- centOS安装Mysql指南
centOS安装Mysql指南 说明:使用操作系统centOS6.4 32位系统:mysql:mysql-5.7.10-linux-glibc2.5-i686.tar.gz; 一.准备 下载mysql ...
- windows下的mysql客户端mysqlworkbench链接虚拟机上CentOS的mysql服务器
本人在虚拟机上CentOS的Linux环境下安装了mysql服务器,在本地Windows下安装了mysql的客户端mysqlworkbench ,所以就想让windows下的mysql客户端mysql ...
- 【Linux】Centos部署MySQL
将CentOS部署MySQL需要本地配置环境.本地编译MySQL,耗时较长的情况,优化为编译成型MySQL并打包,推送并按配置部署. 首先需要在一台机器配置好环境,搭个YUM源,并将所需要的包取出备用 ...
随机推荐
- linux下安装部署ansible
linux下安装部署ansible 介绍 Ansible是一种批量部署工具,现在运维人员用的最多的三种开源集中化管理工具有:puppet,saltstack,ansible,各有各的优缺点,其中sal ...
- office图标(word,powerpoint,excel)异常(变成白板)问题修复
都是wps搞的鬼. 如果先装了wps后卸载wps再装office就可能出现这个问题. 终于解决了!!先装个wps 2016,进入设置→高级→兼职性关联.这时你会发现ppt文件图标不是白板了.重启打开w ...
- Python学习笔记整理(python 3)
一.tuple(元组) tuple和list非常类似,但是tuple一旦初始化就不能修改,如: classmates = ('Michael', 'Bob', 'Tracy') 1 classmate ...
- Hibernate 单向一对多映射
单向 n-1: 单向 n-1 关联只需从 n 的一段访问 1 的一端 此处 Order 类和 Customer 类,其中 Order 类需要引用 Customer 类 代码: public class ...
- Java 接口 新特性(Java8)
Java8新特性之接口增强 在Java7以及以前的版本中,接口里的方法都是抽象的,并且不存在静态方法,属性默认修饰符是public static final.所有方法的声明都是public [返回类型 ...
- myeclipse 无法启动Tomcat(程序未设置断点)This kind of launch is configured to open the Debug perspective ...
myeclipse 中在新建一个项目之后想要运行一下,可是却提示This kind of launch is configured to open the Debug perspective,下面是我 ...
- StringBuild使用与原理
StringBuild的使用: 1.创建: StringBuilder sb=new StringBuilder(); StringBuilder sb=new StringBuilder(200); ...
- __x__(46)0910第六天__框架集
框架集frameset 和 内联框架iframe 的作用类似: 在一个页面中,引入其他的外部html页面. 框架集可以同时引入多个页面. 在 html5 中,推荐使用框架集,而不推荐使用iframe ...
- php发送短信验证码
业务: 手机端点击发送验证码,请求发送到php端,由php调用榛子云短信http://smsow.zhenzikj.com的短信接口,生成验证码并发送. SDK下载: http://smsow.zhe ...
- python全栈开发 * 继承性 层叠性 盒模型 标准文档流 * 180809
---恢复内容开始--- 一继承性 1.继承: 给父级设置一些属性,子级继承了父级的该属性,这就是我们的css中的继承. 2. 可继承: color . font-*(size). text-*(de ...