OceanBase 資料檔案縮容實踐

發表於2023-09-27

本文章介紹了OceanBase叢集關於資料檔案的縮容場景,並提供一種縮容方案予以參考。

作者:關炳文,愛可生 DBA 團隊成員,負責資料庫相關技術支援,一步兩階梯,兼具勤奮與慵懶。

愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。

本文約 1200 字,預計閱讀需要 4 分鐘。

縮容場景

此前某銀行一套 1-1-1 架構的 OceanBase 叢集其中一個節點,OBServer 程式崩潰時預設生成 core 檔案在資料盤 /data/1。一般情況下,core 檔案的大小即為程式執行時佔用的記憶體大小,約 400GB。然而資料盤早已預分配 90% 的空間給資料檔案(block_file),剩餘可用空間不足以存放如此之大的檔案,導致 /data/1 目錄被寫滿,並由此引發兩個問題:

  1. core 檔案沒寫完整,不完整的 core 檔案使得對故障原因的分析工作難以進展。
  2. 資料盤被寫滿,直接導致該節點無法對外業務提供服務。

恢復 OBServer 服務之後,經過與專案組討論,決定 採取給該叢集的資料檔案進行縮容至資料盤總大小的 80% ,避免日後故障復現時發生同樣情況。

本文內的圖片以及程式碼中展示的伺服器資訊(IP 地址、叢集名、租戶名),為個人搭建的模擬環境所用,僅用於輔助說明具體步驟。

縮容操作

版本資訊

  • OBServer 版本:3.2.3
  • OCP 版本:3.3.3

相關引數

datafile_size

用於設定資料檔案的大小。如果想要縮減 datafile_size,可以將這個節點從叢集中刪除,重建這個節點,叢集當前值為 0。

datafile_disk_percentage

表示佔用 data_dir 所在磁碟總空間的百分比,叢集當前值為 90。

1 調整引數

叢集->引數管理,調整 datafile_disk_percentage 的值為 80,即 block_file 佔盤比例為 80%。

2 縮減租戶副本

叢集->租戶管理,選擇租戶(包括 sys 租戶)在副本詳情中選中 zone 刪除副本(例:zone3),等待任務結束。

3 下線 OBServer

叢集->總覽,OBServer 列表中刪除 zone3 的 OBServer,相當於在該節點解除安裝 OBServer 服務,等待任務結束。

4 上線 OBServer

此時該節點的 OceanBase 安裝包被解除安裝了,相關目錄空間也被清空了。如果要重新使用該 OBServer 上線,需要安裝 OceanBase 的 RPM 包,並初始化相關目錄等操作。

由於 OCP 目前(3.3.3 版本)還做不到啟動 OBServer 程式時另外指定引數,因此這一步使用黑屏命令列操作。

4.1 安裝 RPM 包

使用 root 使用者。

rpm -ivh oceanbase-3.2.3.3-107050022023040817.el7.x86_64.rpm

4.2 初始化目錄

使用 admin 使用者。

export cluster_name=sit 

mkdir -p /data/1/$cluster_name/{etc3,sort_dir,sstable} 
mkdir -p /data/log1/$cluster_name/{clog,etc2,ilog,slog,oob_clog} 
mkdir -p /home/admin/oceanbase/store/$cluster_name 

chown -R admin:admin /data/1/$cluster_name && chown -R admin:admin /home/admin/oceanbase && chown -R admin:admin /data/log1/$cluster_name 

for t in {etc3,sort_dir,sstable};do ln -sf /data/1/$cluster_name/$t /home/admin/oceanbase/store/$cluster_name/$t; done 
for t in {clog,etc2,ilog,slog,oob_clog}; do ln -sf /data/log1/$cluster_name/$t /home/admin/oceanbase/store/$cluster_name/$t; done

4.3 指定引數啟動 OBServer 程式

使用 admin 使用者。

cd /home/admin/oceanbase 
ulimit -s 10240  ##堆疊的最大值
ulimit -c unlimited   ##當某些程式發生錯誤時,系統可能會將該程式在記憶體中的資訊寫成檔案(除錯用),這種檔案就被稱為核心檔案(core file)

啟動 OBServer 程式。

cd /home/admin/oceanbase

/bin/observer -i eth0 -p 2881 -P 2882 -n sit -z zone3 -d /home/admin/oceanbase/store/sit -r '10.186.65.8:2882:2881;10.186.65.123:2882:2881;10.186.65.56:2882:2881' -l info -o 'obconfig_url=http://10.186.65.11:8080/services?Action=ObRootServiceInfo&User_ID=alibaba&UID=ocpmaster&ObRegion=sit,config_additional_dir=/data/1/sit/etc3;/data/log1/sit/etc2,cluster_id=16777777,datafile_disk_percentage=80,cpu_count=16,system_memory=5G'

引數參考值:

  • -i 指定網路卡名,可透過 ifconfig 命令檢視。
  • -p 指定服務埠號,一般指定為 2881。
  • -P 指定 RPC 埠號,一般指定為 2882。
  • -n 指定叢集名稱,與原來保持一致。
  • -z 指定啟動的 OBServer 程式所屬的 Zone,與原來保持一致。
  • -d 指定叢集主目錄,除叢集名字,其他不要變動。
  • -r 指定 RS 列表,可透過檢視當前叢集 rootservice_list 引數。
  • -l 指定日誌級別,預設為 INFO,即只有 INFO 及以上級別的日誌資料才會列印到observer.log 、election.log 和 rootservice.log 日誌檔案中。
  • -o 指定叢集啟動引數,需要根據實際情況設定。

    • obconfig_url:用於設定 OBConfig 服務的 URL 地址,與原來保持一致。
    • config_additional_dir:用於設定本地儲存配置檔案的多個目錄,為了冗餘儲存多份配置檔案。
    • cluster_id:指定叢集 ID,與原來保持一致。
    • datafile_disk_percentage:設定為縮容後所佔資料的盤百分比。
    • cpu_count:指定 CPU 個數,與原來保持一致。
    • system_memory:指定 OceanBase 內部保留記憶體,與原來保持一致。

4.4 登入叢集 sys 租戶,新增 OBServer

alter system add server '10.186.65.56:2882' zone 'zone3';

OCP 叢集總覽頁重新整理出 OBServer 列表。

4.5 其它副本操作

重複上述步驟,逐一縮減租戶副本,下線/上線其它 OBServer,並補齊租戶副本。到此,OceanBase 對資料盤 /data/1 的 block_file 縮容已完成。

4.6 重啟叢集

最後,重啟叢集,驗證叢集是否正常執行。

總結

本次資料檔案縮容操作相當於在叢集每個節點重灌 OBServer 服務,在生產環境具有一定風險,建議做好備份工作。因此在本文相同故障場景下,優先考慮本地是否存在其他磁碟空間(NFS 掛載盤傳輸存在網路限制,暫不考慮)可用於存放 core 檔案並修改其生成路徑。

另外,datafile_disk_percentagedatafile_size 引數需要調大時,可以在叢集中進行動態調整,不需要重啟叢集,調小則不效。

相關文章