第1章 基本介绍
drbd(distrbuted replicated block device):分布式复制块设备
类似 rsync + inotify 的架构:inotify基于文件系统上层,当文件系统中有数据发生变化,就调用rsync服务,将文件系统中的文件同步到备库。
1.1 涉及对象
drbd 中的块设备可以是磁盘分区,lvm逻辑卷,或整块磁盘等。
1.2 原理
drbd软件工作位置是在文件系统层级以下,比文件系统更加靠近操作系统内核及IO栈。
基于网络的raid-1,当我们将数据写入本地磁盘系统时,数据还会被实时发送到网络中另一台主机中,以相同的形式记录在另一个磁盘系统中,使得本地(主节点)与远程主机(备节点)的数据保持实时数据同步。
如果本地系统出现故障,那么远程主机上还会保留有一份和主节点相同的数据备份可以继续使用。不会数据不会丢失。还会提升访问数据的用户访问体验(直接接管提供服务,降低宕机修复时间)。drbd服务的作用类似于磁盘阵形里的raid1功能,就相当于把网络中的两台服务器做成了类似磁盘阵列里的raid1一样。
Drbd工作原理图:
1.SERVICE 将数据写入==> FILE SYSTEM ==> BUFFER CACHE ==> DRBD
2.DRBD分两条路走,一条是通过磁盘驱动DISK DRIVER写入到磁盘
3.另一条通过tcp/ip协议,将数据通过网卡将数据发送到备节点…
1.1 两种工作模式
1)实时同步模式:
当数据写到本地磁盘和远端服务器磁盘都成功后才会返回成功写入。DRBD服务协议C级别就是这种模式,可以防止本地和远端数据丢失和不一致,此种模式是生产环境中最常用的模式。
2)异步同步模式:
当数据写入到本地服务器成功后就返回成功写入,不管远端服务器是否写入成功。
还可能是数据写入到本地服务器或远端服的buffer成功后,返回成功,就是DRBD服务协议的A,B级别
提示:在nfs网络文件系统的时候也有类似的参数和功能。例如:nfs服务参数sync和async,mount挂载参数也有sync和async。
1.2 DRBD的3种同步复制协议
协议A:异步复制协议。本地写成功后立即返回,数据放在发送BUFFER中,可能丢失。
协议B:内存同步(半同步)复制协议。本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失(mysql5.5以上支持)。
协议C:同步复制协议。本地和对方服务器磁盘都写成功确认后返回成功。如果单机掉电后单机磁盘损坏,数据都不会丢失。
工作中一般用协议C。选择协议将影响流量,从而影响网络延时。
1.3 DRBD的生产应用模式
单主模式及主备模式,为典型的高可用性集群方案。
复主模式:需要采用共享cluster文件系统,如gfs和ocfs2。用于需要从2个节点并发访问数据的场合,需要特别配置。
1.4 DRBD的企业应用场景
生产场景中会有很多基于高可用服务器对drbd的数据同步解决方案。
例如:heartbeat+drbd+nfs/mfs/gfs,heartbeat+drbd+mysql/oracle等。实际上drbd可以配合任意需要数据同步的所有服务的应用场景。
1.5 相关数据同步工具介绍
1) Rsync(配合实时同步工具sersync,inotify,lsyncd)
2) Scp (也可以配合 实时同步工具sersync,inotify,lsyncd)
3) Nc
4) Nfs
5) Union双机同步
6) Csync2多机同步
7) 软件自身同步机制(mysql,oracle,mongdb,ttserver,redis…)
提示:文件放到数据库,同步到从库,再把文件拿出来。
8) Drbd
补充:
Oracle dg分为基于物理block和逻辑block
逻辑:基于sql,类似mysql
物理:基于block块
从8i到10G都是这样的方式,特点是备节点不能提供服务,只能让备节点断开同步,以readony的方式打开,提价查询服务。
从11G开始,oracle就像mysql一样,主库可以写,从库可以读,11G为什么可以实现,是因为主要还是基于服务层来同步的。
而drbd因为是基于block块的,太底层了,主节点可以提供读写服务,而备节点的磁盘分区是处于非可见状态的。
第2章 Drdb 部署结构图
Drbd 主备模式
Drdb 主主 模式
IP规划 提示:第二块网卡不要配置网关 检查环境两台的hosts [root@linux-node1 html]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.1.80 linux-node1 172.16.1.81 linux-node2 查看 [root@linux-node2 html]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.1.80 linux-node1 172.16.1.81 linux-node2
因此我们创建了两个分区
[root@linux-node1 ~]# fdisk -l Disk /dev/sda: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0001c2db Device Boot Start End Blocks Id System /dev/sda1 * 1 131 1048576 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 131 391 2088960 82 Linux swap / Solaris Partition 2 does not end on cylinder boundary. /dev/sda3 391 2611 17832960 83 Linux Disk /dev/sdb: 536 MB, 536870912 bytes 64 heads, 32 sectors/track, 512 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 [root@linux-node1 ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xea60a6df. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-512, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-512, default 512): Using default value 512 Command (m for help): ^C [root@linux-node1 ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xf6d2e886. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-512, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-512, default 512): +384M Command (m for help): p Disk /dev/sdb: 536 MB, 536870912 bytes 64 heads, 32 sectors/track, 512 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xf6d2e886 Device Boot Start End Blocks Id System /dev/sdb1 1 385 394224 83 Linux Command (m for help): n Command action e extended p primary partition (1-4) 1 Invalid partition number for type `1' Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (386-512, default 386): Using default value 386 Last cylinder, +cylinders or +size{K,M,G} (386-512, default 512): Using default value 512 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@linux-node1 ~]# fdisk -l Disk /dev/sda: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0001c2db Device Boot Start End Blocks Id System /dev/sda1 * 1 131 1048576 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 131 391 2088960 82 Linux swap / Solaris Partition 2 does not end on cylinder boundary. /dev/sda3 391 2611 17832960 83 Linux Disk /dev/sdb: 536 MB, 536870912 bytes 64 heads, 32 sectors/track, 512 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xf6d2e886 Device Boot Start End Blocks Id System /dev/sdb1 1 385 394224 83 Linux /dev/sdb2 386 512 130048 83 Linux [root@linux-node1 ~]# partprobe [root@linux-node1 ~]# mkfs -t ext4 -c /dev/sdb1 [root@linux-node1 ~]# mount /dev/sdb2 /mnt 提示:如果硬盘大于2T 不能使用fdisk 可以使用parted
第1章 Drdb 安装
有两种安装方法,编译和包含Drdb的
有两种安装方法,编译和包含Drdb的 # 上传drbd-8.4.4.tar.gz的安装包 [root@linux-node1 tools]# ls drbd-8.4.4.tar.gz epel-release-6-8.noarch.rpm # 解压进入目录 [root@linux-node1 tools]# tar xf drbd-8.4.4.tar.gz [root@linux-node1 tools]# cd drbd-8.4.4 # 编译安装 [root@linux-node1 drbd-8.4.4]# ./configure --prefix=/application/drbd8.4.4 --with-km --with-heartbeat --sysconfdir=/etc/ # 指定内核源码路径,先查询 ,如果没有kernels 安装yum -y install kernel-devel kernel-headers flex gcc [root@linux-node1 drbd-8.4.4]# ls -ld /usr/src/kernels/$(uname -r) drwxr-xr-x. 22 root root 4096 5月 21 01:34 /usr/src/kernels/2.6.32-573.el6.x86_64 # 执行命令 [root@linux-node1 drbd-8.4.4]# make KDIR=/usr/src/kernels/$(uname -r)/ # 提示successful 就为正确
# 执行make && make install [root@linux-node1 drbd-8.4.4]# make && make install # 创建软连接 并检查 [root@linux-node1 application]# ln -s /application/drbd8.4.4/ /application/drbd [root@linux-node1 application]# ls -l /application/ 总用量 4 lrwxrwxrwx 1 root root 23 10月 16 01:44 drbd -> /application/drbd8.4.4/ drwxr-xr-x 6 root root 4096 10月 15 23:30 drbd8.4.4
第1章 pDrdb的相关配置
提示:DRBD 比较关键的DRBD 逻辑设备。DRBD是工作在内核中的 检查drbd 是否被正确加载到内核 [root@linux-node1 dev]# modprobe drbd [root@linux-node1 dev]# lsmod |grep drbd drbd 322182 0 libcrc32c 1246 1 drbd [root@linux-node1 dev]# echo "modprobe drbd" >>/etc/rc.local [root@linux-node1 dev]# global { usage-count no; } common { syncer { rate 1000M; verify-alg crc32c; } } # primary for drbd1 resource data{ protocol C; disk { on-io-error detach; } # server 1 on linux-node1 { device /dev/drbd0; disk /dev/sdb1; address 172.16.1.80:7788; #IP 地址 meta-disk /dev/sdb2[0]; } #server 2 on linux-node2 { device /dev/drbd0; disk /dev/sdb1; address 172.16.1.81:7788; meta-disk /dev/sdb2[0]; } } 没有中文版本 global { usage-count no; } common { syncer { rate 1000M; verify-alg crc32c; } } resource data{ protocol C; disk { on-io-error detach; } on linux-node1 { device /dev/drbd0; disk /dev/sdb1; address 172.16.1.80:7788; meta-disk /dev/sdb2[0]; } on linux-node2 { device /dev/drbd0; disk /dev/sdb1; address 172.16.1.81:7788; meta-disk /dev/sdb2[0]; } }
第1章 drbd初始化数据
6.1 linux-node1 初始化 [root@linux-node1 etc]# drbdadm --help 初始化 data [root@linux-node1 etc]# drbdadm create-md data Writing meta data... initializing activity log NOT initializing bitmap New drbd meta data block successfully created. 提示:其中初始化 data 是/etc/drbd.conf 配置的文件
6.2 linux-node2 初始化
[root@linux-node2 drbd-8.4.4]# drbdadm create-md data Writing meta data... initializing activity log NOT initializing bitmap New drbd meta data block successfully created.
6.3 启动DRBD
6.3.1 linux-node1 启动drdb [root@linux-node1 ~]# mkdir -p /application/drbd8.4.4/var/run/drbd [root@linux-node1 ~]# drbdadm up data [root@linux-node1 ~]# cat /proc/drbd version: 8.4.4 (api:1/proto:86-101) GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node1, 2017-10-15 23:30:07 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:262128 提示:Secondary/Secondary 表示正确
6.3.2 linux-node2 启动drdb
[root@linux-node1 ~]# mkdir -p /application/drbd8.4.4/var/run/drbd [root@linux-node1 ~]# drbdadm up data [root@linux-node1 ~]# cat /proc/drbd version: 8.4.4 (api:1/proto:86-101) GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node1, 2017-10-15 23:30:07 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:262128
第7章 启动drbd 并配置主从同步数据
提示:
1、 如果为空硬盘,可以随意执行操作不需要考虑数据。
2、 如果两边数据不一样(要特别注意同步数据的方向,否则可能会丢失数据)
[root@linux-node1 ~]# drbdadm — –overwrite-data-of-peer primary data
# 这条命令将linux-node1 服务器/dev/sdb1 的资源同步到linux-node2 /dev/sdb1 分区中。
7.1.1 查看linux-node1
# 在哪执行drbdadm 哪台就是主,执行后 查看/proc/drbd 显示进度条 [root@linux-node1 ~]# cat /proc/drbd version: 8.4.4 (api:1/proto:86-101) GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node1, 2017-10-15 23:30:07 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- ns:39364 nr:0 dw:0 dr:42228 al:0 bm:2 lo:0 pe:2 ua:3 ap:0 ep:1 wo:f oos:224240 [==>.................] sync'ed: 15.7% (224240/262128)K #进度条 finish: 0:00:11 speed: 18,944 (18,944) K/sec # 执行结束后 查看cat /proc/drbd [root@linux-node1 ~]# cat /proc/drbd version: 8.4.4 (api:1/proto:86-101) GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node1, 2017-10-15 23:30:07 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- # 提示 Connected 连接 ro: Primary主/Secondary 次 ds: UpToDate/UpToDate 已同步数据 ns:262128 nr:0 dw:0 dr:262792 al:0 bm:16 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0 发现
7.1.2 查看linux-node2
[root@linux-node2 ~]# cat /proc/drbd version: 8.4.4 (api:1/proto:86-101) GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node2, 2017-10-16 06:32:06 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----- # 提示 Connected 连接 ro: Secondary 次/ Primary 主 ds: UpToDate/UpToDate 已同步数据 ns:0 nr:262128 dw:262128 dr:0 al:0 bm:16 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
7.2 如果遇到问题:
1、 检查两台drdb服务器物理网卡,或者IP。
2、 检查防火墙
3、 是否是drbd脑裂导致
第8章 挂载测试数据库同步案例
# 查看是否有data 目录 [root@linux-node1 ~]# ll /data ls: 无法访问/data: 没有那个文件或目录 # 没有创建 [root@linux-node1 ~]# mkdir /data 8.1 挂载/data [root@linux-node1 ~]# mount /dev/drbd0 /data/ # 提示:drdb 不是通过直接挂载,而是通过/dev/drbd0 # 查看 [root@linux-node1 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 17G 4.7G 12G 30% / tmpfs 491M 16K 491M 1% /dev/shm /dev/sda1 976M 40M 886M 5% /boot /dev/drbd0 244M 2.1M 230M 1% /data 8.2 测试 在Linux-node1 创建20个目录 [root@linux-node1 ~]# cd /data/ [root@linux-node1 data]# ls lost+found [root@linux-node1 data]# touch `seq 20` [root@linux-node1 data]# ls 1 10 11 12 13 14 15 16 17 18 19 2 20 3 4 5 6 7 8 9 lost+found 8.3 测试 在Linux-node2 查看数据 # 提示 如果在Linux-node2 是无法挂载 [root@linux-node2 ~]# drbdadm down data [root@linux-node2 ~]# cat /proc/drbd version: 8.4.4 (api:1/proto:86-101) GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node2, 2017-10-16 06:32:06 [root@linux-node2 ~]# ll /data ls: 无法访问/data: 没有那个文件或目录 [root@linux-node2 ~]# mkdir /data [root@linux-node2 ~]# mount /dev/sdb sdb sdb1 sdb2 [root@linux-node2 ~]# mount /dev/sdb1 /data/ [root@linux-node2 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 17G 2.4G 14G 16% / tmpfs 491M 12K 491M 1% /dev/shm /dev/sda1 976M 40M 886M 5% /boot /dev/sdb1 244M 2.1M 230M 1% /data [root@linux-node2 ~]# ls /data/ 1 10 11 12 13 14 15 16 17 18 19 2 20 3 4 5 6 7 8 9 lost+found