一、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容灾方案和读写分离相关推荐

  1. 企鹅电竞登录鉴权系统架构与核心数据热备容灾方案

    文章目录 0.前言 1.术语说明 2.登录鉴权系统架构 3.登录鉴权关键路径梳理与优化 4.核心数据热备容灾 4.1 需求背景 4.2 其它系统容灾方案 4.2.1 NOW 直播评论容灾架构 4.2. ...

  2. 世界领先!详解蚂蚁金服自研数据库OceanBase的高可用及容灾方案

    小蚂蚁说: 关于蚂蚁金服自研的金融级分布式关系型数据库OceanBase的故事相信大家已经不再陌生了(新来的同学可以移步<厉害了,蚂蚁金服!创造了中国自己的数据库OceanBase>了解更 ...

  3. 赛门铁克容灾方案VCS

    赛门铁克容灾方案 1 Symantec 容灾软件 Symantec 的存储管理软件VERITAS Storage Foundation(简称SF)适用于企业存储管理的标准化平台,它不仅提供比操作系统本 ...

  4. SharePlex for Oracle应用系统高可用和容灾方案

    第1章                             前言 在企业信息化进程不断加快的今天,保持业务的连续性是企业用户进行数据存储时必须考虑的重要方面.灾难的出现可能导致生产停顿.客户满意度 ...

  5. hbase数据备份或者容灾方案

    HBase的数据备份或者容灾方案有这几种:Distcp,CopyTable,Export/Import,Snapshot,Replication,以下分别介绍(以下描述的内容均是基于0.94.20版本 ...

  6. 混合云存储开启企业上云新路径--阿里云混合云备份容灾方案发布

    摘要:当前,数据已经成为了企业的核心资产.而如果数据中心发生故障不仅会给企业带来巨大损失,甚至会直接迫使企业走向倒闭.对于企业而言,每一字节业务数据的丢失都是一场重大的灾难!那么,如何保证企业的核心数 ...

  7. “零成本”建设数据中心机房容灾方案

    前言: 数据中心全年不休地运行,一旦发生不可预知的灾难,如果对数据中心机房造成设备损坏将是一笔不小的损失,设备损坏至少还能弥补修复,但如果是宝贵的数据丢失,造成的损失则是无法计算的. 所以建设数据中心 ...

  8. 混合云存储开启企业上云新路径--阿里云混合云备份容灾方案发布 1

    摘要: 当前,数据已经成为了企业的核心资产.而如果数据中心发生故障不仅会给企业带来巨大损失,甚至会直接迫使企业走向倒闭.对于企业而言,每一字节业务数据的丢失都是一场重大的灾难!那么,如何保证企业的核心 ...

  9. 沃信科技ERP系统容灾方案概述

    沃信科技ERP容灾方案可分为两个部分,一部分是对服务器的容灾方案,包括Web服务器和应用服务器,主要是通过本地高可用集群.远程高可用集群或基于负载均衡器的高可用方案(负载均衡集群):第二部分是数据库部 ...

最新文章

  1. HALCON选择标定板文件
  2. “京东小贷” 注册资本由30亿元增至50亿元,恭喜
  3. (二十):response 对象 (JSP学习第六天)
  4. android 让dialog保持在最前_Android 面试进阶指南 —— 唠唠任务栈,返回栈和启动模式...
  5. C++ newdelete
  6. 使用xadmin覆盖Django的admin
  7. 3 年大厂工作经验面试竟然要我手写 atoi 函数
  8. python日期转化利器arrow实践
  9. linux patch 给文件打补丁,Linux补丁工具patch生成使用补丁用法示例
  10. 手机ncm转mp3工具_一款手机、电脑都能用的文字转语音工具,够高能! - 橘子世界...
  11. [轻松拿offer]Web前端面试真题|带详解!
  12. 外汇mt4 软件在哪里下载比较正规?
  13. 打工人息息相关的个税计算
  14. 关于压缩感知的第一篇论文解析压缩感知研究新思路
  15. 哈工大c语言ex6答案,哈工大C语言程序设计习题ex6.doc
  16. Tensorflow Serving源码详解
  17. Linux基础笔记11 | 链接文件详解
  18. [USACO Oct08] 挖水井题解
  19. 快速过熊掌号2.0新手任务了解熊掌号!
  20. js传参数受特殊字符影响错误

热门文章

  1. 几个实用超酷网站收集
  2. python 病毒 360杀毒_通过一个python小脚本来下载最新的360杀毒安装程序
  3. keep 虚拟路线修改器_Keep 动感单车体验:每天在家就能消耗 250 千卡,你离瘦不远了...
  4. 西财计算机研究生专硕复试分数线,2017年西南财经大学考研复试分数线
  5. zTree简单使用方法
  6. 怎么才能让百度新闻源收录你的网站?
  7. 原来SqlSession只是个甩手掌柜
  8. 流量生意新玩法:线下抓流量、线上去消费
  9. 直播系统服务器费用,直播服务器搭建费用
  10. python中plt.plot()_python plt.plot()绘图