OceanBase(1)OceanBase介绍与社区版安装部署教程
一、OceanBase简介
OceanBase是一种原生的分布式数据库,从2010年至今已经有11年的历史,历经了4个版本。阿里旗下很多服务都是运行于OceanBase上,比如淘宝、支付宝、天猫、花呗等,后来随着发展又有工商银行、中国移动、招商证券等金融机构开始使用OceanBase。OceanBase有以下核心特性:
· 分布式:集群形式部署,支持水平扩展,在线扩容缩容方便,能自动负载均衡
· 高可用:基于Paxos协议做到数据强一致性,即便少数副本故障也不会丢失数据,服务自动恢复(RPO=0;RTO<30S)
· 多租户:租户也可以当作实例来理解,可以按需分配实例的配置并在线进行调整,CPU和内存资源可以相互隔离
· 高兼容:原生的SQL和事务引擎,兼容MySQL、Oracle(社区版暂不支持Oracle的兼容),数据可以平滑迁移
· 高性能:在真实业务系统下单表最大3200亿行,QPS 6100万次,准内存处理性能
· 低成本:X86服务器,不依赖存储设备
OceanBase可以解决MySQL集群以下痛点
二、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反向代理工具,当集群数量较多时建议使用
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-*
· 切换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
· 最终目录结构如下
· 使用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
评论