drbd

来源:互联网 发布:细川忠兴 知乎 编辑:程序博客网 时间:2024/04/30 11:34

linux分布式复制块设备drbd


1.drbd主从:

        primary :可执行读写复制

         secondary:文件系统不能挂载

   drbd主主:

         高可用集群中,把它当为一种资源(其中有锁,表示有一个设配在写,另一个不可以,同时可以自动切换,但只在集群中可以)

2.Disk  Scheduler(磁盘调度器)

        合并读请求,合并写请求    (因为磁臂)

3.drbd协议:

       A:异步 (只要向另一发出去,不管是否出自己网卡NIC,对方是否收到报文)

       B:半同步 (经过对方网卡,但是不保证是否真正同步到B硬盘上)

       C:同步(确保同步到B硬盘上)

4.drbd 资源

        资源名称:可以是除过空格外的任意ACSII字符

         drbd设备:在双方节点上,此drbd设备的设备文件,一般为/dev/drbdN  其主设备号147

          磁盘:在双方节点上,各自提供的存储设备

          网络配置:双方数据同步时所使用的网络属性

5.drbd命令

       drbdadm  (/etc/drbd.conf (/etc/drbd.d/))

       drbdsetup

       drbdmeta (操作drbd源数据)

6.drbd整合在内核  (uname  -r)


配置:

基于跳板机工作:(drdb可以限制只允许跳板机ssh连接,这样更安全)

1.  ssh 实现无密码连接

   跳板机上:

       ssh-keygen

      ssh-copy-id  -i   id_rsa.pub   192.168.1.2

      会在192.168.1.2   ~/.ssh/生成authroized.key   

此时ssh  192.168.1.2   则无需密码

       但如果还提示错误Agent  admiiited.....

       在跳板机上: ssh-add   id_rsa   (把密钥加载进来)

2.将安装包drbd发送到drbd节点机子上

在跳板机子上有安装包

       # for  n   in  {2..3};   do  scp  drbd.rpm    192.168.1.$n:/root/   ;     done

3.安装drbd在两个节点上

        在跳板机子上有安装包

       # for  n   in  {2..3};   do  ssh  192.168.1.$n    `yum localinstall  drbd*.rpm   -y `  ;     done

4. 用跳板机控制drbd机子。

  for  ip  in {1..2};  

  do 

      ssh node$ip  `wget  ftp://192.168.1.254/pub/RPM/drdb/a,rpm`;  

   done

5.修改配置文件

vim   /etc/drbd.d/global_common.conf

   

6.定义资源文件


7.初始化资源

两节点执行

drbd  create-md  mydrdb 

8.启动服务(两节点都执行)

/etc/init.d/drbd  start

9.查看启动状态

    a. cat /proc/drbd

    b.  drbd-overview  

(此时两个都为Secondary  而且数据为Inconsistent  为同步)

10.设置其中一个为主

  drbdadm  - -   - -overwrite-data-of-peer    primary  mydrbd (资源名字,图片中叫web)

  只有一个为主时才会同步,此时Inconsistent变为UoToDate  就证明同步了(drbd 只能一个为主)

11.格式化文件(只能在主节点进行)

    mke2fs  -j  /dev/drbd0

挂载文件

   mount  /dev/drbd0   /data

   cp  /etc/conf     /data

12.  调换角色

   在主节点上:

   umount  /data

  drbdadm   secondary  mydrbd

  在从节点

  drbdadm    primary  mydrbd

  mount  /dev/drbd0  /data

  cd /data

就会有刚复制的inittab文件  实现了文件同步







mydrbd

/dev/drbd0

/dev/sda5

drbd配置文件:

/etc/drbd.conf

/etc/drbd.d/global_common.conf  (common默认协议)

