MySQL中InnoDB-Cluster 日常運維掃盲-愛可生

2020-12-14 騰訊網

作者:楊濤濤

資深資料庫專家,專研 MySQL 十餘年。擅長 MySQL、PostgreSQL、MongoDB 等開源資料庫相關的備份恢復、SQL 調優、監控運維、高可用架構設計等。目前任職於愛可生,為各大運營商及銀行金融企業提供 MySQL 相關技術支持、MySQL 相關課程培訓等工作。

本文來源:原創投稿 *愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。

本篇是《innodb-cluster 掃盲-安裝篇》的續篇。

我們知道,InnoDB Cluster 是 Oralce 官方發布的用來管理 MySQL 組複製的一套工具,有了 InnoDB Cluster,MySQL 原生組複製的部署、運維、開發等將會變得非常簡單。

InnoDB Cluster 測試環境如下:

節點 A:192.168.2.210:3601(主節點)

節點 B:192.168.2.210:3602(從節點)

節點 C:192.168.2.210:3603(從節點)

接下來,看看 InnoDB Cluster 提供的一系列內置函數如何簡化組複製的日常運維管理。

1、get_cluster 方法

獲取集群對象,方便後續管理。

MySQL debian-ytt1:3601 ssl Py > c1 = dba.get_cluster();MySQL debian-ytt1:3601 ssl Py > c1

2、describe 方法

用來獲取集群目前狀態,輸出極簡結果。

輸出集群節點拓撲圖,集群各個節點 IP 地址等。

MySQL debian-ytt1:3601 ssl Py > c1.describe(){ "clusterName": "ytt_mgr", "defaultReplicaSet": { "name": "default", "topology": [ { "address": "127.0.0.1:3601", "label": "127.0.0.1:3601", "role": "HA" }, { "address": "127.0.0.1:3602", "label": "127.0.0.1:3602", "role": "HA" }, { "address": "127.0.0.1:3603", "label": "127.0.0.1:3603", "role": "HA" } ], "topologyMode": "Single-Primary" }}

3、list_routers 方法

獲取集群當前路由信息。

輸出當前 mysql router 路由信息,包含讀寫埠,版本等信息。

MySQL debian-ytt1:3601 ssl Py > c1.list_routers(){ "clusterName": "ytt_mgr", "routers": { "debian-ytt1::system": { "hostname": "debian-ytt1", "lastCheckIn": "2020-07-15 11:43:18", "roPort": 6447, "roXPort": 64470, "rwPort": 6446, "rwXPort": 64460, "version": "8.0.21" } }}

4、set_option 方法

用來設置集群的全局參數。

比如改變集群的名字:名字由原來 ytt_mgr 更改為 ytt_mgr_sandbox。如下圖:

再比如更改集群事務一致性由默認最終一致性級別更改為強一致性級別,如下圖:

5、options 方法

獲取集群當前所有運行參數的結果,過濾後來驗證下效果,如下圖:

當然也可以從 mysql router 層來驗證效果。如下圖,分別獲取寫節點和讀節點的數據一致性參數結果。

6、set_instance_option 方法

單獨設置某個節點的參數,不過目前還是不完善,不是每個參數都可以設置。

比如設置每個實例的標籤,設置為可讀性較強的標籤,三個節點分別設置為 node_a、node_b、node_c。如下圖:

查看設置好的標籤,查看鍵值為 label 的值。

7、set_primary_instance 方法

提升一個從節點為主節點。

比如把節點 B 提升為主,節點 A 降級為從。如下圖:

來驗證下:此時 node_b 為主節點,node_a 降為從節點。

這時候 mysql router 會自動把寫請求發送到新的主節點 B 上:

root@debian-ytt1:/home/ytt# mysql -uroot -proot -P6446 -hdebian-ytt1 -e "select @@port"mysql: [Warning] Using a password on the command line interface can be insecure.+--------+| @@port |+--------+| 3602 |+--------+

8、switch_to_multi_primary_mode 方法

設置集群模式為多主:

MySQL debian-ytt1:3601 ssl Py > c1.switch_to_multi_primary_mode()Switching cluster 'ytt_mgr_sandbox' to Multi-Primary mode...Instance '127.0.0.1:3601' was switched from SECONDARY to PRIMARY.Instance '127.0.0.1:3602' remains PRIMARY.Instance '127.0.0.1:3603' was switched from SECONDARY to PRIMARY.The cluster successfully switched to Multi-Primary mode.

驗證下當前的集群模式。

所有節點均變為主,如下圖:

9、switch_to_single_primary_mode 方法

切換集群為單主模式,如下圖:

10、status 方法

可以查看集群更加詳細的運行時信息,避免對 performance_schema.replication* 等一系列性能表進行額外查詢。

默認 c1.status 等價於 c1.status({"extended":0})

