OB-手動部署Oceanbase集群


實施過程

環境架構規划

角色 機器 備注
OBSERVER 192.168.10.201 OceanBase 數據庫
192.168.10.202
192.168.10.203
OBPROXY 192.168.10.201 OceanBase 訪問反向代理
192.168.10.202
OBCLIENT 192.168.10.201 OceanBase 命令行客戶端
obagent 192.168.10.201 性能指標
192.168.10.202
192.168.10.203

操作系統層環境配置

以下操作如無特別說明,均以root管理員賬號進行配置。

關閉 selinux

#臨時關閉
setenforce 0
# 檢查
getenforce

#開機不啟動selinux,需重啟OS生效。已臨時關閉,本次不需要重啟生效。
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

#查看配置已生效
grep '^SELINUX=' /etc/selinux/config

關閉防火牆服務(firewalld)

#關閉防火牆
systemctl stop firewalld

#開機禁用自啟動防火牆並立刻關閉服務
systemctl disable --now firewalld

# 檢查服務狀態
systemctl status firewalld 

修改主機名(可選)

#修改主機名為oceanbase,當前已生效,退出會話,再登錄后顯示新主機名
hostnamectl set-hostname oceanbase
# 檢查確認
hostnamectl 

配置hosts

#主機名解析添加主機信息
cat >> /etc/hosts << EOF
192.168.10.182 oceanbase
EOF

#查看主機名信息
cat /etc/hosts

添加普通用戶

oceanbase安裝和維護均由普通用戶(ober)操作。[OBD工具部署的OB集群默認運行在admin用戶]

#添加用戶
groupadd -g 1000 ober
useradd -u 1000 -g ober -m -d /ups/app/oceanbase -c "OceanBase Owner" ober


#更改密碼
echo "ober" | passwd --stdin ober
#運行oceanbase可運行任何命令,不需要密碼

# 配置 sudo 權限
visudo      #添加oceanbase一行內容
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
ober       ALL=(ALL)       NOPASSWD: ALL

配置 SSH 互信(ober)

