实践练习2:手动部署3副本集群 (4.0版本)
写在前面
相较于Docker自动部署,自己手动部署3副本集群的过程稍显坎坷。一些报错信息网上搜不太到,主要还是参考官方文档以及查看observer进程启动的报错日志进行解决。此前linux非常薄弱,导致中间一边做还需要查阅一些常见命令的使用方法,虽然磕磕绊绊,好在最后成功。oceanbase的bilibili入门实践体验的教学视频(2-4-如何手动部署OceanBase三副本集群_哔哩哔哩_bilibili)讲解的非常好,推荐👍
特此说明,该3副本集群并没有部署ocp,obproxy,集群部署完成后,通过直连observer方式访问。
前期准备
3台ecs服务器:4c16g,系统盘100g,数据盘40g,centos 7.7
- 172.28.129.220 (中控机 )
- 172.22.57.24
- 172.22.57.25
安装包(oceanbase官网下载OceanBase 社区版下载 - 开源数据库下载 - OceanBase 数据库下载中心):
- oceanbase-ce-4.0.0.0-103000022023011215.el7.x86_64.rpm
- oceanbase-ce-libs-4.0.0.0-103000022023011215.el7.x86_64.rpm
- obclient-2.2.1-4.el7.x86_64.rpm
- libobclient-2.2.1-2.el7.x86_64.rpm
1.服务器配置
关于服务器配置,生产部署和个人实验两类场景有所差异。作为小白,我尽可能简化配置步骤,仅做了一些必要的部分。
- admin用户创建。实际部署时,将使用admin用户进行操作。
- 设置无密码 ssh 登录(建议)。其中部署过程中的很多操作对于每台服务器都是一样的,为了避免多次重复的输入命令,简化部署流程,最好通过ssh实现免密联通3台服务器。这样便可以实现在中控机上同步操作另3台服务器的效果。
- 磁盘分区及挂载。在数据库使用过程产生的数据及日志文件最好存储在不同的磁盘上。在实验过程中,由于只有一块额外40g的数据盘,退而求其次,将数据及日志文件目录挂载至同块数据盘的不同分区。
- 配置时钟同步服务ntp。集群中的服务器时间必须保持一致,否则会导致 OceanBase 集群无法启动,运行时也会出现故障。
此番看来,部署前要做的准备工作还是蛮多的,万事开头难,just do it~ 👨🏭
1.1 admin用户创建
useradd admin
passwd admin
#通过visudo命令编辑/etc/sudoers添加以下内容:
visudo
'''
Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
admin ALL=(ALL) NOPASSWD: ALL
'''
1.2 设置无密码 SSH 登录
# 在中控机172.28.129.220上生成密钥
ssh-keygen -t rsa
# 在中控机上运行命令登录目标机器(3台ecs)
ssh-copy-id admin@172.28.129.220
ssh-copy-id admin@172.22.57.25
ssh-copy-id admin@172.22.57.24
1.3 磁盘分区及挂载
# 查看磁盘信息
fdisk -l
# 对数据盘/dev/vdb进行分区,分成/dev/vdb1,/dev/vdb2两块分区(各20g)
fdisk /dev/vdb
# 创建数据文件、日志文件实际目录
mkdir /data
mkdir /redo
# 对新建分区进行格式化
mkfs.ext4 /dev/vdb1
mkfs.ext4 /dev/vdb2
# 编辑/etc/fstab 添加如下内容
'''
/dev/vdb1 /data ext4 defaults 1 1
/dev/vdb2 /redo ext4 defaults 1 1
'''
vim /etc/fstab
# 编辑完成之后 执行mount操作,完成挂载
mount -a
# 查看结果
df -h
1.4 配置时钟同步服务ntp
#1 在线安装ntp (3台ecs均安装)
yum install ntp ntpdate -y
#2 在中控机上配置其作为ntp服务端服务器
# 编辑配置文件,添加以下内容:
'''
server 172.28.129.220
'''
vim /etc/ntp.conf
# 查看ntp服务端服务是否启动成功
ps -ef | grep -i ntpd
# 运行以下命令设置ntp服务开机自启动
chkconfig ntpd on
#3 在另外两台ecs上开启ntp客户端服务
# 首先先停止原有的ntp服务
service ntpd stop
# 同步ntp服务端时间
ntpdate 172.28.129.220
# 编辑配置文件添加以下内容
'''
server 172.28.129.220
'''
vim /etc/ntp.conf
# 启动ntp服务
systemctl start ntpd.service
# 验证配置是否成功
ntpstat
timedatectl
2.安装以及目录创建
完成服务器配置之后,需要将安装包从中控机分发到其他esc服务器上,然后通过rpm进行安装。安装完成后,需要对文件目录进行规划与创建。
1 在中控机上来完成3台ecs的软件分发及安装
# 定义ip数组
ips={172.28.129.220 172.22.57.25 172.22.57.24}
# 安装包分发
for ip in ${ips[*]}; do echo $ip; scp libobclient-2.2.1-2.el7.x86_64.rpm obclient-2.2.1-4.el7.x86_64.rpm oceanbase-ce-libs-4.0.0.0-103000022023011215.el7.x86_64.rpm oceanbase-ce-4.0.0.0-103000022023011215.el7.x86_64.rpm admin@$ip:~/; done;
# 安装,完成后会自动创建/home/admin/oceanbase目录,可以查看下
for ip in ${ips[*]}; do echo $ip; ssh admin@$ip "sudo rpm -Uvh oceanbase-ce*.rpm && sudo rpm -Uvh *obclient*.rpm"; done;
2 在中控机上来完成3台ecs的目录创建
# 在安装主目录(/home/admin/oceanbase)下手动创建store/obdemo目录,obdemo是我们的集群名
# 在根目录下/data /redo 下分别创建实际存放数据文件和事务日志文件的目录
# 注意,这里我们将slog和sstable放在了一个/data目录下,其在数据盘的同一个分区,如果不这么操作的化,后续
# 启动observer进程的时候可能会报错
for ip ${ips[*]}; do echo $ip; ssh admin@$ip "mkdir -p /home/admin/oceanbase/store/obdemo /data/obdemo/{sstable,slog} /redo/obdemo/{clog,ilog}"; done;
# 软链操作,将主目录下的相关目录链接到实际目录/data和/redo
for ip ${ips[*]}; do echo $ip; ssh admin "ln -s /data/obdemo/sstable /home/admin/oceanbase/store/obdemo/sstable"; done;
for ip ${ips[*]}; do echo $ip; ssh admin "ln -s /data/obdemo/slog /home/admin/oceanbase/store/obdemo/slog"; done;
for ip ${ips[*]}; do echo $ip; ssh admin "ln -s /redo/obdemo/clog /home/admin/oceanbase/store/obdemo/clog"; done;
for ip ${ips[*]}; do echo $ip; ssh admin "ln -s /redo/obdemo/ilog /home/admin/oceanbase/store/obdemo/ilog"; done;
3 环境变量配置
for ip in ${ips[*]}; do echo $ip; ssh admin@$ip "echo 'export LD_LIBRARY_PAT=\$LD_LIBRARY_PAT:~/oceanbase/lib'>>~/.bash_profile"; done;
. ~/.bash_profile
3.再次检查
这一步前,我们已经做了很多的准备工作,终于可以开始启动observer服务进程了,一睹国产分布式数据库的魅力了,但是为了万无一失,我们需要再仔细检查下,主要就是用户是否切换至admin,环境变量是否已经生效,手动创建的目录路径以及属主是否正确。
1 检查用户是否是admin
echo whoami && id
2 检查目录路径是否正确
tree /home/admin/oceanbase /data /redo
3 检查权限
ls -l /
ls -l /home/admin
# 如果权限有问题
sudo chown -R admin:admin /data
sudo chown -R admin:admin /redo
sudo chown -R admin:admin /home/admin/oceanbase
5 检查环境变量是否生效
env | grep LD_LIBRARY
# 如果没有生效
. ~/.bash_profile
4.启动observer进程
如果前期准备工作做好的话,这一步一般来说不会有什么问题,如果有启动上的报错可以参看主目录/home/admin/oceanbase/log/observer.log中的ERROR信息。但要注意一定要保证admin拥有主目录的权限,否则可能会遇到创建dir失败的报错,此时log目录都还没有被创建出来。
启动命令中有较多的参数
-i 设备网卡 可以通过ifconfig查看
-p observer对外访问服务端口observer默认为2881
-P observer rpc端口,用于observer间进行通信默认为2882
-z 当前server所述的可用区,因为我们是3副本集群,所以3台服务器上的observer进程对应不同的zone
-d 集群主目录
-r root_service 格式为ip:2882:2881
-c 集群id,一组数字,随意即可,不与集群重复即可,但是有长度限制,建议不要过长
-n 集群的名称
-o 指定集群启动参数。这里有比较多的参数可以指定,我只设置了内部保留内存和数据文件大小。
#启动172.28.129.220上的observer 作为zone1 (命令中的cd ~/oceanbase 能够保证我们在主目录下进行observer的启动)
cd ~/oceanbase && bin/observer -i eth0 -p 2881 -P 2882 -z zone1 -d ~/oceanbase/store/obdemo -r '172.28.129.220:2882:2881;172.22.57.24:2882:2881;172.22.57.25:2882:2881' -c 20230224 -n obdemo -o "system_memory=2G,datafile_size=5G"
#启动172.22.57.25上的observer 作为zone2
cd ~/oceanbase && bin/observer -i eth0 -p 2881 -P 2882 -z zone2 -d ~/oceanbase/store/obdemo -r '172.28.129.220:2882:2881;172.22.57.24:2882:2881;172.22.57.25:2882:2881' -c 20230224 -n obdemo -o "system_memory=2G,datafile_size=5G"
#启动172.22.57.24上的observer 作为zone3
cd ~/oceanbase && bin/observer -i eth0 -p 2881 -P 2882 -z zone3 -d ~/oceanbase/store/obdemo -r '172.28.129.220:2882:2881;172.22.57.24:2882:2881;172.22.57.25:2882:2881' -c 20230224 -n obdemo -o "system_memory=2G,datafile_size=5G"
#上述命令即使控制台没有报错,也不意味着就成功了,查看进程及端口情况来确认observer是否正确启动
ps -ef | grep observer
#查看2881及2882端口的情况
sudo netstat -ntlp
5.bootstrap
到了最后一步了,通过obclient我们直连中控机的observer进程,进行bootstrap。
#在中控机连接本机上的observer,最开始的连接串非常简单,-P2881说明是直连
obclient -h127.1 -uroot -P2881 -p -c -A
# 首先设置当前会话的超时变量,因为后续的bootstrap操作可能花的时间比较长,适当增大超时时长避免超时报错
SET SESSION ob_query_timeout=1000000000;
# 开始bootstrap,这里需要注意zone和ip是否一一对应
ALTER SYSTEM BOOTSTRAP ZONE 'zone1' SERVER '172.28.129.220:2882',ZONE 'zone2' SERVER '172.22.57.25:2882',ZONE 'zone3' SERVER '172.22.57.24:2882';
6.验证
bootstrap结束之后,我们的3副本集群就算是搭建完毕了,但是好像没有什么实感,我们现在来进行一些简单的验证。
# 在database列表中如果出现oceanbase就说明成功了
show databases;
# 更加直观的我们可以看下sys租户的zone list是否是zone1;zone2;zone3
use oceanbase;
select * from oceanbase.__all_tenant;