本文共 11638 字,大约阅读时间需要 38 分钟。
ob的备集群zone个数未必要跟主集群一样,有时为了节省资源,备集群的zone可以只建一个
(1)主机规划
主机名 | ip | 内存(G) | cpu | 安装软件 | 占用端口 | 备注 | 集群 |
mgr1 | 172.16.80.57 | 128 | 32 | observer(zone1)、obclient、obproxy | 2881、2882、2883(obproxy) | 读写 | 原主集群 |
mgr2 | 172.16.80.58 | 128 | 32 | observer(zone2)、obclient | 2881、2882 | 读写 | |
mgr3 | 172.16.80.59 | 128 | 32 | observer(zone3)、obclient | 2881、2882、80 | 读写 | |
ob2 | 10.10.176.19 | 128 | 32 | observer(zone4)、obclient | 2881、2882 | 只读 | |
ob1 | 10.10.176.18 | 128 | 32 | observer(zone1)、obclient | 2881、2882 | 只读 | 备集群 |
(1)检查主集群是否符合创建备集群的条件
schema层面和表层面都不能设置primary_zone,复制表的定义不能设locality属性
ALTER SYSTEM ADD CLUSTER VERIFY;
有时会报错如上,说明有表级设置的primary_zone或者复制表设置了locality属性
如:
CREATE TABLE table_name (i_id int, i_name varchar(24), primary key(i_id)) duplicate_scope='cluster' primary_zone='zone1';
或者:
create table bmsql_item (
i_id integer not null,
i_name varchar2(24),
i_price decimal(5,2),
i_data varchar2(50),
i_im_id integer,
PRIMARY KEY (i_id)
)locality='F,R{all_server}@zone1, F,R{all_server}@zone2, F,R{all_server}@zone3' primary_zone='zone1' duplicate_scope='cluster';
可以通过以下的sql查出所有不和规范的表:
select table_name,table_type,tenant_id,database_id from __all_virtual_table where locality !='' or primary_zone !='';
找出租户--schema--用户下的表,进行整改(删除或重建)
有时还会报CHECK DB PRIMARY ZONE CONFIG,说明schema层面设置了primary_zone
找出不和规范的schema,删除或者重建
select database_name ,primary_zone from __all_virtual_database where primary_zone !='';
(2)新建只有一个zone的备集群
新建备集群不是仅仅增加备副本,而是搭建一个独立的ob集群
具体命令可以参考安装ob集群--初始化OB集群之前的部分
注意:
1、备集群版本一般要求与主集群版本一致,请注意主集群oceanbase的版本;
2、且要保证备集群主机的资源与原来每个zone的所有主机资源相同,否则会有一些租户无法同步到备集群
初始化ob备集群(集群名与主集群一致):
su - admin
cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -i eth0 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/obdemo -r '10.10.176.18:2882:2881' -c 20210311 -n obdemo -o "system_memory=10G,datafile_size=100G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"
备端bootstrap集群:
mysql -h127.0.1 -uroot -P2881
set session ob_query_timeout=1000000000;
ALTER SYSTEM BOOTSTRAP CLUSTER STANDBY REGION 'default_region' ZONE 'zone1' SERVER '10.10.176.18:2882' PRIMARY_CLUSTER_ID 20210127 PRIMARY_ROOTSERVICE_LIST '172.16.80.57:2882,172.16.80.58:2882,172.16.80.59:2882';
show databases 确认是否bootstrap成功
select * from V$OB_CLUSTER;
主集群查看备集群信息为registered----可以看到一个最高性能(MAXIMUM PERFORMANCE)、异步(ASYNC)模式的备集群搭建成功
同步模式--ASYNC NET_TIMEOUT = 30000000 :该模式下,主集群的 REDO 日志会异步同步到目标备集群。事务的提交时延不受目标备集群的影响。
保护模式:MAXIMUM PERFORMANCE:主库不受目标集群redo日志应用的影响
主集群添加备集群信息:
ALTER SYSTEM add CLUSTER obdemo CLUSTER_ID 20210311;
主集群查看备集群信息为valid,此时复制状态为:
SYS SCHEMA NOT SYNC--REPLICA IN RESTORE--CHECK ALL SCHEMA EFFECTIVE--OK:
系统会自动从主集群同步全量数据,整个过程对带宽有要求,在正常同步过程中,仅同步REDO 日志,相当于加了一个备副本,可以通过设置以下参数增快同步速率
show parameters like '%DATA_COPY%';
ALTER SYSTEM SET SERVER_DATA_COPY_out_CONCURRENCY = 10;
ALTER SYSTEM SET SERVER_DATA_COPY_in_CONCURRENCY = 10;
alter system set data_copy_concurrency=20;
select * from V$OB_STANDBY_STATUS;
等一会复制状态变为OK且备库scn与主库相差不多(此时备集群已经追赶上主集群)
此时查询备集群状态,delay很小(秒级或者亚秒级),几乎可以忽略:
select cluster_name,cluster_id,cluster_status,primary_cluster_id,protection_mode,protection_level,(NOW(6) - USEC_TO_TIME(CURRENT_SCN)) DELAY from V$OB_CLUSTER;
也可以用主集群的 CURRENT_SCN 值减去备集群的 CURRENT_SCN 值作为备集群的落后时间
select usec_to_time(a.current_scn)-usec_to_time(b.current_scn) delay from v$ob_cluster a,V$OB_STANDBY_STATUS b where a.cluster_name=b.cluster_name;
此时查询主备集群的V$OB_CLUSTER_STATS视图,可以查出表的scn信息,主备集群相差很小,refreshed_schema_version相同
备集群:
主集群:
(3)优化参数
(1)备集群创建后,不会自动同步主集群的配置项,可以根据需要修改备集群的配置项值,主集群上已经修改的配置项,需要评估是否也需要在备集群上设置。
(2)主备同步不会同步sys租户,只是对普通租户的同步,所以平常对主集群的参数优化操作,同时需要考虑修改备集群
(3)由于备集群不会自动同步租户资源配置修改操作,建议调整主集群的租户资源配置后,也要手动调整备集群的租户资源配置
alter system set enable_syslog_recycle=true;
alter system set max_syslog_file_count=100;
ALTER SYSTEM SET enable_merge_by_turn=FALSE;
ALTER SYSTEM set minor_freeze_times=100;
ALTER SYSTEM set freeze_trigger_percentage=70;
(4)备集群日志同步模式和保护模式之间的关系
保护模式 | 强同步模式(SYNC)的备集群 | 异步同步模式(ASYNC)的备集群 |
最大保护模式 | 主集群会强同步日志给备集群 | 主集群异步同步日志给备集群 |
最大性能模式 | 主集群异步同步日志给备集群 | 主集群异步同步日志给备集群 |
最大可用模式 | 主集群会在强同步日志和异步同步日志之间切换 | 主集群异步同步日志给备集群 |
切换日志传输服务(异步同步/强同步)
ALTER SYSTEM MODIFY CLUSTER 'cluster_name' CLUSTER_ID cluster_id SET REDO_TRANSPORT_O
PTIONS = 'SYNC|ASYNC'
切换保护模式
ALTER SYSTEM SET STANDBY CLUSTER TO MAXIMIZE PROTECTION/MAXIMIZE PERFORMANCE;
(1)ocp接管备集群
可以现将备集群的主机(设置机房为standby,ocp重新加主机要保证ntp时间同步、原来的agent清理干净,否侧添加失败)加入到ocp,然后设置备集群zone的idc信息防止加入不了ocp(报主机没有idc错误)
alter system alter zone 'zone1' set idc = 'standby';
也可以直接加入备集群(不先加主机),让ocp自动识别idc信息
主集群视角的拓扑图:
备集群视角的拓扑图:
(2)obproxy连接备集群
主集群配置的obproxy会自动识别备集群信息,所以连接主备集群可以这样区别:
obclient -h172.16.80.57 -P2883 -uroot@sys#obdemo:20210127 -p -A -Doceanbase
obclient -h172.16.80.57 -P2883 -uroot@sys#obdemo:20210311 -p -A -Doceanbase
如果不加后面的集群名和id,默认连的是主集群(当主备库switchover或者failover之后,默认会自动连接到新主,所以无需进行业务连接串的更改)
obclient -h172.16.80.57 -P2883 -uroot@sys -p -A -Doceanbase
(3)测试读写操作
dml、ddl、select均不能在备集群操作,只允许弱一致性读
select /*+read_consistency(weak) */ * from test1;
或者会话层面set ob_read_consistency=weak;
只能会话级设置弱一致性读,无法全局设置(普通租户报ddl not allow)set global ob_read_consistency=weak;
(1)查询备集群的同步进度
select cluster_name,cluster_id,cluster_status,(NOW(6) - USEC_TO_TIME(CURRENT_SCN)) DELAY from V$OB_CLUSTER;
最大性能模式下,备集群落后越多,Switchover 切换的时间越长,Failover 后丢失的数据越多
最大保护和最大可用模式下,Switchover 仅支持日志传输模式为 SYNC 的备集群切换为主集群角色;Failover 也需要根据保护模式和保护级别选择合适的 Failover 命令
(2)查询主集群是否允许切换
SELECT SWITCHOVER_STATUS, SWITCHOVER_INFO FROM V$OB_CLUSTER;
SWITCHOVER_STATUS 展示了当前的切换状态,TO STANDBY表示可以切换为备集群。如果为NOT ALLOWED或其他值,则说明当前不满足切换条件;SWITCHOVER_INFO字段展示了不允许切换的原因,上图表示主集群正在备份(有可能是日志归档),关闭日志归档服务:alter system noarchivelog;
再次检查,SWITCHOVER_STATUS变为TO STANDBY
也有可能SWITCHOVER_INFO显示CHECK PRIMARY CLUSTER SERVER STATUS,说明需要检查主集群的observer是否都在线
(3)执行主库切换为备库
ALTER SYSTEM COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
SWITCHOVER_STATUS变为:SWITCHOVER SWITCHING
(4)备集群切换为主集群
备集群的状态变为TO PRIMARY
ALTER SYSTEM COMMIT TO SWITCHOVER TO PRIMARY;
(1)检查主库状态
主库的状态必须为不可用才能进行failover,且备集群的保护模式为最大可用级别和最大保护级别时(数据强同步),才可以保证不丢数据的failover(在最高性能模式下加force可以直接failover)
select protection_mode,protection_level from v$ob_cluster;
(2)执行failover
ALTER SYSTEM FAILOVER TO obdemo CLUSTER_ID = 20210127 ;
在MAXIMUM PERFORMANCE模式下加force
ALTER SYSTEM FAILOVER TO obdemo CLUSTER_ID = 20210127 force;
(3)检查新主库
检查新主库的角色
select cluster_role,switchover_status,switchover_info,protection_mode,protection_level from v$ob_cluster;
检查新备库信息(新主库failover后会将备集群disable)
select cluster_id,cluster_role,cluster_status,rootservice_list,synchronization_status from V$OB_STANDBY_STATUS;
(4)恢复原主库为新备库
将原来的主集群起来,然后将角色设为备集群
ALTER SYSTEM CONVERT TO PHYSICAL STANDBY;
角色由原来的primary变为PHYSICAL STANDBY,但cluster_status为INVALID状态
(5)主库端起同步进程
ALTER SYSTEM ENABLE CLUSTER SYNCHRONIZATION 'obdemo' CLUSTER_ID=20210311;
备库端查询备集群状态由DISABLED变为VALID
(6)检查当前主备同步
主库端查询备库的synchronization_status由CHECK ALL SCHEMA EFFECTIVE变为OK
select cluster_id,cluster_role,cluster_status,rootservice_list,synchronization_status from V$OB_STANDBY_STATUS;
select cluster_id,switchover_status,switchover_info,primary_cluster_id from v$ob_cluster;
select usec_to_time(a.current_scn)-usec_to_time(b.current_scn) delay from v$ob_cluster a,V$OB_STANDBY_STATUS b where a.cluster_name=b.cluster_name;
(1)主集群端临时停止备集群同步
ALTER SYSTEM disable CLUSTER SYNCHRONIZATION 'obdemo' CLUSTER_ID=20210311;
开启同步:
ALTER SYSTEM enable CLUSTER SYNCHRONIZATION 'obdemo' CLUSTER_ID=20210311;
(2)主集群端删除备集群
ALTER SYSTEM remove CLUSTER obdemo CLUSTER_ID 20210311;
之后就可以清理备集群所有observer的进程和数据
(3)配置备集群的弱一致性读的最旧时间
enable_monotonic_weak_read:单调读开关,默认为 False。
max_stale_time_for_weak_consistency:有界旧一致性读配置项,表示弱一致性读取的普通租户的数据不会落后于指定时间的数据,默认值为 5 秒
如果临时将同步停掉,主备之间的差距越来越大,构造出时间差测试max_stale_time_for_weak_consistency参数
备集群sys租户执行:
alter system set max_stale_time_for_weak_consistency='10s' tenant='oracle_test';
主集群disable备集群同步:
ALTER SYSTEM disable CLUSTER SYNCHRONIZATION 'obdemo' CLUSTER_ID=20210311;
在主集群对普通租户中的测试表test1进行dml操作:
insert into test1 values(10);commit;
在主集群查询当前主备delay,要大于max_stale_time_for_weak_consistency
select usec_to_time(a.current_scn)-usec_to_time(b.current_scn) delay from v$ob_cluster a,V$OB_STANDBY_STATUS b where a.cluster_name=b.cluster_name;
备库执行弱一致性读:
select /*+read_consistency(weak) */ * from test1;
发现弱一致性读无法返回结果,参数生效
恢复原设置
alter system set max_stale_time_for_weak_consistency='5s' tenant='oracle_test';
ALTER SYSTEM enable CLUSTER SYNCHRONIZATION 'obdemo' CLUSTER_ID=20210311;
PARTITION LOG NOT SYNC--OK
验证在一个ob集群有备集群,且还有个只读副本情况下的读写分离
与读写分离相关的重要的概念是LDC(逻辑数据中心 Logical Data Center),通过给 OceanBase 集群的每个 Zone 设置 Region 属性和 IDC 属性,并给 OBProxy 指定 IDC 名称配置项后,当数据请求发到 OBProxy 时,OBProxy 将按如下优先级顺序进行路由转发:
如果没有设置 LDC,那么当 OceanBase 数据库多地多中心部署时,弱一致性读会均匀访问数据的所有主从副本,当访问非本地域机房上的副本时,系统响应时间将大大增加
1、修改每个zone的idc(物理机房)
alter system alter zone 'zone1' set idc = 'master';
alter system alter zone 'zone2' set idc = 'master';
alter system alter zone 'zone3' set idc = 'master';
alter system alter zone 'zone4' set idc = 'standby'; --只读副本
select distinct zone,name,info from __all_zone where name='idc' or name='zone_type' or name='region' or name='merge_status';
设置zone1、zone2、zone3都在master机房,zone4在standby机房
2、查看ob集群弱一致性读策略
ob集群的弱一致性读默认路由策略(只读zone优先):
show variables like '%route%';
3、设置obproxy的idc(idc)信息
SHOW PROXYINFO IDC;
ALTER PROXYCONFIG SET proxy_idc_name='standby';
SHOW PROXYINFO IDC;
zone4与obproxy在同一个standby机房,zone1、zone2、zone3都在同一个region的不同机房
4、创建测试表
create table test_isolation(id int);
insert into test_isolation values(10);
commit;
5、查看表的副本分布
SELECT t.tenant_id, a.tenant_name, d.database_name, t.table_name, tg.tablegroup_name , t.part_num , t2.partition_id,
t2.ZONE, t2.svr_ip, case when t2.ROLE=1 then '主副本' when t2.ROLE=2 then '备副本' END AS role, t2.data_size
, a.primary_zone , IF(t.locality = '' OR t.locality IS NULL, a.locality, t.locality) AS locality
FROM oceanbase.__all_tenant AS a
JOIN oceanbase.__all_virtual_database AS d ON ( a.tenant_id = d.tenant_id )
JOIN oceanbase.__all_virtual_table AS t ON (t.tenant_id = d.tenant_id AND t.database_id = d.database_id)
JOIN oceanbase.__all_virtual_meta_table t2 ON (t.tenant_id = t2.tenant_id AND (t.table_id=t2.table_id OR t.tablegroup_id=t2.table_id) AND t2.ROLE IN (1,2) )
LEFT JOIN oceanbase.__all_virtual_tablegroup AS tg ON (t.tenant_id = tg.tenant_id and t.tablegroup_id = tg.tablegroup_id)
WHERE a.tenant_id IN (1010 ) AND t.table_type IN (3) AND d.database_name LIKE '%TPCC%'
AND t.table_name IN ('WEAK_TEST') order by partition_id,role,ZONE;
只读副本在10.10.176.19上,主副本在172.16.80.58上
6、执行弱一致性读
SELECT /*+read_consistency(weak)*/ * FROM weak_test;
查看审计:
select SVR_IP,DB_NAME,SQL_ID,QUERY_SQL,usec_to_time(REQUEST_TIME),client_ip,plan_type from gv$sql_audit where QUERY_SQL like '%WEAK_TEST%' order by REQUEST_TIME;
可以发现obproxy优先访问同机房的只读副本,而不是随机到其他备副本节点,这就是只读副本的目的
client_ip 是 SQL 在 OceanBase 集群视角的客户端 IP。如果客户端是通过 OBPROXY 访问 OB,那么这个地址通常就是 OBPROXY 的地址。
svr_ip 是 SQL 被路由到 OceanBase 集群的节点 IP。通常是 SQL 访问分区的主副本 IP,不过有时候也不是。这个跟 OBPROXY 路由策略有关。
plan_type 是 SQL 的执行类型:
1:表示在该节点(指svr_ip)本机执行;
2:表示是发送到其他节点远程执行,发送到哪个节点这里看不到(通常是指发送到分区主副本节点);
3:表示是这个 SQL 是个分布式执行计划,会涉及到多个分区。有可能这些分区还跨节点了。
7、执行强一致性读
select * FROM weak_test;
发往只读副本所在节点的 OBPROXY 的强一致性读,还是会被路由到主副本所在的节点
8、只读副本和全功能副本在线切换
只读副本和全功能副本的在线转换这个能力,通常用于 OceanBase 集群在线跨机房跨城市搬迁。支付宝每年双11 大促前后常做这种在线搬迁
综上所述,OB 的读写分离有三种方案:
至于要选择哪种方案呢,还是要看“读写分离”的目的。想在什么范围内隔离只读查询对读写业务的影响,决定了选择哪种方案更合适。OB 读写分离方案的优势有两点:
转载地址:http://elwmf.baihongyu.com/