22.1、heartbeat部署规划:
本文的实验环境是虚拟机设备;
名称 |
接口 |
ip |
用途 |
master-db(主) |
eth0 |
10.0.0.16/24 |
用于服务器之间的数据同步(直连) |
eth1 |
172.16.1.16/24 |
管理ip用于数据转发 |
|
vip |
172.16.1.26/24 |
提供对外访问的ip |
|
slave-db(从) |
eth0 |
10.0.0.17/24 |
用于服务器之间的数据同步(直连) |
eth1 |
172.16.1.17/24 |
管理ip用于数据转发 |
|
vip |
172.16.1.26/24 |
提供对外的访问的ip |
22.2、在关机状态下分别为master-db和slave-db添加20G的硬盘:
22.3、关闭selinux和防火墙:
master-db和slave-db的操作相同;
1、关闭selinux:
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
grep "SELINUX=disabled" /etc/selinux/config
setenforce 0
2、关闭防火墙:
/etc/init.d/iptables stop
chkconfig iptables off
22.4、修改主机名:
1、master-db:
[root@master-db ~]#sed -i "s#HOSTNAME=.*#HOSTNAME=master-db#g" /etc/sysconfig/network
[root@master-db ~]#hostname master-db
[root@master-db ~]#hostname
master-db
2、slave-db:
[root@slave-db ~]#sed -i "s#HOSTNAME=.*#HOSTNAME=slave-db#g" /etc/sysconfig/network
[root@slave-db ~]#hostname slave-db
[root@slave-db ~]#hostname
slave-db
22.5、配置master-db和slave-db之间的直连心跳线路由:
主从之间的关系全靠心跳线进行联系;
1、master-db:
[root@master-db ~]#route add -host 10.0.0.17 dev eth0
[root@master-db ~]#route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.17 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
[root@master-db ~]#echo '/sbin/route add -host 10.0.0.17 dev eth0' >>/etc/rc.local
2、slave-db:
[root@slave-db ~]#route add -host 10.0.0.16 dev eth0
[root@slave-db ~]#route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.16 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
[root@slave-db ~]#echo '/sbin/route add -host 10.0.0.16 dev eth0' >>/etc/rc.local
22.6、修改域名解析文件:
master-db和slave-db的操作相同;
vim /etc/hosts
10.0.0.16 master-db
10.0.0.17 slave-db
ping域名看是否可以ping通;
22.7、磁盘分区:
master-db和slave-db的操作相同;
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0 5G
parted /dev/sdb mkpart primary 5 6G
parted /dev/sdb p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 6442MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name 标志
1 17.4kB 5000MB 5000MB primary
2 5000MB 6442MB 1442MB primary
22.8、drbd软件安装:
master-db和slave-db的操作相同;
1、下载rpm包:
mkdir -p /root/tools
cd /root/tools
wget http://mirror.rackspace.com/elrepo/elrepo/el6/x86_64/RPMS/drbd84-utils-8.9.8-1.el6.elrepo.x86_64.rpm
wget http://mirror.rackspace.com/elrepo/elrepo/el6/x86_64/RPMS/kmod-drbd84-8.4.9-1.el6.elrepo.x86_64.rpm
2、安装:
rpm -ivh drbd84-utils-8.9.8-1.el6.elrepo.x86_64.rpm
rpm -ivh kmod-drbd84-8.4.9-1.el6.elrepo.x86_64.rpm
22.9、加载内核:
master-db和slave-db的操作相同;
ls -ld /usr/src/kernels/$(uname -r)
drwxr-xr-x 22 root root 4096 10月 8 23:29 /usr/src/kernels/2.6.32-754.3.5.el6.x86_64
#如果报错需要的包安装如下的软件包;
#yum install -y kernel kernel-devel kernel-headers gcc flex libxslt
modprobe drbd #临时生效;
lsmod | grep drbd
drbd 374888 0
libcrc32c 1246 1 drbd
加入到开机自启动中:
echo '/sbin/modprobe drbd' >>/etc/rc.local
tail -1 /etc/rc.local
22.10、配置drbd配置文件:
master-db和slave-db的操作相同;
1、文件说明:
ls /etc/drbd.d/ #包含文件;
global_common.conf
ls /etc/drbd.conf #配置文件用于包含/etc/drbd.d/中的配置文件;
/etc/drbd.conf
2、配置global_common.conf文件:
cp /etc/drbd.d/global_common.conf{,.bak}
egrep -v "^$|#" /etc/drbd.d/global_common.conf
global { #全局配置
usage-count no;
#不允许开源网站统计开源软件的数量,默认是yes;
}
common {
protocol C;
#使用实时同步数据的方法;
disk {
on-io-error detach;
#同步IO错误的做法是分离该磁盘;
}
net {
cram-hmac-alg "sha1";
#设置加密算法;
shared-secret "mydrbd";
#设置加密随机key;
}
syncer {
rate 100M; #同步的速度;
}
}
resource data {
on master-db { #主机器的主机名;
device /dev/drbd0; #drbd设备;
disk /dev/sdb1; #本地的存储分区;
address 10.0.0.16:7788;
#监听的直连网线,即数据端口,7788是默认端口;
meta-disk /dev/sdb2[0]; #drbd状态数据分区;
}
on slave-db { #从机器的主机名;
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.0.17:7788;
meta-disk /dev/sdb2[0];
}
}
提示:如果需要加磁盘只需要拷贝resource配置即可,然后更改资源名称、数据传输的ip地址和
端口号、drbd状态数据分区、本地的存储分区、drbd设备的名称;
22.11、激活drbd:
master-db和slave-db的操作相同;
1、初始化meta分区:
drbdadm create-md data #data是/etc/drbd.d/global_common.conf配置文件的resource名称;
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
提示:drbdadm -V :查看当前drbd的安装版本;
2、启动drbd服务:
drbdadm up data =》/etc/init.d/drbd start
Device '0' is configured!
Command 'drbdmeta 0 v08 /dev/sdb2 0 apply-al' terminated with exit code 20
#######################################################################
#表示启动data资源,可以用"all"代表启动所有资源;
#drbdadm up all
#相当于以下三个命令的组合:
#drbdadm attach all
#drbdadm syncer all
#drbdadm connect all
########################################################################
cat /proc/drbd #查看drbd的启动进程,没有设置主从时默认两边都是从;
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by mockbuild@Build64R6, 2016-12-13 18:38:15
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
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:263152
22.12、确定drbd的主从关系:
1、设置master-db为主:
[root@master-db ~]#drbdadm -- --overwrite-data-of-peer primary data
#第一次操作时使用;
#此操作很危险会把这边的数据推到对端并覆盖,如果对端有数据需要进行备份;
2、查看master-db的状态:
[root@master-db ~]#cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by mockbuild@Build64R6, 2016-12-13 18:38:15
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:346500 nr:0 dw:0 dr:349848 al:8 bm:0 lo:0 pe:1 ua:3 ap:0 ep:1 wo:f oos:4536684
[>...................] sync'ed: 7.3% (4428/4768)M
finish: 0:01:57 speed: 38,456 (38,456) K/sec
3、查看slave-db的状态:
[root@slave-db ~]#cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by mockbuild@Build64R6, 2016-12-13 18:38:15
0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:0 nr:346112 dw:346112 dr:0 al:8 bm:0 lo:1 pe:3 ua:0 ap:0 ep:1 wo:f oos:4536684
[>...................] sync'ed: 7.3% (4428/4768)M
finish: 0:01:57 speed: 38,456 (38,456) want: 102,400 K/sec
22.13、格式化磁盘:
如果之前主从在分区后就格式化磁盘了,这里就不需要格式化磁盘了;
只需要操作主节点master-db即可,从节点会跟随主节点进行格式化;
[root@master-db ~]#mkfs -t ext4 -b 4096 /dev/drbd0
[root@master-db ~]#tune2fs -c -1 /dev/drbd0 #禁止定期检查磁盘
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
22.14、挂载master-db磁盘:
特别注意:挂载的不是/dev/sdb1系统分区,挂载的是drbd的drbd0逻辑分区,通过挂载点写到drbd0逻辑分区上然后写到/dev/sdb1
系统分区上;不挂载slave-db的/dev/sdb1磁盘,因为该系统分区已经被/dev/drbd0设备占用,且不可见;
[root@master-db ~]#mkdir -p /master-db
[root@master-db ~]#mount /dev/drbd0 /master-db/
#说明:只有置为主端的时才可以这样挂载,否则要停掉资源后挂载本地的系统资源,如/dev/sdb1;
[root@master-db ~]#df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/drbd0 ext4 4.5G 9.4M 4.3G 1% /master-db
22.15、测试:
1、master-db:
[root@master-db ~]#cd /master-db/
[root@master-db ~]#touch /master-db/{1..6}.txt
[root@master-db ~]#ls /master-db/
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt lost+found
2、slave-db:
[root@slave-db ~]#drbdadm down data #停掉drbd服务;
[root@slave-db ~]#mkdir -p /slave-db #创建/dev/sdb1的挂载点;
[root@slave-db ~]#mount /dev/sdb1 /master-db/ #挂载;
[root@slave-db ~]#ls /slave-db/ #数据已经同步过来了;
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt lost+found
提示:因为slave-db上的/dev/sdb1系统分区被'/dev/drbd0'设备占用,不能够查看数据,所以需要停止后挂载查看,但是这种访问方法是不规范的;
[root@slave-db ~]#df -hT #查看磁盘
Filesystem Type Size Used Avail Use% Mounted on
/dev/drbd0 ext4 4.5G 9.4M 4.3G 1% /master-db
[root@slave-db ~]#umount /dev/sdb1 #卸载分区;
[root@slave-db ~]#drbdadm up data #启动drbd服务;
3、查看master-db和slave-db的磁盘使用状态参数说明:
(1)master-db:
[root@master-db ~]#cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by mockbuild@Build64R6, 2016-12-13 18:38:15
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:48 nr:0 dw:48 dr:1357 al:2 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
(2)slave-db:
[root@slave-db ~]#cat /proc/drbd
cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by mockbuild@Build64R6, 2016-12-13 18:38:15
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:48 dw:48 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
4、小结:
(1)通过测试可以发现主从连接状态(cs)、角色(ro)、磁盘状态(ds)正常,且主的数据发送(ns)量和
从的数据接收(nr)、写入(dw)量相同,说明数据同步是成功的;
(2)drbd状态码解释:
1)0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
0 #drbd的次设备号(minor),表示该行是/dev/drbd0资源的信息;
cs #connect state,即节点的连接状态wf未初始化状态;
ro #roles,即节点的角色状态;
ds #disk state,即磁盘的状态,也即drbd底层设备的状态,UpToDate表示正常、inconsistent初始化之前同步的状态;
C #drbd的复制协议,即A、B、C协议;
r-----#是IO标记,反应的是该资源的IO状态信息。共有6种IO状态标记符号;
2)ns:0 nr:48 dw:48 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
ns/send (network send) #通过网络连接发送给对端的数据量,单位为KB。
nr/receive (network receive) #通过网络连接接收到对端发送来的数据量,单位为KB。
dw/written (disk write) #写入本地磁盘的数据量,单位为KB。
dr/read (disk read) #从本地磁盘读取的数据量,单位为KB。
al/al-writes (activity log) #元数据区中al更新的次数。
bm/bm-writes (bit map) #元数据区中bitmap更新的次数。
lo/lower-pending (local count) #DRBD发起的打开本地IO子系统的请求次数。
pe/pending (pending) #本地发送给对端但却没有回复的次数。
ua/unacked (unacknowledged) #接收到对端发送的请求但却没有给予回复的请求数量。
ap/upper-pending (application pending) #转发给DRBD的IO块的请求,但DRBD还没给予回复的请求数量。
ep (epochs) #epoch对象的数量。通常为1。drbd9中没有该指标。
wo/write-ordering (write order) #当前正在使用的write order方法:b(barrier), f(flush), d(drain)或n(none)。
oos/out-of-sync (out of sync) #当前不同步的数据量,单位为KB。
22.16、总结:
1、drbd应用注意项:
(1)drbd开机默认是不自启动的;
chkconfig --list drbd
drbd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
(2)在生产环境中drbd设置的是开机不自启的,人工管理;
(3)drbd停止主服务器端需要卸载(umount /dev/drbd0)设备,然后(/etc/init.d/drbd stop)
停止服务即可,从服务端可以直接停掉;
(4)主从都停止再启动,两边都是从状态(/proc/drbd)也会被清空,说明drbd有自我保护的功能;如果停止的是从
端,从端再启动后,能够确定主从关系,从的状态数据会重新开始;如果停止的是主,主再起就会变成从;
drbd的C模式保证了两边数据的一致性;主端挂载,从端隐藏;
重新确定主端的命令是:drbdadm primary data;
重新确定从端的命令是:drbdadm secondary data;
(5)使用'drbdadm -- --overwrite-data-of-peer primary data'命令指定主端时会将主端的
数据推到主端,覆盖掉,所以需要谨慎操作,如果从端有数据需要进行备份(该参数只用一次,在
初始安装drbd的时候);
2、DRBD报错:0: Failure: (119) No valid meta-data signature found:
(1)原因:
使用fdisk分区时有问题;
(2)解决办法:
分区后'/dev/sdb2'分区不要格式化;如果执行'partprobe'命令报错,需要重启服务器,然后
重新初始化(drbdadm create-md data)数据后再启动(drbdadm up data);
3、查看drbd状态时出现secondary/Uknow的解决的方法:
(1)检查两台drbd服务器物理网络或者连接ip及主机直连路由是否正确;
route add -host '对端ip' dev eth0
(2)停止防火墙,或者放行drbd同步;
(3)还有可能发生裂脑了(官方推荐方法);
1)在从节点slave-db上做如下的操作:
drbdadm secondary data
drbdadm disconnect data
drbdadm -- --discard-my-data connect data
#是个断开连接的过程;
2)在主节点master-db上做如下的操:
通过cat /etc/proc/drbd查看状态,如果是WFConnection状态,需要手动进行连接;
drbdadm connect data
3)查看主从两端的状态:
cat /etc/proc/drbd
3、master-db的磁盘可见,slave-db的磁盘不可见;
实时的差异同步;