1、安装部署、扩容、升级等部分较为顺利,主要完成:
(1)OB单副本安装测试
(2)OB三副本集群部署
(3)OBProxy安装测试,请求转发测试
(4)OCP2.4.3部署、并尝试手工纳管OB集群
(5)ODC部署和客户端工具部署
(6)OB群集升级验证
(7)集群在线弹性(扩容和缩容)验证
(8)租户资源管理(创建、扩容、缩容)验证
遇到的问题:
(1)新老版本ocp安装后,添加主机失败,需要清理浏览器缓存才能成功
(2)添加主机对于mariadb包有依赖,将mysql包卸载安装mariadb才能添加成功
(3)ocp的oracle租户界面没有【用户管理】
(4)oms的增量同步功能有点问题;oms全量迁移20g数据4小时(跟源端库的性能有关?)
(5)ocp英文版本有中文页面
(6)oms同步任务经常pending住,发现有些oms组件状态异常,需要重启oms docker或者此组件才能恢复
(7)ocp扩容集群(增加zone)后,rootservice_list未把新增的zone加进去,需要手动修改添加;删除zone后也不会更新rootservice_list,需要手动修改移除
(8)命令行进行备集群到新主集群的转换,ocp上新主集群还是显示备集群;新备集群显示备集群;导致ocp无法进行切主操作
(9)已经将某observer从集群中删除,ocp上主机信息【所属OB集群】仍显示属于这个ob集群,需要更新源库
obclient> update compute_host set status='AVAILABLE' where name='ob2';
Query OK, 1 row affected (0.00 sec)
obclient> delete from compute_host_service where host_id=1000011;
Query OK, 1 row affected (0.01 sec)
2、功能验证,发现oracle的大部分功能ob的oracle租户都可以实现,但少部分对oracle的支持不完善,主要完成:
(1)租户生命周期管理验证
(2)OB的连接(命令行、jdbc等)验证
(3)C程序连接OB验证
(4)OB的字符集的验证
(5)系统参数(全局、租户、zone)生效、日志输出验证
(6)资源健康监控(全局资源、租户资源等、性能等)验证
(7)OB的SQL(DDL/DML/DCL)验证
(8)大表在线的DDL验证,可以实现dml过程中对大表ddl操作
(9)OB表组(Hash/List/Range)、表分区(Hash/List/Range)、索引功能验证
(10)Oracle兼容性功能(触发器、视图、函数、dblink等)验证
遇到的问题:
(1)c程序连接ob的oci接口函数不完整,研发在进行中,升级obproxy到1.8.6暂时解决sql卡住问题
(2)ocp显示的性能数据只能保留1周,后端不确定是否有更长时间之前的性能数据
(3)profile、Role等不支持
(4)索引rebuild不支持
(5)dblink可以创建,但引用时报错"已验证触发器、视图、存储过程,待验证dblink、package
obclient> select * from DBLIBK_TEST.t1@mylink;
ERROR:
Unknown Error
obclient> select * from TEST.t1@mylink;
ORA-01861: literal does not match format string
"
(6)对无主键表添加主键不支持
obclient> alter table test_acid_a add primary key(id);
ORA-00600: internal error code, arguments: -4007, Not supported feature or function
obclient>
(7)批量插入只支持10000左右的数据,超过报错ORA-00600: internal error code, arguments: -6212, Statement is timeout),已通过升级obproxy解决
(8)分区表不支持分区交换exchange partition?
(9)dba_segments不包含所有表?
(10)查询gv$partition中不存在的租户报timeout
set session ob_query_timeout=1000000000;
obclient> select * from gv$partition where tenant_id='10001';
ERROR 4012 (25000): Statement is timeout
obclient> select tenant_id from gv$partition group by tenant_id;
+-----------+
| tenant_id |
+-----------+
| 1 |
| 1003 |
+-----------+
2 rows in set (0.15 sec)
(11)
3、性能验证整体没问题,已完成
(1)benchmarksql对OB集群性能测试
(2)Jmeter简单测试OB
(3)OB集群启停时间验证
4、ob高可用测试符合paxos,能保证某个zone down时的高可用和快速恢复,已完成:
(1)OBserver三节点节点故障高可用验证
(2)LVS三副本负载均衡obproxy的验证
(3)管理节点(rootserver)、计算节点异常验证
(4)重建故障节点验证
(5)网卡、服务器、磁盘异常验证
(8)群集异常掉电故障模拟验证
遇到的问题:
(1)lvs配置有些问题
(2)集群断电测试:需要先手动mount nfs,保证nfs目录正常可用再起observer,否则日志备份失败;
发现被接管的集群的所有observer都恢复正常,ocp才能正确显示ob集群,否则会显示ob集群不可用;
mount万nfs后需要手动ALTER SYSTEM noarchivelog/archivelog重启日志备份进程;且obproxy若安装在断电的节点,需要手动起
集群重启之后不能直接进行增量备份,需要先进行全备(全备之前要进行合并),否则报错
2021-02-24 16:40:02.169 ERROR 55 --- [ task-9,4616ae5921df434e,1ec1d0662bc7] c.a.o.s.o.b.PhysicalBackupTaskService : data backup pre-check failed, full data backup needed before incremental data backup
log archive status is interrupted,需要重启下log备份进程alter system noarchivelog/archivelog;
5、ob的备份恢复测试,逻辑备份obdump有些问题,已经解决
(1)OB数据物理备份、恢复验证
(2)OB数据逻辑备份、恢复验证
(3)OB的回收站、闪回表、回滚表功能验证
遇到的问题:
(1)obdumper导出对象定义暂时由于ob版本问题搁置(已升级到2.2.76解决
(2)过期的备份不能自动删除,黑屏删除命令有问题
obclient> ALTER SYSTEM SET DELETE OBSOLETE;
ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'DELETE OBSOLETE' at line 1
(3)备份策略问题--黑屏应该查询哪张表
6、测试ocp告警发送到钉钉已完成
7、分布式事务能力(原子性、一致性、隔离性等)验证
obclient> set session ob_query_timeout=1000000000;
Query OK, 0 rows affected (0.00 sec)
obclient> delimiter //
declare
obclient> declare
-> i number;
-> rand number;
-> begin
-> for i in 1..99999 loop
-> update test_acid_a set col1=i where id=1;
-> update test_acid_a set col1=i where id=2;
-> update test_acid_a set col1=i where id=3;
-> update test_acid_a set col1=i where id=4;
-> update test_acid_a set col1=i where id=5;
-> update test_acid_a set col1=i where id=6;
-> update test_acid_a set col1=i where id=7;
-> update test_acid_a set col1=i where id=8;
-> update test_acid_a set col1=i where id=9;
-> update test_acid_a set col1=i where id=10;
-> update test_acid_a set col1=i where id=11;
-> update test_acid_a set col1=i where id=12;
-> select dbms_random.random into rand from dual;
-> if mod(rand,2)=1 then
-> commit;
-> else
-> rollback;
-> end if;
-> end loop;
-> end;
-> //
ORA-00600: internal error code, arguments: -6212, Statement is timeout
obclient> delimiter ;
8、ob专家来宁交流问题记录
1、使用ob需要注意的点
(1)每个observer建议不超过5万分区(ob痛点,到3.1版本支持20万分区)
(2)ob不支持额外加主键(ob痛点),且create table as select * from 不会带主键,建议create相同表结构的表时直接create ,不建议主键多于4个字段
(3)ob的分区键一定要是主键的一部分(ob的痛点)
(4)ob的oci接口需要适配,蚂蚁建议浩鲸列出oci列表,跟进ob开发;ob建议jdbc流式读取
(5)ob初始化时就要指定足够的盘大小,后期不能扩磁盘(除非扩机器或者重建节点)
(6)dml操作时不写clog(较快),commit时才写clog并落盘(commit较慢),且clog为顺序io(wal);
(7)ob有保护机制,设置ob_trx_idle_timeout(默认为120s),如果事务长时间不commit,会自动回滚事务;建议跑批业务拆为多个短事务(间隔上千行)分批提交
(8)上线的oracle租户不多,蚂蚁建议使用oracle租户(mysql租户也不支持存储过程)
(9)浩鲸提出国际项目(尤其欧洲)对第三方软件(各种jar包)的合规性限制较大,需要蚂蚁确认下第三方软件的合规性问题
(10)ob_query_timeout默认是100s且不建议运维从集群层面调大,需要开发对长查询加上hint或者在session层面调整
(11)tablegroup订单表和订单子表建议选择分区数为数量较大的那个,避免分布式事务
(12)hash分区建议分区数不要太小(hash分区不能加分区)
(13)变化数据都存储在内存,白天都是随机读,不落盘,晚上基于基线meger随机写;合并之前如果断电,恢复时如果redo体量大,ob的策略是从其他副本全量拉数据
(14)oms同步最好让ob厂家来搭建oms,否则同步可能会有问题
(15)不太建议使用二级分区
(16)多副本默认只有主副本提供读写服务(除非指定弱一致性读,不太推荐)
(17)建议初始设置primary zone来避免分布式事务,建议unit=1
(18)建议全ssd(蚂蚁内部全flash卡),且要考虑clog直接落盘,需要配置高些(但ob的瓶颈不在io)
2、后期发展(ob3.x)
(1)高版本计算存储分离
(2)完善对于oracle租户的支持如dblink(ob-ob,ob-oracle的dblink)、分区交换等
3、零碎知识点
(1)tpcc测试:oracle租户,阿里云上,上千台主机,10%的分布式事务
(2)大部分副本所在的机房提供读写能力;跨城市最好远端城市为只读副本;备集群可以只要一个副本(省资源)、也可以多副本
(3)内存绝对隔离、cpu相对隔离,io不做隔离(ob的瓶颈不是io,是内存或cpu)
(4)转储相当于checkpoint;蚂蚁每天合并5、6小时,(合并之前如果断电,恢复时如果redo体量大,ob的策略是从其他副本全量拉数据);三副本如果在合并之前全部断电,只能等待应用redo
(5)paxos协议:commit要等最少两个副本返回成功(事务会有个事务超时时间120s,长事务或者大事务会导致自动回滚,);只读副本不参与决策(只读副本的observer的配置可以比其他observer低)
(6)主副本如果down掉,obproxy先去查down掉的主副本、发现不可用再去找其他的好的副本,时间会长些(obproxy的最大连接数8000)
(7)ob建议使用存储过程;ob insert可以values多个(可以跟mysql一致)
(8)还原点:restorepoint(中间表结构不能改变,只能查询那个还原点的数据,多一秒少一秒无法查询)
(9)手动同步sequence时最大值增加一些
(10)clog大小建议内存4倍
(11)sql审计对性能影响很小(旁路记录),蚂蚁内部也是开的
(12)ob的lsm tree没有碎片的概念;5c对应10个线程(50 c++线程);可以ise加速sas