ClassIn 实践:手动部署 OceanBase 三副本集群

2024年 5月 7日 76.1k 0

作者简介:罗呈祥,数据库管理员。

手动部署 ob 三副本集群

1. IP地址和机器规划

机器os :centos 7.5 8c12g

ClassIn 实践:手动部署 OceanBase 三副本集群-1

2. 初始化机器

2.1 修改内核参数

cat << EOF >> /etc/sysctl.conf

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
fs.aio-max-nr=1048576
EOF

然后执行 sysctl -p 使环境生效。

ClassIn 实践:手动部署 OceanBase 三副本集群-2

2.2 修改会话变量

将会话级别的最大栈空间大小设置为 unlimited,最大文件句柄数设置为 655350,Core 文件大小设置为 unlimited 。 修改 /etc/security/limits.conf 配置文件,如果已有设置值低于这个设置值

/etc/security/limits.conf

cat << EOF >> /etc/security/limits.conf

* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited
* soft stack unlimited
* hard stack unlimited
EOF

2.3 关闭防火墙和 selinux

systemctl disable firewalld
systemctl stop firewalld
systemctl status firewalld

vi /etc/selinux/config

SELINUX=disabled

# 立即生效
setenforce 0
# 查看
getenforce

2.4 配置时钟源

yum -y install 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

启动服务

systemctl start chronyd.service
systemctl status chronyd.service

ClassIn 实践:手动部署 OceanBase 三副本集群-3

 

查看时间信息

查看时间同步活动
chronyc activity

查看时间服务器
chronyc sources

查看同步状态
chronyc sources -v

校准时间服务器:
chronyc tracking

ClassIn 实践:手动部署 OceanBase 三副本集群-4

ClassIn 实践:手动部署 OceanBase 三副本集群-5

 ClassIn 实践:手动部署 OceanBase 三副本集群-6

 

连同时区一起配置了

timedatectl set-timezone Asia/Shanghai

chronyc -a makestep

2.5 创建用户并初始化目录

注意配置 admin 用户 sudo 权限

groupadd -g 500 admin
useradd -g 500 -u 500 admin
echo 'admin:admin' | chpasswd
sudo vi /etc/sudoers
# 新增一行
admin  ALL=(ALL)      ALL

mkdir /data
mkdir /redo
chown -R admin:admin /data
chown -R admin:admin /redo
su - admin
mkdir -p /home/admin/oceanbase/store/obcluster /data/obcluster/{sstable,etc3} /redo/obcluster/{clog,ilog,slog,etc2}
for f in {clog,ilog,slog,etc2}; do ln -s /redo/obcluster/$f /home/admin/oceanbase/store/obcluster/$f ; done
for f in {sstable,etc3}; do ln -s /data/obcluster/$f /home/admin/oceanbase/store/obcluster/$f; done

3. 安装 observer

下载 rpm 包并上传安装(从官网找下载链接)

yum install lrzsz -y
rpm -ivh oceanbase-ce-libs-3.1.1-4.el7.x86_64.rpm
rpm -ivh oceanbase-ce-3.1.1-4.el7.x86_64.rpm

su - admin
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/admin/oceanbase/lib' >> ~/.bash_profile
. ~/.bash_profile

# 注意:zone的名称要根据机器不同而改变,下面是zone1的启动命令
cd /home/admin/oceanbase && bin/observer -i ens33 -p 2881 -P 2882 -z zone1 -d /home/admin/oceanbase/store/obcluster -r '192.168.32.111:2882:2881;192.168.32.112:2882:2881;192.168.32.113:2882:2881' -c 16384 -n obcluster -o "memory_limit=8G,cache_wash_threshold=1G,__min_full_resource_pool_memory=268435456,system_memory=3G,memory_chunk_cache_size=128M,cpu_count=16,net_thread_count=8,datafile_size=10G,stack_size=1536K,config_additional_dir=/data/obcluster/etc3;/redo/obcluster/etc2" -d /home/admin/oceanbase/store/obcluster

启动之后,ps -ef| grep observer 检查进程是否运行正常,使用 netstat -ntlp 检查端口开启情况

有兴趣的可以查看日志,看一下 observer 在初始化启动过程中都做了哪些操作‘。

cd /home/admin/oceanbase/log
tail -f observer.log
# 查看warning级别以上的日志
tail -n 20 observer.log.wf

安装 obclient

安装包从官网下载并上传到机器上。

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

4. 集群初始化(bootstrap)

在新部署的机器上是没有密码的,输密码直接回车即可,或者去掉-p参数

obclient -h 127.0.0.1 -u root -P 2881 -p -c -A

set session ob_query_timeout=1000000000; alter system bootstrap ZONE 'zone1' SERVER '192.168.32.111:2882', ZONE 'zone2' SERVER '192.168.32.112:2882', ZONE 'zone3' SERVER '192.168.32.113:2882' ;

ClassIn 实践:手动部署 OceanBase 三副本集群-7

 

使用 root@sys 用户登录数据库并设置密码:

obclient -h 127.0.0.1 -u root@sys -P 2881 -c -A
alter user root identified by 'root123';