su - ober
export SSH='ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no'
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/*.pub >> ~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys ober@<nodeN>:~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# 檢查確認
export SSH='ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyChecking=no'
for hosts in $(grep -Ev "^#|\-vip|scan" /etc/hosts|awk '{print $NF}'); do 
    ${SSH} ${hosts} date
done

創建軟件目錄

以root用戶安裝時,默認安裝在/root/observer目錄下,這里以oceanbase用戶安裝在/ob/observer目錄下。

集群文件類型
  • 運行日志:在啟動目錄下的 log 目錄里。主要記錄進程 observer 的運行日志、選舉服務的運行日志和 rootservice 的運行日志。主要讀寫特點是順序寫。
  • 數據文件:主要是指數據文件 block_file ,一次性初始化大小,后面可以在線擴容,但是不能縮容。主要讀寫特點是隨機讀、順序寫。偶爾密集的隨機寫。
  • 事務日志文件:主要是指事務和 sstable 相關的日志 ,包括 clogilogslog 等。主要讀寫特點是順序寫。

這三類文件盡可能的分散在不同的磁盤上存儲。如果物理上只有一塊盤,則可以使用 fdisklvm 划分為多個邏輯盤。

文件系統mount參數
# lvm 分盤
pvcreate /dev/sdb
vgcreate datavg /dev/sdb
lvcreate -L 20G datavg -n lvredo
lvcreate -l 100%FREE datavg -n lvdata

# 格式化文件系統
mkfs.ext4 /dev/obvg/lvdata
mkfs.ext4 /dev/obvg/lvredo

# 修改 mount 參數文件
vim /etc/fstab 
/dev/obvg/lvredo          /redo              ext4            defaults,noatime,nodiratime,nodelalloc,barrier=0        0 0
/dev/obvg/lvdata             /data         ext4            defaults,noatime,nodiratime,nodelalloc,barrier=0        0 0

# 掛載文件系統
mount -a
查看默認安裝路徑
rpm -ql oceanbase-ce-3.1.0-3.el7.x86_64

for pkg in $(ls -tr ./*.rpm);do
	echo $pkg; rpm -ql $pkg
done
自定義安裝目錄
# 查看安裝目錄大小
[root@progs oceanbase]# df -hT /ups
Filesystem              Type  Size  Used Avail Use% Mounted on
/dev/mapper/upsvg-upslv xfs    64G   44G   21G  69% /ups
[root@progs oceanbase]#

# 檢查屬主、屬組
[root@progs oceanbase]# ls -ld /ups/app/oceanbase
drwxr-xr-x 2 ober ober 6 Aug 28 20:39 /ups/app/oceanbase
[root@progs oceanbase]#

cd /ups/app/oceanbase                       # obs部署啟動目錄   RPM包自動創建
mkdir -p /ups/app/oceanbase/store/obce      # obs數據總目錄, obce為集群名稱
mkdir -p /data/obce                         # obs數據文件實際目錄
mkdir -p /redo/obce                         # 事務日志實際目錄

chown -R ober:ober /ups/app/oceanbase
chown -R ober:ober /data/obce
chown -R ober:ober /redo/obce

ln -s /ups/app/oceanbase/store/obce/sstable /data/obce/sstable
ln -s /ups/app/oceanbase/store/obce/clog /redo/obce/clog
ln -s /ups/app/oceanbase/store/obce/slog /redo/obce/slog
ln -s /ups/app/oceanbase/store/obce/ilog /redo/obce/ilog

系統內核參數配置

cat > /etc/sysctl.d/98-obce.conf <<-'EOF'

# for oceanbase
## 修改內核異步 I/O 限制
fs.aio-max-nr=1048576

## 網絡優化
net.core.somaxconn = 2048
net.core.netdev_max_backlog = 10000 
net.core.rmem_default = 16777216 
net.core.wmem_default = 16777216 
net.core.rmem_max = 16777216 
net.core.wmem_max = 16777216

net.ipv4.ip_local_port_range = 3500 65535 
net.ipv4.ip_forward = 0 
net.ipv4.conf.default.rp_filter = 1 
net.ipv4.conf.default.accept_source_route = 0 
net.ipv4.tcp_syncookies = 0 
net.ipv4.tcp_rmem = 4096 87380 16777216 
net.ipv4.tcp_wmem = 4096 65536 16777216 
net.ipv4.tcp_max_syn_backlog = 16384 
net.ipv4.tcp_fin_timeout = 15 
net.ipv4.tcp_max_syn_backlog = 16384 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_tw_recycle = 1 
net.ipv4.tcp_slow_start_after_idle=0

vm.swappiness = 0
vm.min_free_kbytes = 2097152
vm.max_map_count=655360

# 此處為 OceanBase 數據庫的 data 目錄
kernel.core_pattern = /data/core-%e-%p-%t
EOF

# 加載配置
sysctl --system

其中,kernel.core_pattern 中的 /data 為 OceanBase 數據庫的 data 目錄。

調整資源限制

OceanBase 數據庫的進程涉及的限制包括線程最大棧空間大小(Stack)、最大文件句柄數(Open Files)和 core 文件大小 (Core File Size)資源

#添加內容
cat >> /etc/security/limits.d/98-ober.conf << EOF
* soft nofile 655350
* hard nofile 655350
* soft stack 20480
* hard stack 20480
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited
EOF

#退出當前會話,重新登錄,使配置生效。

#檢查open files當前值,應為655350,否則后續啟動集群會報錯
ulimit -n

時間同步

生產環境所有節點間的時間誤差建議控制在 10ms 以內。

安裝 chrony服務
yum -y install chrony
配置chrony
vi /etc/chrony.conf
# server 后面跟時間同步服務器
# 使用pool.ntp.org 項目中的公共服務器。按 server 配置,理論上您想添加多少時間服務器都可以。
# 或者使用 阿里雲的 ntp 服務器
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server ntp.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp10.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst

# 如果是測試環境,沒有時間同步服務器,那就選取一台配置為時間同步服務器。
# 如果選中的是本機,則取消下面 server 注釋
#server 127.127.1.0

# 根據實際時間計算出服務器增減時間的比率,然后記錄到一個文件中,在系統重啟后為系統做出最佳時間補償調整。
driftfile /var/lib/chrony/drift

# chronyd 根據需求減慢或加速時間調整,
# 在某些情況下系統時鍾可能漂移過快,導致時間調整用時過長。
# 該指令強制 chronyd 調整時期,大於某個閥值時步進調整系統時鍾。
# 只有在因 chronyd 啟動時間超過指定的限制時(可使用負值來禁用限制)沒有更多時鍾更新時才生效。
makestep 1.0 3

# 將啟用一個內核模式,在該模式中,系統時間每11分鍾會拷貝到實時時鍾(RTC)。
rtcsync

# Enable hardware timestamping on all interfaces that support it.
# 通過使用hwtimestamp指令啟用硬件時間戳
#hwtimestamp eth0
#hwtimestamp eth1
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# 指定一台主機、子網,或者網絡以允許或拒絕NTP連接到扮演時鍾服務器的機器
#allow 192.168.0.0/16
#deny 192.168/16

# 即使沒有同步到時間源,也要服務時間
local stratum 10

# 指定包含NTP驗證密鑰的文件。
#keyfile /etc/chrony.keys

# 指定日志文件的目錄。
logdir /var/log/chrony


# Select which information is logged.
#log measurements statistics tracking
檢查chrony狀態信息
# 查看時間同步活動
chronyc activity

# 查看時間服務器
chronyc sources

# 查看同步狀態
chronyc sources -v

# 校准時間服務器:
chronyc tracking

# 使用 clockdiff [-o] <host> 命令可以檢查本機跟目標機器的時間同步誤差
clockdiff 192.168.10.181

如果使用 clockdiff 運行出錯時,可以換下面命令判斷時間同步誤差

ping -T tsandaddr 192.168.10.181 -c 2

節點時間同步誤差不應超過 50ms,否則初始化集群會失敗

時區設置(可選)

# 查看所有可用時區
timedatectl list-timezones

# 設置當前系統時區
timedatectl set-timezone Asia/Shanghai

# 強制同步下系統時鍾
chronyc -a makestep

部署OB集群

安裝obclient客戶端

rpm -ivh libobclient-2.0.0-2.el7.x86_64.rpm obclient-2.0.0-2.el7.x86_64.rpm

部署observer服務

安裝軟件包
# RPM包括是使用cpio格式打包的,因此可以先轉成cpio然后解壓
cd /ups/app/oceanbase/cluster
rpm2cpio oceanbase-ce-3.1.1-4.el7.x86_64.rpm |cpio -ivd
rpm2cpio oceanbase-ce-libs-3.1.1-4.el7.x86_64.rpm |cpio -ivd

配置環境變量
su - ober
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/ups/app/oceanbase/lib' >> ~/.bash_profile
echo 'export PATH=/ups/app/oceanbase/bin:$PATH' >> ~/.bash_profile
. ~/.bash_profile
啟動observer
192.168.10.201 節點
su - ober
cd /ups/app/oceanbase/cluster && bin/observer -i ens32 -l WARN -p 2881 -P 2882 -z zone1 -r '192.168.10.201:2882:2881;192.168.10.202:2882:2881;192.168.10.203:2882:2881' -c obce -n obce -o "__min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,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_size=2G,enable_syslog_wf=False,enable_syslog_recycle=True,max_syslog_file_count=6" -d /ups/app/oceanbase/store/obce
192.168.10.202 節點
su - ober
cd /ups/app/oceanbase/cluster && bin/observer -i ens32 -l WARN -p 2881 -P 2882 -z zone2 -r '192.168.10.201:2882:2881;192.168.10.202:2882:2881;192.168.10.203:2882:2881' -c obce -n obce -o "__min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,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_size=2G,enable_syslog_wf=False,enable_syslog_recycle=True,max_syslog_file_count=6" -d /ups/app/oceanbase/store/obce
192.168.10.203 節點
su - ober
cd /ups/app/oceanbase/cluster && bin/observer -i ens32 -l WARN -p 2881 -P 2882 -z zone3 -r '192.168.10.201:2882:2881;192.168.10.202:2882:2881;192.168.10.203:2882:2881' -c obce -n obce -o "__min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,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_size=2G,enable_syslog_wf=False,enable_syslog_recycle=True,max_syslog_file_count=6" -d /ups/app/oceanbase/store/obce
檢查進程狀態
netstat -ntlp|grep -E "2881|2882"
集群初始化

當所有節點的observer進程都啟動成功,監聽正常時,通過mysql或obclient客戶端工具連接任一節點2881端口進行初始化操作

mysql -h 192.168.10.201 -u root -P 2881 -c -A -e "set session ob_query_timeout=1000000000; alter system bootstrap ZONE 'zone1' SERVER '192.168.10.201:2882', ZONE 'zone2' SERVER '192.168.10.202:2882', ZONE 'zone3' SERVER '192.168.10.203:2882' ;"

密碼為空

驗證

連接到sys的mysql租戶並檢查

mysql -h 192.168.10.201 -u root@sys#obce -P 2881 -c -A -e "show databases;"
設置密碼
  • 集群管理員(root@sys)密碼默認集群管理員(root@sys)的密碼是空
alter user root identified by 'p#ssw0rd' ;
  • OBPROXY 用戶(proxyro)密碼默認OBPROXY 連接 OceanBase 集群使用用戶 proxyro
grant select on oceanbase.* to proxyro identified by 'p#ssw0rd' ;

部署obproxy

安裝軟件包
cd /ups/app/oceanbase/obproxy
rpm2cpio obproxy-3.2.0-1.el7.x86_64.rpm |cpio -ivd
啟動obproxy
# obce 集群名稱
cd /ups/app/oceanbase/obproxy && bin/obproxy -r "192.168.10.201:2881;192.168.10.202:2881;192.168.10.203:2881" -p 2883 -o "enable_strict_kernel_release=false,enable_cluster_checkout=false,skip_proxy_sys_private_check=True,enable_metadb_used=false" -l 2884 -n obce

obproxy [OPTIONS]
-h,--help print this help
-p,--listen_port LPORT obproxy listen port
-l,--promethues_listen_port PLPORT obproxy prometheus listen port
-o,--optstr OPTSTR extra options string
-n,--appname APPNAME application name
-r,--rs_list RS_LIST root server list(format ip:sql_port)
-c,--cluster_name CLUSTER_NAME root server cluster name
-d,--dump_config_sql DSQL dump config sql to file
-e,--execute_config_sql ESQL exectue config sql(create tables, insert initial data)
-N,--nodaemon don't run in daemon
-V,--version VERSION current obproxy version
-R,--releaseid RELEASEID current obproxy kernel release id
-t,--regression_test TEST_NAME regression test
example:
run without config server:
./bin/obproxy -p6789 -r'ip:port;ip:port' -n test -o enable_cluster_checkout=false,syslog_level=INFO
OR ./bin/obproxy -p6789 -r'ip:port;ip:port' -c 'ob_test' -n test -o syslog_level=INFO

run with config server:
./bin/obproxy -p6789 -e -n test -o obproxy_config_server_url='your config url',syslog_level=INFO

Non-first start with local config file:
./bin/obproxy

dump config update sql:
./bin/obproxy -d

run regression tests:
./bin/obproxy -p6789 -rip:port -ntest -o obproxy_config_server_url='' -t ''

檢查服務狀態
ps -ef|grep obproxy
netstat -ntlp |grep -E "2883|2884"
登錄 OBPROXY 修改密碼
-- 登錄用戶名:root@proxysys, 端口:2883 ,初始密碼:空
-- mysql -h 192.168.10.201 -u root@proxysys -P 2883
show proxyconfig like '%sys_password%';

-- 修改 OBPROXY 用戶密碼
alter proxyconfig set obproxy_sys_password = 'p#ssw0rd';

-- 修改 OBPROXY 連接 OceanBase 集群用戶 proxyro 的密碼, 密碼就是前面 OceanBase 集群初始化后創建的用戶 proxyro 的密碼
alter proxyconfig set observer_sys_password = 'p#ssw0rd' ;

檢查確認

通過 OBPROXY 連接 OceanBase 集群

-- mysql -h192.168.10.201 -uroot@sys#obce -P2883 -p -c -A oceanbase

show full processlist;

部署obagent

安裝軟件包
su - ober
cd /ups/app/oceanbase/obagent
rpm2cpio obagent-1.0.0-1.el7.x86_64.rpm |cpio -ivd
配置環境變量
su - ober
echo 'export PATH=/ups/app/oceanbase/obagent/bin:$PATH' >> ~/.bash_profile

. ~/.bash_profile
編輯配置文件
monagent.yaml
vi conf/monagent.yaml
log:
  level: WARN
  filename: log/monagent.log
  maxsize: 30
  maxage: 3
  maxbackups: 10
  localtime: true
  compress: true
server:
  address: 192.168.10.201:8088
  adminAddress: 192.168.10.201:8089
  runDir: run
cryptoMethod: plain
cryptoPath: conf/.config_secret.key
modulePath: conf/module_config
propertiesPath: conf/config_properties
啟動obagent服務
su - ober
/ups/app/oceanbase/obagent/bin/monagent -c conf/monagent.yaml

Usage:
monagent [flags]

Flags:
-c, --config string config file (default "conf/monagent.yaml")
-h, --help help for monagent
-d, --pipelines_config_dir string monitor pipelines config file dir (default "conf/monagent/pipelines")

檢查確認
ps -ef|grep monagent
netstat -tnlp |grep -E "8088|8089"

附錄

常見問題

集群初始化失敗常見原因

  • 集群節點之間時間同步延時超過 50ms 。

  • 集群節點之間網絡延時超過 100ms 。

  • 集群節點上 OBSERVER 相關目錄結構不對或者目錄權限不對。

  • 集群節點上進程 observer 啟動參數寫的不對。注意隱含參數的名字(如__min_full_resource_pool_memory )、參數 -d 的目錄是否正確、參數 -z

    跟 IP 的對應關系、 參數中多了空格或分隔符錯誤(有的是 , ,有的是;)。

  • 集群節點可用內存低於進程 observer 啟動參數 memory_limit 值。

  • 數據目錄空間不足,可以通過設置 datafile_size 根據實際環境配置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM