Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。
数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)
DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。
在DRBD中,资源是特指某复制的存储设备的所有方面。包括资源名称、DRBD设备(/dev/drbdm,这里m是设备最小号,最大号可到147)、磁盘配置(使本地数据可以为DRBD所用)、网络配置(与对方通信).
每个资源有个角色,是Primary或Secondary,下面简称“主”和“备”.
主角色的DRBD设备可以不受限制的读和写,比如创建和映射文件系统、对于块设备的raw或直接IO访问。
备角色的DRBD设备接受来自对方的所有修改,但是不能被应用程序读写,甚至只读也不行。角色可以改变的;
配置drdb:
确保2个节点的时间必须同步:
# ntpdate 172.16.0.1 (两个节点保持一致)
1)所有节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,
需要保证两个节点上的/etc/hosts文件均为下面的内容:
172.16.8.100 node1.blue.com node1
172.16.8.101 node2.blue.com node2
为了使得重新启动系统后仍能保持如上的主机名称,还分别需要在各节点执行类似如下的命令:
NODE1:172.16.8.100
# vim /etc/sysconfig/network
HOSTNAME=node1.blue.com
# hostname node1.blue.com
NODE2:172.16.8.101
# vim /etc/sysconfig/network
HOSTNAME=node2.blue.com
# hostname node2.blue.com
2)设定两个节点可以基于密钥进行ssh通信,这可以通过类似如下的命令实现:
Node1:172.16.8.100
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2
Node2:172.16.8.101
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1
NODE1:
配置corosync,(以下命令在node1.magedu.com上执行)
# yum install corosync pacemaker -y :NODE2 做一样的操作;
# rpm -ql corosync 查看生成了那些文件;
# cd /etc/corosync
# ls
# cp corosync.conf.example corosync.conf
# vim corosync.conf
修改:
secauth:on
并设定此配置文件中 bindnetaddr后面的IP地址为你的网卡所在网络的网络地址
bindnetaddr:172.16.0.0
mcastaddr:239.123.321.99 不要使用默认地址就行;
mcastport: 5405 监听端口;
to_syslog: no
service {
ver: 0版本号
name: pacemaker
# use_mgmtd: yes(有没有这一项都可以)
}
aisexec {可以不用指定,不是关键信息
user: root
group: root
}
生成节点间通信时用到的认证密钥文件:
# corosync-keygen(如果密钥不够,可以下载rpm包来增加密钥的数量)
将Node1:corosync和authkey复制至node2:
# scp -p corosync authkey node2:/etc/corosync/
NODE2 上进行验证即可, # ll /etc/corosync/
分别为两个节点创建corosync生成的日志所在的目录:
# mkdir /var/log/cluster
# ssh node2 ‘mkdir /var/log/cluster‘
启动corosync(以下命令在node1上执行):
# service corosync start; ssh node2 ‘service corosync start‘
# ss -tnul 5405 的多播地址被打开了;
# cd /var/log/cluster
# ls
# tail -f corosync.log 时时查看 日志信息;
查看corosync引擎是否正常启动:
# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
查看初始化成员节点通知是否正常发出:
# grep TOTEM /var/log/cluster/corosync.log
检查启动过程中是否有错误产生。下面的错误信息表示packmaker不久之后将不再作为corosync的插件运行,因此,建议使用cman作为集群基础架构服务;此处可安全忽略。
# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources
查看pacemaker是否正常启动:
# grep pcmk_startup /var/log/cluster/corosync.log
安装crmsh
# cd
# lftp 172.16.0.1/pub
# cd Sources/6.x86_64/corosync> mget crmsh-2.1-1.6.x86_64.rpm
# cd Sources/6.x86_64/crmsh> mget pssh-2.3.1-2.e16.x86_64.rpm
# yum --nogpgcheck localinstall crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-4.1.x86_64.rpm
节点二 也做安装即可;
# scp crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-4.1.x86_64.rpm node2:/root
# crm 是一个模式化shell
crm(live)# help
crm(live)# help status 查看命令的用法;
如果安装了crmsh,可使用如下命令查看集群节点的启动状态:
[root@node1 ~]# crm status
Last updated: Sun May 31 15:35:28 2015
Last change: Sun May 31 13:35:35 2015
Stack: classic openais (with plugin)
Current DC: node1.blue.com - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
0 Resources configured
Online: [ node1.blue.com node2.blue.com ]
从上面的信息可以看出两个节点都已经正常启动,并且集群已经处于正常工作状态。
配置集群的工作属性,禁用stonith (node1 域 node2 要做相同的步骤)
corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用,这可以通过如下命令验正:
我们里可以通过如下命令先禁用stonith:
# crm configure property stonith-enabled=false
或者
# crm
crm(live)# configure
crm(live)configure# property stonith-enabled=false
crm(live)configure# show
node node1.blue.com \
attributes standby=off
node node2.blue.com \
attributes standby=off
property cib-bootstrap-options: \
dc-version=1.1.11-97629de \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes=2 \
stonith-enabled=false
安装:DRBD:
[root@node1 ~]# lftp 172.16.0.1/pub
cd ok, cwd=/pub
lftp 172.16.0.1:/pub> cd Sources/6.x86_64/drbd/
lftp172.16.0.1:/pub/Sources/6.x86_64/drbd>mget kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm
lftp 172.16.0.1:/pub/Sources/6.x86_64/drbd> bye
# scp drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm node2:/root
在两个主机上准备好,2个磁盘设备;并做成drbd,大小要保持一致;
# fdisk /dev/sda
p n p 3 +5G w
# partx -a /dev/sda
# partx -a /dev/sda
BLKPG: Device or resource busy
error adding partition 3
# rpm -ivh kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm
# scp kmod-drbd84-8.4.5-504.1.e16.x86_64.rmp drbd84-utils-8.9.1-1.e16.elrepo.x86_64.rpm node2:/root/
NODE2 与上完成一样的步骤;
# rpm -qa | grep drbd
# rpm -ql drbd84-utils-8.9.1-1.e16.elrepo
# rpm -ql kmod-drbd84-8.4.5-504.1.e16
# vim /etc/drbd.conf
# cd /etc/drbd.d/
# vim /etc/drbd.d/global_common.conf
修改为:
usage-count no; {是否参加用户体验调查,一般NO}
disk {
on-io-error detach;
# fencing resource-only;
}
net {
cram-hmac-alg "sha1";
shared-secret "mydrbdlab"; [可以使用openss-random 来生成随机密钥]
}
syncer {
rate 500M;
}
# vim mystore.res定义MYSQL 数据库同步;定义一个资源;
resource mystore {
device /dev/drbd0;
disk /dev/sda3;
meta-disk internal;
on node1.blue.com {
address 172.16.8.100:7789;
}
on node2.blue.com {
address 172.16.8.101:7789;
}
# scp -r /etc/drbd.* node2:/etc/
NODE2:进行验证;
# cd /etc/drbd.d/
# ll
验证完成;
初始化资源,在Node1和Node2上分别执行:
# drbdadm create-md mystore2个节点都进行;
# service drbd start启动服务;(2个节点同时进行);
此时都是Secondary:
[root@node1 ~]# cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
GIT-hash: 1d360bde0e095d495786eaeb2a1ac76888e4db96 build by root@node1.magedu.com, 2015-01-02 12:06:20
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:5252056
也可以使用drbd-overview命令来查看:
[root@node1 ~]# drbd-overview
0:mystore/0 Connected Secondary/Secondary Inconsistent/Inconsistent
从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:
Node1:
# drbdadm primary --force mystore
此时两个节点在同步数据:
[root@node1 drbd.d]# drbd-overview
0:mystore/0 SyncSource Primary/Secondary UpToDate/Inconsistent
[>....................] sync‘ed: 1.1% (5080/5128)M
Node2:
[root@node2 drbd.d]# drbd-overview
0:mystore/0 SyncTarget Secondary/Primary Inconsistent/UpToDate
[=========>..........] sync‘ed: 53.1% (2408/5128)M
方法二:
注: 也可以在要设置为Primary的节点上使用如下命令来设置主节点:
# drbdadm -- --overwrite-data-of-peer primary mystore
创建文件系统:所有的操作,只能在主节点上进行;
文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
# mke2fs -t ext4 /dev/drbd0
# mkdir /mydata
# mount /dev/drbd0 /mydata
# cd /mydata
# ls
# cp /etc/issue ./
把对方变为主节点,自己变成从节点
# cd
# umount /dev/drbd0
把自己降为从服务器;
# drbdadm secondary mystore把自己变成从节点;
# drbd-overview 现在双方都是从节点;
NODE2:变成主节点;
# drbdadm primary mystore 把自己提升为 主节点;
[root@node2 drbd.d]# mkdir /mydata
[root@node2 drbd.d]# mount /dev/drbd0 /mydata
[root@node2 drbd.d]# cd /mydata
[root@node2 mydata]# ls
issue lost+foundissue ←这里会显示之前,NODE1复制的 文件;
# cp /etc/fstab ./
切换为从节点NODE2:
# umount /dev/drbd0
# drbdadm secondary mystore
[root@node2 ~]# drbd-overview
0:mystore/0 Connected Secondary/Secondary UpToDate/UpToDate
NODE1:升级为主:
[root@node1 ~]# drbdadm primary mystore
[root@node1 ~]# mount /dev/drbd /mnt
mount: you must specify the filesystem type
[root@node1 ~]# mount /dev/drbd0 /mnt
[root@node1 ~]# cd /mnt/
[root@node1 mnt]# ls
fstab issue lost+found
此时 fstab 文件存在!
此时文件都同步了,按位对齐的;
drbd + pacemaker mysql 的实现;
应该先降级后,在停止服务的;
NODE1:
[root@node1 mnt]# cd
[root@node1 ~]# umount /dev/drbd0
[root@node1 ~]# service drbd stop
# chkconfig drbd off
NODE2:
# service drbd stop
# drbd-overview
# chkconfig drbd off
将drbd 配置为corosync 可用的资源; 要使用(特殊的克隆类型,主从类型)克隆资源来使用了;
NODE1:# crm status
# crm
crm(live)# configure
crm(live)configure# primitive mystor ocf:linbit:drbd params drbd_resource="mystore"
op monitor role="Master" interval=10s timeout=20s
op monitor role="Slave" interval=20s timeout=20s
op start timeout=240s op stop timeout=100s
crm(live)configure# ms ms_mystor mystor meta clone-max="2" clone-node-max="1"
master-max="1" master-node-max="1" notify="ture"
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status 此时就正常启动了
Masters:[node1.magedu.com]
Slave:[node2.magedu.com]
# crm node standby
# crm status
Masters:[node2.magedu.com]
Stopped:[node1.magedu.com]
NODE2: 自动提升了状态;
# crm node online
Slave:[node1.magedu.com]就变成 从服务了;
还是把Node1变成主服务:
NODE2: # crm node standby
Masters:[node1.magedu.com]
Stopped:[node2.magedu.com]
变成从服务:# crm node online
# crm status
Masters:[node1.magedu.com]
Slave:[node2.magedu.com]
定义一个文件系统资源:
# mkdir /mydataNODE2也一样;
crm(live)configure# delete mydata
crm(live)configure# primitive mydata ocf:heartbeat:Filesystem params
device="/dev/drbd0" directory="/mydata" fstype="ext4"
op monitor interval=20s timeout=40s op start timeout=60s op stop timeout=60s
crm(live)configure# verify
定义约束:
crm(live)configure# colocation mydata_with_ms_mystor_master inf: mydata ms_mystor:Master
顺序约束:
crm(live)configure# order mydata_after_ms_mystor_master Mandatory: ms_mystor:promote mydata:start
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status
NODE1: # mount
/dev/drbd0 on /mydata type ext4 (rw)
构建成 mariaDB 的高可用集群:
那个节点是主节点就在那个节点上配置: 切记!!!
Node1:
安装配置mariaDB;
# lftp 172.16.0.1/pub
> cd Source/source/mariaDB mget mariadb-5.5.43-linux-x86_64.tar.gz
> bye
# tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local
# cd /usr/local/
# groupadd -r -g 306 mysql
# useradd -r -g 306 -u 306 mysql
# mkdir /mydata/data -pv
# chown -R mysql.mysql /mydata/data
# ll /mydata/data
# ln -sv mariadb-5.5.43-linux-x86_64 mysql
# cd mysql
# ll
# chown -R root.mysql ./*
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
# ls /mydata/data查看初始化数据是否存在;
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld off
# mkdir /etc/mysql
# cp support-files/my-large.cnf /etc/mysql/my.cnf
# vim /etc/mysql/my.cnf
添加内容为:
datadir = /mydata/data
innodb_file_per_table = on
skip_name_resolve = on
# service mysqld start
# /usr/local/mysql/bin/mysql
> GRANT ALL ON *.* TO ‘root‘@‘172.16.%.%‘ IDENTIFIED BY ‘mageedu‘;
> FLUSH PRIVILEGES;
> quit
# service mysqld stop
切换主节点为Node2: 来安装mariaDB;
# crm node standby
# crm node online 主要是,把NODE2切换为主节点;
# crm status
Node2: # mkdir /etc/mysql/
Node1:# scp /etc/mysql/my.cnf node2:/etc/mysql
Node2安装mariaDB:
# groupadd -r -g 306 mysql
# useradd -r -g 306 -u 306 mysql
# lftp 172.16.0.1/pub
> cd Source/source/mariaDB mget mariadb-5.5.43-linux-x86_64.tar.gz
> bye
# mkdir /etc/mysql
# ll /mydata/data/
# tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local
# cd /usr/local
# ln -sv mariadb-5.5.43-linux-x86_64 mysql
# cd mysql
# ll
# chown -R root.mysql ./*
# ll
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld off
# service mysqld start
# /usr/local/mysql/bin/mysql
> CREATE DATABASE testdb;
> SHOW DATABASES;
> exit
# service mysqld stop
切换主节点为Node1:
# crm node standby
# crm node online
# crm status
Node1:
# service mysqld start
# /usr/local/mysql/bin/mysql
> SHOW DATABASES;
查看刚刚在NODE2上创建的 testdb 是否存在;存在,说明2者访问的数据库是同一个;
# service mysqld stop
把mysql 定义为高可用集群的资源;文件系统挂载在哪了,mysql就必须运行在哪里;
NODE1:
# crm
crm(live)# configure
crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip=‘172.16.8.200‘ op monitor interval=10s timeout=20s
crm(live)configure# verify
crm(live)configure# primitive myserver lsb:mysqld op monitor interval=20s timeout=20s
crm(live)configure# verify
crm(live)configure# colocation myip_with_ms_mystor_master inf: myip ms_mystor:Master
crm(live)configure# colocation myserver_with_mydata inf: myserver mydata
crm(live)configure# show
crm(live)configure# order myserver_after_mydata Mandatory: mydata:start myserver:start
crm(live)configure# show
crm(live)configure# order myserver_after_myip Mandatory: myip:start myserver:start
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status
客户端测试Mysql:
# yum install -y mysql
# mysql -uroot -p -h 172.16.8.200
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+
5 rows in set (0.02 sec)
之前在Node2上创建的testdb表还是存在的;
让NODE1成为备节点:
# crm node standby
# crm status
# crm node online
此时客户端访问MYSQL 依然正常;
Node2:# ip addr show
172.16.8.200 已经启动起来了;
# crm node standby
# crm node online
NODE1 成为主节点:
# ip addr show
172.16.100.27 已经启动了;
客户端访问mariadb 服务依然能够正常使用;
此时基于drbd的mariaDB 的高可用集群 已经搭建完成!!
本文出自 “blue” 博客,请务必保留此出处http://sailove.blog.51cto.com/3215562/1658006
原文地址:http://sailove.blog.51cto.com/3215562/1658006