本文章介紹了OceanBase叢集關於資料檔案的縮容場景,並提供一種縮容方案予以參考。
作者:關炳文,愛可生 DBA 團隊成員,負責資料庫相關技術支援,一步兩階梯,兼具勤奮與慵懶。
愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。
本文約 1200 字,預計閱讀需要 4 分鐘。
縮容場景
此前某銀行一套 1-1-1 架構的 OceanBase 叢集其中一個節點,OBServer 程式崩潰時預設生成 core 檔案在資料盤 /data/1
。一般情況下,core 檔案的大小即為程式執行時佔用的記憶體大小,約 400GB。然而資料盤早已預分配 90% 的空間給資料檔案(block_file),剩餘可用空間不足以存放如此之大的檔案,導致 /data/1
目錄被寫滿,並由此引發兩個問題:
- core 檔案沒寫完整,不完整的 core 檔案使得對故障原因的分析工作難以進展。
- 資料盤被寫滿,直接導致該節點無法對外業務提供服務。
恢復 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_percentage
與 datafile_size
引數需要調大時,可以在叢集中進行動態調整,不需要重啟叢集,調小則不效。