【簡介】
OBDeploy是OceanBase叢集部署的工具,可以通過簡單的幾行命令,就能快速的進行OceanBase部署。但對於初學者來講,可能會比較困惑,Deploy到底做了哪些事情?裡面的具體步驟有哪些?雖然部署會成功,可能對於細節還是一頭霧水。萬一部署失敗,排障的過程就會非常麻煩,所以我們嘗試脫離OBDeploy,進行手工部署OceanBase叢集,以瞭解一下具體的安裝細節。
另外一方面,用OBDeploy部署,有一些莫名其妙的限制。比如目錄是動態MD5生成,安裝包是在/home/admin目錄下,等等。這些限制對於標準化部署,可能不是那麼標準。所以,脫離OBDeploy,部署OCeanbase,也有實際意義。
【場景選擇】
OceanBase部署的場景很多,有單機,本機,群集,是否帶OBProxy等等。在OBDeploy中,example目錄下,有一些示例模板。
模板名稱 | 說明 |
---|---|
distributed-example.yaml | 伺服器記憶體>50G, 多節點部署 |
distributed-with-obproxy-example.yaml | 伺服器記憶體>50G,多節點部署,並且部署obproxy |
local-example.yaml | 伺服器記憶體>50G, 本機單節點部署,只有一個zone |
mini-distributed-example.yaml | 伺服器記憶體小,多節點部署。 |
mini-distributed-with-obproxy-example.yaml | 伺服器記憶體小,多節點部署。並且部署obproxy |
mini-local-example.yaml | 伺服器記憶體小,本機單節點部署,只有一個zone |
mini-single-example.yaml | 伺服器記憶體小,遠端單節點部署,只有一個zone |
mini-single-with-obproxy-example.yaml | 伺服器記憶體小,單節點部署,單zone,且部署obproxy |
single-example.yaml | 伺服器記憶體>50G, 單節點部署,只有一個zone |
single-with-obproxy-example.yaml | 伺服器記憶體>50G, 單節點部署,單zone, 有obproxy |
這裡,我們選擇mini-distributed-example.yaml這個模板。Mini指的是我們伺服器記憶體小,測試用途。實際規格是20C 256G,distributed指的是三節點部署。我們跳過obproxy的安裝,因此選用該模板。 我們用RPM包的方式進行安裝。
準備如下四臺伺服器:
SERVERA 10.10.10.8 [中控機,可以用虛擬機器,用於從外網下載RPM包,以及OBDEPLOY工具]
SERVERB 10.10.10.139
SERVERC 10.10.10.135
SERVERD 10.10.10.133
PS:SERVERB, SERVERC, SERVERD需要用物理機。虛擬機器會在群集建立的步驟,非常容易超時,導致搭建失敗
【環境準備】
1.在所有伺服器上,建立使用者obuser
sudo useradd obuser; sudo passwd obuser
2.切換到obuser賬號,建立SSH
ssh-keygen –t RSA
3.把obuser賬號加入到sudoer中
sudo visudo
4.在中控機器上,.ssh目錄下,複製key:
ssh-copy-id obuser@10.10.10.111
ssh-copy-id obuser@10.10.10.131
ssh-copy-id obuser@10.10.10.138
5.在中控機上,wget下載:
http://mirrors.aliyun.com/oceanbase/community/stable/el/7/x86_64/
這裡選擇的版本是當前的版本,如果有最新的,應該選擇最新的版本:
libobclient-2.0.0-2.el7.x86_64.rpm
obclient-2.0.0-2.el7.x86_64.rpm
ob-deploy-1.0.2-2.el7.x86_64.rpm
obproxy-3.1.0-1.el7.x86_64.rpm
oceanbase-ce-3.1.0-2.el7.x86_64.rpm
oceanbase-ce-libs-3.1.0-2.el7.x86_64.rpm
oceanbase-ce-sql-parser-3.1.0-2.el7.x86_64.rpm
並把該下載的檔案,傳遞到SERVERB, SERVERC, SERVERD上。
scp *.rpm obuser@10.10.10.111:~
scp *.rpm obuser@10.10.10.131:~
scp *.rpm obuser@10.10.10.138:~
【伺服器準備】
1)在每臺工作機上,修改環境變數:
sudo sed -i '$a vm.max_map_count=655360\nfs.aio-max-nr=1048576' /etc/sysctl.conf
sudo sed -i '$a* soft nofile 655350\n* hard nofile 655350\n* soft nproc 655360\n* hard nproc 655360' /etc/security/limits.d/20-nproc.conf
sudo sed -i '$a* soft nofile 655350\n* hard nofile 655350\n* soft nproc 655360\n* hard nproc 655360\n* hard core unlimited\n* soft core unlimited\n* hard stack 10240\n* soft stack 10240\n* hard cpu unlimited\n* soft cpu unlimited' /etc/security/limits.conf
並重啟使得生效。
2)在每臺工作機上,安裝ocenabase:
sudo yum install oceanbase-ce-libs-3.1.0-2.el7.x86_64.rpm
sudo yum install oceanbase-ce-3.1.0-2.el7.x86_64.rpm
安裝程式會把oceanbase安裝到 /home/admin/oceanbase目錄下。該目錄並非是我們所期望的,所以做如下調整:
cd /home/obuser
sudo mv /home/admin/oceanbase .
sudo chown –R obuser:obuser /home/obuser/oceanbase
3)庫路徑處理
下面步驟需要操作一下,如果不處理的話,群集可能會搭建不起來。(雖然服務可以起來)。
sudo mv /home/obuser/oceanbase/lib /home/obuser/oceanbase/libs
ln –sf /home/obuser/oceanbase/libs /home/obuser/oceanbase/lib
在每臺機器上, export環境變數LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/home/obuser/oceanbase/lib:$LD_LIBRARY_PATH
或者可以直接修改.bashrc檔案,使得一直生效。
我們可以執行下面命令:
/home/obuser/oceanbase/bin/observer –help
來驗證observer是否能列印幫助資訊。
【資料目錄準備】
在每臺機器上,建立資料目錄:
sudo mkdir /data/observer
sudo chown -R obuser:obuser /data/observer
mkdir -p /data/observer/admin;
mkdir -p /data/observer/.conf
mkdir -p /data/observer/log;
mkdir -p /data/observer/store;
mkdir -p /data/observer/store/sstable
mkdir -p /data/observer/store/clog
mkdir -p /data/observer/store/ilog
mkdir -p /data/observer/store/slog
備註,如果後續群集搭建不成功,需要將整個目錄清空。所以需要準備好清理指令碼:在重建之前,必須保持目錄乾淨:
sudo kill -9 `pidof observer`
rm -fr /data/observer/log/*
rm -fr /data/observer/run/mysql.sock
rm -fr /data/observer/run/observer.pid
rm -fr /data/observer/store/clog_shm
rm -fr /data/observer/store/ilog_shm
rm -fr /data/observer/store/clog/1
rm -fr /data/observer/store/ilog/1
rm -fr /data/observer/store/slog/1
rm -fr /data/observer/store/sstable/block_file
【啟動服務】
我們啟動observer的時候,一定要到 /data/observer目錄下進行啟動。
cd /data/observer // 要在該目錄下啟動服務
第一臺伺服器上,執行如下命令,啟動:
/home/obuser/oceanbase/bin/observer -r '10.10.10.111:5022:2883;10.10.10.131:5022:2883;10.10.10.138:5022:2883’ -o datafile_size=16G,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=8,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_disk_percentage=20,idc='idc1' -z 'zone1' -p 2883 –P5022 -c 11 -d /data/observer/store -i eth0 –n myapp –l ERROR
第二臺伺服器上,啟動如下命令:
/home/obuser/oceanbase/bin/observer -r '10.10.10.111:5022:2883;10.10.10.131:5022:2883;10.10.10.138:5022:2883' -o datafile_size=16G,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=8,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_disk_percentage=20,idc='idc2' -z 'zone2' -p 2883 –P5022 -c 11 -d /data/observer/store -i eth0 –n myapp –l ERROR
第三臺伺服器上,啟動如下命令:
/home/obuser/oceanbase/bin/observer -r '10.10.10.111:5022:2883;10.10.10.131:5022:2883;10.10.10.138:5022:2883' -o datafile_size=16G,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=8,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_disk_percentage=20,idc='idc3' -z 'zone3' -p 2883 –P5022 -c 1 -d /data/observer/store -i eth0 –n myapp –l ERROR
服務啟動應該不會有什麼問題,也很少會報錯。
【群集搭建】
群集啟動後,我們用如下命令進行登入:
Mysql –h 10.10.10.111 –port 2883 –u root
登入後,執行下面的命令建立群集
alter system bootstrap REGION "sys_region" ZONE "zone1" SERVER "10.10.10.111:5022",REGION "sys_region" ZONE "zone2" SERVER "10.10.10.131:5022",REGION "sys_region" ZONE "zone3" SERVER "10.10.10.138:5022";
這步在物理機上,一般耗時30秒左右。但如果是虛擬機器的話,可能部署的時間會更長。系統超時是10分鐘。如果部署條件不符合的話,最終的結果也是超時,所以,如果建立叢集超過3分鐘都還沒有完成的話,應該是前面的配置出現問題了。