在前一篇寫到 架設 HA 高可用性:MySQL DRBD + Heartbeat – 兩台式架構 HA (Master/Slave),結果馬上就遇到一些特殊環境必須採用一些特殊的調整
在本文遇到的狀況是因為無法避免的因素無法切割一個 /dev/sdb1 的硬碟分割區出來,而在一開始安裝系統的時候又把所有的空間全部給了根目錄
$ df -lh Filesystem Size Used Avail Use% Mounted on /dev/sda3 916G 2.0G 868G 1% / tmpfs 3.9G 0 3.9G 0% /dev/shm /dev/sda1 248M 64M 173M 27% /boot
如果要壓縮磁區在切新的磁區出來的話,又必須 umount,因為環境不允許這個狀況,絞盡腦汁只好改用 dd 來建立虛擬硬碟取代所需要的資源池磁區
**這個方法並不是很好的解決方案,因為使用 dd 所建立的虛擬硬碟會大大降低 I/O 效能,若非狀況特殊請使用實體硬碟磁區
由於 DRBD 所需要的磁區類型是 block device,所以不能單單僅使用 dd 來建立 image 掛載,還要使用 mknod 和 losetup 這兩個工具來建立
用 dd 來產生 block device
Step.1 建立一個 100GB 的虛擬硬碟
$ dd if=/dev/zero of=/drbd/drbd.img bs=1M count=102400
Step.2 使用 mknod 這個工具建立一個 block device
$ mknod /dev/drbd255 b 7 255 #確認建立完成 $ ls -l /dev/drbd255 brw-r--r-- 1 root root 7, 255 Jul 26 18:12 /dev/drbd255
建立一個 /dev/drbd255 的設備,b 是 create block (buffered) special file,而 7 , 255 則代表設備號是有意義的,可以參考 devices.txt
Step.3 再使用 losetup 將建立好的 img 掛載到 /dev/drbd255
$ losetup /dev/drbd255 /drbd/drbd.img # 確認是否掛載成功 $ losetup -a /dev/loop255: [0803]:46661635 (/drbd/drbd.img)
這樣就完成建立一個 block device 可以給 DRBD 使用!
但是還沒完成!這個動作在重開機的時候並不會替我們自動掛載上去,可能你會想說可以寫在 rc.local 啊!!
這是錯的!重溫一下 Linux 的開機流程分析 可以知道當你設定 DRBD 為開機啟動(chkconfig)的時候,你的 rc.local 根本還沒有掛載!因為 rc.local 是在所有開機程序結束後才執行的最後一個工作,所以乾脆就直接修改一下 DRBD 的 init service,讓他啟動服務的時候就一並掛載我們設定的 block device。
$ vim /etc/init.d/drbd #!/bin/bash VIRTUALDISK="/dev/drbd255" VIRTUALIMG="/drbd/drbd.img" .... skip case "$1" in start) if [[ ! -b $VIRTUALDISK ]]; then echo "mount block "$VIRTUALDISK" from $VIRTUALIMG" mknod $VIRTUALDISK b 7 255 losetup $VIRTUALDISK $VIRTUALIMG fi .... skip run_hook stop [ -f /var/lock/subsys/drbd ] && rm /var/lock/subsys/drbd log_end_msg 0 if [[ -b $VIRTUALDISK ]]; then echo "umount $VIRTUALDISK" losetup -d $VIRTUALDISK rm -f $VIRTUALDISK fi ;;
如果覺得麻煩可以直接下載改好的檔案 drbd
測試啟動服務,必須要自動掛載上 image,而停用反之。