簡介:
1、MHA目前在MySQL高可用方面是一個(gè)相對(duì)成熟的解決方案,是MySQL高可用環(huán)境下故障切換和主從提升的高可用軟件
2、MHA能在短時(shí)間內(nèi)完成故障切換,并且在最大程度上保證數(shù)據(jù)的一致性,以達(dá)到真正意義上的高可用
3、MHA基于mysql協(xié)議,通過mysql主從或主主進(jìn)行復(fù)制
4、MHA官網(wǎng):https://code.google.com/p/mysql-master-ha/
軟件由兩部分組成:MHA Manager(關(guān)理節(jié)點(diǎn))和MHA Node(數(shù)據(jù)節(jié)點(diǎn))
1、MHA Manager可以單獨(dú)部署在一臺(tái)獨(dú)立的機(jī)器上管理多個(gè)master-slave集群,也可以部署在一臺(tái)slave節(jié)點(diǎn)上
2、MHA Node運(yùn)行在每臺(tái)MySQL服務(wù)器上
3、MHA_Manager會(huì)定時(shí)探測集群中的master節(jié)點(diǎn),當(dāng)master出現(xiàn)故障時(shí),
它可以自動(dòng)將最新數(shù)據(jù)的slave提升為新的master,然后將所有其他的slave重新指向新的master
4、MHA配合半同步復(fù)制使用可以最大限度的保證數(shù)據(jù)安全性
工作原理:
1、從宕機(jī)崩潰的master保存二進(jìn)制日志事件(binlog events)
2、識(shí)別含有最新更新的slave
3、應(yīng)用差異的中繼日志(relay log)到其他的slave
4、應(yīng)用從master保存的二進(jìn)制日志事件(binlog events)
5、提升一個(gè)slave為新的master
6、使其他的slave連接新的master進(jìn)行復(fù)制
MHA工具:
Manager工具包:
masterha_check_ssh #檢查MHA的SSH配置狀況,MHA強(qiáng)烈依賴ssh秘鑰驗(yàn)證
masterha_check_repl #檢查MySQL復(fù)制狀況
masterha_manager #MHA主程序
masterha_check_status #檢測當(dāng)前MHA運(yùn)行狀態(tài)
masterha_master_monitor #檢測master是否宕機(jī)
masterha_master_switch #手動(dòng)控制故障轉(zhuǎn)移
masterha_conf_host #添加或刪除配置的server信息
masterha_stop #MHA關(guān)閉工具
Node工具包:
save_binary_logs #保存和復(fù)制master的二進(jìn)制日志
apply_diff_relay_logs #識(shí)別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的slave
filter_mysqlbinlog #去除不必要的ROLLBACK事件(MHA已不再使用這個(gè)工具)
purge_relay_logs #清除中繼日志(不會(huì)阻塞SQL線程)
實(shí)驗(yàn)環(huán)境:
角色 ip地址
MHA_manager 192.168.0.70
Master 192.168.0.40
Slave 192.168.0.60
Slave 192.168.0.10
安裝MHA:
1、配置elpe和baseyum源
2、yum -y localinstall mha4mysql-manager-0.55-0.el6.noarch.rpm mha4mysql-node-0.54-0.el6.noarch.rpm
#非管理節(jié)點(diǎn)不用安裝mha4mysql-manager-0.55-0.el6.noarch.rpm
3、配置ssh秘鑰驗(yàn)證
ssh-keygen #生成秘鑰,一直回車就行
cat id_rsa.pub >> authorized_keys #將authorized_keys id_rsa id_rsa.pub 拷貝到所有節(jié)點(diǎn)的~/.ssh目錄下
注意:不能禁止password登陸,否則會(huì)出現(xiàn)錯(cuò)誤
配置mysql主從(建議使用mysql5.5版本以上):
master配置:
vim /etc/my.cnf #修改配置文件,添加如下內(nèi)容
[mysqld] #找到mysqld配置段
log-bin=mysql-bin #開啟二進(jìn)制日志
relay-log=relay-bin #開啟中繼日志
binlog_format=mixed #使用混合模式的二進(jìn)制日志
server-id= 1 #全局唯一的server-id
innodb-file-per-table=1 #使用單獨(dú)表空間文件
default-storage-engine=InnoDB #使用InnoDB存儲(chǔ)引擎
autocommit=0 #關(guān)閉事務(wù)自動(dòng)提交
skip-name-resolve=1 #關(guān)閉主機(jī)名反解
relay-log-purge=0 #不允許自動(dòng)清理中繼日志,因?yàn)镸HA會(huì)依靠中繼日志恢復(fù)數(shù)據(jù)
service mysqld restart #重啟mysql
mysql> SHOW MASTER STATUS; #查看當(dāng)前二進(jìn)制日志位置
+------------------+----------+
| File | Position|
+------------------+----------+
|mysql-bin.000004 | 360 | #記住當(dāng)前值
+------------------+----------+
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'mha'@'192.168.0.%' IDENTIFIED BY 'mha';
mysql> GRANT ALL ON *.* TO 'mymha'@'192.168.0.%' IDENTIFIED BY 'mymha'; #創(chuàng)建MHA監(jiān)控用戶
mysql> FLUSH PRIVILEGES;
slave配置:
vim /etc/my.cnf #修改配置文件,添加如下內(nèi)容
[mysqld] #找到mysqld配置段
log-bin=mysql-bin #開啟二進(jìn)制日志
relay-log=relay-bin #開啟中繼日志
binlog_format=mixed #使用混合模式的二進(jìn)制日志
server-id= 2 #全局唯一的server-id
innodb-file-per-table=1 #使用單獨(dú)表空間文件
default-storage-engine=InnoDB #使用InnoDB存儲(chǔ)引擎
autocommit=0 #關(guān)閉事務(wù)自動(dòng)提交
skip-name-resolve=1 #關(guān)閉主機(jī)名反解
read-only=1 #只讀,對(duì)root用戶無效(slave節(jié)點(diǎn)必須設(shè)置)
relay-log-purge=0 #不允許自動(dòng)清理中繼日志,因?yàn)镸HA會(huì)依靠中繼日志恢復(fù)數(shù)據(jù)
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.10',MASTER_USER='mha',MASTER_PASSWORD='mha',
MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=360,MASTER_PORT=3306; #指定主服務(wù)器
mysql> START SLAVE; #啟動(dòng)復(fù)制線程
mysql> SHOW SLAVE STATUS\G; #查看從服務(wù)器狀態(tài)
Slave_IO_Running: Yes #必須都為yes
Slave_SQL_Running: Yes
mysql> SELECT USER,PASSWORD,HOST FROM mysql.user; #查看mha是否同步成功
MHA配置:
mkdir /etc/mha
mkdir /var/log/mha_app1
vim /etc/mha/app1.cnf
[server default] #MHA工作屬性定義(配置時(shí)不能有注釋)
manager_workdir=/masterha/app1 #MHA的工作目錄
manager_log=/var/log/mha_app1/manager.log #MHA的日志文件
password=mymha #設(shè)置MHA監(jiān)控用戶的密碼
user=mymha #設(shè)置監(jiān)控用戶
ping_interval=1 #設(shè)置監(jiān)控主庫,健康檢查時(shí)間
remote_workdir=/masterha/app1 #設(shè)置遠(yuǎn)端mysql在發(fā)生切換時(shí)binlog的保存位置
repl_password=mha #設(shè)置復(fù)制用戶的密碼
repl_user=mha #設(shè)置復(fù)制環(huán)境中的復(fù)制用戶名
ssh_user=root #設(shè)置ssh的登錄用戶名
master_binlog_dir=/usr/local/mysql/data/ #二進(jìn)制日志文件存放路徑
可選參數(shù),腳本都需要自己寫:
shutdown_script=/masterha/scripts/shutdown.sh #故障發(fā)生后關(guān)閉故障主機(jī)腳本(用于防止腦裂)
master_ip_failover_script=/masterha/scripts/automatic.sh #設(shè)置自動(dòng)故障轉(zhuǎn)移時(shí)執(zhí)行的腳本
master_ip_online_change_script=/masterha/scripts/manual.sh #設(shè)置手動(dòng)故障轉(zhuǎn)移時(shí)執(zhí)行的腳本
report_script=/masterha/scripts/twili.py #設(shè)置發(fā)生切換后發(fā)送的報(bào)警腳本
[server1]
hostname=192.168.0.40
port=3306
[server2] #節(jié)點(diǎn)設(shè)置
hostname=192.168.0.60 #主機(jī)地址
port=3306 #端口
check_repl_delay=0 #用防止master故障時(shí),切換時(shí)slave有延遲
candidate_master=1
#設(shè)置為候選master,如果沒有設(shè)置則在slave中選擇數(shù)據(jù)最新的成為master,如果設(shè)置了建議最好指向半同步節(jié)點(diǎn)
[server3]
hostname=192.168.0.10
port=3306
MHA使用:
chmod 600 /etc/mha/app1.cnf #設(shè)置為只有root用戶對(duì)此文件有權(quán)限
masterha_check_ssh --conf=/etc/mha/app1.cnf #檢查ssh秘鑰認(rèn)證是否成功
--conf:指定配置文件
masterha_check_repl --conf=/etc/mha/app1.cnf #檢查mysql復(fù)制環(huán)境成功
masterha_check_status --conf=/etc/mha/app1.cnf #檢查MHA運(yùn)行狀態(tài)
masterha_manager --conf=/etc/mha/app1.cnf #啟動(dòng)MHA
標(biāo)題名稱:mysql進(jìn)階(三)MHA高可用集群
文章路徑:
http://weahome.cn/article/pcsdie.html