MySQL 高可用架構 - MHA環境部署記錄
MySQL 高可用架構 - MHA環境部署記錄
一、MHA介紹
MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職於Facebook公司)開發,是日本的一位MySQL專家採用Perl語言編寫的一個指令碼管理工具,該工具僅適用於MySQLReplication(二層)環境,目的在於維持Master主庫的高可用性。是一套優秀的作為MySQL高可用性環境下故障切換和主從提升的高可用軟體。在MySQL故障切換過程中,MHA能做到在0~30秒之內自動完成資料庫的故障切換操作,並且在進行故障切換的過程中,MHA能在最大程度上保證資料的一致性,以達到真正意義上的高可用。
MHA是自動的master故障轉移和Slave提升的軟體包.它是基於標準的MySQL複製(非同步/半同步).該軟體由兩部分組成:MHA Manager(管理節點)和MHA Node(資料節點)。
1. MHA Manager可以單獨部署在一臺獨立的機器上管理多個master-slave叢集,也可以部署在一臺slave節點上。MHA Manager會定時探測叢集中的node節點,當發現master出現故障的時候,它可以自動將具有最新資料的slave提升為新的master,然後將所有其它的slave導向新的master上.整個故障轉移過程對應用程式是透明的。
2. MHA Node執行在每臺MySQL伺服器上,它通過監控具備解析和清理logs功能的指令碼來加快故障轉移的。
在MHA自動故障切換過程中,MHA試圖從當機的主伺服器上儲存二進位制日誌,最大程度的保證資料的不丟失,但這並不總是可行的。例如,如果主伺服器硬體故障或無法通過ssh訪問,MHA沒法儲存二進位制日誌,只進行故障轉移而丟失了最新的資料。使用MySQL 5.5的半同步複製,可以大大降低資料丟失的風險。MHA可以與半同步複製結合起來。如果只有一個slave已經收到了最新的二進位制日誌,MHA可以將最新的二進位制日誌應用於其他所有的slave伺服器上,因此可以保證所有節點的資料一致性。
目前MHA主要支援一主多從的架構,要搭建MHA,要求一個複製叢集中必須最少有三臺資料庫伺服器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫,因為至少需要三臺伺服器,出於機器成本的考慮,淘寶也在該基礎上進行了改造,目前淘寶TMHA已經支援一主一從。
二、MHA工作架構說明
展示瞭如何通過MHA Manager管理多組主從複製。可以將MHA工作原理總結為如下:
相較於其它HA軟體,MHA的目的在於維持MySQL Replication中Master庫的高可用性,其最大特點是可以修復多個Slave之間的差異日誌,最終使所有Slave保持資料一致,然後從中選擇一個充當新的Master,並將其它Slave指向它。工作流程主要如下:
1. 從當機崩潰的master儲存二進位制日誌事件(binlog events);
2. 識別含有最新更新的slave;
3. 應用差異的中繼日誌(relay log)到其他的slave;
4. 應用從master儲存的二進位制日誌事件(binlog events);
5. 提升一個slave為新的master;
6. 使其他的slave連線新的master進行復制;
################ MHA工作原理 ###############
當master出現故障時,通過對比slave之間I/O執行緒讀取master binlog的位置,選取最接近的slave做為latest slave。其它slave通過與latest slave對比生成差異中繼日誌。在latest slave上應用從master儲存的binlog,同時將latest slave提升為master。最後在其它slave上應用相應的差異中繼日誌並開始從新的master開始複製。
在MHA實現Master故障切換過程中,MHA Node會試圖訪問故障的master(通過SSH),如果可以訪問(不是硬體故障,比如InnoDB資料檔案損壞等),會儲存二進位制檔案,以最大程度保證資料不丟失。MHA和半同步複製一起使用會大大降低資料丟失的危險。
############ MHA軟體的架構 ########### 由兩部分組成,Manager工具包 和 Node工具包,具體的說明如下。
1. Manager工具包主要包括以下幾個工具:
masterha_check_ssh # 檢查MHA的SSH配置狀況
masterha_check_repl # 檢查MySQL複製狀況
masterha_manger # 啟動MHA
masterha_check_status # 檢測當前MHA執行狀態
masterha_master_monitor # 檢測master是否當機
masterha_master_switch # 控制故障轉移(自動或者手動)
masterha_conf_host # 新增或刪除配置的server資訊
2. Node工具包(這些工具通常由MHA Manager的指令碼觸發,無需人為操作)主要包括以下幾個工具:
save_binary_logs #(儲存二進位制日誌) 儲存和複製master的二進位制日誌
apply_diff_relay_logs # (應用差異中繼日誌) 識別差異的中繼日誌事件並將其差異的事件應用於其他的slave
filter_mysqlbinlog # 去除不必要的ROLLBACK事件(MHA已不再使用這個工具)
purge_relay_logs # (清理中繼日誌) 清除中繼日誌(不會阻塞SQL執行緒)
########## MHA如何保持資料的一致性呢?######### 主要通過MHA node的以下幾個工具實現,但是這些工具由mha manager觸發:
save_binary_logs 如果master的二進位制日誌可以存取的話,儲存複製master的二進位制日誌,最大程度保證資料不丟失
apply_diff_relay_logs 相對於最新的slave,生成差異的中繼日誌並將所有差異事件應用到其他所有的slave
注意:
對比的是relay log,relay log越新就越接近於master,才能保證資料是最新的。
purge_relay_logs刪除中繼日誌而不阻塞sql執行緒
################# MHA的優勢 ##################
1. 故障切換快
在主從複製叢集中,只要從庫在複製上沒有延遲,MHA通常可以在數秒內實現故障切換。9-10秒內檢查到master故障,可以選擇在7-10秒關閉master以避免出現裂腦,幾秒鐘內,將差異中繼日誌(relay log)應用到新的master上,因此總的當機時間通常為10-30秒。恢復新的master後,MHA並行的恢復其餘的slave。即使在有數萬臺slave,也不會影響master的恢復時間。
DeNA在超過150個MySQL(主要5.0/5.1版本)主從環境下使用了MHA。當mater故障後,MHA在4秒內就完成了故障切換。在傳統的主動/被動叢集解決方案中,4秒內完成故障切換是不可能的。
2. master故障不會導致資料不一致
當目前的master出現故障時,MHA自動識別slave之間中繼日誌(relay log)的不同,並應用到所有的slave中。這樣所有的salve能夠保持同步,只要所有的slave處於存活狀態。和Semi-Synchronous Replication一起使用,(幾乎)可以保證沒有資料丟失。
3. 無需修改當前的MySQL設定
MHA的設計的重要原則之一就是儘可能地簡單易用。MHA工作在傳統的MySQL版本5.0和之後版本的主從複製環境中。和其它高可用解決方法比,MHA並不需要改變MySQL的部署環境。MHA適用於非同步和半同步的主從複製。
啟動/停止/升級/降級/安裝/解除安裝MHA不需要改變(包擴啟動/停止)MySQL複製。當需要升級MHA到新的版本,不需要停止MySQL,僅僅替換到新版本的MHA,然後重啟MHA Manager就好了。
MHA執行在MySQL 5.0開始的原生版本上。一些其它的MySQL高可用解決方案需要特定的版本(比如MySQL叢集、帶全域性事務ID的MySQL等等),但並不僅僅為了master的高可用才遷移應用的。在大多數情況下,已經部署了比較舊MySQL應用,並且不想僅僅為了實現Master的高可用,花太多的時間遷移到不同的儲存引擎或更新的前沿發行版。MHA工作的包括5.0/5.1/5.5的原生版本的MySQL上,所以並不需要遷移。
4. 無需增加大量的伺服器
MHA由MHA Manager和MHA Node組成。MHA Node執行在需要故障切換/恢復的MySQL伺服器上,因此並不需要額外增加伺服器。MHA Manager執行在特定的伺服器上,因此需要增加一臺(實現高可用需要2臺),但是MHA Manager可以監控大量(甚至上百臺)單獨的master,因此,並不需要增加大量的伺服器。即使在一臺slave上執行MHA Manager也是可以的。綜上,實現MHA並沒用額外增加大量的服務。
5. 無效能下降
MHA適用與非同步或半同步的MySQL複製。監控master時,MHA僅僅是每隔幾秒(預設是3秒)傳送一個ping包,並不傳送重查詢。可以得到像原生MySQL複製一樣快的效能。
6. 適用於任何儲存引擎
MHA可以執行在只要MySQL複製執行的儲存引擎上,並不僅限制於InnoDB,即使在不易遷移的傳統的MyISAM引擎環境,一樣可以使用MHA。
三、MHA高可用環境部署記錄
1. 機器環境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
2. 實現主機名hostname登入(在三臺節點上都需要執行)(這一步不是必須要操作的)
1 2 3 4 5 6 7 8 9 |
|
3. 準備好Mysql主從環境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
4. 建立使用者mha管理的賬號(在三臺節點上都需要執行)
1 2 3 4 5 6 7 8 9 10 11 12 |
|
5. 開始安裝mha
mha包括manager節點和data節點,其中:
data節點包括原有的MySQL複製結構中的主機,至少3臺,即1主2從,當master failover後,還能保證主從結構;只需安裝node包。
manager server:執行監控指令碼,負責monitoring 和 auto-failover;需要安裝node包和manager包。
5.1 在所有data資料節點機上安裝安裝MHA node
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
5.2 在manager節點(即182.48.115.238)上安裝MHA Manager(注意manager節點也要安裝MHA node)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
5.3 在管理節點(182.48.115.238)上進行下面配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
5.4 設定relay log的清除方式(在兩臺slave節點上)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
5.5 檢查SSH配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
5.6 使用mha工具check檢查repl環境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
|
6. 管理mha操作
6.1 檢查MHA Manager的狀態
1 2 3 4 5 |
|
6.2 開啟MHA Manager監控
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
6.3 關閉MHA Manage監控
1 2 3 4 5 6 7 8 9 |
|
7. 配置VIP
vip配置可以採用兩種方式,一種通過keepalived的方式管理虛擬ip浮動;另外一種通過指令碼方式啟動虛擬ip的方式(即不需要keepalived或者heartbeat類似的軟體)。
第一種方式:通過keepalive的方式管理vip
1. 下載軟體進行並進行安裝(在兩臺master上都要安裝,準確的說一臺是master(182.48.115.236);另外一臺是備選master(182.48.115.237),在沒有切換以前是slave)
1 2 3 4 5 6 7 8 9 10 11 12 |
|
2. keepalived配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
|
3. 啟動keepalived服務
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
4. MHA引入keepalived(MySQL服務程式掛掉時通過MHA 停止keepalived)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
|
第二種方式:通過指令碼的方式管理VIP
這裡是修改/usr/local/bin/master_ip_failover,修改完成後內容如下。還需要手動在master伺服器上繫結一個vip
1. 現在master節點上繫結vip
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
2. manager節點修改/usr/local/bin/master_ip_failover
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
|
8. failover故障切換
1. 自動切換(必須先啟動MHA Manager,否則無法自動切換。(當然手動切換不需要開啟MHA Manager監控))
1 2 3 4 5 |
|
1.1 在candicate master(182.48.115.237)上停掉slave sql執行緒,模擬主從延時。
1 2 3 4 |
|
1.2 模擬sysbench壓力測試
1 2 |
|
1.3 開啟在candicate master(182.48.115.237)上的IO執行緒,追趕落後於master的binlog
1 2 |
|
1.4 殺掉主庫(182.48.115.236)mysql程式,模擬主庫發生故障,進行自動failover操作
1 |
|
1.5 檢視MHA切換日誌,瞭解整個切換過程。在manager管理節點(182.48.115.238)上檢視日誌
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
2. 手動Failover(MHA Manager必須沒有執行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
9. 線上進行切換
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 |
|
由於線上進行切換需要呼叫到master_ip_online_change這個指令碼,但是由於該指令碼不完整,需要自己進行相應的修改。在測試中發現指令碼還是有問題,指令碼中new_master_password這個變數獲取不到,導致線上切換失敗,所以進行了相關的硬編碼,直接把mysql的root使用者密碼賦值給變數new_master_password。另外這個指令碼還可以管理vip。
10. 修復當機後的master節點
通常情況下自動切換以後,原master可能已經廢棄掉,待原master主機修復後,如果資料完整的情況下,可能想把原來master重新作為新主庫的slave,這時我們可以藉助當時自動切換時刻的MHA日誌來完成對原master的修復。下面是提取相關日誌的命令:
1 2 |
|
獲取上述資訊以後,就可以直接在修復後的master上執行change master to相關操作,重新作為從庫了。
最後補充一下郵件傳送指令碼send_report ,這個指令碼經過調整後可以使用,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
|
告警郵件如下:
目前高可用方案可以一定程度上實現資料庫的高可用,出於對資料庫的高可用和資料一致性的要求,推薦使用MHA架構。
*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************
相關文章
- mysql高可用架構MHA搭建MySql架構
- 部署MHA+keepalived+ProxySQL高可用架構SQL架構
- MySQL高可用架構-MMM、MHA、MGR、PXCMySql架構
- MySQL 實現高可用架構之 MHAMySql架構
- Redis+Keepalived高可用環境部署記錄Redis
- ProxySQL Cluster 高可用叢集環境部署記錄SQL
- mysql高可用架構MHA搭建(centos7+mysql5.7.28)MySql架構CentOS
- 構建MHA實現MySQL高可用叢集架構MySql架構
- MySQL高可用架構之MHA 原理與實踐MySql架構
- MHA高可用架構的實現方式架構
- Mysql 5.7 MHA 高可用MySql
- MySQL高可用架構之Keepalived+主從架構部署MySql架構
- MySQL——MHA高可用群集部署及故障測試MySql
- MySQL高可用群集MHA部署及故障測試分析MySql
- MySQL叢集架構:MHA+MySQL-PROXY+LVS實現MySQL叢集架構高可用/高效能MySql架構
- MySQL資料庫實現高可用架構之MHA的實戰MySql資料庫架構
- Canal高可用架構部署架構
- Mysql高可用架構方案MySql架構
- 基於 MHA 高可用的 MySQLMySql
- MySQL 高可用架構之 MMM 架構MySql架構
- MySQL高可用方案-PXC(Percona XtraDB Cluster)環境部署詳解MySql
- MySQL 中常見的幾種高可用架構部署方案MySql架構
- MHA原始碼分析——環境部署原始碼
- MySQL高可用架構對比MySql架構
- Centos7.5基於MySQL5.7的 InnoDB Cluster 多節點高可用叢集環境部署記錄CentOSMySql
- 【DB寶45】MySQL高可用之MGR+Consul架構部署MySql架構
- Mysql 高可用(MHA)-讀寫分離(Atlas)MySql
- MySQL高可用架構設計分析MySql架構
- 基於MySQL Cluster + LVS + KeepAlived部署負載均衡高可用架構MySql負載架構
- MHA+MySQL主從配置實現MySQL高可用MySql
- MySQL高可用架構:mysql+keepalived實現MySql架構
- MySQL MHA部署 Part 5 MHA部署指南MySql
- MHA高可用架構工作原理?主庫當機處理過程架構
- MHA高可用+VIP漂移
- 高可用架構架構
- 【DB寶42】MySQL高可用架構MHA+ProxySQL實現讀寫分離和負載均衡MySql架構負載
- 構建生產環境可用的高可用kubernetes叢集
- Mysql MHA部署-04MHA配置MySql