成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一次 MySQL 誤操作導致的事故,「高可用」都頂不住了!

數據庫 MySQL
其實操作同步數據庫的時候,不應該用這種覆蓋同步的方式,可以采取單庫同步的方式,也就不會干掉 log 數據庫了。

圖片

上次我們項目不是把 MySQL 高可用部署好了么,MySQL 雙主模式 + Keepalived,來保證高可用。簡單來說就是有兩個 MySQL 主節點,分別有兩個 Keepalived 安裝在宿主機上監控 MySQL 的狀態,一旦發現有問題,就重啟 MySQL,而客戶端也會自動連接到另外一臺 MySQL。

詳情可以看悟空寫的這篇:??實戰 MySQL 高可用架構??

這次是我們在項目中遇到的一次事故,來一起復盤下吧。

本文目錄如下:

圖片

?事故現場

  • 環境:測試環境
  • 時間:上午10:30
  • 反饋人員:測試群,炸鍋了,研發同事初步排查后,發現可能是數據庫問題。

然后就開始找原因吧。因為這套集群環境是我部署的,所以我來排查的話輕車熟路。

系統部署圖

先說下系統的部署圖,方便大家理解。

兩個數據庫部署在 node55 和 node56 節點上,他們互為主從關系,所以叫做雙主。圖片

還有兩個 Keepalived 部署在 node55 和 node56 上面,分別監控 MySQL 容器的狀態。

圖片

?報錯原因和解決方案

① 我第一個想法就是,不是有 Keepalived 來保證高可用么,即使 MySQL 掛了,也可以通過 Keepalived 來自動重啟才對。即使一臺重啟不起來,還有另外一臺可以用的吧?

② 那就到服務器上看下 MySQL 容器的狀態吧。到 MySQL 的兩臺服務器上,先看下 MySQL 容器的狀態,docker ps  命令,發現兩臺 MySQL 容器都不在列表中,這代表容器沒正常運行。

圖片

③ 這不可能,我可是安裝了 Keepalived 高可用組件的,難道 Keepalived 也掛了?

④ 趕緊檢查一波 Keepalived,發現兩臺 Keepalived 是正常運行的。通過執行命令查看:systemctl status keepalived

圖片

⑤ 納尼,Keepalived 也是正常的, Keepalived 每隔幾秒會重啟 MySQL,可能我在那一小段空閑時間沒看到 MySQL 容器啟動?換個命令執行下,docker ps -a,列出所有容器的狀態。可以看到 MySQL 啟動后又退出了,說明 MySQL 確實是在重啟。

圖片

⑥ 那說明 Keepalived 雖然重啟了 MySQL 容器,但是 MySQL 自身有問題,那 Keepalived 的高可用也沒辦法了。

⑦ 那怎么整?只能看下 MySQL 報什么錯了。執行查看容器日志的命令。docker logs <容器 id>。找到最近發生的日志:

圖片

⑧ 提示 mysql-bin.index 文件不存在,這個文件是配置在主從同步那里的,在 my.cnf 配置里面。

圖片圖片

這個配置好后,然后執行主從同步的時候,就會在 var/lib/mysql/log 目錄下生成多個 mysql-bin.xxx? 的文件。還有一個 mysql-bin.index? 索引文件,它會標記現在 binlog 日志文件記錄到哪里了。

圖片圖片

mysql-bin.index 文件里面的內容如下:

/var/lib/mysql/log/mysql-bin.000001

這個 mysql-bin.000001 文件還是帶序號的,這里還有坑,后面我再說。

⑨ 報錯信息是提示缺少 mysql-bin.index,那我們就去檢查下唄,確實沒有啊!先不管這個文件怎么消失的吧,趕緊把這個 log 文件夾先創建出來,然后 mysql 會自動給我們生成這個文件的。

解決方案:執行以下命令創建文件夾和添加權限。

mkdir log
chmod 777 log -R

⑩ 兩臺服務器上都有這個 log 目錄后,Keepalived 也幫我們自動重啟好了 MySQL 容器,再來訪問下其中一個節點 node56 的 MySQL 的狀態,咦,居然報錯了。

圖片

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

可以看到幾個關鍵信息:

  • Slave_IO_Running: NO,當前同步的 I/O 線程沒有運行,這個 I/O 線程是從庫的,它會去請求主庫的 binlog,并將得到的 binlog 寫到本地的 relay-log (中繼日志)文件中。沒有運行,則代表從庫同步是沒有正常運行。
  • Master_Log_File: mysql-bin.000014,說明當前同步的日志文件為??000014??,之前我們看到節點 node56 上 mysql.index 里面寫的是 000001,這個 000014 根本就不在 index 文件里面,所以就會報錯了。

這里涉及到主從同步的原理,上一張圖:

圖片

  • 從庫會生成兩個線程,一個 I/O 線程,一個 SQL 線程;
  • I/O線程會去請求主庫的 binlog 日志文件,并將得到的 binlog 日志文件 寫到本地的 relay-log (中繼日志)文件中;
  • 主庫會生成一個 dump 線程,用來給從庫 I/O 線程傳 binlog;
  • SQL線程,會讀取 relay log 文件中的日志,并解析成 SQL 語句逐一執行。

那好辦啊,我們重新指定下同步哪個日志文件,以及同步的位置就好了。

?解決方案:

