博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ob容灾方案和读写分离
阅读量:2064 次
发布时间:2019-04-29

本文共 11638 字,大约阅读时间需要 38 分钟。

一、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;

image.png

有时会报错如上,说明有表级设置的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成功

image.png

select * from V$OB_CLUSTER;

主集群查看备集群信息为registered----可以看到一个最高性能(MAXIMUM PERFORMANCE)、异步(ASYNC)模式的备集群搭建成功

同步模式--ASYNC NET_TIMEOUT = 30000000 :该模式下,主集群的 REDO 日志会异步同步到目标备集群。事务的提交时延不受目标备集群的影响。

保护模式:MAXIMUM PERFORMANCE:主库不受目标集群redo日志应用的影响

image.png

主集群添加备集群信息:

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与主库相差不多(此时备集群已经追赶上主集群)

image.png

此时查询备集群状态,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;

image.png

也可以用主集群的 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相同

备集群:

image.png

主集群:

image.png

(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信息

image.png

主集群视角的拓扑图:

image.png

备集群视角的拓扑图:

image.png

(2)obproxy连接备集群

主集群配置的obproxy会自动识别备集群信息,所以连接主备集群可以这样区别:

obclient -h172.16.80.57 -P2883 -uroot@sys#obdemo:20210127 -p  -A -Doceanbase

image.png

obclient -h172.16.80.57 -P2883 -uroot@sys#obdemo:20210311 -p  -A -Doceanbase

image.png

如果不加后面的集群名和id,默认连的是主集群(当主备库switchover或者failover之后,默认会自动连接到新主,所以无需进行业务连接串的更改)

obclient -h172.16.80.57 -P2883 -uroot@sys -p  -A -Doceanbase

(3)测试读写操作

dml、ddl、select均不能在备集群操作,只允许弱一致性读

image.png

select /*+read_consistency(weak) */ * from test1;

image.png

或者会话层面set ob_read_consistency=weak;

image.png

只能会话级设置弱一致性读,无法全局设置(普通租户报ddl not allow)set global ob_read_consistency=weak;

image.png

3、主备切换switchover

(1)查询备集群的同步进度

select cluster_name,cluster_id,cluster_status,(NOW(6) - USEC_TO_TIME(CURRENT_SCN)) DELAY from V$OB_CLUSTER;

image.png

最大性能模式下,备集群落后越多,Switchover 切换的时间越长,Failover 后丢失的数据越多

最大保护和最大可用模式下,Switchover 仅支持日志传输模式为 SYNC 的备集群切换为主集群角色;Failover 也需要根据保护模式和保护级别选择合适的 Failover 命令

(2)查询主集群是否允许切换

SELECT SWITCHOVER_STATUS, SWITCHOVER_INFO FROM V$OB_CLUSTER;

image.png

SWITCHOVER_STATUS 展示了当前的切换状态,TO STANDBY表示可以切换为备集群。如果为NOT ALLOWED或其他值,则说明当前不满足切换条件;SWITCHOVER_INFO字段展示了不允许切换的原因,上图表示主集群正在备份(有可能是日志归档),关闭日志归档服务:alter system noarchivelog;

再次检查,SWITCHOVER_STATUS变为TO STANDBY

image.png

也有可能SWITCHOVER_INFO显示CHECK PRIMARY CLUSTER SERVER STATUS,说明需要检查主集群的observer是否都在线

(3)执行主库切换为备库

ALTER SYSTEM COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;

SWITCHOVER_STATUS变为:SWITCHOVER SWITCHING

image.png

(4)备集群切换为主集群

备集群的状态变为TO PRIMARY

image.png

ALTER SYSTEM COMMIT TO SWITCHOVER TO PRIMARY;

image.png

 

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 ;

image.png

image.png

在MAXIMUM PERFORMANCE模式下加force

ALTER SYSTEM FAILOVER TO obdemo CLUSTER_ID = 20210127 force;

image.png

(3)检查新主库

检查新主库的角色

select cluster_role,switchover_status,switchover_info,protection_mode,protection_level from v$ob_cluster;

image.png

检查新备库信息(新主库failover后会将备集群disable)

select cluster_id,cluster_role,cluster_status,rootservice_list,synchronization_status from V$OB_STANDBY_STATUS;

image.png

(4)恢复原主库为新备库

将原来的主集群起来,然后将角色设为备集群

ALTER SYSTEM CONVERT TO PHYSICAL STANDBY;

image.png

角色由原来的primary变为PHYSICAL STANDBY,但cluster_status为INVALID状态

image.png

(5)主库端起同步进程

ALTER SYSTEM ENABLE CLUSTER SYNCHRONIZATION 'obdemo' CLUSTER_ID=20210311;

备库端查询备集群状态由DISABLED变为VALID

image.png

(6)检查当前主备同步

主库端查询备库的synchronization_status由CHECK ALL SCHEMA EFFECTIVE变为OK

select cluster_id,cluster_role,cluster_status,rootservice_list,synchronization_status from V$OB_STANDBY_STATUS;

image.png

select cluster_id,switchover_status,switchover_info,primary_cluster_id from v$ob_cluster;

image.png

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;

image.png

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;

image.png

备库执行弱一致性读:

select /*+read_consistency(weak) */ * from test1;

image.png

发现弱一致性读无法返回结果,参数生效

恢复原设置

alter system set max_stale_time_for_weak_consistency='5s' tenant='oracle_test';

ALTER SYSTEM enable CLUSTER SYNCHRONIZATION 'obdemo' CLUSTER_ID=20210311;

image.png

image.png

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';

image.png

设置zone1、zone2、zone3都在master机房,zone4在standby机房

2、查看ob集群弱一致性读策略

ob集群的弱一致性读默认路由策略(只读zone优先):

show variables like '%route%';

image.png

3、设置obproxy的idc(idc)信息

SHOW PROXYINFO IDC;

image.png

ALTER PROXYCONFIG SET proxy_idc_name='standby';

SHOW PROXYINFO IDC;

image.png

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;

image.png

只读副本在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;

image.png

可以发现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;

image.png

发往只读副本所在节点的 OBPROXY 的强一致性读,还是会被路由到主副本所在的节点

8、只读副本和全功能副本在线切换

image.png

只读副本和全功能副本的在线转换这个能力,通常用于 OceanBase 集群在线跨机房跨城市搬迁。支付宝每年双11 大促前后常做这种在线搬迁

三、读写分离方案

综上所述,OB 的读写分离有三种方案:

  • 三副本或者五副本架构下,个别 SQL 通过弱一致性读 HINT 或者会话设置,就近只读备副本
  • 三副本或五副本架构下,额外增加一个或多个只读副本,为只读副本配置单独的 OBPROXY ,只读业务走这个 OBPROXY 专门访问只读副本。
  • 为 OB 集群搭建一个备集群,可以是单副本或者三副本,只读业务专门访问备集群

 

至于要选择哪种方案呢,还是要看“读写分离”的目的。想在什么范围内隔离只读查询对读写业务的影响,决定了选择哪种方案更合适。OB 读写分离方案的优势有两点:

  • 无论什么状况都不用担心误写了“备副本或只读副本”,因为它不支持写,写操作会被路由到主副本。(当然备集群那个例外,不能跨集群路由)。
  • 无论什么时候都不用担心“备副本或只读副本”故障了,因为 OBPROXY会就近路由到其他备副本。(当然单副本备集群不能,如果要防范这个风险,就搭建三副本备集群就行,自身有高可用)。

转载地址:http://elwmf.baihongyu.com/

你可能感兴趣的文章
Python 格式化打印json数据(展开状态)
查看>>
解决windows下libcurl中curl_formadd()的CURLFORM_FILENAME使用中文导致post失败的问题
查看>>
Centos7 安装curl(openssl)和libxml2
查看>>
Centos7 离线安装RabbitMQ,并配置集群
查看>>
Centos7 or Other Linux RPM包查询下载
查看>>
运行springboot项目出现:Type javax.xml.bind.JAXBContext not present
查看>>
Java中多线程向mysql插入同一条数据冲突问题
查看>>
Idea Maven项目使用jar包,添加到本地库使用
查看>>
FastDFS集群架构配置搭建(转载)
查看>>
HTM+CSS实现立方体图片旋转展示效果
查看>>
FFmpeg 命令操作音视频
查看>>
问题:Opencv(3.1.0/3.4)找不到 /opencv2/gpu/gpu.hpp 问题
查看>>
目的:使用CUDA环境变量CUDA_VISIBLE_DEVICES来限定CUDA程序所能使用的GPU设备
查看>>
问题:Mysql中字段类型为text的值, java使用selectByExample查询为null
查看>>
程序员--学习之路--技巧
查看>>
解决问题之 MySQL慢查询日志设置
查看>>
contOS6 部署 lnmp、FTP、composer、ThinkPHP5、docker详细步骤
查看>>
TP5.1模板布局中遇到的坑,配置完不生效解决办法
查看>>
PHPstudy中遇到的坑No input file specified,以及传到linux环境下遇到的坑,模板文件不存在
查看>>
TP5.1事务操作和TP5事务回滚操作多表
查看>>