status() 方法參數為 JSON 對象有四個值:0,1,2,3。

0:禁止列印詳細信息(默認)

1:列印集群元數據相關信息,集群組協議的版本,成員等簡單的信息。

2:列印集群重放線程的相關事務執行信息。

3:列印集群內每個節點所屬詳細的信息。

下圖是執行 c1.status({"extended":2}) 的結果

從結果可以看到目前節點 B 的延遲時間,事務重放的數量,目前重放的 GTID 位置等等。

11、dissolve() 方法

用來解散集群。

dissolve 會刪除集群所有元數據、組複製相關配置數據、組複製相關的日誌文件(重放日誌,恢復日誌等)。

MySQL debian-ytt1:3601 ssl Py > c1.dissolve()...Are you sure you want to dissolve the cluster? [y/N]: yInstance '127.0.0.1:3602' is attempting to leave the cluster...Instance '127.0.0.1:3603' is attempting to leave the cluster...Instance '127.0.0.1:3601' is attempting to leave the cluster...The cluster was successfully dissolved.Replication was disabled but user data was left intact.

總結

MySQL InnoDB Cluster 是一款非常好用的管理 MySQL 組複製的套件,熟悉它的使用方法會極大的簡化我們對組複製的日常管理。

相關焦點

  • MySQL InnoDB Cluster環境搭建和簡單測試
    定義一個Cluster變量,節點1就開啟了Cluster創建之旅,可以從下面的信息看出,至少需要3個節點mysql-js>  var cluster = dba.createCluster('testCluster')A new InnoDB cluster will be created on instance 'root@localhost:3310'.
  • 從零搭建MySQL InnoDB Cluster
    mysql-js> dba.createCluster('mycluster')A new InnoDB cluster will be created on instance 'root@10.186.23.95:3306'.
  • MySQL 優化案例 - select count-愛可生
    調整部分 MySQL 參數,重啟 MySQL,保證目前 innodb buffer pool (內存緩衝區) 中為空,不緩存任何數據;3. 執行 select count(*),理論上走主鍵索引,查看當前內存緩衝區中緩存的數據量(理論上會緩存整個聚簇索引);4. 在測試表 sbtest1上添加二級索引,索引大小為 55MB;5.
  • MySQL 表如何計算統計信息-愛可生
    比如對比指定表在系統表 mysql.innodb_index_stats 的數據跟 distinct 查詢的結果,如果相差太大,可以考慮增加這個值。 當 analyze table 變的非常慢時,可能是這個值設置的太大了,此時要考慮減小這個值。
  • MySQL 大量 Opening tables 案例分析-愛可生
    (row0mysql.cc:1738),ha_innobase::write_row(ha_innodb.cc:7566),handler::ha_write_row(handler.cc:7991),write_record(sql_insert.cc:1873),Sql_cmd_insert::mysql_insert(sql_insert.cc:769),Sql_cmd_insert::execute
  • MySQL裡快速找到 binlog 中是否有大事務-愛可生
    本文關鍵字:大事務、binlog、Linux 問題 我們並不喜歡 MySQL 中出現大事務(更新很多數據的事務),大事務往往帶來很多維護的問題。
  • pt-table-checksum 到底會不會影響MySQL業務性能-愛可生
    我們先建一對主從:然後用 mysqlslap一個持續的壓力:開另外一個會話,將 master 上的 general log 打開:然後通過 pt-table-checksum 進行一次比較:查看 master 的 general log,由於 mysqlslap 的影響,general log 中有很多內容,我們找到與 pt-table-checksum
  • MySQL InnoDB存儲引擎啟動過程源碼分析
    本文將簡單介紹MySQL InnoDB存儲引擎在啟動過程中所做的一些事情,主要包括調用了哪些函數,創建了哪些線程,這些函數和線程的大概作用,以便對InnoDB啟動過程有一個初步的了解。源碼版本:Percona Server for MySQL 5.7.19InnoDB插件的定義:InnoDB作為MySQL的一個插件,在源碼文件handler/ha_innodb.cc 中可以看到InnoDB的插件的定義,如下:從InnoDB插件的定義來看,其初始化函數為 innobase_init,位於handler/ha_innodb.cc
  • 為什麼這次 MySQL 崩潰恢復要這麼久-愛可生
    作者:xuty本文來源:原創投稿 *愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。4.2. innobase_start_or_create_for_mysql然後我們需要看下 validate參數的定義,分析崩潰恢復與正常啟動的區別。
  • 幾個常見而嚴重的 MySQL 問題分析 | 運維進階
    Truncate table過程中CTRL +C 終止了。 有分片上存在truncate 事務一直存在,進而對該表的所有操作均會超時。 1.3 查詢卡住,更新卡住...殊不知,你前面的Alter table都沒成功.
  • 詳解MySQL|MySQL中間件DBLE-第五章 後端資料庫相關特性-愛可生
    後端資料庫的相關特性主要從讀寫分離、連接管理、上下文同步以及高可用故障切換四個方面拆分講解;讀寫分離與高可用故障切換是社區同學反饋中需求最大的部分,本節內容十分詳盡的講解了大家關注的關鍵技術點及相關處理細節,有助於增進對分布式應用的相關理解。
  • MySQL InnoDB 引擎中的 7 種鎖類型,你都知道嗎?
    前言大概幾個月之前項目中用到事務,需要保證數據的強一致性,期間也用到了mysql的鎖,但當時對mysql的鎖機制只是管中窺豹,所以本文打算總結一下mysql的鎖機制。本文主要論述關於mysql鎖機制,mysql版本為5.7,引擎為innodb,由於實際中關於innodb鎖相關的知識及加鎖方式很多,所以沒有那麼多精力羅列所有場景下的加鎖過程並加以分析,僅根據現在了解的知識,結合官方文檔,說說自己的理解,如果發現有不對的地方,歡迎指正。概述總的來說,InnoDB共有七種類型的鎖:mysql鎖詳解1.
  • Mysql innodb 存儲引擎的性能優化
    ,但是關於資料庫方面的翻譯的不好,大家就看看吧,翻譯本文只是想更 清楚的了解mysql 優化上的一些基本原則,而國內對於這個沒有完整的資料。在行級鎖的存儲引擎中事務是更好的選擇。InnoDB的的鎖表行為在不同的mysql 版本是不同的,如果你 從MySQL4.0或者更新的版本升級,那你依賴於innodb_table_locks這個選項會導致很多問題。5. 主鍵簇5.1. 主鍵是特殊的5.1.1. 通過主鍵訪問數據比通過其它key訪問更快。無論是在內存還是磁碟通過主鍵查找都是最快的。
  • MySQL 數據校驗工具-愛可生
    如果一個表因為行數少而要在單個塊中對其進行校驗,那麼 pt-table-checksum 將額外驗證該表在副本上是否過大。這避免了以下場景:表在主伺服器上是空的,但在副本上非常大,並且在一個大型查詢中進行檢查,這會導致複製過程中出現非常長的延遲。  還有?些其他的保障措施。
  • 愛可生詳解MySQL|刪庫了數據無法恢復?教你讓資料庫起死回生
    /storage/innobase/include/dict0boot.h 文件定義了每個字典表的 index id,對應 id 的 page 中存儲著字典表的數據。這裡我們需要藉助 undrop-for-innodb 工具恢復數據,它能讀取表空間信息得到 page,將數據從 page 中提取出來。
  • 【乾貨】Linux運維常見問題及解決的32個錦囊妙計
    作為linux運維,多多少少會碰見這樣那樣的問題或故障,從中總結經驗,查找問題,匯總並分析故障的原因,這是一個Linux運維工程師良好的習慣。每一次技術的突破,都經歷著苦悶,伴隨著快樂,可我們還是執著的繼續努力,從中也積累了更多的經驗,這就是實踐給予我們的豐厚回報。下面匯總了我做項目過程可能出現的故障及解決方法,看看是否與你有共鳴,並對你有幫助?
  • MySQL 實戰筆記 第04期:alter table 語句進度評估
    無為,多年 MySQL DBA 工作經驗,現就職於某知名網際網路公司,對 MySQL、 Redis、PostgrepSQL 等主流資料庫有一定了解,擁有豐富的一線運維經驗
  • InnoDB加鎖實驗
    InnoDB中使用的最多的行級鎖(record lock), 所有的行級鎖都是作用在索引上面的. InnoDB通過用行鎖代替表鎖大大提高了對並發的支持. 從模式層面分, 鎖主要包括讀鎖(shared lock, 後面簡稱S鎖)和寫鎖(exclusive lock, 後面簡稱X鎖), 這個讀寫的概念, 在行級鎖和表級鎖中都有體現.
  • MySQL底層存儲結構
    67 Dec 6 14:24 db.opt 12 -rw-r 1 mysql mysql 8674 Dec 24 10:51 t_innodb.frm # 表結構定義文件 96 -rw-r 1 mysql mysql 98304 Dec 24 10:54 t_innodb.ibd # 表空間文件,裡面存放數據和索引 12 -rw-r 1 mysql mysql 8674 Dec
  • 深入理解MySQL 5.7 GTID系列(八):GTID帶來的運維改變
    GTID帶來的運維改變,我想理解應該是更加深刻,這節主要討論以下幾個部分:如何跳過一個事務mysqldump導出行為的改變5.7中搭建基於GTID的主從5.7中GTID的主從的切換5.7中在線改變GTID模式一、如何跳過一個事務和傳統基於位置的主從不同,如果從庫報錯我們需要獲得從庫執行的最後一個事務