第一章 环境准备
1.1 服务器和介质准备
1.1.1 服务器架构及Linux 操作系统版本要求
1.1.2 服务器数量及配置
1.1.3 RPM版本
1.2 部署规划及环境检查、配置
1.2.1 架构 1-1-1
1.2.2 磁盘挂载
OB服务器:
1.2.3 网卡设置
网卡名统一设置为eth49。
1.2.4 安装依赖包
因服务器存在资源复用情况,无法直接安装RPM包。本次采取RPM包直接解压缩方式。
rpm2cpio oceanbase-ce-3.1.0-1.el7.x86_64.rpm |cpio -idmv mkdir -p ~/oceanbase_test/ob1/ mv ./home/admin/oceanbase ~/oceanbase_test/ob1/
rpm2cpio oceanbase-ce-libs-3.1.0-1.el7.x86_64.rpm |cpio -idmv mv ./home/admin/oceanbase/lib ~/oceanbase_test/ob1/oceanbase/
cd ~/oceanbase_test/ob1/ tree
1.2.5 配置时钟源
OceanBase数据库是一个分布式数据库,所以集群多个节点的时钟必须配置时钟同步服务NTP或者chrony(网上教程很详细,在此不赘述),保证所有节点时钟偏差在100ms以内。我的服务器使用的是ntp方式,在中间机上使用ping或clockdiff命令检查到三台ob节点的延迟。三节点时间同步误差如果超过 50ms,则后面初始化集群一定会失败。
ping -T tsandaddr xxip -c 1
1.2.6 初始化自定义目录
创建总数据目录、数据目录、日志目录 mkdir -p ~/oceanbase_test/ob1/oceanbase/store/obtest1 /data/8/bingxiao_datadata/{sstable,etc3} /data/7/bingxiao_data/redo/obtest1/{clog,ilog,slog,etc2} 创建软连接 for f in {clog,ilog,slog,etc2}; do ln -s /data/7/bingxiao_data/redo/obtest1/$f ~/oceanbase_test/ob1/oceanbase/store/obtest1/$f ; done for f in {sstable,etc3}; do ln -s /data/8/bingxiao_data/data/obtest1/$f ~/oceanbase_test/ob1/oceanbase/store/obtest1/$f; done 查看目录层级 cd ~/oceanbase_test/ob1/ tree store/ /data/8/bingxiao_data/data/ /data/7/bingxiao_data/redo/
注意:若进程初始化失败之后,建议先清理目录,再进行重建
kill -9 `pidof observer` /bin/rm -rf ~/oceanbase_test/ob1/oceanbase/store/obtest1/*/*
第二章 部署OB集群
2.1 配置lib
echo ‘export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase_test/ob1/oceanbase/lib' >> ~/.bash_profile
. ~/.bash_profile
2.2 启动observer
每个机器的启动参数大部分一样,只有-z参数不一样,注意关注。
1. ip1
cd ~/oceanbase_test/ob1/oceanbase && bin/observer -i eno49 -p 26881 -P 26882 -z zone1 -d ~/oceanbase_test/ob1/oceanbase/store/obtest1 -r 'XX:26882:26881;XX:26882:26881;XX:26882:26881' -c 20211205 -n obtest1 -o "__min_full_resource_pool_memory=268435456,datafile_size=100G,memory_limit=32G, system_memory=16G,cpu_count=32,stack_size=1536K,cache_wash_threshold=2G,workers_per_cpu_quota=10, schema_history_expire_time=1d,net_thread_count=8,major_freeze_duty_time=Disable, minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False, datafile_disk_percentage=10, config_additional_dir=/data/8/bingxiao_data/data/obtest1/etc3;/data/7/bingxiao_data/redo/obtest1/etc2"
2. ip2
cd ~/oceanbase_test/ob1/oceanbase && bin/observer -i eno49 -p 26881 -P 26882 -z zone1 -d ~/oceanbase_test/ob1/oceanbase/store/obtest1 -r 'XX:26882:26881;XX:26882:26881;XX:26882:26881' -c 20211205 -n obtest1 -o "__min_full_resource_pool_memory=268435456,datafile_size=100G,memory_limit=32G, system_memory=16G,cpu_count=32,stack_size=1536K,cache_wash_threshold=2G,workers_per_cpu_quota=10, schema_history_expire_time=1d,net_thread_count=8,major_freeze_duty_time=Disable, minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False, datafile_disk_percentage=10, config_additional_dir=/data/8/bingxiao_data/data/obtest1/etc3;/data/7/bingxiao_data/redo/obtest1/etc2"
3、ip3
cd ~/oceanbase_test/ob1/oceanbase && bin/observer -i eno49 -p 26881 -P 26882 -z zone1 -d ~/oceanbase_test/ob1/oceanbase/store/obtest1 -r 'XX:26882:26881;XX:26882:26881;XX:26882:26881' -c 20211205 -n obtest1 -o "__min_full_resource_pool_memory=268435456,datafile_size=100G,memory_limit=32G, system_memory=16G,cpu_count=32,stack_size=1536K,cache_wash_threshold=2G,workers_per_cpu_quota=10, schema_history_expire_time=1d,net_thread_count=8,major_freeze_duty_time=Disable, minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False, datafile_disk_percentage=10, config_additional_dir=/data/8/bingxiao_data/data/obtest1/etc3;/data/7/bingxiao_data/redo/obtest1/etc2"
注意:启动参数中,memory_limit,system_memory,cpu_count,datafile_disk_percentage参数是否合理很重要,很多报错都是由于设置不合理导致的,我在采用教程文档中默认配置参数启动时,就遇到了进程直接起不来,bootstrap时超时或者报system error,RPC error等。所以建议,可以根据服务器资源情况进行微调。
2.3 检查端口
检查三个节点进程启动正常,主要看端口监听是否正常。在中控机上批量查询:
for ip in $IPS;do echo $ip;ssh $ip "netstat -ntlp | grep -E '26881|26882' "; done
2.4 集群自举(初始化)
当 OceanBase 集群节点都正常启动,并且监听正常时,可以通过mysql或obclient连接到任一节点,进行自举(bootstrap 集群初始化)操作。 初始密码是空。
mysql -h XX -P 26881 -uroot -p -c -A set session ob_query_timeout=1000000000; alter system bootstrap ZONE 'zone1' SERVER 'XX:26882', ZONE 'zone2' SERVER 'XX:26882', ZONE 'zone3' SERVER 'XX' ;
bootstrap完成后,重连集群
mysql -h XX -P 26881 -uroot@sys -p -c -A
2.5 部署obproxy
1. 解压obproxy rpm包
rpm2cpio obproxy-3.1.0-1.el7.x86_64.rpm|cpio -idmv mkdir -p ~/oceanbase_test/ob1/ mv ./home/admin/oceanbase ~/oceanbase_test/ob1/ tree
2. 启动obproxy
bin/obproxy -r XX:26881;XX:26881;XX:26881 -p 26883 -l 26884 -o enable_strict_kernel_release=false,enable_cluster_checkout=false,enable_metadb_used=false,skip_proxy_sys_private_check=true -c obtest1
3. 登录obproxy修改密码
mysql -h XX -P 26883 -uroot@proxysys -p --修改 OBPROXY 用户密码 alter proxyconfig set obproxy_sys_password = 'ob_FC123#'; --修改 OBPROXY 连接 OceanBase 集群用户 proxyro 的密码 alter proxyconfig set observer_sys_password = 'ob_FC123#';
4. 使用obproxy连接obtest1集群:
命令参数:
-h | host:任意一台obproxy机器的ip -P | port:2883 -u | user:root@sys#{集群名},比如例子中root@sys#ob_test
mysql -h{OBPROXY-IP} -P2883 -uroot@sys#{集群名} -p'xxxxxx' -Doceanbase obclient -h{OBPROXY-IP} -P2883 -uroot@sys#{集群名} -p'xxxxxx' -Doceanbase obclient -h{OBPROXY-IP} -P2883 -uroot@sys#{集群名} -p'xxxxxx' -Doceanbase
mysql -h XX -P 26883 -uroot@sys#obtest1 -p -c -A oceanbase show processlist; show full processlist;
第三章 创建OceanBase租户
3.1 查看业务租户可用资源大小
当OceanBase集群部署完成后,预分配的服务器CPU,内存部分会分配给OB系统租户,其余的CPU和内存资源才是业务租户可以分配的。这些可用资源的大小,可以通过连接OB系统租户,查看__all_virtual_server_stat表获取,示例如下,剩余可用CPU 24C,内存 10G:
MySQL [oceanbase]> select zone, sum(cpu_total) - sum(cpu_max_assigned) as 'CPU remaining C', (sum(mem_total) - sum(mem_max_assigned))/1024/1024/1024 as 'Memory remaining G' from __all_virtual_server_stat group by zone; +-------+-----------------+--------------------+ | zone | CPU remaining C | Memory remaining G | +-------+-----------------+--------------------+ | zone1 | 24 | 10.200000000186 | | zone2 | 24 | 10.200000000186 | | zone3 | 24 | 10.200000000186 | +-------+-----------------+--------------------+ 3 rows in set (0.032 sec)
3.2 创建实例规格、创建实例
create resource unit S1C1G max_cpu=1,min_cpu=1,max_memory='1G',min_memory='1G',max_iops=1000,min_iops=1000,max_ session_num=1000000,max_disk_size='10G'; create resource pool poo1 unit='S1C1G' ,unit_num=1; create tenant mysqlTest resource_pool_list=('poo1'),primary_zone='RANDOM',charset='utf8' set ob_tcp_invited_node s='%',ob_compatibility_mode='mysql';
3.3 创建库、表
CREATE DATABASE TESTDB2; USE TESTDB2; CREATE TABLE TEST2(ID INT PRIMARY KEY,NAME VARCHAR(256),AGE INT); DESC TEST2; INSERT INTO TEST2 VALUES(1,"ZHANGSAN",30); SELECT * FROM TEST2;
3.4 连接OceanBase租户
3.4.1 控制台连接:
obclient -h{OBPROXY-IP} -P2883 -uroot@{租户名}#{集群名} -p'xxxxxx'
如上例:
obclient -h XX -P 26883 -uroot@mysqlTest#obtest1 -p -c -A oceanbase
3.4.2 JDBC连接:
需要安装包中的 oceanbase-client-1.0.9.jar 和 guava-18.0.jar
maven配置:
<dependency> <groupId>com.alipay.oceanbase</groupId> <artifactId>oceanbase-client</artifactId> <version>1.0.9</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency>
URL:
与Oracle或Mysql的配置一致。
第四章 踩坑总结
1、observer启动失败,bootstrap初始化报错。
启动参数中,memory_limit,system_memory,cpu_count,datafile_disk_percentage参数的合理性很重要,很多时候的报错都是由于设置与实际资源不匹配或者分配的资源没有达到ob内部启动要求导致的,我在采用教程文档中默认配置参数启动时,就遇到了进程直接起不来,bootstrap时超时或者报system error,RPC error等。所以建议,可以根据实际服务器资源情况进行微调。
2、proxy连接失败。
部署obproxy之后,可以通过proxysys账号登录obproxy时,报错。ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 0。重试几次之后甚至会导致obproxy core.dump, system error:0或2或11等。
通过查看proxy日志,发现有一条wran日志很奇怪,“xx@proxysys ip is not private”。于是在obproxy -o参数中添加了skip_proxy_sys_private_check=true,重启服务后,报错解决,连接root@proxysys成功。