天天看點

OceanBase 是如何關閉主備線程的?

作者:愛可生

本文總結了 OceanBase 與 MySQL 在主備同步指令和資料保護上的差別。

作者:何文超

愛可生南區傳遞服務部 DBA 團隊成員,主要負責 MySQL 故障處理,MySQL 高可用架構改造,OceanBase 相關技術支援。愛好足球,羽毛球。

本文來源:原創投稿

愛可生開源社群出品,原創内容未經授權不得随意使用,轉載請聯系小編并注明來源。

背景

在 MySQL 主備同步中,存在 stop slave;reset slave all 這樣的指令來控制關閉主備線程,删除主備相關資訊。

那麼在分布式的 OceanBase 中是否存在類似場景?兩者的指令是否相同?又有什麼差別?

說明

  • MySQL 中是主備庫同步;OceanBase 中類似場景存在于主備叢集中。
  • OceanBase 主備叢集沒有 stop slave; reset slave all 的指令,但有類似場景。

下面來詳細介紹 OceanBase 中的 “stop slave; reset slave all“。

環境準備

一套 OceanBase 主備叢集。

OceanBase 中的 stop slave

下面通過幾個實驗,來驗證 clog 是如何影響 OceanBase 主備機群狀态的。

實驗 1:關閉 clog,叢集是否可用?

關閉 clog 同步(在主叢集 sys 租戶上操作)。

MySQL [(none)]> alter system disable cluster synchronization 'hwc_cluster' cluster_id=1682755173;
//hwc_clog:備叢集名
//cluster_id:備叢集 ID
           

檢視同步狀态(在主叢集 sys 租戶上操作)。

MySQL [(none)]> select * from oceanbase.v$ob_standby_status\G;
*************************** 1. row ***************************
            cluster_id: 1682755173
          cluster_name: hwc_cluster
          cluster_role: PHYSICAL STANDBY
        cluster_status: DISABLED
           current_scn: 1688630508000921
      rootservice_list: 10.186.64.63:2882:2881
redo_transport_options: ASYNC NET_TIMEOUT = 30000000
      protection_level: MAXIMUM PERFORMANCE
synchronization_status: CLUSTER IS DISABLED
1 row in set (0.00 sec)

//synchronization_status:CLUSTER IS DISABLED  
//主備叢集斷開 clog 日志同步
           

結論:關閉 clog 同步,OceanBase 主備叢集關閉。

實驗 2:特殊情況下,新資料是否丢失?

驗證一下,當 【主備叢集 clog 同步斷開時間】 > 【clog 的保留時間】,再次開啟主備叢集間的 clog 同步,新資料是否丢失?

修改 clog 保留天數為 1 天:

MySQL [(none)]> ALTER SYSTEM SET clog_expire_days=1;
           

1 天後,主叢集插入新資料。

MySQL [lpp]> select * from test;
+------+------+
| c1   | c2   |
+------+------+
|    1 | eee  |
|    2 | eee  |
|    3 | eee  |
+------+------+
3 rows in set (0.01 sec)
MySQL [lpp]> insert into test(c1,c2) values(4,'ddd');
Query OK, 1 row affected (0.02 sec)
           

開啟 clog 同步(主叢集 sys 租戶上操作)。

MySQL [(none)]> alter system enable cluster synchronization 'hwc_cluster' cluster_id=1682755173;
//hwc_clog:備叢集名
//cluster_id:備叢集 ID
           

檢查備叢集是否同步到新資料?(連接配接串需要添加 -c)

MySQL [lpp]> select /*+READ_CONSISTENCY(WEAK) */ * from test;
+------+------+
| c1   | c2   |
+------+------+
|    1 | eee  |
|    2 | eee  |
|    3 | eee  |
|    4 | ddd  |
+------+------+
4 rows in set (0.00 sec)
           

結論:備叢集同步到新資料。

原理:當開啟主備叢集 clog 同步,會自動檢測資料一緻性,如發現資料不一緻,會自動拉取基線資料進行同步。

4:停止 clog 同步後,備叢集是否可用?

clog 正常同步時,備叢集查詢資料(連接配接串需要添加 -c)。

MySQL [LPP]> select /*+READ_CONSISTENCY(WEAK) */ * from test;
+------+------+
| c1   | c2   |
+------+------+
|    1 | eee  |
|    2 | eee  |
|    3 | eee  |
|    4 | ddd  |
+------+------+
4 rows in set (0.00 sec)
           

停止 clog 同步;備叢集查詢資料(連接配接串需要添加 -c)。

MySQL [lpp]> select /*+READ_CONSISTENCY(WEAK) */ * from test;
ERROR 4012 (HY000): Timeout
           

結論:當停止 clog 同步時,備叢集不可用。

OceanBase 中的 reset slave all

MySQL 中通過 reset slave all 删除主備相關資訊,從庫可以作為一個獨立的庫,可讀可寫。

OceanBase 中通過主備叢集解耦來實作删除主備叢集關系,可參考官方文檔,具體涉及生産環境,解耦步驟更為繁瑣,此處不詳細闡述。

OceanBase 與 MySQL 的差別?

那麼,OceanBase 主備叢集與 MySQL 主備庫,在關閉主備線程,删除主備相關資訊上有哪些差別呢?

MySQL

  1. 指令操作位置:備庫
  2. 停止同步指令:stop slave
  3. 删除主備關系:reset slave all
  4. 當 binlog 同步斷開,主節點日志過期,重新打開日志同步:備庫會丢資料
  5. 當 binlog 同步斷開,備庫是否可用:備庫可用

OceanBase

  1. 指令操作位置:主叢集
  2. 停止同步指令:alter system disable cluster synchronization 'hwc_cluster' cluster_id=xxxxxxxxx
  3. 删除主備關系:主備庫解耦(較為繁瑣,OCP V3.3.0 可以白屏化操作)
  4. 當 clog 同步斷開,主節點日志過期,重新打開日志同步:備叢集不會丢資料
  5. 當 clog 同步斷開,備庫是否可用:備叢集不可用

更多技術文章,請通路:https://opensource.actionsky.com/

繼續閱讀