首页 > 数据库 > 数据库开发技术 > OBCE V3 培训实验:OB 主备集群

这个图需要调整一下,事务开始后的 DML 应该也会在备副本中同时进行。
1.3 OB 备集群部署
obclient -h10.0.0.61 -P2883 -uSYS@oboracle#obdemo:1680747946 -paaAA11__不过,这个只是一个 OBProxy 跟OCP绑定使用关联了多个 OB集群(主和备)才要求带上这个集群 ID。如果OBProxy是直接跟 OB 备集群绑定的,那连接的时候不需要带上备集群的 ID 。
(SYS@10.0.0.62:2883) [SYS]> select count(*) from tpcc.bmsql_warehouse;ORA-16000: standby cluster support weak read only
cd /home/admin/oceanbase && bin/observer -r '172.17.0.3:2882:2881' -p 2881 -P 2882 -z zone1 -n obdemo -c 2 -d /home/admin/oceanbase/store -i eth0 -l WARN -o "__min_full_resource_pool_memory=1073741824,memory_limit=9G,system_memory=1G,stack_size=512K,cpu_count=16,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=100,enable_separate_sys_clog=False,enable_merge_by_turn=False,datafile_size=20G,enable_syslog_wf=False,enable_syslog_recycle=True,max_syslog_file_count=10"cd /home/admin/oceanbase && bin/observer -r '172.17.0.4:2882:2881' -p 2881 -P 2882 -z zone1 -n obdemo -c 1 -d /home/admin/oceanbase/store -i eth0 -l WARN -o "__min_full_resource_pool_memory=1073741824,memory_limit=9G,system_memory=1G,stack_size=512K,cpu_count=16,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=100,enable_separate_sys_clog=False,enable_merge_by_turn=False,datafile_size=20G,enable_syslog_wf=False,enable_syslog_recycle=True,max_syslog_file_count=10"
set session ob_query_timeout=10000000000;alter system bootstrap ZONE 'zone1' SERVER '172.17.0.3:2882' ;set session ob_query_timeout=10000000000;ALTER SYSTEM BOOTSTRAP CLUSTER STANDBY ZONE 'zone1' SERVER '172.17.0.4:2882' PRIMARY_CLUSTER_ID 2 PRIMARY_ROOTSERVICE_LIST '172.17.0.3:2882' ;
从命令里看出备集群的 OBSERVER 进程认主集群看的是主集群的 rootservice_list 。
备集群初始化成功后 DBA 在备集群创建一个默认的资源规格模板。资源大小根据备集群节点的资源能力定。
CREATE resource unit standby_unit_config_template max_cpu=2,min_cpu=2,max_memory='1G',min_memory='1G',max_iops=1024,max_disk_size=1024000000,max_session_Num=100;这个在后面备集群同步主集群的租户时会用到这个模板。通常是在备集群资源跟主集群资源不对等(创建不出来主集群的租户)时才用这个。不过 OCP 自动化搭建备集群的步骤里没有给机会创建这个默认的资源规格模板,所以 OCP 里部署备集群可能会报错(OBCE 考试里会碰到)。
当主备集群都初始化后,还需要在主集群上添加一个备集群信息。这个时候主集群认备集群就是通过集群 ID (备集群初始化的时候注册到主集群上的)。
obclient [oceanbase]> ALTER SYSTEM ADD CLUSTER VERIFY;Query OK, 0 rows affected (0.013 sec)obclient [oceanbase]> ALTER SYSTEM ADD CLUSTER obdemo CLUSTER_ID 1;Query OK, 0 rows affected (0.012 sec)
可以通过备集群的事件视图(__all_rootservice_event_history) 了解备集群添加的细节步骤。
SELECT gmt_create ,module,event ,name1 ,value1 ,name2,value2,name3,value3,name4,value4FROM `__all_rootservice_event_history`WHERE 1=1AND module NOT IN ('schema_recycler')ORDER BY gmt_create DESC LIMIT 10;
2.2 OB 主备集群信息查看
查看主备集群信息语句。
查询视图 v$ob_all_clusters 可以看到所有主备集群部分信息。这个在主备集群查看都是一样的。这个在主备集群看到的都是一样的。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, protection_mode,protection_level,redo_transport_options FROM v$ob_cluster;+------------+--------------+--------------+----------------+---------------------+---------------------+------------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | protection_mode | protection_level | redo_transport_options |+------------+--------------+--------------+----------------+---------------------+---------------------+------------------------------+| 2 | obdemo | PRIMARY | VALID | MAXIMUM PERFORMANCE | MAXIMUM PERFORMANCE | ASYNC NET_TIMEOUT = 30000000 |+------------+--------------+--------------+----------------+---------------------+---------------------+------------------------------+1 row in set (0.003 sec)
如果想看当前集群是主集群还是备集群,查看视图 v$ob_cluster 。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status,"switchover#",protection_mode,protection_level,redo_transport_options FROM v$ob_cluster;+------------+--------------+--------------+----------------+-------------+---------------------+---------------------+-----------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | switchover# | protection_mode | protection_level | redo_transport_options |+------------+--------------+--------------+----------------+-------------+---------------------+---------------------+-----------------------------+| 2 | obdemo | PRIMARY | VALID | switchover# | MAXIMUM PERFORMANCE | MAXIMUM PERFORMANCE | SYNC NET_TIMEOUT = 10000000 |+------------+--------------+--------------+----------------+-------------+---------------------+---------------------+-----------------------------+1 row in set (0.003 sec)
上面这个就是主集群的,下面这个是备集群的。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, protection_mode,protection_level,redo_transport_options FROM v$ob_cluster;+------------+--------------+------------------+----------------+---------------------+---------------------+------------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | protection_mode | protection_level | redo_transport_options |+------------+--------------+------------------+----------------+---------------------+---------------------+------------------------------+| 1 | obdemo | PHYSICAL STANDBY | VALID | MAXIMUM PERFORMANCE | MAXIMUM PERFORMANCE | ASYNC NET_TIMEOUT = 30000000 |+------------+--------------+------------------+----------------+---------------------+---------------------+------------------------------+1 row in set (0.002 sec)
主集群还可以通过视图 V$OB_STANDBY_STATUS 查看备集群信息,备集群这个视图内容为空。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role, cluster_status, rootservice_list,redo_transport_options,protection_level,synchronization_status FROM V$OB_STANDBY_STATUS\G*************************** 1. row ***************************cluster_id: 1cluster_name: obdemocluster_role: PHYSICAL STANDBYcluster_status: VALIDrootservice_list: 172.17.0.4:2882:2881redo_transport_options: ASYNC NET_TIMEOUT = 30000000protection_level: MAXIMUM PERFORMANCEsynchronization_status: OK1 row in set (0.004 sec)
2.3 OB 主备集群 switchover
切换之前要检查主备集群的状态,并且这些状态会随着切换进度而变化。
主集群切换前状态,必须是 TO STANDBY
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info from v$ob_cluster;+------------+--------------+--------------+----------------+-------------------+----------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | switchover_status | switchover_info |+------------+--------------+--------------+----------------+-------------------+----------------------------+| 2 | obdemo | PRIMARY | VALID | TO STANDBY | SYNCED STANDBY CLUSTERS: 1 |+------------+--------------+--------------+----------------+-------------------+----------------------------+1 row in set (0.038 sec)
备集群切换前状态,这个 NOT ALLOWED 是正常的。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info from v$ob_cluster;+------------+--------------+------------------+----------------+-------------------+-------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | switchover_status | switchover_info |+------------+--------------+------------------+----------------+-------------------+-------------------------+| 1 | obdemo | PHYSICAL STANDBY | VALID | NOT ALLOWED | NO CLUSTER IN SWITCHING |+------------+--------------+------------------+----------------+-------------------+-------------------------+1 row in set (0.005 sec)
主集群开始切换,集群角色变更为 PHYSICAL STANDBY 。
obclient [oceanbase]> alter system commit to switchover to physical standby;Query OK, 0 rows affected (0.069 sec)obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info from v$ob_cluster;+------------+--------------+------------------+----------------+----------------------+-----------------+| cluster_id | cluster_name | cluster_role | cluster_status | switchover_status | switchover_info |+------------+--------------+------------------+----------------+----------------------+-----------------+| 2 | obdemo | PHYSICAL STANDBY | VALID | SWITCHOVER SWITCHING | |+------------+--------------+------------------+----------------+----------------------+-----------------+1 row in set (0.002 sec)
备集群开始切换前,状态为 TO PRIMARY 。集群角色变更为 PRIMARY 。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info from v$ob_cluster;+------------+--------------+------------------+----------------+-------------------+-----------------+| cluster_id | cluster_name | cluster_role | cluster_status | switchover_status | switchover_info |+------------+--------------+------------------+----------------+-------------------+-----------------+| 1 | obdemo | PHYSICAL STANDBY | VALID | TO PRIMARY | |+------------+--------------+------------------+----------------+-------------------+-----------------+1 row in set (0.017 sec)obclient [oceanbase]> alter system commit to switchover to primary;Query OK, 0 rows affected (0.041 sec)obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info from v$ob_cluster;+------------+--------------+--------------+----------------+-------------------+----------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | switchover_status | switchover_info |+------------+--------------+--------------+----------------+-------------------+----------------------------+| 1 | obdemo | PRIMARY | VALID | TO STANDBY | SYNCED STANDBY CLUSTERS: 2 |+------------+--------------+--------------+----------------+-------------------+----------------------------+1 row in set (0.038 sec)obclient [oceanbase]> select * from v$ob_all_clusters;+------------+--------------+------------------+----------------+----------------------+------------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | rootservice_list | redo_transport_options |+------------+--------------+------------------+----------------+----------------------+------------------------------+| 1 | obdemo | PRIMARY | VALID | 172.17.0.4:2882:2881 | ASYNC NET_TIMEOUT = 30000000 || 2 | obdemo | PHYSICAL STANDBY | VALID | 172.17.0.3:2882:2881 | ASYNC NET_TIMEOUT = 30000000 |+------------+--------------+------------------+----------------+----------------------+------------------------------+2 rows in set (0.019 sec)
2.4 主备集群 failover 测试
先看看上面的集群如果主集群 CRASH 会怎么样。KILL 掉主集群 (cluster_id=1)
查看备集群里视图。
obclient [oceanbase]> select * from v$ob_all_clusters;+------------+--------------+------------------+----------------+----------------------+------------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | rootservice_list | redo_transport_options |+------------+--------------+------------------+----------------+----------------------+------------------------------+| 1 | obdemo | PRIMARY | VALID | 172.17.0.4:2882:2881 | ASYNC NET_TIMEOUT = 30000000 || 2 | obdemo | PHYSICAL STANDBY | VALID | 172.17.0.3:2882:2881 | ASYNC NET_TIMEOUT = 30000000 |+------------+--------------+------------------+----------------+----------------------+------------------------------+2 rows in set (0.001 sec)
这个视图 v$ob_all_clusters 不能反应主集群状态,所以不能依此判断。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level from v$ob_cluster;+------------+--------------+------------------+----------------+-------------------+-----------------+---------------------+---------------------+| cluster_id | cluster_name | cluster_role | cluster_status | switchover_status | switchover_info | protection_mode | protection_level |+------------+--------------+------------------+----------------+-------------------+-----------------+---------------------+---------------------+| 2 | obdemo | PHYSICAL STANDBY | VALID | NOT ALLOWED | | MAXIMUM PERFORMANCE | MAXIMUM PERFORMANCE |+------------+--------------+------------------+----------------+-------------------+-----------------+---------------------+---------------------+1 row in set (0.007 sec)
确认当前集群是备集群,最大性能模式,日志同步时异步的。看看能不能直接 failover 。
obclient [oceanbase]> alter system failover to 'obdemo' cluster_id=2;ERROR 4708 (HY000): Failover is not allowed when protection level not in MAXIMUM PROTECTION or AVAILABILITYobclient [oceanbase]>
failover 失败,因为当前备集群不是最大同步模式。如果是生产环境,此时悔之晚矣。
将主集群拉起,重新设置备集群的同步模式。首先在主集群确认当前集群的同步模式。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level, redo_transport_options from v$ob_cluster \G*************************** 1. row ***************************cluster_id: 1cluster_name: obdemocluster_role: PRIMARYcluster_status: VALIDswitchover_status: TO STANDBYswitchover_info: SYNCED STANDBY CLUSTERS: 2protection_mode: MAXIMUM PERFORMANCEprotection_level: MAXIMUM PERFORMANCEredo_transport_options: ASYNC NET_TIMEOUT = 300000001 row in set (0.044 sec)
然后看看能不能直接修改为最大保护模式。
obclient [oceanbase]> alter system set standby cluster to maximize protection;ERROR 4179 (HY000): set maximum protection mode with zero or more than one cluster in sync mode not allowedobclient [oceanbase]> alter system modify cluster 'obdemo' cluster_id 2 set redo_transport_options = 'sync net_timeout=10000000';Query OK, 0 rows affected (0.005 sec)obclient [oceanbase]> alter system set standby cluster to maximize protection;Query OK, 0 rows affected (0.074 sec)obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level, redo_transport_options from v$ob_cluster \G*************************** 1. row ***************************cluster_id: 1cluster_name: obdemocluster_role: PRIMARYcluster_status: VALIDswitchover_status: NOT ALLOWEDswitchover_info: PRIMARY CLUSTER NOT IN SYNC MODEprotection_mode: MAXIMUM PROTECTIONprotection_level: MAXIMUM PROTECTIONredo_transport_options: ASYNC NET_TIMEOUT = 300000001 row in set (0.010 sec)obclient [oceanbase]>
修改同步模式为最大保护模式时,必须将 REDO 传输模式改为 SYNC 模式。
OB 主备集群改为最大保护模式后,如果备集群 CRASH 了,会发生什么?
杀掉备集群 (cluster_id=2)。查看主集群的视图。
obclient [oceanbase]> select * from v$ob_all_clusters;+------------+--------------+------------------+----------------+----------------------+------------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | rootservice_list | redo_transport_options |+------------+--------------+------------------+----------------+----------------------+------------------------------+| 1 | obdemo | PRIMARY | VALID | 172.17.0.4:2882:2881 | ASYNC NET_TIMEOUT = 30000000 || 2 | obdemo | PHYSICAL STANDBY | VALID | 172.17.0.3:2882:2881 | SYNC NET_TIMEOUT = 10000000 |+------------+--------------+------------------+----------------+----------------------+------------------------------+2 rows in set (0.002 sec)obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level, redo_transport_options from v$ob_cluster\G*************************** 1. row ***************************cluster_id: 1cluster_name: obdemocluster_role: PRIMARYcluster_status: VALIDswitchover_status: NOT ALLOWEDswitchover_info: CAN NOT ACCESS CLUSTERS: 2protection_mode: MAXIMUM PROTECTIONprotection_level: MAXIMUM PROTECTIONredo_transport_options: ASYNC NET_TIMEOUT = 300000001 row in set (0.011 sec)
视图 v$ob_cluster 提示备集群连不上,不能切换。此时尝试在主集群的业务租户写入数据,会 HANG 住,直到 SQL 语句执行超时。
obclient [TPCC]> insert into t1 (id,c1) values(5,'D');ORA-00600: internal error code, arguments: -4012, Timeoutobclient [TPCC]>
可见 OB 主备集群同步模式为最大保护的时候,备集群不可用时,主集群也会停写。并且也不能读。
obclient [TPCC]> select * from t1;ORA-00600: internal error code, arguments: -4012, Timeoutobclient [TPCC]> select /*+ read_consistency(weak) */ * from t1;ORA-00600: internal error code, arguments: -6212, Statement is timeoutobclient [TPCC]>
两个超时错误代码居然还不一样,这个后面再研究。恢复备集群,主集群会话重连后可以读写了。继续 failover 测试。
此时要确认一下备集群上的视图信息变为最大保护模式。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level from v$ob_cluster;+------------+--------------+------------------+----------------+-------------------+-------------------------+--------------------+--------------------+| cluster_id | cluster_name | cluster_role | cluster_status | switchover_status | switchover_info | protection_mode | protection_level |+------------+--------------+------------------+----------------+-------------------+-------------------------+--------------------+--------------------+| 2 | obdemo | PHYSICAL STANDBY | VALID | NOT ALLOWED | NO CLUSTER IN SWITCHING | MAXIMUM PROTECTION | MAXIMUM PROTECTION |+------------+--------------+------------------+----------------+-------------------+-------------------------+--------------------+--------------------+1 row in set (0.005 sec)
主集群上这个视图信息的切换信息依然提示不允许切换,意思是需要同步。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level, redo_transport_options from v$ob_cluster\G*************************** 1. row ***************************cluster_id: 1cluster_name: obdemocluster_role: PRIMARYcluster_status: VALIDswitchover_status: NOT ALLOWEDswitchover_info: PRIMARY CLUSTER NOT IN SYNC MODEprotection_mode: MAXIMUM PROTECTIONprotection_level: MAXIMUM PROTECTIONredo_transport_options: ASYNC NET_TIMEOUT = 300000001 row in set (0.013 sec)
杀掉主集群(cluster_id=1) OBSERVER 进程。备集群 failover 到主集群。
obclient [oceanbase]> alter system failover to 'obdemo' cluster_id=2;Query OK, 0 rows affected (2.451 sec)obclient [oceanbase]> select * from v$ob_all_clusters;+------------+--------------+------------------+----------------+----------------------+------------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | rootservice_list | redo_transport_options |+------------+--------------+------------------+----------------+----------------------+------------------------------+| 1 | obdemo | PHYSICAL STANDBY | DISABLED | 172.17.0.4:2882:2881 | ASYNC NET_TIMEOUT = 30000000 || 2 | obdemo | PRIMARY | VALID | 172.17.0.3:2882:2881 | SYNC NET_TIMEOUT = 10000000 |+------------+--------------+------------------+----------------+----------------------+------------------------------+2 rows in set (0.001 sec)obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level from v$ob_cluster\G*************************** 1. row ***************************cluster_id: 2cluster_name: obdemocluster_role: PRIMARYcluster_status: VALIDswitchover_status: NOT ALLOWEDswitchover_info: NONE SYNCED STANDBY CLUSTERprotection_mode: MAXIMUM PERFORMANCEprotection_level: MAXIMUM PERFORMANCE1 row in set (0.005 sec)
备集群 failover 到主集群成功,同步模式变为最大性能模式。
2.5 OB 主备集群 failover 后的主集群修复
上面备集群 failover 成功后,写入几笔业务数据。然后恢复原主集群(cluster_id=1) 看看,主备集群同步还能修复不?
obclient [TPCC]> insert into t1 (id,c1) values(10,'AA');Query OK, 1 row affected (0.037 sec)obclient [TPCC]> select * from t1;+----+------+-----------+| ID | C1 | C2 |+----+------+-----------+| 5 | D | 24-NOV-23 || 10 | AA | 24-NOV-23 |+----+------+-----------+2 rows in set (0.022 sec)obclient [TPCC]> commit;Query OK, 0 rows affected (0.024 sec)
恢复老的主集群(cluster_id=1)。不过此时要特别注意,不能用原来的方式启动 OBSERVER 进程(bin/observer) ,而要所有节点 OBSERVER 进程带参数 -m disabled_cluster 启动。否则,启动后的集群继续写入数据就会导致双主集群,这个时候估计再也修复不了(没有测试)。
[admin@server02 oceanbase]$ pwd/home/admin/oceanbase[admin@server02 oceanbase]$ bin/observer -m disabled_clusterbin/observer -m disabled_clusterserver mode: disabled_cluster
老的主集群启动后,查看自身集群信息。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level, redo_transport_options from v$ob_cluster\G*************************** 1. row ***************************cluster_id: 1cluster_name: obdemocluster_role: PRIMARYcluster_status: DISABLEDswitchover_status: NOT ALLOWEDswitchover_info: NO CLUSTER IN SWITCHINGprotection_mode: MAXIMUM PROTECTIONprotection_level: MAXIMUM PROTECTIONredo_transport_options: ASYNC NET_TIMEOUT = 300000001 row in set (0.012 sec)obclient [oceanbase]> select * from v$ob_all_clusters;+------------+--------------+------------------+----------------+----------------------+------------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | rootservice_list | redo_transport_options |+------------+--------------+------------------+----------------+----------------------+------------------------------+| 1 | obdemo | PRIMARY | VALID | 172.17.0.4:2882:2881 | ASYNC NET_TIMEOUT = 30000000 || 2 | obdemo | PHYSICAL STANDBY | VALID | 172.17.0.3:2882:2881 | SYNC NET_TIMEOUT = 10000000 |+------------+--------------+------------------+----------------+----------------------+------------------------------+2 rows in set (0.002 sec)
老主集群还认为自己是主,另外一个集群是备。再次说明视图 v$ob_all_clusters 信息不可靠。不过视图 v$ob_cluster 还是可靠的,集群状态为 DISABLED(禁用)状态。
此时可以老的主集群可以转换(CONVERT)到备集群。注意不是切换(SWITCHOVER 或 FAILOVER)。
obclient [oceanbase]> alter system convert to physical standby;Query OK, 0 rows affected (0.030 sec)obclient [oceanbase]> select * from v$ob_all_clusters;+------------+--------------+------------------+----------------+----------------------+------------------------------+cluster_id | cluster_name | cluster_role | cluster_status | rootservice_list | redo_transport_options |+------------+--------------+------------------+----------------+----------------------+------------------------------+1 | obdemo | PHYSICAL STANDBY | DISABLED | 172.17.0.4:2882:2881 | ASYNC NET_TIMEOUT = 30000000 |2 | obdemo | PRIMARY | VALID | 172.17.0.3:2882:2881 | SYNC NET_TIMEOUT = 10000000 |+------------+--------------+------------------+----------------+----------------------+------------------------------+2 rows in set (0.001 sec)obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level, redo_transport_options from v$ob_cluster\G1. row ***************************cluster_id: 1cluster_name: obdemocluster_role: PHYSICAL STANDBYcluster_status: DISABLEDswitchover_status: NOT ALLOWEDswitchover_info:protection_mode: MAXIMUM PROTECTIONprotection_level: MAXIMUM PROTECTIONredo_transport_options: ASYNC NET_TIMEOUT = 300000001 row in set (0.004 sec)obclient [oceanbase]>
这个时候视图内容有发生变化,集群角色对了,但是集群状态还是禁用状态。
此时还需要到新集群(cluster_id=2)上去激活主备同步。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level from v$ob_cluster\G *************************** 1. row *************************** cluster_id: 2cluster_name: obdemocluster_role: PRIMARYcluster_status: VALIDswitchover_status: NOT ALLOWEDswitchover_info: NONE SYNCED STANDBY CLUSTERprotection_mode: MAXIMUM PERFORMANCEprotection_level: MAXIMUM PERFORMANCE1 row in set (0.005 sec)obclient [oceanbase]> alter system enable cluster synchronization 'obdemo' cluster_id=1;Query OK, 0 rows affected (0.047 sec)obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level from v$ob_cluster\G*************************** 1. row ***************************cluster_id: 2cluster_name: obdemocluster_role: PRIMARYcluster_status: VALIDswitchover_status: NOT ALLOWEDswitchover_info: NONE SYNCED STANDBY CLUSTERprotection_mode: MAXIMUM PERFORMANCEprotection_level: MAXIMUM PERFORMANCE1 row in set (0.019 sec)
等同步赶上,切换状态会再次变化。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level from v$ob_cluster\G*************************** 1. row ***************************cluster_id: 2cluster_name: obdemocluster_role: PRIMARYcluster_status: VALIDswitchover_status: TO STANDBYswitchover_info: SYNCED STANDBY CLUSTERS: 1protection_mode: MAXIMUM PERFORMANCEprotection_level: MAXIMUM PERFORMANCE1 row in set (0.047 sec)
此时这个备集群的数据也可以验证一下。
obclient [TPCC]> select * from t1;ORA-16000: standby cluster support weak read onlyobclient [TPCC]> select /*+ read_consistency(weak) */ * from t1;+----+------+-----------+| ID | C1 | C2 |+----+------+-----------+| 5 | D | 24-NOV-23 || 10 | AA | 24-NOV-23 |+----+------+-----------+2 rows in set (0.002 sec)
由于数据没有丢失,这种场景的 failover 又叫无损 failover 。
2.6 OB 主备有损 failover 测试
无损 failover 的前提条件是主备同步用最大保护模式,但估计开启的人不会很多(在 ORACLE 数据库里,就没有多少客户会真的开启最大保护模式)。默认都是以最大性能同步模式运行。当主集群故障的时候,就要进行强制切换了。
先看如果主集群可用的情况下,能不能直接激活备集群(cluster_id=1)。
obclient [oceanbase]> ALTER SYSTEM ACTIVATE PHYSICAL STANDBY CLUSTER;ERROR 4708 (HY000): Failover is not allowed when primary cluster [cluster_id=2] is still aliveobclient [oceanbase]>
从上面结果可见 OB 激活备集群的时候有对主集群进行判断。这样可以防止运维上的误操作。继续杀掉主集群进程。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level, redo_transport_options from v$ob_cluster\G*************************** 1. row ***************************cluster_id: 1cluster_name: obdemocluster_role: PHYSICAL STANDBYcluster_status: VALIDswitchover_status: NOT ALLOWEDswitchover_info:protection_mode: MAXIMUM PERFORMANCEprotection_level: MAXIMUM PERFORMANCEredo_transport_options: ASYNC NET_TIMEOUT = 300000001 row in set (0.007 sec)
备集群上的集群视图切换信息变为空了。继续激活备集群。
obclient [oceanbase]> ALTER SYSTEM ACTIVATE PHYSICAL STANDBY CLUSTER; ERROR 4012 (HY000): Timeoutobclient [oceanbase]> set session ob_query_timeout=100000000000000;Query OK, 0 rows affected (0.001 sec)obclient [oceanbase]> ALTER SYSTEM ACTIVATE PHYSICAL STANDBY CLUSTER;Query OK, 0 rows affected (49.186 sec)obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level, redo_transport_options from v$ob_cluster\G*************************** 1. row ***************************cluster_id: 1cluster_name: obdemocluster_role: PRIMARYcluster_status: VALIDswitchover_status: NOT ALLOWEDswitchover_info: NONE SYNCED STANDBY CLUSTERprotection_mode: MAXIMUM PERFORMANCEprotection_level: MAXIMUM PERFORMANCEredo_transport_options: ASYNC NET_TIMEOUT = 300000001 row in set (0.005 sec)
激活备集群估计内部操作非常多,默认情况下会语句超时。
这种情况下理论上新主集群会丢失一部分数据。OBCE 实验练习里会通过插入大量数据以及断网来人为导致主备集群在无损 failover 之前的不一致。这里我就不演示了。我们直到理论上会丢失数据即可,所以这种切换也叫有损 failover 。
2.7 OB 主备有损 failover 后的老主集群处理
老的主集群我们试试以默认方式启动看看 (bin/observer)。
obclient [oceanbase]> SELECT cluster_id, cluster_name, cluster_role,cluster_status, switchover_status, switchover_info,protection_mode, protection_level from v$ob_cluster\G*************************** 1. row ***************************cluster_id: 2cluster_name: obdemocluster_role: PRIMARYcluster_status: VALIDswitchover_status: NOT ALLOWEDswitchover_info: NONE SYNCED STANDBY CLUSTERprotection_mode: MAXIMUM PERFORMANCEprotection_level: MAXIMUM PERFORMANCE1 row in set (0.024 sec)obclient [oceanbase]> select * from v$ob_all_clusters;+------------+--------------+------------------+----------------+----------------------+------------------------------+| cluster_id | cluster_name | cluster_role | cluster_status | rootservice_list | redo_transport_options |+------------+--------------+------------------+----------------+----------------------+------------------------------+| 1 | obdemo | PHYSICAL STANDBY | VALID | 172.17.0.4:2882:2881 | ASYNC NET_TIMEOUT = 30000000 || 2 | obdemo | PRIMARY | VALID | 172.17.0.3:2882:2881 | SYNC NET_TIMEOUT = 10000000 |+------------+--------------+------------------+----------------+----------------------+------------------------------+2 rows in set (0.002 sec)obclient [oceanbase]>
显然它还不知道自己已经不是主集群了。尝试读取一下业务数据,也是可以的。并且也能继续写入。
obclient [TPCC]> select * from t1;+----+------+-----------+| ID | C1 | C2 |+----+------+-----------+| 5 | D | 24-NOV-23 || 10 | AA | 24-NOV-23 |+----+------+-----------+2 rows in set (0.004 sec)obclient [TPCC]> insert into t1 (id,c1) values(10,'AA');Query OK, 1 row affected (0.021 sec)
这种老主集群恢复后可以继续写入容易导致业务问题。所以 DBA 在恢复老的主集群时不能这样启动,而应该以只读模式启动,允许业务连上来读取故障前的数据,以判断有损 failover 丢失多少数据。
[admin@server01 oceanbase]$ kill -9 `pidof observer`[admin@server01 oceanbase]$ bin/observer -m disabled_with_readonly_clusterbin/observer -m disabled_with_readonly_clusterserver mode: disabled_with_readonly_cluster
此时可以读,但是不能写入。
obclient [TPCC]> select * from t1;+----+------+-----------+| ID | C1 | C2 |+----+------+-----------+| 5 | D | 24-NOV-23 || 10 | AA | 24-NOV-23 |+----+------+-----------+2 rows in set (0.008 sec)obclient [TPCC]> insert into t1 (id,c1) values(10,'AA');ORA-16000: database open for read-only access
这个集群用完后就可以直接删除了。因为此时是绝无可能再修复主备同步了。只能重新搭建备集群。
总结
本文总结了 OB 主备集群部署的注意事项,详细探索了主备集群的同步模式、各种场景下的切换方式等等。总体来说,OB 的主备集群的部署相比 ORACLE 的部署方法还是要简单好用的多。
关于 OBCE 的实验还有运维监控,主要是锁的排查。以前已经分享过类似文章《https://mp.weixin.qq.com/s/QsPbF0RqpasXR24wWv3UMQ》,就不再重复了。关于实验部分的总结就到这里。下一篇分享 OBCE 机考心得。欢迎继续关注!
更多阅读请参考
原文作者:数据库技术闲谈;如有侵权,请联系管理员删除。