前面文章已經介紹了MySQL的安裝和主從配置
主從配置應該只能算是一套容災方案,當主庫崩潰之後,我們可以將程式切換到從庫以保證系統正常執行,這個切換過程是手動的
主從配置的問題就在於主庫down掉之後從庫不能自動提升成為主庫,今天我們就介紹一個MySQL高可用的解決方案:MHA+Mysql主從配置
MHA - Master High Availability,MySQL高可用方面相對成熟的解決方案,是一個用於故障切換和主從提升的軟體
要搭建MHA,要求叢集至少要有三個節點,即一主二從。MHA分為MHA-Manager(管理節點)和MHA-Node(資料節點)兩部分,結合MySQL主從配置架構圖如下(臨時畫的,略醜陋……):
說明一下伺服器情況:
1. 一共三臺伺服器,系統ubuntu16.04 64位
2. IP分別為:192.168.1.222、192.168.1.223、192.168.1.224
3. 222為master節點,223和224都是slave節點
4. mha-manager裝在223上,三臺機器都裝了mha-node
複製程式碼
下面介紹MHA的安裝和配置
MHA安裝
一般我們是將Manager裝在某一個Mysql從節點上,當然也可以單獨裝在一臺機器上
1. 下載安裝包
MHA的安裝包下載需要翻牆,這裡我共享一個網盤連結方便大家下載吧
MHA-Manager: MHA-Manager
密碼:yoed
複製程式碼
MHA-Node:MHA-Node
密碼:y5ml
複製程式碼
2. 安裝相關依賴
apt-get install libdbd-mysql-perl
apt-get install libconfig-tiny-perl
apt-get install liblog-dispatch-perl
apt-get install libparallel-forkmanager-perl
複製程式碼
3. 安裝MHA Node
由於MHA Manager會用到MHA Node提供的模組,不先安裝MHA Node直接安裝MHA Manager會報錯
cd 安裝包上傳目錄
dpkg -i mha4mysql-node_0.54-0_all.deb
複製程式碼
4. 安裝MHA Manager
cd 安裝包上傳目錄
dpkg -i mha4mysql-manager_0.55-0_all.deb
複製程式碼
MHA配置
1. 環境配置
MHA 叢集中的各節點彼此之間均需要基於 ssh 互信通訊,以實現遠端控制及資料管理功能,所以MHA環境中的三臺主機需要相互信任:實現三臺主機之間相互免金鑰登入
登入MHA Manager機器,建議直接使用root使用者
# 生成公鑰
ssh-keygen -t rsa
# 生成私鑰
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.1.223
# 複製給本機
ssh root@192.168.1.223 'ifconfig'
# 將生成的公私鑰傳給MHA Node機器
scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} root@192.168.1.222:/root/.ssh/
scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} root@192.168.1.224:/root/.ssh/
複製程式碼
分別登入MHA Node機器,同樣直接使用root使用者
# 複製給本機
# 222機器
ssh root@192.168.1.222 'ifconfig'
# 224機器
ssh root@192.168.1.224 'ifconfig'
複製程式碼
要是root登陸的話,需要修改ssh的配置檔案
vim /etc/ssh/sshd_config
# PermitRootLogin,設定為YES,再重啟SSH
複製程式碼
Manager要是裝到某一臺MySQL上,則需要自己和自己無密碼登入,單獨到一臺伺服器則不需要
# 確保可以無密碼與自己通訊
ssh 192.168.1.223
複製程式碼
測試三臺機器之間可以免金鑰登入
# 223
ssh 192.168.1.222
ssh 192.168.1.224
# 222
ssh 192.168.1.223
ssh 192.168.1.224
# 224
ssh 192.168.1.222
ssh 192.168.1.223
複製程式碼
2. 主從配置
由於之後slave節點會提升為master節點,所以主從配置要做一些修改
Master配置
log_bin = master-bin # 啟動二進位制日誌
log_bin_index = master-bin.index
relay-log = slave-relay-bin
relay-log-purge = 0 # 禁用或啟用不再需要中繼日誌時是否自動清空它們
複製程式碼
Slave配置
log_bin = master-bin
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
relay-log-purge = 0
read_only = 1
複製程式碼
3. MHA Manager配置
登入master,建立mha賬號並授權,也可以直接使用root賬戶或其他有許可權的已有使用者
需要的許可權:Super,select,create,insert,update,delete,drop,reload
mysql>GRANT ALL ON *.* TO 'mhaadmin'@'192.168.1.%' IDENTIFIED BY 'mhapassword';
mysql>FLUSH PRIVILEGES;
複製程式碼
建立相關目錄
mkdir /usr/local/masterha /usr/local/masterha/app1 # 建立資料檔案目錄
mkdir /etc/masterha # 建立配置檔案目錄
複製程式碼
建立配置檔案
vi /etc/masterha/app1.cnf
複製程式碼
[server default]
user=mhaadmin # mysql使用者名稱
password=mhapassword # mysql密碼
ssh_user=root # ssh免金鑰登入的帳號名
repl_user=repl # mysql複製帳號,主從配置裡配的
repl_password=mysql # mysql複製賬號密碼
ping_interval=1 # ping間隔,用來檢測master是否正常,預設是3秒,嘗試三次沒有迴應的時候自動進行failover
manager_workdir=/usr/local/masterha/app1 # 資料目錄
manager_log=/usr/local/masterha/manager.log # 日誌檔案
remote_workdir=/usr/local/masterha/app1 # 另外2臺機子在執行時候需要建立的目錄,注意ssh-keygen帳號的許可權問題
master_binlog_dir=/var/log/mysql # binlog目錄,不指定會報錯
[server1]
hostname=192.168.1.222
candidate_master=1 # master機宕掉後,優先啟用這臺作為新master
check_repl_delay=0 # 預設情況下如果一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave作為一個新的master,因為對於這個slave的恢復需要花費很長時間,通過設定check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略複製延時,這個引數對於設定了candidate_master=1的主機非常有用,因為這個候選主在切換的過程中一定是新的master
[server2]
hostname=192.168.1.223
no_master=1 # 一定不會選這個機器為master,根據情況設定
[server3]
hostname=192.168.1.224
# port=3306 # port預設是3306,如果是其他的,需要在這裡指定,否則會報錯
candidate_master=1
複製程式碼
啟動MHA
MHA提供了指令碼測試服務是否能正常啟動
SSH檢查
masterha_check_ssh --conf=/etc/masterha/app1.cnf
複製程式碼
REPLICATION檢查
masterha_check_repl --conf=/etc/masterha/app1.cnf
複製程式碼
檢查全部OK的話就可以啟動服務了
nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /usr/local/masterha/manager.log &
複製程式碼
可以檢視程式
ps aux|grep masterha
複製程式碼
檢查master節點狀態
masterha_check_status --conf=/etc/masterha/app1.cnf
複製程式碼
啟動檢查中遇到的問題
User repl does not exist or does not have REPLICATION SLAVE privilege! Other slaves can not start replication from this host.
開始我們在做主從配置的時候,只在master節點建立了用於複製的賬號,現在slave節點也可能提升為master節點了,所以在slave節點上也要建立用於複製的賬號,賬號密碼要與master的相同
複製程式碼
Can't exec "mysqlbinlog": No such file or directory at /usr/share/perl5/MHA/BinlogManager.pm
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
複製程式碼
mysql: not found mysql command failed with rc 127:0
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
複製程式碼