MySQL高可用
本文主要圍繞MHA和Galera Cluster來講述兩種方案在MySQL中是怎樣實現高可用的。
1.幾種常見的高可用模式
MMM: Multi-Master Replication Manager for MySQL,Mysql主主複製管理器是一套靈活的腳本程序,基於perl實現,用來對mysql replication進行監控和故障遷移,並能管理mysql Master-Master複製的配置(同一時間只有一個節點是可寫的)
官網: http://www.mysql-mmm.org
https://code.google.com/archive/p/mysql-master-master/downloads
MHA: Master High Availability,對主節點進行監控,可實現自動故障轉移至其它從節點;通過提升某一從節點爲新的主節點,基於主從複製實現,還需要客戶端配合實現,目前MHA主要支持一主多從的架構,要搭建MHA,要求一個複製集羣中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫,出於機器成本的考慮,淘寶進行了改造,目前淘寶TMHA已經支持一主一從
官網:https://code.google.com/archive/p/mysql-master-ha/
Galera Cluster:wsrep(MySQL extended with the Write Set Replication)通過wsrep協議在全局實現複製;任何一節點都可讀寫,不需要主從複製,實現多主讀寫
MHA集羣架構
2.MHA
MHA工作原理
1 從宕機崩潰的master保存二進制日誌事件(binlog events)
2 識別含有最新更新的slave
3 應用差異的中繼日誌(relay log)到其他的slave
4 應用從master保存的二進制日誌事件(binlog events)
5 提升一個slave爲新的master
6 使其他的slave連接新的master進行復制
MHA
MHA軟件由兩部分組成,Manager工具包和Node工具包
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信息
MHA Node工具包:這些工具通常由MHA Manager的腳本觸發,無需人爲操作)主要包括以下幾個工具:
save_binary_logs 保存和複製master的二進制日誌
apply_diff_relay_logs 識別差異的中繼日誌事件並將其差異的事件應用於其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用此工具)
purge_relay_logs 清除中繼日誌(不會阻塞SQL線程)
注意:爲了儘可能的減少主庫硬件損壞宕機造成的數據丟失,因此在配置MHA的同時建議配置成MySQL 5.5的半同步複製
MHA 自定義擴展:
secondary_check_script: 通過多條網絡路由檢測master的可用性
master_ip_ailover_script: 更新Application使用的masterip
shutdown_script: 強制關閉master節點
report_script: 發送報告
init_conf_load_script: 加載初始配置參數
master_ip_online_change_script:更新master節點ip地址
配置文件:
global配置,爲各application提供默認配置
application配置:爲每個主從複製集羣
實現MHA
在管理節點上安裝兩個包:
啓用epel源
mha4mysql-manager
mha4mysql-node
在被管理節點安裝:
yum install mha4mysql-node
實現MHA
在管理節點建立配置文件
vim /etc/mastermha/app1.cnf
[server default]
user=mhauser
password=magedu
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=magedu
ping_interval=1
[server1]
hostname=192.168.8.17
candidate_master=1
[server2]
hostname=192.168.8.27
candidate_master=1
[server3]
hostname=192.168.8.37
實現Master
vim /etc/my.cnf
[mysqld]
log-bin
server_id=1
skip_name_resolve=1 MHA必須設
mysql>show master logs
mysql>grant replication slave on *.* to repluser@'192.168.8.%' identified by ‘magedu'; 用於從服務器複製
mysql>grant all on *.* to mhauser@'192.168.8.%’identified by‘magedu'; 管理賬號
實現slave
vim /etc/my.cnf
[mysqld]
server_id=2 不同節點此值各不相同
log-bin
read_only
relay_log_purge=0
skip_name_resolve=1
mysql>CHANGE MASTER TO MASTER_HOST=‘MASTER_IP',
MASTER_USER='repluser', MASTER_PASSWORD=‘magedu',
MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;
實現MHA
在所有節點實現相互之間ssh key驗證 注意時間的同步
Mha驗證和啓動
masterha_check_ssh --conf=/etc/mastermha/app1.cnf
masterha_check_repl --conf=/etc/mastermha/app1.cnf
masterha_manager --conf=/etc/mastermha/app1.cnf
排錯日誌:
/data/mastermha/app1/manager.log
3.Galera Cluster
Galera Cluster:集成了Galera插件的MySQL集羣,是一種新型的,數據不共享的,高度冗餘的高可用方案,目前Galera Cluster有兩個版本,分別是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即採用multi-master的集羣架構,是一個既穩健,又在數據一致性、完整性及高性能方面有出色表現的高可用解決方案
右圖圖示:三個節點組成了一個集羣,與普通的主
從架構不同,它們都可以作爲主節點,三個節點是對等的,稱爲multi-master架構,當有客戶端要寫入或者讀取數據時,連接哪個實例都是一樣的,讀到的數據是相同的,寫入某一個節點之後,集羣自己會將新數據同步到其它節點上面,這種架構不共享任何數據,是一種高冗餘架構
Galera Cluster特點
多主架構:真正的多點讀寫的集羣,在任何時候讀寫數據,都是最新的
同步複製:集羣不同節點之間數據同步,沒有延遲,在數據庫掛掉之後,數據不會丟失
併發複製:從節點APPLY數據時,支持並行執行,更好的性能
故障切換:在出現數據庫故障時,因支持多點寫入,切換容易
熱插拔:在服務期間,如果數據庫掛了,只要監控程序發現的夠快,不可服務時間就會非常少。在節點故障期間,節點本身對集羣的影響非常小
自動節點克隆:在新增節點,或者停機維護時,增量數據或者基礎數據不需要人工手動備份提供,Galera Cluster會自動拉取在線節點數據,最終集羣會變爲一致
對應用透明:集羣的維護,對應用程序是透明的
Galera Cluster工作過程
Galera Cluster官方文檔:
http://galeracluster.com/documentation-webpages/galera-documentation.pdf
http://galeracluster.com/documentation-webpages/index.html
https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/
Galera Cluster包括兩個組件
Galera replication library (galera-3)
WSREP:MySQL extended with the Write Set Replication
WSREP複製實現:
percona-cluster
MariaDB-Cluster mariadb集羣專業版
注意:都至少需要三個節點,不能安裝mariadb-server
MySQL複製
yum install MariaDB-Galera-server 需要官方yum源
vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.8.7,192.168.8.17,192.168.8.27"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
下面配置可選項
wsrep_cluster_name = ‘mycluster‘默認my_wsrep_cluster
wsrep_node_name = 'node1'
wsrep_node_address = ‘192.168.8.7'
MySQL複製
首次啓動時,需要初始化集羣,在其中一個節點上執行命令
/etc/init.d/mysql start --wsrep-new-cluster
而後正常啓動其它節點
service mysql start
查看集羣中相關係統變量和狀態變量
SHOW VARIABLES LIKE 'wsrep_%';
SHOW STATUS LIKE 'wsrep_%';
SHOW STATUS LIKE 'wsrep_cluster_size';