看下主庫 node55 上日志文件狀態。

圖片

記下這兩個信息:File=mysql-bin.00001,Position=117748。(這里也有個坑:先要鎖表,再看這兩個值,從庫開始同步后,再解鎖表)。

具體執行的命令如下:

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS
UNLOCK TABLES

然后在從庫 node56 上重新指定同步的日志文件和位置:

# 停止從庫同步
STOP SLAVE;

# 設置同步文件和位置
CHANGE MASTER TO MASTER_HOST='10.2.1.55',
MASTER_PORT=3306,
MASTER_USER='vagrant',
MASTER_PASSWORD='vagrant',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=117748;

# 開啟同步
START SLAVE;

再次查看就不報錯了,I/O 線程也跑起來了,

圖片

圖片在這里插入圖片描述

然后將 node55 當做從庫,node56 當做主庫,同樣執行上面的幾步,狀態顯示正常了,然后用 navicat 工具連下數據庫,都是正常的,在測試群反饋下結果,搞定收工。

?好像忘了一個問題,為啥 log 文件夾被干掉了??

為什么會出現問題?

然后問了一波當時有沒有人刪除這個 /var/lib/mysql/log 目錄,也沒有人會隨便刪除這個目錄的吧。

但是發現 log 的上級目錄 /var/lib/mysql 有很多其他文件夾,比如 xxcloud, xxcenter 等。這不就是我們項目中幾個數據庫的名字么,只要在這個目錄的文件夾,都會顯示在 navicat 上,是一一對應的,如下圖所示。其中也顯示了 log 數據庫。

圖片

那會不會有人從 navicat 上干掉了 log 數據庫?極有可能啊!

果然,有位同事之前在遷移升級的過程中,發現這個 log 數據庫在老的系統是沒有的,所以就清理了,這就相當于把 log 數據庫干掉了,同時也會把 log 文件夾干掉了。好了,終于水落石出了!這個其實也是我前期沒有考慮到 log 目錄的一個問題。沒錯,這是我的鍋~

改進

其實操作同步數據庫的時候,不應該用這種覆蓋同步的方式,可以采取單庫同步的方式,也就不會干掉 log 數據庫了。但是,這個 log 數據庫放在這里有點奇怪啊,能不能不要出現在這里呢?

我們只要指定這個 log 目錄不在  /var/lib/mysql 目錄下就好了。

東哥建議:log 文件和數據庫 data 文件進行隔離:

  • datadir = /var/lib/mysql/data
  • log_bin = /var/lib/mysql/log

?另外一個問題,我們的高可用真的高可用了嗎?

至少沒有做到及時報警,MySQL 數據庫掛了,我是不知道的,都是通過測試同學反饋的。

能不能及時感知到 MySQL 異常呢?

這里可以利用 Keepalived 發送郵件的功能,或者通過日志報警系統。這個是后面需要改進的地方。

責任編輯:趙寧寧 來源: 悟空聊架構
相關推薦

2022-09-29 10:27:40

元宇宙

2023-09-04 00:00:07

百度長連接網絡

2020-03-31 09:42:18

運營商員工網絡

2022-06-06 11:31:31

MySQL數據查詢

2009-04-15 12:22:42

Nehalemintel服務器

2010-12-02 10:16:32

2022-06-30 19:00:00

高可用KeepalivedLinux

2020-10-27 10:53:08

加密

2023-05-05 18:09:41

Google開源OpenAI

2025-03-11 08:48:35

JVMOOM事故

2020-08-24 07:34:39

網絡超時請求

2021-03-05 22:41:55

CDH集群CDH集群

2024-06-04 08:19:34

2022-05-12 09:52:09

網絡架構HTTP跨域保護機制

2023-01-16 14:49:00

MongoDB數據庫

2020-11-16 12:35:25

線程池Java代碼

2022-07-11 13:58:14

數據庫業務流程系統

2019-01-16 09:20:42

架構設計JVM FullGC宕機事故

2021-02-08 08:07:09

CPU應用服務器

2017-11-09 09:06:29

流量暴增優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜影院操 | 午夜精品福利视频 | 一级h片| 91在线精品视频 | 欧美 日韩 国产 成人 | 亚洲人a | a在线视频 | 久久久精品影院 | 日韩精品一区二区三区中文在线 | 亚洲成人精品视频 | 九九亚洲| 国产一区二区av | 久久99国产精品 | 久久精品av | 久久亚洲欧美日韩精品专区 | 国产一区二区三区四区三区四 | 粉嫩粉嫩芽的虎白女18在线视频 | 国产精品久久777777 | 国产精品爱久久久久久久 | 91久久精品一区二区二区 | 色网站入口 | 日韩中文字幕在线视频观看 | 美女黄网站| 香蕉一区二区 | 另类 综合 日韩 欧美 亚洲 | 五月花丁香婷婷 | 欧美一区二区三区视频在线观看 | 精品国产免费人成在线观看 | 91久久夜色 | 视频一区二区中文字幕日韩 | 国产一区影院 | 黄色激情毛片 | 免费福利视频一区二区三区 | 中文字幕av第一页 | 91在线精品秘密一区二区 | 久久综合入口 | 亚洲综合无码一区二区 | 国产日韩久久 | 精品中文字幕一区二区 | 欧美视频 亚洲视频 | 欧美在线资源 |