Mha-Atlas-MySQL高可用方案實踐

一,mysql-mha環境準備

 

1.1 實驗環境:

image_1cu39f2n51q18aved13190gop.png-33.9kB

 

1.2 軟件包

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網絡

 

1.3 主機名映射

image_1cu39iv37sh4l561olq19d31v391m.png-27.3kB

 

1.4 關閉selinux和iptables

image_1cu39p4l71f2vbht1g081km3a923.png-18.7kB
image_1cu39q9icgi31pci1qb31o0vjfl2g.png-32.9kB

 

二,簡介

 

2.1 做者簡介

image_1cu39ra2b16r81a05al1vlv1tms2t.png-70.4kB 
姓名:鬆信嘉範 
MySQL/Linux專家 
2001年索尼公司入職 
2001年開始使用oracle 
2004年開始使用MySQL 
2006年9月-2010年8月MySQL從事顧問 
2010年-2012年DeNA 
2012年至今Facebook

 

2.2 軟件簡介

一、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。整個故障轉移過程對應程序是徹底透明的。

 

2.3 工做流程

一、複製主庫binlog日誌出來 
二、找出relaylog日誌最全的從庫 
三、將最全的relaylog日誌在全部從庫中同步(第一次數據同步) 
四、將以前最全的那個從庫提高爲主庫 
五、將複製出來的binlog日誌放到新提高爲主庫的從庫裏面 
六、其餘全部從庫從新指向新提高主庫,繼續主從複製

image_1cu3a0ro114q112m4o5r1m473ku3q.png-23.5kB

 

2.4 MHA架構圖

InkedQQ截圖20170903190825_LI.jpg-684kB

 

2.5 MHA工具介紹

MHA軟件由兩部分組成,Manager工具包和Node工具包,具體的說明以下: 
image_1cu3a68a61e661kqt1e9opl39bd4j.png-45.1kB

 

三,mysql環境準備

 

3.1 環境檢查

微信圖片_20181207111205.png-34.9kB

 

3.2 安裝mysql

 

3.2.1 安裝包準備

連接:https://pan.baidu.com/s/1aSh6hKFDcA6VAsXicbTSSQ 
提取碼:2ynt

image_1cu3ap81d1tbffnq1bnhqae2gj7v.png-22.2kB

 