ClassIn 实践:手动部署 OceanBase 三副本集群-8

在其他机器上测试:

ClassIn 实践:手动部署 OceanBase 三副本集群-9

测试成功。

5. 部署 obproxy(以单节点为例)

从官网下载并安装 obproxy 软件包

rpm -ivh obproxy-3.2.0-1.el7.x86_64.rpm

启动 obproxy

cd /home/admin/obproxy-3.2.0 && bin/obproxy -r "192.168.32.111:2881;192.168.32.112:2881;192.168.32.113:2881" -p 2883 -o "enable_strict_kernel_release=false,enable_cluster_checkout=false,enable_metadb_used=false" -c obcluster

ClassIn 实践:手动部署 OceanBase 三副本集群-10

尝试连接,又出现了经典报错:

(官方文档给了解释,此处只为模拟问题)

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 11

ClassIn 实践:手动部署 OceanBase 三副本集群-11

此时使用2881端口是连得上的:

ClassIn 实践:手动部署 OceanBase 三副本集群-12

说明问题出在 obproxy 与 observer 间的通信上。

需要设置 root@proxysys 的密码。

ClassIn 实践:手动部署 OceanBase 三副本集群-13

ClassIn 实践:手动部署 OceanBase 三副本集群-14

obclient -h 127.0.0.1 -u root@proxysys -P 2883
# 设置管理obproxy的root用户密码
alter proxyconfig set obproxy_sys_password = 'root123' ;
# 设置与observer连接的用户的密码
alter proxyconfig set observer_sys_password = 'root123' ;

设置之后,还需要修改 observer 里 proxyro 用户的密码。

登录 observer,查看用户

obclient -h 127.0.0.1 -u root@sys -P 2881 -c -A -proot123 -Doceanbase
select user_id,user_name from __all_user;

ClassIn 实践:手动部署 OceanBase 三副本集群-15

发现并没有这个用户,需要创建出来并授权(只读用户,select 即可):

create user proxyro identified by 'root123';
grant select on *.* to proxyro;

再次测试发现可以连接了!

ClassIn 实践:手动部署 OceanBase 三副本集群-16

6. 创建租户并生成一些数据

6.1 创建 unit 和资源池、租户

create resource unit lcxunit max_cpu=2,max_memory='2G',max_iops=10000,max_disk_size='2G',max_session_num=2000;
create resource pool lcxpool unit='lcxunit',unit_num=1;
CREATE TENANT IF NOT EXISTS test_tenant charset='utf8mb4', replica_num=1, zone_list=('zone1'), primary_zone='zone1', resource_pool_list=('lcxpool') SET ob_tcp_invited_nodes='%';

#删除租户
DROP TENANT tenant_name [FORCE]

ClassIn 实践:手动部署 OceanBase 三副本集群-17

查看租户信息:

ClassIn 实践:手动部署 OceanBase 三副本集群-18

查看资源分配情况和

SELECT a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, (cpu_total-cpu_assigned) cpu_free, round(mem_total/1024/1024/1024) mem_total_gb, round((mem_total-mem_assigned)/1024/1024/1024) mem_free_gb, usec_to_time(b.last_offline_time) last_offline_time, usec_to_time(b.start_service_time) start_service_time, b.status  FROM __all_virtual_server_stat a JOIN __all_server b ON (a.svr_ip=b.svr_ip AND a.svr_port=b.svr_port)  ORDER BY a.zone, a.svr_ip;
SELECT t1.name resource_pool_name, t2.`name` unit_config_name, t2.max_cpu, t2.min_cpu, round(t2.max_memory/1024/1024/1024) max_mem_gb, round(t2.min_memory/1024/1024/1024) min_mem_gb, t3.unit_id, t3.zone, concat(t3.svr_ip,':',t3.`svr_port`) observer,t4.tenant_id, t4.tenant_name  FROM __all_resource_pool t1 JOIN __all_unit_config t2 ON (t1.unit_config_id=t2.unit_config_id)   JOIN __all_unit t3 on (t1.`resource_pool_id` = t3.`resource_pool_id`)   LEFT JOIN __all_tenant t4 on (t1.tenant_id=t4.tenant_id) ORDER BY t1.`resource_pool_id`, t2.`unit_config_id`, t3.unit_id;

ClassIn 实践:手动部署 OceanBase 三副本集群-19

同样新创建的租户 root 用户没有密码,登录后创建数据库生成一些数据

ClassIn 实践:手动部署 OceanBase 三副本集群-20

使用 sysbench 生成数据

ClassIn 实践:手动部署 OceanBase 三副本集群-1

查看生成结果

ClassIn 实践:手动部署 OceanBase 三副本集群-22

ClassIn 实践:手动部署 OceanBase 三副本集群-23

 OceanBase 社区版入门到实战教程直播正在进行中~

快和小伙伴一起进群交流学习吧~

加入直播群方式一:

钉钉群号 3582 5151

加入直播群方式二:

扫码下方二维码加入

ClassIn 实践:手动部署 OceanBase 三副本集群-24

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论