DRBD-MYSQL分佈式塊設備實現高可用node
DRBD是一個用軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲複製解決方案。 DRBD Logo數據鏡像:實時、透明、同步(全部服務器都成功後返回)、異步(本地服務器成功後返回)。DBRD的核心功能經過Linux的內核實現,最接近系統的IO棧,但它不能神奇地添加上層的功能好比檢測到EXT3文件系統的崩潰。DBRD的位置處於文件系統如下,比文件系統更加靠近操做系統內核及IO棧。mysql
環境:linux
192.168.5.101 cml1算法
192.168.5.102 cml2sql
[root@cml1 ~]# cat /etc/hostsvim
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4centos
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6api
192.168.5.101 cml1 wwwNaNl1.com服務器
192.168.5.102 cml2 wwwNaNl2.com網絡
192.168.5.104 cml3 wwwNaNl3.com
192.168.5.105 cml4 wwwNaNl4.com
[root@cml1 ~]# ssh-keygen
[root@cml1 ~]# ssh-copy-id cml2
[root@cml1 ~]# crontab -l
*/5 * * * * ntpdate cn.pool.ntp.org
[root@cml1 ~]# rpm --importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@cml1 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@cml1 ~]# yum install -y kmod-drbd84 drbd84-utils
/etc/drbd.conf #主配置文件
/etc/drbd.d/global_common.conf#全局配置文件
[root@cml1 ~]# cat /etc/drbd.conf
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include"drbd.d/global_common.conf";
include "drbd.d/*.res";
[root@cml1 ~]# vim/etc/drbd.d/global_common.conf
global {
usage-count no; #是否參加DRBD使用統計,默認爲yes。官方統計drbd的裝機量
#minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; #使用DRBD的同步協議
handlers {
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh;/usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ;reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh;/usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ;reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh;/usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ;halt -f";
}
startup {
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
}
options {
# cpu-mask on-no-data-accessible
}
disk {
on-io-error detach; #配置I/O錯誤處理策略爲分離
# size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
# disk-drain md-flushes resync-rate resync-after al-extents
# c-plan-ahead c-delay-target c-fill-target c-max-rate
# c-min-rate disk-timeout
}
net {
# 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
}
syncer {
rate 1024M; #設置主備節點同步時的網絡速率
}
}
註釋: on-io-error 策略可能爲如下選項之一
detach 分離:這是默認和推薦的選項,若是在節點上發生底層的硬盤I/O錯誤,它會將設備運行在Diskless無盤模式下
pass_on:DRBD會將I/O錯誤報告到上層,在主節點上,它會將其報告給掛載的文件系統,可是在此節點上就每每忽略(所以此節點上沒有能夠報告的上層)
-local-in-error:調用本地磁盤I/O處理程序定義的命令;這須要有相應的local-io-error調用的資源處理程序處理錯誤的命令;這就給管理員有足夠自由的權力命令命令或是腳本調用local-io-error處理I/O錯誤定義一個資源
[root@cml1 ~]# cat/etc/drbd.d/mysql.res
resource mysql { ##資源名稱
protocol C; ##使用協議
meta-disk internal;
device /dev/drbd1; ##DRBD設備名稱
syncer {
verify-alg sha1; ##加密算法
}
net {
allow-two-primaries;
}
on cml1 {
disk /dev/sdb1; ##drbd使用的磁盤分區爲「mysql」(能夠不想同的磁盤名字)
address 192.168.5.101:7789; ##設置DRBD監聽地址的端口
}
on cml2 {
disk /dev/sdb1;
address 192.168.5.102:7789;
}
}
[root@cml1 ~]# scp -rp /etc/drbd.d/*cml2:/etc/drbd.d/
##而後在兩臺機器上安裝mariadb
[root@cml1 ~]# yum install -ymariadb-server mariadb
[root@cml1 ~]# mkdir /data/
[root@cml1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommendedto prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored whensystemd is used.
# If you need to run mysqld under adifferent user or group,
# customize your systemd unit file formariadb according to the
# instructions inhttp://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the configdirectory
#
!includedir /etc/my.cnf.d
[root@cml1 ~]# chown mysql:mysql /data/
[root@cml1 ~]# drbdadm create-md mysql
initializing activity log
initializing bitmap (160 KB) to all zero
Writing meta data...
New drbd meta data block successfullycreated.
[root@cml1 ~]# modprobe drbd
##查看內核是否已經加載了模塊:
[root@cml1 drbd.d]# lsmod | grep drbd
drbd 396875 1
libcrc32c 12644 4 xfs,drbd,ip_vs,nf_conntrack
###
[root@cml1 ~]# drbdadm up mysql
[root@cml1 ~]# drbdadm -- --force primarymysql
##查看狀態:
[root@cml1 ~]# cat /proc/drbd
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4cbuild by mockbuild@, 2017-09-15 14:23:22
1:cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----s
ns:0 nr:0 dw:0 dr:912 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:foos:5240636
[root@cml2 ~]# chown mysql:mysql /data/
[root@cml2 ~]# drbdadm create-md mysql
[root@cml2 ~]# modprobe drbd
[root@cml2 ~]# drbdadm up mysql
在從上面能夠查看數據同步的狀態:
[root@cml2 ~]# cat /proc/drbd
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash:a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-1514:23:22
1:cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:0 nr:1513472 dw:1513472 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:foos:3727164
[====>...............] sync'ed: 29.0% (3636/5116)M
finish: 0:01:32 speed: 40,192 (38,804) want: 102,400 K/sec
[root@cml1 ~]# mkfs.ext4 /dev/drbd1
meta-data=/dev/drbd1 isize=512 agcount=4, agsize=327540 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1310159,imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560,version=2
= sectsz=512 sunit=0 blks,lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@cml1 ~]# mount /dev/drbd1 /mnt
[root@cml1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 17G 6.9G 11G 41% /
devtmpfs 588M 0 588M 0% /dev
tmpfs 599M 0 599M 0% /dev/shm
tmpfs 599M 34M 565M 6% /run
tmpfs 599M 0 599M 0% /sys/fs/cgroup
/dev/sda1 1014M 168M 847M 17% /boot
/dev/drbd1 5.0G 33M 5.0G 1% /mnt
注####要想使得從能夠掛載,咱們必須,先把主切換成叢,而後再到從上面掛載:
有以下資源:
資源的鏈接狀態;一個資源可能有如下鏈接狀態中的一種
StandAlone 獨立的:網絡配置不可用;資源尚未被鏈接或是被管理斷開(使用 drbdadm disconnect 命令),或是因爲出現認證失敗或是腦裂的狀況
Disconnecting 斷開:斷開只是臨時狀態,下一個狀態是StandAlone獨立的
Unconnected 懸空:是嘗試鏈接前的臨時狀態,可能下一個狀態爲WFconnection和WFReportParams
Timeout 超時:與對等節點鏈接超時,也是臨時狀態,下一個狀態爲Unconected懸空
BrokerPipe:與對等節點鏈接丟失,也是臨時狀態,下一個狀態爲Unconected懸空
NetworkFailure:與對等節點推進鏈接後的臨時狀態,下一個狀態爲Unconected懸空
ProtocolError:與對等節點推進鏈接後的臨時狀態,下一個狀態爲Unconected懸空
TearDown 拆解:臨時狀態,對等節點關閉,下一個狀態爲Unconected懸空
WFConnection:等待和對等節點創建網絡鏈接
WFReportParams:已經創建TCP鏈接,本節點等待從對等節點傳來的第一個網絡包
Connected 鏈接:DRBD已經創建鏈接,數據鏡像如今可用,節點處於正常狀態
StartingSyncS:徹底同步,有管理員發起的剛剛開始同步,將來可能的狀態爲SyncSource或PausedSyncS
StartingSyncT:徹底同步,有管理員發起的剛剛開始同步,下一狀態爲WFSyncUUID
WFBitMapS:部分同步剛剛開始,下一步可能的狀態爲SyncSource或PausedSyncS
WFBitMapT:部分同步剛剛開始,下一步可能的狀態爲WFSyncUUID
WFSyncUUID:同步即將開始,下一步可能的狀態爲SyncTarget或PausedSyncT
SyncSource:以本節點爲同步源的同步正在進行
SyncTarget:以本節點爲同步目標的同步正在進行
PausedSyncS:以本地節點是一個持續同步的源,可是目前同步已經暫停,多是由於另一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步
PausedSyncT:以本地節點爲持續同步的目標,可是目前同步已經暫停,這能夠是由於另一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步
VerifyS:以本地節點爲驗證源的線上設備驗證正在執行
VerifyT:以本地節點爲驗證目標的線上設備驗證正在執行
[root@cml1 ~]# cat /proc/drbd
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash:a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-1514:23:22
1:cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:10526345 nr:340312 dw:392669 dr:10488683 al:24 bm:0 lo:0 pe:0 ua:0ap:0 ep:1 wo:f oos:0
[root@cml1 etc]# drbd-overview
NOTE: drbd-overview will be deprecatedsoon.
Please consider using drbdtop.
1:mysql/0 Connected Secondary/Primary UpToDate/UpToDate
You have new mail in /var/spool/mail/root
node3如今是master狀態:
[root@cml2 ~]# drbd-overview
NOTE: drbd-overview will be deprecatedsoon.
Please consider using drbdtop.
1:mysql/0 Connected Primary/Secondary UpToDate/UpToDate /test xfs 5.0G 33M 5.0G 1%
You have new mail in /var/spool/mail/root
[root@cml2 ~]# iptables -P INPUT DROP. ##注意這裏要先開啓22端口:
###咱們查看一下cml1的狀態:
[root@cml1 etc]# drbd-overview
NOTE: drbd-overview will be deprecatedsoon.
Please consider using drbdtop.
1:mysql/0 WFConnection Secondary/Unknown UpToDate/DUnknown
You have new mail in /var/spool/mail/root
###如今是Unknown狀態,是不可用的:
[root@cml1 etc]# drbdadm primary mysql
[root@cml1 etc]# drbd-overview
NOTE: drbd-overview will be deprecatedsoon.
Please consider using drbdtop.
1:mysql/0 WFConnection Primary/Unknown UpToDate/DUnknown
[root@cml1 etc]# mount /dev/drbd1 /mnt/
[root@cml1 etc]# ls /mnt/
xiaoluo.txt
iptables -P INPUT ACCEPT
##查看兩個結點的狀態:
[root@cml1 etc]# drbdadm role mysql
Primary/Unknown
[root@cml2 ~]# drbdadm role mysql
Primary/Unknown
##查看兩個的連接狀態:
[root@cml1 etc]# drbd-overview
NOTE: drbd-overview will be deprecatedsoon.
Please consider using drbdtop.
1:mysql/0 StandAlone Primary/Unknown UpToDate/DUnknown /mnt xfs 5.0G 33M 5.0G 1%
[root@cml2 ~]# drbd-overview
NOTE: drbd-overview will be deprecatedsoon.
Please consider using drbdtop.
1:mysql/0 StandAlone Primary/Unknown UpToDate/DUnknown /test xfs 5.0G 33M 5.0G 1%
[root@cml1 ~]# umount /mnt/
[root@cml1 ~]# drbdadm disconnect mysql
??: Failure: (162) Invalid configurationrequest
additional info from kernel:
unknown connection
Command 'drbdsetup-84 disconnectipv4:192.168.113.143:7789 ipv4:192.168.113.144:7789' terminated with exit code10
要把mariadb stop掉才能夠切成secondary
[root@cml1 ~]# drbdadm secondary mysql
[root@cml1 ~]# drbd-overview
NOTE: drbd-overview will be deprecatedsoon.
Please consider using drbdtop.
1:mysql/0 StandAlone Secondary/Unknown UpToDate/DUnknown
[root@cml1 ~]# drbdadm connect--discard-my-data mysql ##在從主機上作
##如今咱們查看一下集羣結點仍是不能用的:
[root@cml1 ~]# drbd-overview
NOTE: drbd-overview will be deprecatedsoon.
Please consider using drbdtop.
1:mysql/0 WFConnection Secondary/Unknown UpToDate/DUnknown
[root@cml2 ~]# drbdadm connect mysql ##在主的主機上面作
##而後咱們再查看一下狀態:
[root@cml2 ~]# drbd-overview
NOTE: drbd-overview will be deprecatedsoon.
Please consider using drbdtop.
1:mysql/0 Connected Primary/Secondary UpToDate/UpToDate /test xfs 5.0G 33M 5.0G 1%
[root@cml1 ~]# drbd-overview
NOTE: drbd-overview will be deprecatedsoon.
Please consider using drbdtop.
1:mysql/0 Connected Secondary/Primary UpToDate/UpToDate