/etc/drbd.d/*.res



博文主要介绍的是在红帽5.8系统上基于drbd+corosync对高可用mysql服务的实现,这种模式的搭建在企业环境中也是很实用的,让我们一起来看看整个实现过程吧

前提条件说明

(1)节点之间需要传递事务信息,节点之间识别节点是通过节点名称实现,所以需要DNS解析,将相应IP对应节点名称,但是如果依赖DNS服务器时,高可用集群服务又增大了风险,为了避免DNS服务器存在的隐患,配置解析时直接使用本地/etc/hosts配置文件定义

(2)节点名称必须要与‘uname–n’命令显示的名称一致

(3)高可用集群节点的管理,比如停止某一节点时,是不能在自身这个节点停止其服务,需要在一个运行正常的节点上停止其他节点;所以,提供ssh互信通信(配置每个节点基于密钥的方式与节点进行通信)

(4)时间需要同步

节点之间网络通信配置实现

test1节点 IP配置

test2节点 IP配置

配置完成重启网络服务

各节点节点名称配置

test1节点名称配置

1
# vim /etc/sysconfig/network

1
# hostname test1.magedu.com

test2 节点名称配置

1
# vim /etc/sysconfig/network

1
# hostname test2.magedu.com

配置完成重新登录一下终端

主机名解析配置

RS1 主机名解析配置

1
# vim /etc/hosts

RS2 主机名解析配置

1
# vim /etc/hosts

节点之间的ssh互信功能配置

节点 test1(简称)配置

1
2
# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
# ssh-copy-id -i .ssh/id_rsa.pub root@test2.magedu.com

测试一下

节点 test2配置

1
2
# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
# ssh-copy-id -i .ssh/id_rsa.pub root@test1.magedu.com

测试是否可以进行ssh通信

时间同步

配置一台主机为时间服务器,进行时间同步,这里直接使用的是实验提供的时间服务器,没有做其他配置

节点test1test2同时同步

1
# ntpdate 172.16.0.1

定义一条计划任务,时刻同步着时间

1
2
# crontab –e 
*/5 * * * * ntpdate 172.16.0.1 >/dev/null

DRBD的实现过程

Drbd是将位于两个系统上的两块磁盘上的磁盘分区做成镜像设备,在底层通过TCP/IP 协议在底层完成数据同步(不同主机,光网络,TCP/IP报文);Drbd工作时在内核上进行数据同步,即drbd是内核的一个功能,向系统中写数据的时候,drbd将数据一分为二通过网卡将数据发送到另一台主机,另一台主机上要有运行一个的服程序;完成这drbd的这些操作的是主机上drbd 的内核模块;drbd内核模块在需要时被装入内核

首先要在在节点1与节点2上创建两个一样的分区,这个比较简单所以过程就省略了

安装drbd软件包

1
2
3
# yum -y --nogpgcheck localinstall
drbd83-8.3.81.el5.centos.i386.rpm
kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

准备配置文件

1
# cp /usr/share/doc/drbd83-8.3.8/drbd.conf  /etc

