一般情況下,磁碟損分為以下兩種類型:
• 磁碟壞道
• 磁碟扇區損壞
磁碟壞道,可以分為:0磁軌壞道,邏輯壞道,硬碟壞道。磁碟壞道通常都可以將損壞的磁碟進行隔離不使用後繼續使用,但建議儘快更換硬碟,因為壞道會擴散,以免出現嚴重的數據問題。在Linux 環境中,磁碟壞道可以通過 badblocks 或 Smartmontools 工具進行檢測,這兩個工具的使用說法,已超過了本教程的範圍,大家可自行搜索了解。
磁碟扇區損壞可以分為兩種:一種是無法修復的物理損壞,另一種是可以修復的軟體錯誤。在 Linux 環境中該如何判斷磁碟的扇區是否出現損壞了呢?可以通過 demesg | grep error 命令進行檢查,通常情況下,出現類似 I/O error, dev sdb, sector 8653216 信息時表示 /dev/sdb 磁碟的扇區可能出現問題了。
當磁碟出現損壞時,SequoiaDB 資料庫可能會有以下現象:
• 資料庫節點掛掉,手工無法拉起
• 數據讀取失敗,節點日誌文件中出現 -1 系統IO錯誤 或 -10 系統錯誤等錯誤碼的日誌
假設已經確認損壞的磁碟為 /dev/sdb, SequoiaDB 資料庫的安裝目錄(資料庫安裝目錄可以通過查看 /etc/default/sequoiadb 文件中 INSTALLDIR 配置的路徑)為 /opt/sequoiadb ,SequoiaDB 資料庫的作業系統管理用戶為 sdbadminn,用戶組為 `sdbadmingroup`。現需要進行磁碟更換的操作,具體的操作步驟如下:
1. 確認損壞磁碟對應的資料庫節點以 sdbadmin 用戶 ssh 登錄存在磁碟損壞的主機,執行以下命令確認 /dev/sdb 磁碟所對應的資料庫節點
df -h | grep /dev/sdb && sdblist -l -m local從上圖中可以獲知,/dev/sdb 磁碟對應服務埠( 對應 SvcName 列)為 11840 的資料庫節點,數據節點的數據目錄為/sdbdata/data01/sequoiadb/database/data/11840,該數據目錄需要記錄起來,後面手工恢復數據的步驟中需要用到。
2. 停止資料庫節點1)檢查集群管理服務節點配置文件中 EnableWatch 參數的值是否為 TRUE,集群管理服務節點配置文件所在為路徑為 /opt/sequoiadb/conf/sdbcm.conf。如果為 TRUE,說明集群管理服務節點會檢測節點的狀態,自動將異常掛掉的節點拉起。此時在執行第 2 步檢查資料庫節點進程不存在時,還需要再執行一次停止資料庫節點的命令,以免資料庫節點再被集群管理服務節點拉起。
cat /opt/sequoiadb/conf/sdbcm.conf | grep "EnableWatch"從上圖可以獲知,集群管理服務節點配置了自動拉起異常節點並且 EnableWatch 的默認值為 TRUE。2)檢查服務埠為 11840 的資料庫節點進程是否存在,若返回的結果包含 Total: 0 關鍵字,表示資料庫節點進程不存在,即資料庫節點已停止。Note:
資料庫節點服務埠 11840 需要替換成 第 1 步中實際資料庫節點的服務埠
3)停止服務埠為 11840 的資料庫節點,若返回的結果包括 Total: 1; Success: 1; Failed: 0 或者 Total: 0; Success: 0; Failed: 0 關鍵字,表示資料庫節點已經停止成功。若返回Total: 1; Success: 0; Failed: 1,表示資料庫節點停止失敗,可重新執行停止資料庫節點命令,若執行多次都無法停止,可以通過 kill -9 <PID> 將進程強殺,PID是第1步中 PID 列對應的數值。3. 更換磁碟
1)從伺服器磁碟卡槽中拔出損壞的磁碟,插入新的磁碟,然後 ssh 登陸主機,切換至 root 權限用戶,檢查作業系統是否仍可以查看到損壞磁碟的掛載目錄。
從上圖可以獲知,從作業系統中仍看到損壞磁碟的掛載目錄,需要進行卸載。
2)從磁碟掛載目錄中取消掛載損壞的磁碟。正常取消掛載不會有任何結果輸出,若有輸出 umount: /sdbdata/data01: target is busy 等信息,表示有作業系統進程使用了 /sdbdata/data01 目錄,並且進程未退出,需要執行第3步操作,查看有哪些進程使用 /sdbdata/data01 目錄,並將其 kill 掉。
3)通過 fuser 命令查看有哪些進程使用 /sdbdata/data01 目錄,並將其 kill -9 強殺進程。
從上圖可以獲知,進程號為 78422 的進程在使用 /sdbdata/data01 目錄,需要執行 kill -9 78422 命令將該進程強殺掉。
4)通過 fdisk 命令查看檢查作業系統是否已經識別到新插入的磁碟,若輸出結果中出現對應的磁碟盤符,則表示作業系統已經識別到新插入的磁碟。
從上圖可以獲知作業系統還未識別到新插入的磁碟,需要按照第 5 步的命令在線動態識別新插入的磁碟。5)查看主機總線號, 並且重新掃描SCSI總線添加設備,注意:- - - 的 - 符號之間存在空格。scsi_hosts=(`ls /sys/class/scsi_host/`)for scsi_host in ${scsi_hosts} do echo "- - -" > "/sys/class/scsi_host/${scsi_host}/scan"done6)再次通過 fdisk 命令查看檢查作業系統是否已經識別到新插入的磁碟,若輸出結果中出現對應的磁碟盤符,則表示作業系統已經識別到新插入的磁碟。
7)磁碟 /dev/sdb 分區格式化,類型為 ext4,若磁碟的容量大於 2T,使用 parted 工具格式化,否則可以使用 fdisk 工具。此處的磁碟容量小於 2T,當輸出的結果包含 Syncing disks 和 Writing superblocks and filesystem accounting information: done 字眼表示格式化完成。
echo -e "n\np\n1\n\n\nw" | fdisk /dev/sdbecho -e "y\n" | mkfs.ext4 /dev/sdbparted -s /dev/sdb mklabel gptparted -s /dev/sdb mkpart primary 0 100parted -s /dev/sdb printecho -e "y\n" | mkfs.ext4 /dev/sdb8)掛載磁碟至 /sdbdata/data01 目錄
mount /dev/sdb /sdbdata/data019)將 /sdbdata/data01 目錄的擁有者設置為 SequoiaDB 資料庫作業系統管理用戶
sdbadmin:sdbadmin_groupchown -R sdbadmin:sdbadmin_group /sdbdata/data0110)若配置 /etc/fstab 文件設置開機自動掛載磁碟,若磁碟的盤符發生了改變時,需要修改 /etc/fstab 文件的配置,具體的掛載參數配置以實際情況為主,此處的配置為示例配置。
/dev/sdb /sdbdata/data01 ext4 defaults 0 14.恢復資料庫節點數據恢復資料庫節點數據有兩種方式:手工複製主節點的數據文件和基於複製組主從節點間的數據同步機制。手工複製主節點的數據文件最好選擇數據寫入較少的時間窗口執行,這樣能夠減少手工複製完啟動節點時觸發全量同步的可能性,本文提供的手工複製主節點的數據文件步驟中停止了主節點,即不能有新數據寫入。基於複製組主從節點間的數據同步機制恢復數據的步驟為:啟動資料庫節點,此處的資料庫節點服務埠為 11840 節點啟動後,自動從主節點中同步數據,無需人工幹預。
1)連接資料庫,注意需要將 username ,password 修改為真實的用戶名和密碼,若沒有用戶名和密碼則填寫空串""。sdb 'db = new Sdb("localhost", 11810, "username", "password")'2)查看資料庫節點所屬複製組名,此處資料庫節點的主機名為 sdbserver1, 服務埠為 11840。
sdb 'db.list(SDB_LIST_GROUPS,{"Group.HostName":"sdbserver1","Group.Service.Name":"11840"},{"GroupName":null})'從上圖可以獲知,資料庫節點 sdbserver1:11840 所屬的複製組為 group1。
3)查看複製組 group1 的主節點信息。
sdb 'db.getRG("group1").getMaster()'從上圖可以獲知,複製組的主節點為 sdbserver1:11830。
4)ssh 登錄到主節點所在的機器,查看主節點的數據目錄,查看 DBPath 列的值。
從上圖可以獲知主節點 sdbserver1:11830 的數據目錄為 /opt/sequoiadb/database/data/11830。
5)將複製組 group1 的數據和日誌持久化至磁碟。
sdb 'db.sync({"GroupName" : "group1"})'6)停止該主節點,輸出的結果出現 DONE 或 Total: 1; Success: 1; Failed: 0 時表示節點停止成功。
7)創建待恢復節點的數據節點目錄,複製主節點的數據目錄下的所有數據文件至待恢復節點的數據節點目錄中。
mkdir -p /sdbdata/data01/sequoiadb/database/data/11840scp -r sdbadmin@sdbserver1:/opt/sequoiadb/database/data/11830/* /sdbdata/data01/sequoiadb/database/data/118408)手工拷貝數據完成後,啟動複製組 group1 。
sdb 'db.getRG("group1").start()'5. 檢查集群的資料庫節點狀態1)統計集群的資料庫節點狀態是否均為正常,若返回結果只有 ServiceStatus:true 類型的統計數量 N,則表示 N 個數據節點的節點服務狀態為正常,若返回結果存在ServiceStatus:false 或 ServiceStatus:null類型的統計數據量 M,則表示 M 個數據節點的節點服務狀態不正常。
sdb 'db.exec("select ServiceStatus, count(1) as count from $SNAPSHOT_DB group by ServiceStatus")'
從上圖可以獲知集群的 4 個資料庫節點的服務狀態為正常。
2)如果存在服務狀態不正常的節點,可以通過以下命令查看節點的詳細情況。若返回的結果含有 "ServiceStatus": false 時,表示節點服務狀態不正常,可通過 Status 欄位了解節點具體所處的狀態。若返回的結果含有 ErrNodes 信息,通常情況是連接不上該節點,對應異常碼可以查看 Flag 欄位的值。
sdb 'db.exec("select * from $SNAPSHOT_DB where NodeName=\"sdbserver1:11840\"")'從上圖可以獲知sdbserver1:11810 資料庫節點連接不上,應該是掛掉或者沒有啟動。
資料庫節點存在以下幾種狀態(Status欄位值):• "Shutdown":正在關閉狀態,表示節點正在被關閉• "Rebuilding":重新構建狀態,如節點異常重啟後,無法與其他節點進行數據同步時,節點會進入該狀態,重新構建數據詳細的錯誤碼說明詳見:http://doc.sequoiadb.com/cn/sequoiadb-cat_id-1432190985-edition_id-304
分布式資料庫中,磁碟損壞是常有的事,更換損壞的磁碟後,只需要簡單的幾個步驟,即可以自動恢復 SequoiaDB 資料庫節點的數據。 如果您有哪些疑問想與我們交流歡迎留言,同時歡迎報名參加10月22日舉行的SequoiaDB v5.0新版本發布會,了解我們更多的技術特性。
往期技術乾貨
點擊閱讀原文,即刻報名SequoiaDB新品5.0發布會