3.2.2 安裝(3臺都裝)

 
  1. yum -y install ncurses-devel
  2. yum -y install libaio
  3. tar xf mysql-5.6.17-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
  4. ln -s /usr/local/mysql-5.6.17-linux-glibc2.5-x86_64 /usr/local/mysql
  5. useradd mysql -s /sbin/nologin -M
  6. /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
  7. /bin/cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
  8. /bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
  9. ln -s /usr/local/mysql/bin/* /usr/local/bin/
 

3.2.3 加入開機自啓動並啓動mysql (3臺都加)

image_1cu3avvaen2i134314gt8sc1diq8c.png-29.1kB

 

3.2.4 配置密碼 (3臺都配)

 
  1. mysqladmin -uroot password '123123'
 

四,配置基於GTID的主從複製

 

4.1 先決條件

主庫和從庫都要開啓binlog 
主庫和從庫server-id不一樣 
要有主從複製用戶

 

4.2 主庫操做(MySQL-Master)

 

4.2.1 修改配置文件

 
  1. [root@MySQL-Master ~]# vim /etc/my.cnf
  2. [root@MySQL-Master ~]# cat /etc/my.cnf
  3. [client]
  4. socket = /usr/local/mysqld/data/mysql.sock
  5. [mysqld]
  6. lower_case_tabel_names = 1
  7. default-storage-engine = InnoDB
  8. port = 3306
  9. datadir = /usr/local/mysql/data
  10. character-set-server = utf8
  11. socket = /usr/local/mysql/data/mysql.sock
  12. log_bin = mysql-bin #開啓binlog日誌
  13. server_id = 1 #設置server_id
  14. innodb_buffer_pool_size = 200M
  15. slave-parallel-workers = 8
  16. thread_cache_size = 600
  17. back_log = 600
  18. slave_net_timeout = 60
  19. max_binlog_size = 512M
  20. key_buffer_size = 8M
  21. query_cache_size = 64M
  22. join_buffer_size = 2M
  23. sort_buffer_size = 2M
  24. query_cache_type = 1
  25. thread_stack = 192K

image_1cu3c0cravl41ga01sm4oug1ha99.png-20.1kB

 

4.2.2 登錄MySQL刪除沒必要要的用戶並建立主從複製用戶

(1)刪除沒必要要的用戶

 
  1. mysql>
  2. mysql> select user,host from mysql.user;
  3. +------+--------------+
  4. | user | host |
  5. +------+--------------+
  6. | root | 127.0.0.1 |
  7. | root | ::1 |
  8. | | localhost |
  9. | root | localhost |
  10. | | mysql-master |
  11. | root | mysql-master |
  12. +------+--------------+
  13. 6 rows in set (0.10 sec)
  14. mysql> drop user root@'127.0.0.1';
  15. Query OK, 0 rows affected (0.00 sec)
  16. mysql> drop user root@'::1';
  17. Query OK, 0 rows affected (0.00 sec)
  18. mysql> drop user ' '@'localhost';
  19. Query OK, 0 rows affected (0.00 sec)
  20. mysql> drop user ' '@'mysql-master';
  21. Query OK, 0 rows affected (0.00 sec)
  22. mysql> select user,host from mysql.user;
  23. +------+--------------+
  24. | user | host |
  25. +------+--------------+
  26. | root | localhost |
  27. | root | mysql-master |
  28. +------+--------------+
  29. 2 rows in set (0.00 sec)

(2)建立主從複製用戶

image_1cu3ir7mp1nia9m7k59btn186j9.png-25.7kB

image_1cu3iscpt1pmjep01bde12rmo3sm.png-32.6kB

 

4.3 從庫操做(MySQL-SlaveA和MySQL-SlaveB)

 

4.3.1 修改配置文件

MySQL-SlaveA 
image_1cu3cm8ef1cmm1m3q1m0c17p3t78aj.png-66.5kB 
image_1cu3cpf9g1aqd6841mpjh0kt2b0.png-24.7kB

MySQL-SlaveB 
image_1cu3ct38o3k0m6j1o56ihg116rbt.png-71.1kB 
image_1cu3cv6fn8aba241rj01vm0vk1ct.png-26.9kB

特別提示: 在以往若是是基於binlog日誌的主從複製,則必需要記住主庫的master狀態信息。

image_1cu3g3100jseo1g12k2s6064rf7.png-27.1kB

可是在MySQL5.6版本里多了一個Gtid的功能,能夠自動記錄主從複製位置點的信息,並在日誌中輸出出來。

 

4.4 開啓GTID

image_1cu3g5mfr1p0r1i82act1m3h9tfk.png-30kB

編輯mysql配置文件(主庫從庫都須要修改)

image_1cu3ggdlshen1p631trd191j1gvsge.png-78.5kB

三臺機器都須要加上上圖標註的三行代碼

修改完配置文件之後重啓動數據庫

 
  1. /etc/init.d/mysqld restart

再次查看GTID狀態 
image_1cu3gm8jefta1nv6s64141vl0ngr.png-31.2kB

再次提示: 
主庫從庫都必需要開啓GTID,不然在作主從複製的時候就會報錯.

 

4.5 配置主從複製(MySQL-SlaveA,MySQL-SlaveB)

image_1cu3h4guc3av1mdf1bac1g7oc5bh8.png-30.5kB

image_1cu3h86501vjnb77dismn8mohl.png-24.3kB

 

4.6 開啓從庫的主從複製功能(MySQL-SlaveA,MySQL-SlaveB)

 
  1. mysql>start slave; 開啓主從複製

image_1cu3j0bf2jpqn8o2ueed1vko13.png-87.4kB

image_1cu3j3qsc1gb01mosid86761aon1g.png-88.6kB

兩個從庫MySQL-SlaveA和MySQL-SlaveB都執行以上步驟。

MySQL主從複製,啓動slave時,出現下面報錯: 
mysql> start slave; 
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

解決辦法:

微信圖片_20181207173111.png-20.5kB

 

4.7 什麼是GTID

一、GTID(Global Transaction)全局事務標識符:是一個惟一的標識符,它建立並與源服務器(主)上提交的每一個事務相關聯。此標識符不只對其發起的服務器是惟一的,並且在給定複製設置中的全部服務器上都是惟一的。全部交易和全部GTID之間都有1對1的映射。

二、GTID其實是由UUID+TID組成的。其中UUID是一個MySQL實例的惟一標識。TID表明了該實例上已經提交的事務數量,而且隨着事務提交單調遞增。 
下面是一個GTID的具體形式:

3E11FA47-71CA-11E1-9E33-C80AA9429562:23
 

4.8 GTID的新特性

(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)支持延遲複製

 

4.9 開啓方法

 
  1. #mysql配置文件:
  2. [mysqld]
  3. gtid_mode=ON
  4. enforce_gtid_consistency
  5. #查看
  6. show global variables like ‘%gtid%’;
 

4.10 從庫設置(MySQL-SlaveA,MySQL-SlaveB)

image_1cu3jhj0p18tu11rhhcqabfemo1t.png-24.9kB

image_1cu3jjl6cgna2731tfi8mq7u42a.png-19.7kB

編輯配置文件/etc/my.cnf

image_1cu3jt5ns25f1lho197016ct76i2n.png-86kB

image_1cu3jv76d8cc1dv3p9hmgjg134.png-39.1kB

修改完畢後重啓mysql服務:/etc/init.d/mysqld restart

 

五,部署MHA

 

5.1 環境準備(全部節點MySQL-Master,MySQL-SlaveA,MySQL-SlaveB)

mha4mysql-node-0.56-0.el6.noarch.rpm如下連接提取 
連接:https://pan.baidu.com/s/1S9FDyBjxEBXBF00aAFK4pw 
提取碼:opja

 
  1. 光盤安裝依賴包 yum -y install perl-DBD-MySQL
  2. 安裝mha4mysql-node-0.56-0.el6.noarch.rpm
  3. rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

image_1cu3lfr408mt18211sfi15404cg4h.png-40.9kB

image_1cu3ljqg31ft0t3j1c126l51gar5e.png-21.8kB

 

5.2 部署管理節點(mha-manager)

 

5.2.1 在MySQL-SlaveB上部署管理節點

 
  1. #使用阿里雲源+epel源
  2. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
  3. wget -O /etc/yum.repos.d/epel-6.repo http://mirrors.aliyun.com/repo/epel-6.repo
  4. #安裝manager依賴包(須要公網源)
  5. yum -y install perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
  6. #安裝manager包
  7. [root@MySQL-SlaveB rpm]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
  8. Preparing... ########################################### [100%]
  9. 1:mha4mysql-manager ########################################### [100%]
 

5.2.2 編輯配置文件

 
  1. #建立配置文件目錄
  2. mkdir -p /etc/mha
  3. #建立日誌目錄
  4. mkdir -p /var/log/mha/mha1
  5. #建立配置文件(默認沒有)
  6. [root@MySQL-SlaveB ~]# cd /etc/mha/
  7. [root@MySQL-SlaveB mha]# ls
  8. [root@MySQL-SlaveB mha]# vim /etc/mha/mha1.cnf
  9. [root@MySQL-SlaveB mha]# cat /etc/mha/mha1.cnf
  10. [server default]
  11. manager_log=/var/log/mha/mha1/manager #manager管理日誌存放路徑
  12. manager_workdir=/var/log/mha/mha1 #manager管理日誌的目錄路徑
  13. master_binlog_dir=/usr/local/mysql/data #binlog日誌的存放路徑
  14. user=mha #管理帳戶
  15. password=123123 #管理帳戶密碼
  16. ping_interval=2 #存活檢查的間隔時間
  17. repl_user=rep #主從複製的受權帳戶
  18. repl_password=123123 #主從複製的受權帳戶密碼
  19. ssh_user=root #用於ssh鏈接的帳戶
  20. [server1]
  21. hostname=192.168.200.159
  22. port=3306
  23. [server2]
  24. #candidate_master=1 #此條暫時註釋掉(後面解釋)
  25. #check_repl_delay=0 #此條暫時註釋掉(後面解釋)
  26. hostname=192.168.200.161
  27. port=3306
  28. [server3]
  29. hostname=192.168.200.160
  30. port=3306
  31. #**特別提示:**
  32. #以上配置文件內容裏每行的最後不要留有空格,所以,不能複製的呦

特別說明: 
參數: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

 

5.3 配置ssh信任(全部節點mysql-db01,mysql-db02,mysql-db03)

 
  1. #建立密鑰對
  2. [root@MySQL-SlaveB ~]# ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa >/dev/null 2>&1
  3. #發送MySQL-SlaveB公鑰,包括本身
  4. [root@MySQL-SlaveB ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.159
  5. [root@MySQL-SlaveB ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.161
  6. [root@MySQL-SlaveB ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.160
  7. #發送MySQL-SlaveA公鑰,包括本身
  8. [root@MySQL-SlaveA ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.159
  9. [root@MySQL-SlaveA ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.161
  10. [root@MySQL-SlaveA ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.160
  11. #發送MySQL-Master公鑰,包括本身
  12. [root@MySQL-Master ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.159
  13. [root@MySQL-Master ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.160
  14. [root@MySQL-Master ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.200.161
 

5.4 啓動測試

 

5.4.1 ssh檢查檢測

 
  1. [root@MySQL-SlaveB ~]# masterha_check_ssh --conf=/etc/mha/mha1.cnf #ssh檢查命令

微信圖片_20181207145748.png-37.3kB

 

5.4.2 主從複製檢測

[root@MySQL-SlaveB ~]# masterha_check_repl --conf=/etc/mha/mha1.cnf

(1)錯誤的主從複製檢測

image_1cu3nhpt9vbr1at01pti1c111svb7s.png-61.3kB

所以在MySQL-SlaveA和MySQL-SlaveB上添加主從複製的用戶便可。 
grant replication slave on . to rep@'192.168.200.%' identified by '123123';

image_1cu45ad2j10m2gs21cek1egn1dps1h.png-39.7kB

 

5.5 啓動MHA

 
  1. [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 &
  2. [1] 3408
  3. [root@mysql-slaveB ~]# ps -ef | grep perl | grep -v grep
  4. 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

image_1cu45dem0cv5pcl1e5r17ic1vrp1u.png-54.2kB

 

5.6 進行mha自動切換master的測試

初始狀態: 
image_1cu46e88s14ltc01jaue9r1sep2b.png-15.9kB

(1)登錄mysql-db02(192.168.0.53)查看信息狀態 
image_1cu46rg6c1rd518oj11ca144m13sv2o.png-52.9kB

(2)停掉mysql-db01(192.168.0.51)上的MySQL服務

 
  1. [root@MySQL-Master ~]# /etc/init.d/mysqld stop
  2. Shutting down MySQL..... SUCCESS!

image_1cu46ubao5uchoj1gll10e11f3u35.png-15.3kB

(3)查看slaveB上的MySQL從庫同步狀態

image_1cu4799kbd06jo1revtncaa74f.png-61.5kB

(4)查看mysql-db02上的MySQL,主庫同步狀態。

image_1cu47bdbrrqq14u3d6quiik1k4s.png-34.3kB

(5)查看mysql-db03上的mha進程狀態

image_1cu47cv4hccq120v17n1kcl1jb259.png-15.9kB

(6)查看mha配置文件信息

image_1cu47gdcf1k7j1869heq1iv78775m.png-49.1kB

說明: 
看成爲主庫的mysql-db01上的MySQL宕機之後,mha經過檢測發現mysql-db01宕機,那麼會將binlog日誌最全的從庫馬上提高爲主庫,而其餘的從庫會指向新的主庫進行再次同步。

查詢mha日誌路徑 /var/log/mha/mha1/manager

image_1cu47spk91771mfclkg1s8a1b4963.png-59.7kB

 

5.7 進行mha的故障還原測試

因爲mysql-Master的MySQL服務宕機,所以mha將mysql-SlaveA提高爲了主庫。所以,咱們須要將宕機的mysql-Master的MySQL服務啓動,而後做爲主庫mysql-SlaveA的從庫。

初始狀態: 
image_1cu47vubu1kp8ah31pp11a1itrv6g.png-15.4kB

(1)將故障宕機的mysql-Master的MySQL服務啓動並受權進行從同步

 
  1. /etc/init.d/mysqld start #啓動Master的MySQL服務
  2. #進入mysql受權進行從同步
  3. mysql> CHANGE MASTER TO MASTER_HOST='192.168.200.161', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123123';

image_1cu48bvbj1v0rst1g6hhpq1avn6t.png-56.5kB

(2)將mha配置文件裏缺失的部分補全

image_1cu48igmo1a4ok2ev619nbgjp7a.png-44kB

(3)啓動mha進程

image_1cu4b30vg1laena71e9g4lnhsk7n.png-65.9kB

注:若是發現從庫沒有mha帳戶須要將主庫的mha帳戶刪除後重新受權一個,這樣從庫就自動複製過來了。通常狀況下不會這樣,我可能出現bug了!!!

(4)停掉mysql-slaveA上的MySQL服務

image_1cu4b8osk1q6tf0ble1gph162i84.png-15.2kB

(5)查看mysql-slaveB上的主從同步狀態:

image_1cu4bb05e7ik4vl16cter0cvh8h.png-54.4kB

(6)啓動mysql-slaveA上的MySQL服務

 
  1. [root@MySQL-SlaveA ~]# /etc/init.d/mysqld start
  2. Starting MySQL.. SUCCESS!
  3. [root@MySQL-SlaveA ~]# mysql -uroot -p123123
  4. mysql> CHANGE MASTER TO MASTER_HOST='192.168.200.159', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123123';
  5. mysql> start slave;
  6. mysql> show slave status\G

image_1cu4bhj9d1f321v8n111317la4uk8u.png-79.2kB

(7)再次補全mha配置文件後,啓動mha進程

image_1cu4bld9a2b413igjr3ldhjf59b.png-47.5kB
注:此次上述沒有自動複製mha帳戶的問題沒有發生,可能真的遇到了bug!!!

六,MHA參數驗證明踐

image_1cu4bpl9f9nl6341ndfq2kjs3a5.png-41.4kB

image_1cu4c066qtrrjmn4df12731q36ai.png-55.3kB

 

測試

image_1cu4c3a3nvt9o661n1i1ak81ubhav.png-15.7kB

image_1cu4c5s3n1ij3i281tktfu61jncbc.png-18.2kB

image_1cu4c8l8u12pdkaf1c1se161d6fbp.png-50.6kB

綜上實驗,當slaveB新加了參數驗證,主庫再次宕機的話,新的主庫變成了本身。

相關文章
相關標籤/搜索