配置/etc/drbd.d/global-common.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
global {
        usage-count no;
        # minor-countdialog-refresh disable-ip-verification
common {
        protocol C;
        handlers {
                # fence-peer"/usr/lib/drbd/crm-fence-peer.sh";
                # split-brain"/usr/lib/drbd/notify-split-brain.sh root";
                # out-of-sync"/usr/lib/drbd/notify-out-of-sync.sh root";
                #before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 ---c 16k";
                #after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
        }
        startup {
                # wfc-timeoutdegr-wfc-timeout outdated-wfc-timeout wait-after-sb
        }
        disk {
                on-io-errordetach;
                # on-io-errorfencing use-bmbv no-disk-barrier no-disk-flushes
                # no-disk-drain no-md-flushesmax-bio-bvecs
        }
        net {
                cram-hmac-alg"sha1"
                shared-secret"mydrbdlab";
        }
        syncer {
                rate 100M;
        }
}

定义一个资源/etc/drbd.d/web.res(文件名以.res结尾)

1
2
3
4
5
6
7
8
9
10
11
12
# vim web.res
resource web {
        device    /dev/drbd1;
        disk      /dev/sda6;
        meta-disk internal;
on test1.magedu.com {
        address172.16.51.77:7789;
}
on test2.magedu.com {
        address172.16.51.78:7789;
}
}

复制配置文件及资源到test1与test2节点

# scp -p web.res global_common.conf test1:/etc/drbd.d/

初始化资源(在test1和test2上分别执行初始化操作命令)

1
# drbdadm create-md web

启动drbd(两个节点之间要同步磁盘数据,所以两个节点同时上线)

1
# service drbd status

查看同步状态

设置一个test1节点为Primary

稍等片刻,再次查看同步状态(主从节点已经设定完成)

创建文件系统

文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化

1
2
3
# mke2fs -j /dev/drbd0
# mkdir /mydata
# mount /dev/drbd0 /mydata/

准备测试文件(为主从节点调试结果做验证)

对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary

test1转换为从节点

1
2
# umount /mydata/
# drbdadm secondary mydrbd

test节点上操作

1
# drbdadm primary mydrbd

查看状态

挂载,查看是否同步了数据

DRBD功能准备完成,下面进行drbd+corosync实现高可用mysql

基于drbd+corosync实现高可用mysql

安装相关的rpm包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# yum -y --nogpgcheck localinstall
cluster-glue-1.0.6-1.6.el5.i386.rpm
cluster-glue-libs-1.0.6-1.6.el5.i386.rpm
corosync-1.4.5-1.1.i386.rpm
corosynclib-1.4.5-1.1.i386.rpm
heartbeat-3.0.3-2.3.el5.i386.rpm
heartbeat-libs-3.0.3-2.3.el5.i386.rpm
libesmtp-1.0.4-5.el5.i386.rpm
openais-1.1.3-1.6.el5.i386.rpm
openaislib-1.1.3-1.6.el5.i386.rpm
pacemaker-1.1.5-1.1.el5.i386.rpm
pacemaker-cts-1.1.5-1.1.el5.i386.rpm
pacemaker-libs-1.1.5-1.1.el5.i386.rpm
resource-agents-1.0.4-1.1.el5.i386.rpm

在节点test1上的操作配置

准备配置文件

1
2
3
# cd /etc/corosync/
# cp corosync.conf.example corosync.conf
# vim corosync.conf

修改组播相关内容

1
2
3
4
5
totem {
              secauth:on
       interface{
                     bindnetaddr:172.16.0.0
                     mcastaddr:239.151.51.51

添加的内容

1
2
3
4
5
6
7
8
service {
       ver: 0
       name: pacemaker
}
aisexec {
       user: root
       group: root
}

创建日志文件目录

1
2
# mkdir /var/log/cluster
# ssh test2 'mkdir /var/log/cluster'

生成一对密钥

1
# corosync-keygen

复制密钥文件与配置文件到test2节点

1
# scp -p authkey corosync.conf test2:/etc/corosync/

启动corosync

查看节点状态信息

开始crm配置

说明:因为没有stonith设备并且只有两个节点所以需要禁用stonith功能,并更改节点默认属性

1
2
3
4
5
crm(live)configure#property stonith-enabled=false
crm(live)configure#verify
crm(live)configure#property no-quorum-policy=ignore
crm(live)configure#verify
crm(live)configure#commit

定义资源粘性,配置在当前节点test1粘性

1
2
3
crm(live)configure#rsc_defaults resource-stickiness=100
crm(live)configure#verify
crm(live)configure#commit

全局资源配置信息查看

资源配置

(1)将drbd配置为基本资源

(2)将drbd配置为克隆类资源

资源代理查看

1
2
crm(live)# ra
crm(live)ra#providers drbd

查看元数据信息

1
crm(live)ra# metaocf:heartbeat:drbd

定义一个主资源与一个主从类资源

1
2
3
4
5
crm(live)#configure
crm(live)configure#primitive mydrbdservice ocf:heartbeat:drbd params drbd_resource=mydrbd op starttimeout=240 op stop timeout=100 op monitor role=Master interval=20 timeout=30op monitor role=Slave interval=30 timeout=30
crm(live)configure#ms ms_mydrbd mydrbdservice meta master-max=1 master-node-max=1 clone-max=2clone-node-max=1 notify=true
crm(live)configure#verify
crm(live)configure#commit

状态信息查看

主从转换验证

1
2
3
crm(live)# node
crm(live)node#standby
crm(live)node#online test1.magedu.com

配置资源,通过NFS使其能够实现自动挂载

Filesystem资源添加

1
crm(live)configure#primitive mystore ocf:heartbeat:Filesystem params device=/dev/drbd0directory=/mydata fstype=ext3 op start timeout=60 op stop timeout=60

定义排列colocation使Filesystem必须跟主节点在一起

1
crm(live)configure#colocation mystore_with_ms_mydrbd inf: mystore ms_mydrbd:Master

定义排列order约束

1
crm(live)configure#order mystore_after_ms_mydrbd mandatory: ms_mydrbd:promote mystore:start

节点状态信息查看

在节点test2上查看是否成功挂载

主备节点切换验证

1
2
crm(live)# node
crm(live)node#standby test2.magedu.com

状态信息查看

查看test1节点上Filesystem是否成功挂载

安装配置mysql服务

现在的主节点是test1,首先在节点1上配置mysql服务

创建mysql用户与mysql

1
2
# groupadd -g3306 mysql
# useradd -g 3306-u 3306 -M mysql

准备mysql

1
2
# tar xf mysql-5.5.28-linux2.6-i686.tar.gz-C /usr/local/
# ln -sv mysql-5.5.28-linux2.6-i686mysql

准备数据目录

1
2
3
# cd /mydata
# mkdir data
# chownmysql.mysql data -R

更改mysql文件属主属组

1
2
# cd/usr/local/mysql
# chown root.mysql/usr/local/mysql/* -R

准备配置文件与服务脚本

1
2
3
# cd/usr/local/mysql
# cpsupport-files/my-large.cnf /etc/my.cnf
# cpsupport-files/mysql.server /etc/init.d/

修改配置文件

1
# vim /etc/my.cnf

添加以下内容(线程数与datadir目录位置)

1
2
thread_concurrency= 2
datadir=/mydata/data

设置mysql服务不能开机启动

1
2
# chkconfig --addmysqld
# chkconfigmysqld off

初始化mysql

1
2
# cd/usr/local/mysql
#scripts/mysql_install_db --user=mysql --datadir=/mydata/data

启动mysql

test2节点mysql服务配置与test1节点相同,说明流程如下

关闭节点test1 mysql服务

把节点test2 转换成Master

1
2
3
crm(live)# node
crm(live)node#standby test1.magedu.com
crm(live)node#online test1.magedu.com

开始配置test2mysql服务流程与test1相同(不执行初始化操作)

配置mysql服务为高可用

添加mysql为集群资源

1
2
3
crm(live)configure#primitive mysqld lsb:mysqld
crm(live)configure#verify
crm(live)configure#

定义colocation约束(mysqlmystore在一起;即与主节点在一起)

1
2
crm(live)configure#colocation mysql_with_mystore inf: mysqld mystore
crm(live)configure#verify

定义order约束(最后启动mysql服务)

1
2
3
crm(live)configure#order mysqld_after_mystore mandatory: mystore mysqld
crm(live)configure#verify
crm(live)configure#commit

节点状态信息查看

test2mysql服务启动状态查看

主从节点切换测试

1
2
3
crm(live)# node
crm(live)node#standby test2.magedu.com
crm(live)node#online test2.magedu.com

查看状态信息

查看test1节点是否成功运行mysql服务


http://djy0000.blog.51cto.com/5816828/1201251


0 0