1) mha管理節點安裝包:php
mha4mysql-manager-0.56-0.el6.noarch.rpmnode
mha4mysql-manager-0.56.tar.gzmysql
2) mha node節點安裝包:linux
mha4mysql-node-0.56-0.el6.noarch.rpmsql
mha4mysql-node-0.56.tar.gz數據庫
3) mysql中間件:vim
Atlas-2.2.1.el6.x86_64.rpm服務器
4) mysql源碼安裝包微信
mysql-5.6.17-linux-glibc2.5-x86_64.tar網絡
姓名:鬆信嘉範
MySQL/Linux專家
2001年索尼公司入職
2001年開始使用oracle
2004年開始使用MySQL
2006年9月-2010年8月MySQL從事顧問
2010年-2012年DeNA
2012年至今Facebook
一、MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,是一套優秀的做爲MySQL高可用性環境下故障切換和主從提高的高可用軟件。在MySQL故障切換過程當中,MHA能作到0~30秒以內自動完成數據庫的故障切換操做,而且在進行故障切換過程當中,MHA能最大程度上保證數據庫的一致性,以達到真正意義上的高可用。
二、MHA由兩部分組成:MHA Manager(管理節點)和MHA Node(數據節點)。MHA Manager能夠獨立部署在一臺獨立的機器上管理多個Master-Slave集羣,也能夠部署在一臺Slave上。當Master出現故障時,它能夠自動將最新數據的Slave提高爲新的Master,而後將全部其餘的Slave從新指向新的Master。整個故障轉移過程對應程序是徹底透明的。
一、複製主庫binlog日誌出來
二、找出relaylog日誌最全的從庫
三、將最全的relaylog日誌在全部從庫中同步(第一次數據同步)
四、將以前最全的那個從庫提高爲主庫
五、將複製出來的binlog日誌放到新提高爲主庫的從庫裏面
六、其餘全部從庫從新指向新提高主庫,繼續主從複製
MHA軟件由兩部分組成,Manager工具包和Node工具包,具體的說明以下:
連接:https://pan.baidu.com/s/1aSh6hKFDcA6VAsXicbTSSQ
提取碼:2ynt
yum -y install ncurses-devel
yum -y install libaio
tar xf mysql-5.6.17-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/mysql-5.6.17-linux-glibc2.5-x86_64 /usr/local/mysql
useradd mysql -s /sbin/nologin -M
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
/bin/cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
/bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
ln -s /usr/local/mysql/bin/* /usr/local/bin/
mysqladmin -uroot password '123123'
主庫和從庫都要開啓binlog
主庫和從庫server-id不一樣
要有主從複製用戶
[root@MySQL-Master ~]# vim /etc/my.cnf
[root@MySQL-Master ~]# cat /etc/my.cnf
[client]
socket = /usr/local/mysqld/data/mysql.sock
[mysqld]
lower_case_tabel_names = 1
default-storage-engine = InnoDB
port = 3306
datadir = /usr/local/mysql/data
character-set-server = utf8
socket = /usr/local/mysql/data/mysql.sock
log_bin = mysql-bin #開啓binlog日誌
server_id = 1 #設置server_id
innodb_buffer_pool_size = 200M
slave-parallel-workers = 8
thread_cache_size = 600
back_log = 600
slave_net_timeout = 60
max_binlog_size = 512M
key_buffer_size = 8M
query_cache_size = 64M
join_buffer_size = 2M
sort_buffer_size = 2M
query_cache_type = 1
thread_stack = 192K
(1)刪除沒必要要的用戶
mysql>
mysql> select user,host from mysql.user;
+------+--------------+
| user | host |
+------+--------------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | mysql-master |
| root | mysql-master |
+------+--------------+
6 rows in set (0.10 sec)
mysql> drop user root@'127.0.0.1';
Query OK, 0 rows affected (0.00 sec)
mysql> drop user root@'::1';
Query OK, 0 rows affected (0.00 sec)
mysql> drop user ' '@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> drop user ' '@'mysql-master';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from mysql.user;
+------+--------------+
| user | host |
+------+--------------+
| root | localhost |
| root | mysql-master |
+------+--------------+
2 rows in set (0.00 sec)
(2)建立主從複製用戶
MySQL-SlaveA
MySQL-SlaveB
特別提示: 在以往若是是基於binlog日誌的主從複製,則必需要記住主庫的master狀態信息。
可是在MySQL5.6版本里多了一個Gtid的功能,能夠自動記錄主從複製位置點的信息,並在日誌中輸出出來。
編輯mysql配置文件(主庫從庫都須要修改)
三臺機器都須要加上上圖標註的三行代碼
修改完配置文件之後重啓動數據庫
/etc/init.d/mysqld restart
再次查看GTID狀態
再次提示:
主庫從庫都必需要開啓GTID,不然在作主從複製的時候就會報錯.
mysql>start slave; 開啓主從複製
兩個從庫MySQL-SlaveA和MySQL-SlaveB都執行以上步驟。
MySQL主從複製,啓動slave時,出現下面報錯:
mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
解決辦法:
一、GTID(Global Transaction)全局事務標識符:是一個惟一的標識符,它建立並與源服務器(主)上提交的每一個事務相關聯。此標識符不只對其發起的服務器是惟一的,並且在給定複製設置中的全部服務器上都是惟一的。全部交易和全部GTID之間都有1對1的映射。
二、GTID其實是由UUID+TID組成的。其中UUID是一個MySQL實例的惟一標識。TID表明了該實例上已經提交的事務數量,而且隨着事務提交單調遞增。
下面是一個GTID的具體形式:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
(1)支持多線程複製:事實上是針對每一個database開啓相應的獨立線程,即每一個庫有一個單獨的(sql thread)
(2)支持啓用GTID,在配置主從複製,傳統的方式裏,你須要找到binlog和POS點,而後change master to 指向。在mysql5.6裏,無須再知道binlog和POS點,只須要知道master的IP/端口/帳號密碼便可,由於同步複製是自動的,MySQL經過內部機制GTID自動找點同步。
(3)基於Row複製只保存改變的列,大大節省磁盤空間,網絡,內存等
(4)支持把Master和Slave的相關信息記錄在Table中;原來是記錄在文件裏,如今則記錄在表裏,加強可用性
(5)支持延遲複製
#mysql配置文件:
[mysqld]
gtid_mode=ON
enforce_gtid_consistency
#查看
show global variables like ‘%gtid%’;
編輯配置文件/etc/my.cnf
修改完畢後重啓mysql服務:/etc/init.d/mysqld restart
mha4mysql-node-0.56-0.el6.noarch.rpm如下連接提取
連接:https://pan.baidu.com/s/1S9FDyBjxEBXBF00aAFK4pw
提取碼:opja
光盤安裝依賴包 yum -y install perl-DBD-MySQL
安裝mha4mysql-node-0.56-0.el6.noarch.rpm
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
#使用阿里雲源+epel源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
wget -O /etc/yum.repos.d/epel-6.repo http://mirrors.aliyun.com/repo/epel-6.repo
#安裝manager依賴包(須要公網源)
yum -y install perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
#安裝manager包
[root@MySQL-SlaveB rpm]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
Preparing... ########################################### [100%]
1:mha4mysql-manager ########################################### [100%]
#建立配置文件目錄
mkdir -p /etc/mha
#建立日誌目錄
mkdir -p /var/log/mha/mha1
#建立配置文件(默認沒有)
[root@MySQL-SlaveB ~]# cd /etc/mha/
[root@MySQL-SlaveB mha]# ls
[root@MySQL-SlaveB mha]# vim /etc/mha/mha1.cnf
[root@MySQL-SlaveB mha]# cat /etc/mha/mha1.cnf
[server default]
manager_log=/var/log/mha/mha1/manager #manager管理日誌存放路徑
manager_workdir=/var/log/mha/mha1 #manager管理日誌的目錄路徑
master_binlog_dir=/usr/local/mysql/data #binlog日誌的存放路徑
user=mha #管理帳戶
password=123123 #管理帳戶密碼
ping_interval=2 #存活檢查的間隔時間
repl_user=rep #主從複製的受權帳戶
repl_password=123123 #主從複製的受權帳戶密碼
ssh_user=root #用於ssh鏈接的帳戶
[server1]
hostname=192.168.200.159
port=3306
[server2]
#candidate_master=1 #此條暫時註釋掉(後面解釋)
#check_repl_delay=0 #此條暫時註釋掉(後面解釋)
hostname=192.168.200.161
port=3306
[server3]
hostname=192.168.200.160
port=3306
#**特別提示:**
#以上配置文件內容裏每行的最後不要留有空格,所以,不能複製的呦
特別說明:
參數:candidate_master=1
解釋:設置爲候選master,若是設置該參數之後,發生主從切換之後會將此從庫提高爲主庫,即便這個主庫不是集羣中事件最新的slave
參數:check_repl_delay=0
解釋:默認狀況下若是一個slave落後master 100M的relay logs 的話,MHA將不會選擇該slave做爲一個新的master,由於對於這個slave的恢復須要花費很長時間,經過設置check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略複製延時,這個參數對於設置了candidate_master=1的主機很是有用,由於這個候選主在切換的過程當中必定是新的master
#建立密鑰對
[root@MySQL-SlaveB ~]# ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa >/dev/null 2>&1
#發送MySQL-SlaveB公鑰,包括本身
[root@MySQL-SlaveB ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.159
[root@MySQL-SlaveB ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.161
[root@MySQL-SlaveB ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.160
#發送MySQL-SlaveA公鑰,包括本身
[root@MySQL-SlaveA ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.159
[root@MySQL-SlaveA ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.161
[root@MySQL-SlaveA ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.160
#發送MySQL-Master公鑰,包括本身
[root@MySQL-Master ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.159
[root@MySQL-Master ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.160
[root@MySQL-Master ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.161
[root@MySQL-SlaveB ~]# masterha_check_ssh --conf=/etc/mha/mha1.cnf #ssh檢查命令
[root@MySQL-SlaveB ~]# masterha_check_repl --conf=/etc/mha/mha1.cnf
(1)錯誤的主從複製檢測
所以在MySQL-SlaveA和MySQL-SlaveB上添加主從複製的用戶便可。
grant replication slave on . to rep@'192.168.200.%' identified by '123123';
[root@mysql-slaveB ~]# nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &
[1] 3408
[root@mysql-slaveB ~]# ps -ef | grep perl | grep -v grep
root 3408 1272 1 03:03 pts/0 00:00:00 perl /usr/bin/masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover
初始狀態:
(1)登錄mysql-db02(192.168.0.53)查看信息狀態
(2)停掉mysql-db01(192.168.0.51)上的MySQL服務
[root@MySQL-Master ~]# /etc/init.d/mysqld stop
Shutting down MySQL..... SUCCESS!
(3)查看slaveB上的MySQL從庫同步狀態
(4)查看mysql-db02上的MySQL,主庫同步狀態。
(5)查看mysql-db03上的mha進程狀態
(6)查看mha配置文件信息
說明:
看成爲主庫的mysql-db01上的MySQL宕機之後,mha經過檢測發現mysql-db01宕機,那麼會將binlog日誌最全的從庫馬上提高爲主庫,而其餘的從庫會指向新的主庫進行再次同步。
查詢mha日誌路徑 /var/log/mha/mha1/manager
因爲mysql-Master的MySQL服務宕機,所以mha將mysql-SlaveA提高爲了主庫。所以,咱們須要將宕機的mysql-Master的MySQL服務啓動,而後做爲主庫mysql-SlaveA的從庫。
初始狀態:
(1)將故障宕機的mysql-Master的MySQL服務啓動並受權進行從同步
/etc/init.d/mysqld start #啓動Master的MySQL服務
#進入mysql受權進行從同步
mysql> CHANGE MASTER TO MASTER_HOST='192.168.200.161', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123123';
(2)將mha配置文件裏缺失的部分補全
(3)啓動mha進程
注:若是發現從庫沒有mha帳戶須要將主庫的mha帳戶刪除後重新受權一個,這樣從庫就自動複製過來了。通常狀況下不會這樣,我可能出現bug了!!!
(4)停掉mysql-slaveA上的MySQL服務
(5)查看mysql-slaveB上的主從同步狀態:
(6)啓動mysql-slaveA上的MySQL服務
[root@MySQL-SlaveA ~]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS!
[root@MySQL-SlaveA ~]# mysql -uroot -p123123
mysql> CHANGE MASTER TO MASTER_HOST='192.168.200.159', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123123';
mysql> start slave;
mysql> show slave status\G
(7)再次補全mha配置文件後,啓動mha進程
注:此次上述沒有自動複製mha帳戶的問題沒有發生,可能真的遇到了bug!!!
綜上實驗,當slaveB新加了參數驗證,主庫再次宕機的話,新的主庫變成了本身。