OceanBase(1)OceanBase介绍与社区版安装部署教程

TangLu 未命名 2022-05-07 2574 0

一、OceanBase简介

OceanBase是一种原生的分布式数据库,从2010年至今已经有11年的历史,历经了4个版本。阿里旗下很多服务都是运行于OceanBase上,比如淘宝、支付宝、天猫、花呗等,后来随着发展又有工商银行、中国移动、招商证券等金融机构开始使用OceanBase。OceanBase有以下核心特性:

· 分布式:集群形式部署,支持水平扩展,在线扩容缩容方便,能自动负载均衡

· 高可用:基于Paxos协议做到数据强一致性,即便少数副本故障也不会丢失数据,服务自动恢复(RPO=0;RTO<30S)

· 多租户:租户也可以当作实例来理解,可以按需分配实例的配置并在线进行调整,CPU和内存资源可以相互隔离

· 高兼容:原生的SQL和事务引擎,兼容MySQL、Oracle(社区版暂不支持Oracle的兼容),数据可以平滑迁移

· 高性能:在真实业务系统下单表最大3200亿行,QPS 6100万次,准内存处理性能

· 低成本:X86服务器,不依赖存储设备


OceanBase可以解决MySQL集群以下痛点

ob1.png


二、OceanBase社区版安装部署教程

1、下载OceanBase软件包

可通过以下3种方式获取OceanBase安装包

· 官方下载:https://open.oceanbase.com/softwareCenter/community

· Github下载:https://github.com/oceanbase/oceanbase/releases

· 阿里云Yum:https://mirrors.aliyun.com/oceanbase/OceanBase.repo


2、OceanBase软件包介绍

oceanbase-ce(必需):OceanBase社区版核心程序

oceanbase-ce-libs(必需):OceanBase社区版库文件

ob-deploy:自动化部署工具,手动部署的话非必选

obproxy:OceanBase反向代理工具,当集群数量较多时建议使用

ob2.png


3、服务器初始化

· 文件句柄数设置

vi /etc/security/limits.conf
root soft nofile 655350
root hard nofile 655350
* soft nofile 655350
* hard nofile 655350
* soft stack 20480
* hard stack 20480
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited

#退出当前会话,重新登录,查看配置是否生效
ulimit -a


· 配置 sysctl.conf

vi /etc/sysctl.conf
## 修改内核异步 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

#更改配置完成后,执行命令加载配置
sysctl -p

 

· 关闭防火墙、SELinux

systemctl disable firewalld 
systemctl stop firewalld

vi /etc/selinux/config
SELINUX=disabled

setenforce 0


4、手动部署OceanBase三副本集群(以下操作每个节点都需要执行),需要注意副本不等同于节点,单副本也可以有多个节点

· 建立admin用户并配置sudo权限

useradd admin
usermod admin -G wheel


· 下载RPM包进行安装,RPM 包将被自动安装在/home/admin/oceanbase

wget https://mirrors.aliyun.com/oceanbase/community/stable/el/7/x86_64/oceanbase-ce-3.1.1-4.el7.x86_64.rpm
wget https://mirrors.aliyun.com/oceanbase/community/stable/el/7/x86_64/oceanbase-ce-libs-3.1.1-4.el7.x86_64.rpm
rpm -ivh oceanbase-ce-*

obtree.png


· 切换admin用户,为OB建立对应的数据目录(和使用 OBD 自动化部署不同的是这里创建了一个obdemo的目录作为集群名标识),如果后期破坏了这些目录结构可能会导致集群无法启动。其中store作为数据文件目录包含了 clog、ilog、slog、sstable 4个子目录。clog、ilog、slog 是事务日志目录,slog 存储静态数据写入的事务日志,clog 存储动态数据写入的事务日志,ilog 存储日志目录。sstable 是磁盘上的静态数据目录,sstable 目录下会有一个 block_file,这个文件在 observer 启动后就会被创建,如果不指定大小的话在集群启动后会直接预分配95%的可用磁盘空间,通过datafile_size 或 datafile_disk_percentage 控制这个文件的大小或者分配的比例

su - admin
sudo chown admin:admin /home/admin/oceanbase/

#创建总目录
mkdir -p /home/admin/oceanbase/store/obdemo  

#创建数据文件目录
mkdir -p /data/obdemo/{sstable,etc3} 

#创建日志目录
mkdir -p /redo/obdemo/{clog,ilog,slog,etc2}

#通过软连接进行目录关联,尽量分配独立磁盘给/data分区和/redo分区
sudo chown -R admin:admin /home/admin/oceanbase/

for f in {clog,ilog,slog,etc2}; 
do
 ln -s /redo/obdemo/$f /home/admin/oceanbase/store/obdemo/$f
done

