MySQL 並行複製從庫發生自動重啟分析

来源:https://www.cnblogs.com/YangJiaXin/archive/2018/04/19/8882508.html
-Advertisement-
Play Games

並行複製從庫發生自動重啟分析 背景 半同步複製從庫在晚上凌晨2點半發生自動重啟,另一個非同步複製從庫在第二天凌晨3點也發生了自動重啟。 分析 版本mysql 5.7.16 mysql show variables like '%slave_para%'; + + + | Variable_name | ...


並行複製從庫發生自動重啟分析

背景

半同步複製從庫在晚上凌晨2點半發生自動重啟,另一個非同步複製從庫在第二天凌晨3點也發生了自動重啟。

分析

版本mysql 5.7.16
mysql> show variables like '%slave_para%';
+------------------------+---------------+
| Variable_name | Value |
+------------------------+---------------+
| slave_parallel_type | LOGICAL_CLOCK |
| slave_parallel_workers | 16 |
+------------------------+---------------+

  1. mysqld服務在以mysqld_safe守護進程啟動的情況下,在發生mysqld異常情況(比如OOM)會自動拉起mysqld服務,但已確認兩個從庫實例messages中無與OOM相關的日誌。
  2. 從監控中發現,兩個從庫與Seconds_Behind_Master沒有很高的異常上升。
  3. 參數slave_pending_jobs_size_max 在多線程複製時,在隊列中Pending的事件所占用的最大記憶體,預設為16M,如果記憶體富餘,或者延遲較大時,可以適當調大;註意這個值要比主庫的max_allowed_packet大。
    參考官方文檔:slave_pending_jobs_size_max

  4. 兩個發生自動重啟的從庫日誌中都出現了ibuf record inserted to page x:x ,通過查看space_id發現都是對應的同一張表(xxx.xx),疑是晚上的定時任務對這張表做了大事務的操作。從庫的並行複製只有對併發提交的事務才會進行並行應用,對一個大事務,只有一個線程進行應用。
  5. 分析在從庫發生自動重啟的時間段里發現,產生了大事務

mysqlbinlog -v -v --base64-output=decode-rows
--start-datetime='2018-04-03 02:47:22' --stop-datetime='2018-04-03 02:48:26' /data/mysql/mysql-bin.003446 | awk
'/###/{if($0~/UPDATE|INSERT|DELETE/)count[$2""$NF]++}END{for(i in
count)print i,"\t",count[i]}' | column -t | sort -k3nr | more

DELETExxxx.xxxxw 565330
DELETExxxx.xxxx 23595
DELETExxxx.xxxxail 24156
DELETExxxx.xxxx 18475
INSERTxxxx.xxxxw_his 576265
INSERTxxxx.xxxx_his 23829
INSERTxxxx.xxxxail_his 24539
INSERTxxxx.xxxxhis 18709

6.向看源碼的朋友請教了下,得到了MySQL自動重啟的Stack Trace

nm -D -n /usr/local/mysql/bin/mysqld>/tmp/mysqld.sym

resolve_stack_dump -s /tmp/mysqld.sym -n /tmp/err.log |c++filt | less

0xf1dff5 my_print_stacktrace + 53
0x79d3b4 handle_fatal_signal + 1188
0x358c00f7e0 _end + -1978652160
0x358bc325e5 _end + -1982703611
0x358bc33dc5 _end + -1982697499
0x1159d65 ut_dbg_assertion_failed(char const*, char const*, unsigned long) + 170
0x115e8b3 ib::fatal::~fatal() + 179
0x102b4d1 ibuf_print(_IO_FILE*) + 881
0x102f531 ibuf_update_free_bits_low(buf_block_t const*, unsigned long, mtr_t*) + 3905
0x1033b29 ibuf_merge_or_delete_for_page(buf_block_t*, page_id_t const&, page_size_t const*, unsigned long) + 2825
0x11a59a1 buf_page_io_complete(buf_page_t*, bool) + 1249
0x1200afb fil_aio_wait(unsigned long) + 347
0x110db48 io_handler_thread + 200
0x358c007aa1 _end + -1978684223
0x358bce8aad _end + -1981956915

測試

主庫模擬一個大事務,看從庫是否有異常出現
環境
centos 7.4
mysql5.7.19
從庫並行複製線程 8
從庫slave_pending_jobs_size_max 設置比主庫 max_allowed_packet大

主庫

