我们来谈谈网络文件系统复制。
许多情况下,网络文件系统复制通常在今天使用:
- 出于安全原因复制文件系统:如果一个节点发生故障,则可以访问另一个节点。
- 要将文件系统复制到另一个公司总部,所以每个客户都可以在本地访问他的数据,而不是通过公共网络。 但如果他去了另一个总部,他就拥有所有的资料,他也可以访问本地。
可以想像,这种系统通常用于构建集群环境的文件系统。
我们选择用DRDB实现解决方案。 它是主要的porpouse是(像其他系统这样)文件系统的高可用性和灾难恢复。
我们使用Debian 8实现该解决方案,但它也应该在Ubuntu上运行。
先决条件
在我们开始之前,这是先决条件:
- 至少有2个Debian服务器。
- Debian被安装为一个最小的安装(如果你知道你在生产系统上做什么,根本不需要)推荐指南https://www.youcl.com/tutorial/debian-8-jessie-minimal-server/
- 每个服务器中至少有2个Linux磁盘:/ dev / sda用于linux安装,/ dev / sdb用于DRDB安装。
注意!!!:在安装过程中,磁盘/ dev / sdb上的所有数据都将被破坏,所以不要在内部有数据的磁盘上工作。
DRBD安装
在我们的例子中,我将使用两个节点:
- 192.168.152.100 mysql1.local.vm
- 192.168.152.110 mysql2.local.vm
在所有节点上,修改文件/ etc / hosts,如下所示:
127.0.0.1 localhost
192.168.152.100 mysql1.local.vm mysql1
192.168.152.110 mysql2.local.vm mysql2
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
然后执行以下命令来安装DRDB:
apt-get update
apt-get -y upgrade
apt-get install drbd-utils
配置主要/次要 - 灾难恢复
主配置文件是/etc/drbd.conf,如下所示:
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
按照惯例,/ /etc/drbd.d/global_common.conf
包含 DRBD配置 的全局 和公共 部分,而 .res
文件 在每个部分中都 包含一个资源 。
在我们的例子中,我们做了一个最小化的设置来复制两个节点上的数据。 在每个节点进行以下修改:
我们将开始编辑文件/etc/drbd.d/global_common.conf modify the default line from
global {
usage-count yes;
# minor-count dialog-refresh disable-ip-verification
}
...
net {
protocol C;
# protocol timeout max-epoch-size max-buffers unplug-watermark
# connect-int ping-int sndbuf-size rcvbuf-size ko-count
# allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
# after-sb-1pri after-sb-2pri always-asbp rr-conflict
# ping-timeout data-integrity-alg tcp-cork on-congestion
# congestion-fill congestion-extents csums-alg verify-alg
# use-rle
}
...
现在我们将为我们的资源创建一个配置文件/etc/drbd.d/r0.res。 在所有节点上创建文件并在其中添加:
resource r0 { on mysql1.local.vm { device /dev/drbd1; disk /dev/sdb; address 192.168.152.100:7789; meta-disk internal; } on mysql2.local.vm { device /dev/drbd1; disk /dev/sdb; address 192.168.152.110:7789; meta-disk internal; } }
我们迄今所做的工作如下:
- 您可以使用usage-count参数将“选择加入”包含在DRBD的使用统计信息中。
- 资源被配置为使用完全同步复制,否则明确指定“协议Cunless”。
- 我们的集群由两个节点组成:mysql1和mysql2。
- 我们有一个任意命名为
r0
的资源,它使用/dev/sdb
作为下级设备,并配置了内部元数据。 - 该资源使用TCP端口7789作为其网络连接,并分别绑定到IP地址192.168.152.100和192.168.152.110。
在所有节点上,使用以下命令初始化元数据:
drbdadm create-md r0
你应该看到这样的东西:
--== Thank you for participating in the global usage survey ==--
The server's response is:
you are the 2963th user to install this version
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
success
接下来,我们启用资源并初始化第一个复制运行,仅在第一个节点上,它应该开始复制:
drbdadm up r0
drbdadm primary --force r0
要检查一切是否正常工作,您可以检查两个节点上的文件/ proc / drbd,并且看到如下所示:
Mysql1
root@mysql1:# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:54624 nr:0 dw:0 dr:55536 al:0 bm:3 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:5188060
[>....................] sync'ed: 1.1% (5064/5116)Mfinish: 0:17:21 speed: 4,964 (4,964) K/sec
Mysql2
root@mysql2:# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:0 nr:17496 dw:17496 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:5225188
[>....................] sync'ed: 0.4% (5100/5116)Mfinish: 0:29:41 speed: 2,916 (2,916) want: 5,160 K/sec
在构建阶段,您可以注意到UpToDate / Inconsistent ,这是正确的,因为这是数据的第一次同步。
在系统同步之后,这个shloud会更改为UpToDate / UpToDate,就像下面的日志一样:
root@mysql1:/home/sysop# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:5242684 nr:0 dw:0 dr:5243596 al:0 bm:320 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
现在我们有一个新的块设备,称为/ dev / drbd1,我们可以使用我们首选的文件系统类型进行格式化。 例如,如果我们要在ext4格式化它并将其安装在/ var / www上,我们可以简单地做:
root@mysql1:/home/sysop# mkfs.ext4 /dev/drbd1
mke2fs 1.42.12 (29-Aug-2014)
Creazione del file system con 1310671 4k blocchi e 327680 inode
Etichetta del file system=ab3e18c9-e8cb-42c8-977a-ab79bdb18aea
Backup del superblocco salvati nei blocchi:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: fatto
Scrittura delle tavole degli inode: fatto
Creating journal (32768 blocks): fatto
Scrittura delle informazioni dei super-blocchi e dell'accounting del file system: fatto
然后我们可以挂载我们的文件系统:
mkdir /var/www
mount /dev/drbd1 /var/www
/ var / www目录现在通过drbd系统进行安装。
在这种情况下,通过主/备配置,我们实施了一个灾难恢复系统。
在这种情况下,如果您尝试将文件系统安装在第二个节点上,则会出现错误:
root@mysql2:~# mount /dev/drbd1 /var/www/
mount: /dev/drbd1 is write-protected, mounting read-only
mount: mount /dev/drbd1 on /var/www failed: Tipo di supporto errato
由于我们的配置,这是正常和预期的。
现在我们可以模拟mysql1上的一个失败,所以用poweroff命令关闭它。
在mysql2上我们可以看到什么:
Oct 5 13:52:14 mysql2 kernel: [13458.629215] drbd r0: PingAck did not arrive in time.
Oct 5 13:52:14 mysql2 kernel: [13458.629587] drbd r0: peer( Primary -> Unknown ) conn( Connected -> NetworkFailure ) pdsk( UpToDate -> DUnknown )
Oct 5 13:52:14 mysql2 kernel: [13458.629919] drbd r0: asender terminated
Oct 5 13:52:14 mysql2 kernel: [13458.629921] drbd r0: Terminating drbd_a_r0
Oct 5 13:52:14 mysql2 kernel: [13458.630028] drbd r0: Connection closed
Oct 5 13:52:14 mysql2 kernel: [13458.630035] drbd r0: conn( NetworkFailure -> Unconnected )
Oct 5 13:52:14 mysql2 kernel: [13458.630035] drbd r0: receiver terminated
Oct 5 13:52:14 mysql2 kernel: [13458.630036] drbd r0: Restarting receiver thread
Oct 5 13:52:14 mysql2 kernel: [13458.630037] drbd r0: receiver (re)started
Oct 5 13:52:14 mysql2 kernel: [13458.630041] drbd r0: conn( Unconnected -> WFConnection )
mysql2节点检测到mysql1死了,如果我们检查/ proc / drbd:
root@mysql2:~# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:5457236 dw:5457236 dr:0 al:0 bm:320 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
我们可以看到状态从次要/主要更改为次要/未知。 所以现在我们做的伎俩,推广mysql2为主。 在mysql2上运行:
drbdadm primary r0
让我们再检查一下/ proc / drbd看魔法...
root@mysql2:~# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:5457236 dw:5457236 dr:912 al:0 bm:320 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
正如你可以看到我们的节点现在是主要的,可以定期安装。
root@mysql2:~# mount /dev/drbd1 /var/www/
root@mysql2:~# df -h
File system Dim. Usati Dispon. Uso% Montato su
/dev/sda1 9,3G 1,4G 7,5G 16% /
udev 10M 0 10M 0% /dev
tmpfs 97M 4,6M 92M 5% /run
tmpfs 241M 0 241M 0% /dev/shm
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 241M 0 241M 0% /sys/fs/cgroup
/dev/drbd1 4,8G 10M 4,6G 1% /var/www
现在我们假设我们要再次占用mysql1,如果我们现在开始我们来分裂大脑,你可以检查日志并查看这些错误:
Oct 5 14:26:04 mysql1 kernel: [ 7.760588] drbd r0: conn( StandAlone -> Unconnected )
Oct 5 14:26:04 mysql1 kernel: [ 7.760599] drbd r0: Starting receiver thread (from drbd_w_r0 [458])
Oct 5 14:26:04 mysql1 drbdadm[435]: adjust net: r0
Oct 5 14:26:04 mysql1 drbdadm[435]: ]
Oct 5 14:26:04 mysql1 kernel: [ 7.769318] drbd r0: receiver (re)started
Oct 5 14:26:04 mysql1 kernel: [ 7.769327] drbd r0: conn( Unconnected -> WFConnection )
Oct 5 14:26:04 mysql1 /etc/init.d/mysql[485]: MySQL PID not found, pid_file detected/guessed: /var/run/mysqld/mysqld.pid
Oct 5 14:26:04 mysql1 acpid: starting up with netlink and the input layer
Oct 5 14:26:04 mysql1 acpid: 1 rule loaded
Oct 5 14:26:04 mysql1 acpid: waiting for events: event logging is off
Oct 5 14:26:05 mysql1 kernel: [ 8.270578] drbd r0: Handshake successful: Agreed network protocol version 101
Oct 5 14:26:05 mysql1 kernel: [ 8.270581] drbd r0: Agreed to support TRIM on protocol level
Oct 5 14:26:05 mysql1 kernel: [ 8.270770] drbd r0: conn( WFConnection -> WFReportParams )
Oct 5 14:26:05 mysql1 kernel: [ 8.270771] drbd r0: Starting asender thread (from drbd_r_r0 [461])
Oct 5 14:26:05 mysql1 kernel: [ 8.272594] block drbd1: drbd_sync_handshake:
Oct 5 14:26:05 mysql1 kernel: [ 8.272597] block drbd1: self 242B364F4A5B9C68:525CC995A3CFBA2B:44A1DE193A6C6701:0000000000000004 bits:64463 flags:0
Oct 5 14:26:05 mysql1 kernel: [ 8.272598] block drbd1: peer 6903F6042F95F5FF:525CC995A3CFBA2A:44A1DE193A6C6700:0000000000000004 bits:4 flags:0
Oct 5 14:26:05 mysql1 kernel: [ 8.272599] block drbd1: uuid_compare()=100 by rule 90
Oct 5 14:26:05 mysql1 kernel: [ 8.272601] block drbd1: helper command: /sbin/drbdadm initial-split-brain minor-1
Oct 5 14:26:05 mysql1 kernel: [ 8.272692] drbd r0: meta connection shut down by peer.
Oct 5 14:26:05 mysql1 kernel: [ 8.272720] drbd r0: conn( WFReportParams -> NetworkFailure )
Oct 5 14:26:05 mysql1 kernel: [ 8.272722] drbd r0: asender terminated
Oct 5 14:26:05 mysql1 kernel: [ 8.272722] drbd r0: Terminating drbd_a_r0
Oct 5 14:26:05 mysql1 kernel: [ 8.279158] block drbd1: helper command: /sbin/drbdadm initial-split-brain minor-1 exit code 0 (0x0)
Oct 5 14:26:05 mysql1 kernel: [ 8.279173] block drbd1: Split-Brain detected but unresolved, dropping connection!
Oct 5 14:26:05 mysql1 kernel: [ 8.279197] block drbd1: helper command: /sbin/drbdadm split-brain minor-1
Oct 5 14:26:05 mysql1 kernel: [ 8.286125] block drbd1: helper command: /sbin/drbdadm split-brain minor-1 exit code 0 (0x0)
Oct 5 14:26:05 mysql1 kernel: [ 8.286144] drbd r0: conn( NetworkFailure -> Disconnecting )
Oct 5 14:26:05 mysql1 kernel: [ 8.286146] drbd r0: error receiving ReportState, e: -5 l: 0!
Oct 5 14:26:05 mysql1 kernel: [ 8.287009] drbd r0: Connection closed
Oct 5 14:26:05 mysql1 kernel: [ 8.287017] drbd r0: conn( Disconnecting -> StandAlone )
Oct 5 14:26:05 mysql1 kernel: [ 8.287018] drbd r0: receiver terminated
Oct 5 14:26:05 mysql1 kernel: [ 8.287019] drbd r0: Terminating drbd_r_r0
这是因为现在我们有两个主节点,这在主/备配置中是不可能的。 所以假设mysql2上有新的数据id,我们必须将mysql1降级到Secondary。
所以在mysql1上运行:
root@mysql1:~# drbdadm secondary r0
[email protected]:~# drbdadm connect --discard-my-data r0
在mysql2上,是分裂的大脑幸存者 ,我们必须执行:
root@mysql2:~# drbdadm connect r0
现在你可以检查一下是否正确重建,但现在mysql1是次要的,而mysql2是主要的。
root@mysql1:~# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:0 nr:28224 dw:28224 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:229628
[=>..................] sync'ed: 11.2% (229628/257852)K
finish: 0:01:04 speed: 3,528 (3,528) want: 6,600 K/sec