ob容灾方案和读写分离
一、ob备集群
1、命令行搭建ob备集群
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集群
具体命令可以参考https://www.yuque.com/sipc/database/gg8345安装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;
2、备集群操作
(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;
3、主备切换switchover
(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;
4、主库故障,备库failover
(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;
5、其他操作
(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 的读写分离有三种方案:
- 三副本或者五副本架构下,个别 SQL 通过弱一致性读 HINT 或者会话设置,就近只读备副本。
- 三副本或五副本架构下,额外增加一个或多个只读副本,为只读副本配置单独的 OBPROXY ,只读业务走这个 OBPROXY 专门访问只读副本。
- 为 OB 集群搭建一个备集群,可以是单副本或者三副本,只读业务专门访问备集群。
至于要选择哪种方案呢,还是要看“读写分离”的目的。想在什么范围内隔离只读查询对读写业务的影响,决定了选择哪种方案更合适。OB 读写分离方案的优势有两点:
- 无论什么状况都不用担心误写了“备副本或只读副本”,因为它不支持写,写操作会被路由到主副本。(当然备集群那个例外,不能跨集群路由)。
- 无论什么时候都不用担心“备副本或只读副本”故障了,因为 OBPROXY会就近路由到其他备副本。(当然单副本备集群不能,如果要防范这个风险,就搭建三副本备集群就行,自身有高可用)。
ob容灾方案和读写分离相关推荐
- 企鹅电竞登录鉴权系统架构与核心数据热备容灾方案
文章目录 0.前言 1.术语说明 2.登录鉴权系统架构 3.登录鉴权关键路径梳理与优化 4.核心数据热备容灾 4.1 需求背景 4.2 其它系统容灾方案 4.2.1 NOW 直播评论容灾架构 4.2. ...
- 世界领先!详解蚂蚁金服自研数据库OceanBase的高可用及容灾方案
小蚂蚁说: 关于蚂蚁金服自研的金融级分布式关系型数据库OceanBase的故事相信大家已经不再陌生了(新来的同学可以移步<厉害了,蚂蚁金服!创造了中国自己的数据库OceanBase>了解更 ...
- 赛门铁克容灾方案VCS
赛门铁克容灾方案 1 Symantec 容灾软件 Symantec 的存储管理软件VERITAS Storage Foundation(简称SF)适用于企业存储管理的标准化平台,它不仅提供比操作系统本 ...
- SharePlex for Oracle应用系统高可用和容灾方案
第1章 前言 在企业信息化进程不断加快的今天,保持业务的连续性是企业用户进行数据存储时必须考虑的重要方面.灾难的出现可能导致生产停顿.客户满意度 ...
- hbase数据备份或者容灾方案
HBase的数据备份或者容灾方案有这几种:Distcp,CopyTable,Export/Import,Snapshot,Replication,以下分别介绍(以下描述的内容均是基于0.94.20版本 ...
- 混合云存储开启企业上云新路径--阿里云混合云备份容灾方案发布
摘要:当前,数据已经成为了企业的核心资产.而如果数据中心发生故障不仅会给企业带来巨大损失,甚至会直接迫使企业走向倒闭.对于企业而言,每一字节业务数据的丢失都是一场重大的灾难!那么,如何保证企业的核心数 ...
- “零成本”建设数据中心机房容灾方案
前言: 数据中心全年不休地运行,一旦发生不可预知的灾难,如果对数据中心机房造成设备损坏将是一笔不小的损失,设备损坏至少还能弥补修复,但如果是宝贵的数据丢失,造成的损失则是无法计算的. 所以建设数据中心 ...
- 混合云存储开启企业上云新路径--阿里云混合云备份容灾方案发布 1
摘要: 当前,数据已经成为了企业的核心资产.而如果数据中心发生故障不仅会给企业带来巨大损失,甚至会直接迫使企业走向倒闭.对于企业而言,每一字节业务数据的丢失都是一场重大的灾难!那么,如何保证企业的核心 ...
- 沃信科技ERP系统容灾方案概述
沃信科技ERP容灾方案可分为两个部分,一部分是对服务器的容灾方案,包括Web服务器和应用服务器,主要是通过本地高可用集群.远程高可用集群或基于负载均衡器的高可用方案(负载均衡集群):第二部分是数据库部 ...
最新文章
- HALCON选择标定板文件
- “京东小贷” 注册资本由30亿元增至50亿元,恭喜
- (二十):response 对象 (JSP学习第六天)
- android 让dialog保持在最前_Android 面试进阶指南 —— 唠唠任务栈,返回栈和启动模式...
- C++ newdelete
- 使用xadmin覆盖Django的admin
- 3 年大厂工作经验面试竟然要我手写 atoi 函数
- python日期转化利器arrow实践
- linux patch 给文件打补丁,Linux补丁工具patch生成使用补丁用法示例
- 手机ncm转mp3工具_一款手机、电脑都能用的文字转语音工具,够高能! - 橘子世界...
- [轻松拿offer]Web前端面试真题|带详解!
- 外汇mt4 软件在哪里下载比较正规?
- 打工人息息相关的个税计算
- 关于压缩感知的第一篇论文解析压缩感知研究新思路
- 哈工大c语言ex6答案,哈工大C语言程序设计习题ex6.doc
- Tensorflow Serving源码详解
- Linux基础笔记11 | 链接文件详解
- [USACO Oct08] 挖水井题解
- 快速过熊掌号2.0新手任务了解熊掌号!
- js传参数受特殊字符影响错误
热门文章
- 几个实用超酷网站收集
- python 病毒 360杀毒_通过一个python小脚本来下载最新的360杀毒安装程序
- keep 虚拟路线修改器_Keep 动感单车体验:每天在家就能消耗 250 千卡,你离瘦不远了...
- 西财计算机研究生专硕复试分数线,2017年西南财经大学考研复试分数线
- zTree简单使用方法
- 怎么才能让百度新闻源收录你的网站?
- 原来SqlSession只是个甩手掌柜
- 流量生意新玩法:线下抓流量、线上去消费
- 直播系统服务器费用,直播服务器搭建费用
- python中plt.plot()_python plt.plot()绘图