mysql> desc sbtest1;
+-----+-----------+-----+-----+------+----------------+
|  id |   int(11) |  NO | PRI | NULL | auto_increment |
|   k |   int(11) |  NO | MUL |    0 |                |
|   c | char(120) |  NO |     |      |                |
| pad |  char(60) |  NO |     |      |                |
| id3 |   int(11) | YES |     | NULL |                |
| id5 |   int(11) | YES |     | NULL |                |
+-----+-----------+-----+-----+------+----------------+

select count(*) from sbtest1;

mysql> show variables like 'max_allowed_packet%';
+--------------------+----------+
| max_allowed_packet | 16777216 | 16M
+--------------------+----------+

從庫

mysql> show variables like '%slave_para%';
+------------------------+---------------+
| Variable_name          | Value         |
+------------------------+---------------+
| slave_parallel_type    | LOGICAL_CLOCK |
| slave_parallel_workers | 8             |
+------------------------+---------------+
mysql> show variables like '%slave_pending_jobs%';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| slave_pending_jobs_size_max | 67108864 | 64M
+-----------------------------+----------+

主庫執行

UPDATE sbtest1 SET c=REPEAT(UUID(),2) where id<100000;

從庫出現大量類似生產環境中的日誌,但沒有模擬出從庫自動重啟的情況

Note] Multi-threaded slave: Coordinator has waited 208341 times hitting slave_pending_jobs_size_max; current event size = 8044
Note] Multi-threaded slave: Coordinator has waited 208351 times hitting slave_pending_jobs_size_max; current event size = 8044
Note] Multi-threaded slave: Coordinator has waited 208361 times hitting slave_pending_jobs_size_max; current event size = 8044
Note] Multi-threaded slave: Coordinator has waited 208371 times hitting slave_pending_jobs_size_max; current event size = 8044
Note] Multi-threaded slave: Coordinator has waited 208381 times hitting slave_pending_jobs_size_max; current event

結論

從庫開啟並行複製,主庫執行大事務,從庫日誌會出現大量中 Coordinator has waited。但沒有復現出從庫發生自動重啟的情況。
建議:

  1. 儘量減少大事務的執行,拆分為小事務
  2. 從庫slave_pending_jobs_size_max 變數設置比主庫max_allowed_packet大些
  3. 可設置binlog_rows_query_log_events = 1(可以動態開啟),DDL,DML會以語句形式在binlog中記錄,方便分析binlog
  4. crash問題後續可以多保留一些日誌,再次復現時好分析些
  5. 已給官方提了bug了,鏈接地址為 http://bugs.mysql.com/90342

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 環境前提: centos 6.5 x64 jdk 1.8 elasticsearch 6.1.4 logstash 6.1.4 kibana 6.1.4 mysql 5.x 保證上面軟體已經安裝,並且正常啟動。 1.配置logstash 腳本 表結構如下: 2.啟動運行 ./logstash -f ...
  • 獲取RPM包 # wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 列出RPM包里都有哪些文件 # rpm -qpl mysql57-community-release-el7-11.noarch.r ...
  • 本文內容: 複製文件法 利用mysqldump 利用select into outfile 其它(列舉但不介紹) 首發日期:2018-04-19 有些時候,在備份之前要先做flush tables ,確保所有數據都被寫入到磁碟中。 複製文件法: 對於myisam存儲引擎的資料庫,它的表結構(.frm... ...
  • int 類型的數據 可以在資料庫里存成 char字元串類型的數據; 純數字的字元串 可以在資料庫里存儲為 int的數據類型。 ...
  • 本文為mariadb官方手冊:INSERT ON DUPLICATE KEY UPDATE的譯文。 原文:https://mariadb.com/kb/en/insert-on-duplicate-key-update/ 我提交到MariaDB官方手冊的譯文:https://mariadb.com/ ...
  • 隨著Linux 7 版本的普及,但Oracle資料庫主流版本仍是11gR2,11.2.0.4 是生產安裝首選。由於11.2.0.4對Linux 7 的支持不很完美,在Linux 7 上安裝會遇到幾處問題,以此記錄下來。 https://docs.oracle.com/cd/E11882_01/rel ...
  • 16 Managing Undo 官網:http://docs.oracle.com/cd/E11882_01/server.112/e25494/undo.htm#ADMIN013 從Oracle11g開始,在預設安裝中oracle會自動管理undo, 典型安裝中不需要DBA介入配置,然而,如果選 ...
  • 並行複製從庫更新的記錄不存在實際卻存在 背景 開了並行複製的半同步從庫SQL 線程報1032錯誤,非同步複製從庫沒有報錯,偶爾會出現這種 分析 版本mysql 5.7.16 mysql show variables like '%slave_para%'; + + + | Variable_name ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...