for f in {sstable,etc3}; 
do
 ln -s /data/obdemo/$f /home/admin/oceanbase/store/obdemo/$f
done


sudo chown -R admin. /data/obdemo
sudo chown -R admin. /redo/obdemo


· 最终目录结构如下

obtree2png.png

ob_tree.png


· 使用admin用户启动服务(如果节点之间配置一致,启动参数里通常只有 -z 参数不同),一定不要用root启动,否则文件权限会变

-i:服务绑定的网卡,比如eth0

-p:服务监听的端口,默认2881

-P:RPC端口,用于集群之间通讯

-z:声明节点所属的zone,三个 zone 的三个节点就可以初始化为一个三副本集群,需要注意对应关系一定要正确

-d:数据存放的总目录,会在这个目录下寻找clog、ilog、slog、sstable等目录

-r:集群所有节点的地址信息

-c:集群标识号,节点之间配置一个相同的号码,必须是数字格式

-n:集群名称

-o:内存相关配置,如果节点内存大于64G可以不用额外声明。memory_limit用于设置进程可用最大内存,0为不限制(注意系统最大内存不能低于memory_limit值);datafile_size用于设置数据文件(block_file)的大小;system_memory用于设置系统预留的内存容量;__min_full_resource_pool_memory用于设置创建租户时的最小内存规格

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

/home/admin/oceanbase/bin/observer -i eth0 -p 2881 -P 2882 -z zone1 -d /home/admin/oceanbase/store/obdemo -r '172.20.1.212:2882:2881;172.20.1.213:2882:2881;172.20.1.214:2882:2881' -c 20220518 -n obdemo -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=4,datafile_size=50G,stack_size=1536K,config_additional_dir=/data/obdemo/etc3;/redo/obdemo/etc2"
/home/admin/oceanbase/bin/observer -i eth0 -p 2881 -P 2882 -z zone2 -d /home/admin/oceanbase/store/obdemo -r '172.20.1.212:2882:2881;172.20.1.213:2882:2881;172.20.1.214:2882:2881' -c 20220518 -n obdemo -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=4,datafile_size=50G,stack_size=1536K,config_additional_dir=/data/obdemo/etc3;/redo/obdemo/etc2"
/home/admin/oceanbase/bin/observer -i eth0 -p 2881 -P 2882 -z zone3 -d /home/admin/oceanbase/store/obdemo -r '172.20.1.212:2882:2881;172.20.1.213:2882:2881;172.20.1.214:2882:2881' -c 20220518 -n obdemo -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=4,datafile_size=50G,stack_size=1536K,config_additional_dir=/data/obdemo/etc3;/redo/obdemo/etc2"


· 初始化集群

当 OceanBase 集群三个节点都正常启动后就可以通过2881端口连接到任一节点进行bootstrap集群初始化操作,如果初始化失败的话需要排查上一步初始化时-o所配置的参数,比如内存是否不足(OBServer可用内存不得低于8G)、cpu是否配置不够等都会导致初始化集群失败

mysql -h 172.20.1.212 -u root -P 2881 -p -c -A
set session ob_query_timeout=1000000000;alter system bootstrap ZONE 'zone1' SERVER '172.20.1.212:2882', ZONE 'zone2' SERVER '172.20.1.213:2882', ZONE 'zone3' SERVER '172.20.1.214:2882' ;
#大概需要30秒左右


· 集群创建完成后会默认生成一个sys租户(也可以理解为sys实例),在该租户下有一个默认的root用户(每个租户创建后都会有一个root账号),这里需要先修改root的密码(OBProxy用户密码也可以同时修改,这里非必须),直连observer时用户名格式为用户名@实例名比如root@sys。如果使用OBProxy的话则是用户名@实例名#集群名,比如root@sys#linuxe

mysql -h 172.20.1.212 -u root@sys -P 2881 -p -c -A
alter user root identified by '123456' ;

#下面的操作可以先不做,等需要进行obpxory的时候再操作,可以看后面的相关文章
#create user proxyro;       # OBProxy默认使用proxyro用户去连接集群,该用户需要手动创建
#grant select on oceanbase.* to proxyro identified by '123456' ;


5、OceanBase日志文件(/home/admin/oceanbase/log)

observer.log:observer运行时的日志文件,排错主要查看该日志

rootservice.log:observer上的RootServer日志

election.log:选举模块日志

为了避免硬盘被日志填满,建议开启日志循环,并且调整日志级别,详细操作可以参考文章《OceanBase(4)OceanBase集群日常运维命令

enable_syslog_recycle=True;
max_syslog_file_count=<count>;
syslog_level=[DEBUG,TRACE,INFO,WARN,USER_ERR,ERROR];  #默认为INFO,OB的日志输出会非常多,建议调整为WARN


评论