#################################################################node
開篇引題mysql
Distributed Replicated Block Deviceweb
部署MFSsql
部署Corosync+Pacemakervim
故障模擬測試安全
補充和總結bash
#################################################################服務器
開篇引題網絡
直接上圖,有圖有真相啊!此圖是MFS網絡組成和運行原理,先不說圖中每種角色的做用(下文會有詳細說明),直觀信息告訴咱們客戶端不管是讀寫請求都須要與MasterServer通訊,而圖中MasterServer角色只有一個,所以單點故障的因素就顯而易見了。解決MFS的單點故障正是本文的初衷,接下來就介紹如何利用多種技術解決MFS的單點故障,實現MasterServer的高可用。
session
Distributed Replicated Block Device
分佈式複製塊設備是Linux內核的存儲層中的一個分佈式存儲系統,可利用DRBD在兩臺Linux服務器之間共享塊設備、文件系統和數據,相似於一個網絡RAID1的功能,內核中的DRBD模塊監聽特定套接字上,複製系統調用產生的寫數據爲副本並經過TCP協議發送至DRBD從節點,由於節點間磁盤設備每個數據位都是相同的,因此DRBD能夠實現廉價塊級別的數據共享。
DRBD工做模型
主從模型(primary/secondary),同一時刻只能有一個節點提供服務(不然會產生腦裂),從節點沒法使用磁盤分區(掛載也不能夠)。
主主模型(primary/primary),須要藉助於集羣文件系統並啓用分佈式文件鎖功能,並且寫性能不會有提高.
DRBD管理
內核模塊:drbd用戶空間
管理工具:drbdadm,drbdsetup,drbdmeta
工做流程(默認模型是Sync)
Async:副本交於本地TCP/IP協議棧就返回(性能最高)
SemiSync:副本交對方TCP/IP協議棧就返回(折中方案)
Sync:副本被secondary存儲到磁盤中就返回(性能差)
安裝配置DRBD(drbd內核模塊必須和內核版本徹底匹配)
rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm
主配置文件
[root@one packages]# 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";
全局配置文件
cat /etc/drbd.d/global_common.conf global { usage-count yes; # minor-count dialog-refresh disable-ip-verification } common { 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"; # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; } startup { # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb } options { # cpu-mask on-no-data-accessible } disk { on-io-error detach; # 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 { cram-hmac-alg "sha1"; shared-secret "soulboy"; # 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 1000M; } }
定義資源mfs
[root@one packages]# cat /etc/drbd.d/mydata.res resource mydata { on one.soulboy.com { device /dev/drbd0; disk /dev/sdb2; #大小要一致 address 192.168.1.61:7789; meta-disk internal; } on two.soulboy.com { device /dev/drbd0; disk /dev/sdb1; #大小要一致 address 192.168.1.62:7789; meta-disk internal; } } resource mfs { on one.soulboy.com { device /dev/drbd1; disk /dev/sdb3; address 192.168.1.61:7788; meta-disk internal; } on two.soulboy.com { device /dev/drbd1; disk /dev/sdb2; address 192.168.1.62:7788; meta-disk internal; } }
同步配置文件到從節點
scp /etc/drbd.d/* two.soulboy.com:/etc/drbd.d/
初始化資源(分別在兩個節點上執行)
drbdadm create-md mfs
啓動資源(分別在兩個節點上執行)
service drbd start
將某節點變爲主節點(192.168.1.61爲主節點)
drbdadm primary --force mydata
查看狀態肯定同步完畢
[root@one packages]# service drbd status 1:mfs Connected Primary/Secondary UpToDate/UpToDate C /mfs ext4
格式化文件系統(在主節點)
mke2fs -t ext4 /dev/drbd1
容許對方搶佔(分別在兩節點上執行)
drbdadm primary mfs
開機不要自動啓動
chkconfig drbd off
部署MFS
MFS工做原理
MFS文件系統可以實現RAID功能,節約成本,不遜色於專業的存儲系統,能夠實如今線擴容。
MFS的四種角色
MasterServer(元數據服務器):負責管理各個ChunkServer及調度文件讀寫,回收文件空間及恢復多節點拷貝。
Metalogger(元數據日誌服務器):負責備份管理服務器的變化日誌文件。
ChunkServer(數據存儲服務器):真正存儲用戶數據的服務器,將文件切塊相互同步,遵從MasterServer的調度爲Client提供數據傳輸,Chunk節點數量越多,可靠性和MFS可用的磁盤空間就會越大。
Client(客戶端):客戶端經過fuse內核接口遠程管理服務器上所管理的數據存儲服務器,和使用本地文件系統同樣。
安裝配置元數據服務
mount /dev/drbd1 /mfs #掛載drbd設備 groupadd -g 1000 mfs #兩邊節點的uid要統一 useradd -u 1000 -g mfs -s /sbin/nologin mfs #兩邊節點都須要建立 mkdir -pv /mfs #主節點建立數據目錄便可 chown -R mfs.mfs /mfs #兩個節點修改目錄屬主和屬組爲mfs tar xf mfs-1.6.26.tar.gz cd mfs-1.6.26 ./configure --prefix=/mfs --with-default-user=mfs --with-default-group=mfs make && make install cp /mfs/etc/mfsmaster.cfg.dist /mfs/etc/mfsmaster.cfg cp /mfs/etc/mfsexports.cfg.dist /mfs/etc/mfsexports.cfg cp /mfs/var/mfs/metadata.mfs.empty /mfs/var/mfs/metadata.mfs
主配置文件
vim /mfs/etc/mfsmaster.cfg # WORKING_USER = mfs #運行用戶 # WORKING_GROUP = mfs #運行組 # SYSLOG_IDENT = mfsmaster #在syslog中標識本身 # LOCK_MEMORY = 0 #是否執行mlockall()以免mfsmaster進程溢出(默認爲0) # NICE_LEVEL = -19 #運行的優先級 # EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg #目錄控制文件路徑 # TOPOLOGY_FILENAME = /usr/local/mfs/etc/mfstopology.cfg #拓撲類型文件路徑 # DATA_PATH = /usr/local/mfs/var/mfs #數據存放路徑(changelog,sessions,stats) # BACK_LOGS = 50 #元數據的改變日誌文件數量 # BACK_META_KEEP_PREVIOUS = 1 # # REPLICATIONS_DELAY_INIT = 300 #延遲複製時間(300秒) # REPLICATIONS_DELAY_DISCONNECT = 3600 #ChunkServer斷開復制的延遲 # MATOML_LISTEN_HOST = * #元數據日誌服務器監聽的IP地址(*表明任何IP) # MATOML_LISTEN_PORT = 9419 #元數據日誌服務器監聽的端口地址(9419) # MATOCS_LISTEN_HOST = * #用於ChunkServer鏈接的IP地址(*表明任何IP) # MATOCS_LISTEN_PORT = 9420 #用於ChunkServer鏈接的端口(9420) # MATOCL_LISTEN_HOST = * #用於客戶端鏈接的地址 # MATOCL_LISTEN_PORT = 9421 #用於客戶端鏈接的端口 # CHUNKS_LOOP_CPS = 100000 # CHUNKS_LOOP_TIME = 300 #Chunks迴環頻率 # CHUNKS_SOFT_DEL_LIMIT = 10 # CHUNKS_HARD_DEL_LIMIT = 25 # CHUNKS_WRITE_REP_LIMIT = 2 #在一個循環裏複製到一個ChunkServer的最大Chunks數目 # CHUNKS_READ_REP_LIMIT = 10 # REJECT_OLD_CLIENTS = 0 #彈出低於1.6.0客戶端的鏈接
目錄掛載控制文件
vim /mfs/etc/mfsexports.cfg #分爲三個部分,無需修改 * . rw * / rw,alldirs,maproot=0 客戶端IP 被掛載目錄 客戶端擁有的權限
爲MasterServer提供lsb格式啓動腳本
cat /etc/init.d/mfsmaster # chkconfig: 345 91 10 # description: mfs start. . /etc/rc.d/init.d/functions . /etc/sysconfig/network path="/mfs/sbin" [ "${NETWORKING}" = "no" ] && exit 0 start() { $path/mfsmaster start $path/mfscgiserv start } stop() { $path/mfsmaster stop $path/mfscgiserv start } restart() { $path/mfsmaster restart $path/mfscgiserv restart } status() { $path/mfsmaster test $path/mfscgiserv test } case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; *) echo $"Usage: $0 start|stop|restart|status" exit 1 esac exit 0
修改權限
chmod 755 /etc/init.d/mfsmaster
導出命令
echo 'export PATH=$PATH:/mfs/sbin' > /etc/profile.d/mfs.sh . /etc/profile.d/mfs.sh
同步啓動腳本至從節點
scp -p /etc/init.d/mfsmaster two:/etc/init.d/
關閉服務卸載drbd設備
service mfsmaster stop umount /dev/drbd1
部署Corosync+Pacemaker
Corosync是集羣管理套件的一部分,它在傳遞信息的時候能夠經過一個簡單的配置文件來定義信息傳遞的方式和協議等,RHCS集羣套件就是基於corosync實現。但corosync只提供了message layer的能力。集羣的資源管理則須要Pacemaker,其管理接口有兩個分別是crmsh和pcs。
環境準備
service NetworkManager stop
時間同
主機名稱解析的結果等於uname -n
安裝(pacemaker做爲corosync的插件運行)
yum install -y corosync pacemaker
資源管理器配置接口基於crmsh
yum install -y crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm
生成密鑰
corosync-keygen cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
配置文件
vim /etc/corosync/corosync.conf #添加pacemaker插件 compatibility: whitetank #是否兼容0.8版本的corosync totem { #用來定義集羣節點心跳信息傳遞 version: 2 #版本號 secauth: on #啓用安全認證機制 threads: 0 #啓用多少線程完成心跳信息傳遞 interface { #定義心跳信息傳遞的接口 ringnumber: 0 #避免循環轉發心跳信息 bindnetaddr: 192.168.2.0 #指定網卡的網絡地址 mcastaddr: 226.194.61.21 #心跳信息使用的組播地址 mcastport: 5405 #組播監聽端口 ttl: 1 } } logging { #心跳信息層日誌 fileline: off # to_stderr: no #是否把錯誤信息發往屏幕 to_logfile: yes #使用自定義日誌文件logfile to_syslog: no #是否記錄到系統日誌 logfile: /var/log/cluster/corosync.log debug: off #調試功能 timestamp: on #每次記錄心跳信息是否記錄時間戳 logger_subsys { subsys: AMF debug: off } } amf { mode: disabled } service { #添加pacemaker插件 ver: 0 name: pacemaker } aisexec { #可省略 user: root group: root }
複製配置文件到其餘節點
scp -p /etc/corosync/corosync.conf /etc/corosync/authkey two.soulboy.com:/etc/corosync/
分別在兩節點啓動corosync服務
service corosync start
使用crmsh接口定義drbd資源(忽略法定票數、禁用stonith設備)
crm(live)configure# property no-quorum-policy=ignore crm(live)configure# property stonith-enabled=false
定義原始資源
crm(live)configure# primitive mfs_drbd ocf:linbit:drbd params drbd_resource=mfs op monitor role=Master interval=10 timeout=20 op monitor role=Slave interval=20 timeout=20 op start timeout=240 op stop timeout=100 #定義drbd資源 crm(live)configure# ms ms_mfs_drbd mfs_drbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" #定義drbd的克隆資源、克隆屬性 crm(live)configure# primitive mfsstore ocf:heartbeat:Filesystem params device="/dev/drbd1" directory="/mfs" fstype="ext4" op monitor interval=40 timeout=40 op start timeout=60 op stop timeout=60 #定義本地掛載資源 crm(live)configure# primitive mfsip ocf:heartbeat:IPaddr params ip="192.168.1.40" op monitor interval=20 timeout=20 on-fail=restart #定義vip crm(live)configure# primitive mfsserver lsb:mfsmaster #定義mfs服務
定義colocation約束(資源運行在同一個節點上的偏好)
crm(live)configure# colocation mfsstore_with_ms_mfs_drbd_master inf: mfsstore ms_mfs_drbd:Master #掛載資源追隨drbd主資源在一塊兒 crm(live)configure# colocation mfsserver_with_mfsstore inf: mfsserver mfsstore #mfs服務追隨掛載資源 crm(live)configure# colocation mfsip_with_mfsserver inf: mfsip mfsserver #vip追隨mfs服務
定義資源組(若是定義了資源組就沒有必要定義colocation約束了)
crm(live)configure# group ha_mfsservice mfsstore mfsserver mfsip #本文沒有這樣作,但特此說明這樣作也是能夠的
定義order約束(資源啓動和關閉的次序)
crm(live)configure# order ms_mfs_drbd_before_mfsstore mandatory: ms_mfs_drbd:promote mfsstore:start #節點上存在drbdMaster才能啓動mystore服務 crm(live)configure# order mfsstore_before_mfsserver mandatory: mfsstore:start mfsserver:start #mystore服務啓動才能啓動mfs服務 crm(live)configure# order mfsip_before_mfsserver mandatory: mfsip mfsserver #vip啓動才能啓動mfs服務
定義location約束(資源對節點的傾向性)
location mfsservice_prefer_one ha_mfsservice 500: one.soulboy.com #主節點從故障中回覆是否能夠將資源搶奪回來,本文沒有這樣作,特此說明這樣作是能夠完成資源搶佔的。
檢查語法並保存
crm(live)configure# verify crm(live)configure# commit
查看集羣狀態(發現資源都運行在主節點上)
[root@one packages]# crm crm(live)# status Online: [ one.soulboy.com two.soulboy.com ] Master/Slave Set: ms_mfs_drbd [mfs_drbd] Masters: [ one.soulboy.com ] Slaves: [ two.soulboy.com ] mfsstore (ocf::heartbeat:Filesystem): Started one.soulboy.com mfsserver (lsb:mfsmaster): Started one.soulboy.com mfsip (ocf::heartbeat:IPaddr): Started one.soulboy.com
查看驗證
[root@one ~]# drbd-overview #drbd資源正常 1:mfs/0 Connected Primary/Secondary UpToDate/UpToDate C r----- /mfs ext4 5.0G 142M 4.6G 3% [root@one ~]# service mfsmaster status #mfs資源正常 mfsmaster pid: 13966 mfscgiserv pid:14158 [root@one ~]# ip addr show | grep 192.168.1.40 #vip資源正常 inet 192.168.1.40/24 brd 192.168.1.255 scope global secondary eth0 [root@one ~]# ls /mfs #掛載資源正常 etc lost+found sbin share var
故障模擬測試
安裝ChunkServer
useradd mfs -s /sbin/nologin tar xf mfs-1.6.26.tar.gz cd mfs-1.6.26 ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs make && make install cp /usr/local/mfs/etc/mfschunkserver.cfg.dist /usr/local/mfs/etc/mfschunkserver.cfg cp /usr/local/mfs/etc/mfshdd.cfg.dist /usr/local/mfs/etc/mfshdd.cfg
主配置文件
vim /usr/local/mfs/etc/mfschunkserver.cfg # WORKING_USER = mfs # WORKING_GROUP = mfs # SYSLOG_IDENT = mfschunkserver # LOCK_MEMORY = 0 # NICE_LEVEL = -19 # DATA_PATH = /usr/local/mfs/var/mfs # MASTER_RECONNECTION_DELAY = 5 # BIND_HOST = * MASTER_HOST = 192.168.1.40 #元數據服務器的地址 MASTER_PORT = 9420 #元數據服務器監聽端口 # MASTER_TIMEOUT = 60 # CSSERV_LISTEN_HOST = * # CSSERV_LISTEN_PORT = 9422 #此端口用戶和其餘ChunkServer間複製數據 # HDD_CONF_FILENAME = /usr/local/mfs/etc/mfshdd.cfg #分配給MFS磁盤使用空間配置文件路徑 # HDD_TEST_FREQ = 10 # LOCK_FILE = /var/run/mfs/mfschunkserver.lock # BACK_LOGS = 50 # CSSERV_TIMEOUT = 5
磁盤空間配置文件
vim /usr/local/mfs/etc/mfshdd.cfg /data #/data是一個MFS的分區,實例化爲本機一個獨立的磁盤掛載分區。
修改權限並啓動服務
chown -R mfs:mfs /data mfschunkserver start
Client編譯安裝
MFS客戶端依賴於fuse
tar xf fuse-2.9.2.tar.gz cd fuse-2.9.2 ./configure make && make install vim /etc/profile #在最後添加 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH source /etc/profile #即時生效 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
安裝MFS客戶端
useradd mfs -s /sbin/nologin tar xf mfs-1.6.26.tar.gz cd mfs-1.6.26 ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --enable-mfsmount make && make install modprobe fuse #加載fuse到內核
掛載MFS文件系統
mkdir /webdata #建立本地目錄做爲掛載點 /usr/local/mfs/bin/mfsmount /webdata -H 192.168.1.40 #掛載MFS到本地/webdata目錄
掛載MFSMeta文件系統
mkdir /webdatameta #建立本地MFSMeta目錄 /usr/local/mfs/bin/mfsmount -m /webdatameta -H 192.168.1.40 #掛載MFSMeta文件系統
client建立文件並查看信息(正常)
[root@five /]# echo "123" > /webdata/one #建立文件 [root@five /]# mfsfileinfo /webdata/one #查看副本和存儲節點 /webdata/one: chunk 0: 0000000000000006_00000001 / (id:6 ver:1) copy 1: 192.168.1.50:9422 copy 2: 192.168.1.64:9422
登陸web管理控制檯(正常)
模擬主節點故障
crm(live)node# standby #離線,等待幾秒鐘 crm(live)node# online #上線 crm(live)node# cd #回退 crm(live)# status #查看集羣資源狀態 Online: [ one.soulboy.com two.soulboy.com ] Master/Slave Set: ms_mfs_drbd [mfs_drbd] Masters: [ two.soulboy.com ] Slaves: [ one.soulboy.com ] mfsstore (ocf::heartbeat:Filesystem): Started two.soulboy.com mfsserver (lsb:mfsmaster): Started two.soulboy.com mfsip (ocf::heartbeat:IPaddr): Started two.soulboy.com
client再次建立文件並查看副本數(正常)
[root@five /]# echo "123" > /webdata/two [root@five /]# mfsfileinfo /webdata/two /webdata/two: chunk 0: 0000000000000007_00000001 / (id:7 ver:1) copy 1: 192.168.1.50:9422 copy 2: 192.168.1.64:9422
再次登陸web管理控制檯(正常)
補充和總結
解決MFS單點故障的主要思路是將MasterServer安裝在drbd設備目錄中,經過corosync+pacemaker將drbd、vip、mount、mfsmaster資源粘合在一塊兒,並經過colocation和order的約束保證了資源間依賴關係和啓動次序,此外mfsmaster的啓動在pacemaker中定義爲lsb風格RA,也就是形如/etc/init.d/目錄下的sysv風格的腳本。值得一提的是pacemaker的管理接口,本文中使用的是crmsh,而pcs接口有着比crmsh更強大的功能,能夠實現管理集羣整個生命週期,支持節點的添加、移除、啓動、關閉等操做。
實現mysql的高可用也能夠經過本文這種思路實現,具體步驟可參考本文,這裏補充下pcs接口的用法,方便讀者作對比。
pcs resource create myvip ocf:heartbeat:IPaddr params ip=192.168.1.70 op monitor interval=20 timeout=20 on-fail=restart #定義vip pcs resource create mystore ocf:heartbeat:Filesystem params device="192.168.1.50:/mysqldata" directory="/mydata" fstype="nfs" op monitor interval=40 timeout=40 on-fail=restart op start timeout=60 op stop timeout=60 #定義nfs pcs resource create mysqlserver lsb:mysqld op monitor interval=20 timeout=20 on-fail=restart #定義httpd pcs resource group add mysqlservice myvip mystore mysqlserver #定義webservice資源組 pcs constraint location mysqlservice prefers two.soulboy.com=500 #定義資源傾向性,資源組webservice對節點二的傾向性爲500 pcs constraint order start myvip then start mystore #定義資源的order執行次序,這個貌似不能一會兒定義三個資源月約束 pcs constraint order start mystore then start mysqlserver #定義資源的order執行次序 pcs constraint colocation add myvip mystore #定義colocation,若是有資源組能夠省略。這個貌似不能一次定義三個資源月約束 pcs constraint colocation add mystore mysqlserver #定義colocation
實現mfs的高可用也能夠經過heartbeat+drbd來實現,思路和本文相似,已經大牛撰寫,文章內容優質,請參考: qzhijun的BLOG