1. 程式人生 > >Mha-Atlas-MySQL高可用方案實踐。

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

Mha-Atlas-MySQL高可用方案實踐(一)

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

 

一,mysql-mha環境準備

 

1.1 實驗環境:

image_1ct28q0ae1gh81h7d189v1vtcllhm.png-22.1kB

image_1ct28qs2nvh91gjjq4c1c0k10u913.png-23.5kB

image_1ct28rl28ck58571ft7kpb1cpj20.png-24.9kB

 

1.2 軟體包

 

用到得所有包

連結:https://pan.baidu.com/s/19tiKXNEW4C6oWi9OFmcDYA 
提取碼:be07

 

1) mha管理節點安裝包:

mha4mysql-manager-0.56-0.el6.noarch.rpm 
mha4mysql-manager-0.56.tar.gz

 

2) mha node資料節點安裝包:

mha4mysql-node-0.56-0.el6.noarch.rpm 
mha4mysql-node-0.56.tar.gz

 

3) mysql中介軟體:

Atlas-2.2.1.el6.x86_64.rpm

 

4) mysql原始碼安裝包

mysql-5.6.17-linux-glibc2.5-x86_64.tar

 

1.3 主機名對映

echo "192.168.200.69 sl-Mysql-Mater" >> /etc/hosts

echo "192.168.200.79 sl-Mysql-Slave1" >> /etc/hosts

echo "192.168.200.80 sl-Mysql-Slave2" >> /etc/hosts

scp /etc/hosts [email protected]

:/etc/

scp /etc/hosts [email protected]:/etc/

image_1ct28li7d5a71e50o8751r1rgb9.png-114.1kB

 

1.4 關閉selinux和iptables(三臺都需要關閉)

 
  1. [[email protected]-db01 ~]# vim /etc/sysconfig/selinux
  2. [[email protected]-db01 ~]# cat /etc/sysconfig/selinux | grep -v "#"
  3. SELINUX=disabled
  4. SELINUXTYPE=targeted
  5. [[email protected]-db01 ~]# setenforce 0
  6. [[email protected]-db01 ~]# service iptables stop
  7. iptables: Setting chains to policy ACCEPT: filter [ OK ]
  8. iptables: Flushing firewall rules: [ OK ]
  9. iptables: Unloading modules: [ OK ]
  10. [[email protected]-db01 ~]# chkconfig iptables off

image_1ct294pdl8q01m7p188u1akkdip3d.png-13.3kB

 

二,簡介

 

2.1 作者簡介

image_1cr2c9hfkui813hgmi4122lce91m.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 工作流程

  • 從宕機崩潰的master儲存二進位制日誌事件(binlog events);
  • 識別含有最新更新的slave;
  • 應用差異的中繼日誌(relay log)到其他的slave;
  • 應用從master儲存的二進位制日誌事件(binlog events);
  • 提升一個slave為新的master;
  • 使其他的slave連線新的master進行復制;

1,複製主庫binlog日誌出來(因為還有沒來的及複製到從庫的二進位制日誌呢) 
2,找出relaylog日誌最全的從庫 (每個從庫複製的速度是有差異的) 
3,將最全的relaylog日誌在所有從庫中同步(第一次資料同步) 
4,將之前最全的那個從庫提升為主庫 
5,將複製出來的binlog日誌,放到新提升的主庫裡 
6,其他所有從庫重新指向新提升的主庫,繼續主從複製。

 

 

 

2.5 MHA工具介紹

MHA軟體由兩部分組成,Manager工具包和Node工具包,具體的說明如下

 
  1. #Manager工具包主要包括以下幾個工具
  2. masterha_check_ssh #檢查MHA的SSH配置狀況
  3. masterha_check_repl #檢查MySQL複製狀況
  4. masterha_check_status #檢測當前MHA執行狀態
  5. masterha_master_monitor #檢測master是否宕機
  6. masterha_manger #啟動MHA
  7. masterha_master_switch #控制故障轉移(自動或者手動)
  8. masterha_conf_host #新增或刪除配置的server資訊
  9. masterha_secondary_check #試圖建立TCP連線從遠端伺服器
  10. masterha_stop #停止MHA
  11. #Node工具包主要包括以下幾個工具
  12. save_binary_logs #儲存和複製master的二進位制日誌
  13. apply_diff_relay_logs #識別差異的中繼日誌事件
  14. filter_mysqlbinlog #去除不必要的ROLLBACK事件
  15. purge_relay_logs #清除中繼日誌
 

三,mysql環境準備

 

3.1 環境檢查

image_1ct2b2iptph11qd011a61a2p5qm3q.png-26.6kB

 

3.2 安裝mysql

 

3.2.1 安裝包準備

上方有所有軟體包得下載連結

 

3.2.2 安裝(3臺都裝)

yum -y install ncurses-devel 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/

which mysqladmin

image_1ct2beebco0pert1m15l5h1c547.png-19.2kB


image_1ct2biqtqlac152i1190ons15774k.png-99kB


image_1ct2bk0vk10k31rfe1ekph9j1o9v51.png-28.8kB

 

3.2.3 加入開機自啟動並啟動mysql

chkconfig mysqld on

chkconfig mysqld --list

/etc/init.d/mysqld start

image_1ct2bm65e1v1g1o0hr2ug81uc05e.png-22.8kB

 

3.2.4 配置密碼

mysqladmin -uroot password 'linyaonie'

image_1ct2bneml1245seeo0j16bo8jc5r.png-45.1kB

 

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

 

4.1 先決條件

  • 主庫和從庫都要開啟binlog
  • 主庫和從庫server-id不同
  • 要有主從複製使用者
 

4.2 主庫操作(mysql-db01)

 

4.2.1 修改配置檔案

 
  1. #修改主庫配置檔案/etc/my.cnf
  2. [[email protected]-db01 mysql]# cat /etc/my.cnf
  3. [client]
  4. socket = /usr/local/mysql/data/mysql.sock
  5. [mysqld]
  6. lower_case_table_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
  26. #重啟動MySQL服務
  27. [[email protected]-db01 mysql]# /etc/init.d/mysqld restart
  28. Shutting down MySQL.. SUCCESS!
  29. Starting MySQL. SUCCESS!
 

4.2.2 登陸MySQL刪除不必要的使用者並建立主從複製使用者

1)刪除不必要的使用者

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

2)建立主從複製使用者

 
  1. mysql> grant replication slave on *.* to [email protected]'192.168.0.%' identified by '123123';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> select user,host from mysql.user;
  4. +------+-------------+
  5. | user | host |
  6. +------+-------------+
  7. | rep | 192.168.0.% |
  8. | root | localhost |
  9. | root | mysql-db01 |
  10. +------+-------------+
  11. 3 rows in set (0.00 sec)
  12. mysql> show grants for [email protected]'192.168.0.%';
  13. +--------------------------------------------------------------------------------------------------------------------------+
  14. | Grants for [email protected].168.0.% |
  15. +--------------------------------------------------------------------------------------------------------------------------+
  16. | GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.0.%' IDENTIFIED BY PASSWORD '*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1' |
  17. +--------------------------------------------------------------------------------------------------------------------------+
  18. 1 row in set (0.00 sec)
 

4.3 從庫操作(mysql-db02和mysql-db03)

 

4.3.1 修改配置檔案

 
  1. #修改mysql-db02配置檔案(和mysql-db01配置檔案一致)
  2. #只需要修改server-id = 5選項
  3. [[email protected]-db02 ~]# cat /etc/my.cnf
  4. [client]
  5. socket = /usr/local/mysql/data/mysql.sock
  6. [mysqld]
  7. lower_case_table_names = 1
  8. default-storage-engine = InnoDB
  9. port = 3306
  10. datadir = /usr/local/mysql/data
  11. character-set-server = utf8
  12. socket = /usr/local/mysql/data/mysql.sock
  13. log_bin = mysql-bin #從binlog也要開啟
  14. server_id = 5 #僅需修改此項
  15. innodb_buffer_pool_size = 200M
  16. slave-parallel-workers = 8
  17. thread_cache_size = 600
  18. back_log = 600
  19. slave_net_timeout = 60
  20. max_binlog_size = 512M
  21. key_buffer_size = 8M
  22. query_cache_size = 64M
  23. join_buffer_size = 2M
  24. sort_buffer_size = 2M
  25. query_cache_type = 1
  26. thread_stack = 192K
  27. [[email protected]-db02 ~]# /etc/init.d/mysqld restart #重啟mysql
  28. Shutting down MySQL.. SUCCESS!
  29. Starting MySQL. SUCCESS!
  30. #修改mysql-db03配置檔案(和mysql-db01配置檔案一致)
  31. #只需要修改server-id = 10選項
  32. [[email protected]-db03 ~]# cat /etc/my.cnf
  33. [client]
  34. socket = /usr/local/mysql/data/mysql.sock
  35. [mysqld]
  36. lower_case_table_names = 1
  37. default-storage-engine = InnoDB
  38. port = 3306
  39. datadir = /usr/local/mysql/data
  40. character-set-server = utf8
  41. socket = /usr/local/mysql/data/mysql.sock
  42. log_bin = mysql-bin #從binlog也要開啟
  43. server_id = 10 #只需修改此項
  44. innodb_buffer_pool_size = 200M
  45. slave-parallel-workers = 8
  46. thread_cache_size = 600
  47. back_log = 600
  48. slave_net_timeout = 60
  49. max_binlog_size = 512M
  50. key_buffer_size = 8M
  51. query_cache_size = 64M
  52. join_buffer_size = 2M
  53. sort_buffer_size = 2M
  54. query_cache_type = 1
  55. thread_stack = 192K
  56. [[email protected]-db03 ~]# /etc/init.d/mysqld restart #重啟mysql
  57. Shutting down MySQL.. SUCCESS!
  58. Starting MySQL. SUCCESS!

特別提示: 
在以往如果是基於binlog日誌的主從複製,則必須要記住主庫的master狀態資訊。 
image_1cr2cmb0d1i5216r51o85vqk1qvv6j.png-17.6kB
但是在MySQL5.6版本里多了一個Gtid的功能,可以自動記錄主從複製位置點的資訊,並在日誌中輸出出來。

 

4.4 開啟GTID

 
  1. #沒開啟之前先看一下GTID狀態
  2. mysql> show global variables like '%gtid%';
  3. +--------------------------+-------+
  4. | Variable_name | Value |
  5. +--------------------------+-------+
  6. | enforce_gtid_consistency | OFF |
  7. | gtid_executed | |
  8. | gtid_mode | OFF |
  9. | gtid_owned | |
  10. | gtid_purged | |
  11. +--------------------------+-------+
  12. 5 rows in set (0.00 sec)

編輯mysql配置檔案(主庫從庫都需要修改)

image_1cr2cne5nbdg1k821beq1jspvvv70.png-64.7kB

mysql-db01,mysql-db02,mysql-db03都需要加入上圖的上行程式碼

修改完配置檔案以後重啟動資料庫

 
  1. [[email protected]-db01 ~]# /etc/init.d/mysqld restart
  2. Shutting down MySQL.. SUCCESS!
  3. Starting MySQL. SUCCESS!
  4. [[email protected]-db02 ~]# /etc/init.d/mysqld restart
  5. Shutting down MySQL.. SUCCESS!
  6. Starting MySQL. SUCCESS!
  7. [[email protected]-db03 ~]# /etc/init.d/mysqld restart
  8. Shutting down MySQL.. SUCCESS!
  9. Starting MySQL. SUCCESS!

再次檢視GTID狀態

 
  1. [[email protected]-db01 ~]# mysql -uroot -p123123
  2. Warning: Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 1
  5. Server version: 5.6.17-log MySQL Community Server (GPL)
  6. Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. mysql> show global variables like '%gtid%';
  12. +--------------------------+-------+
  13. | Variable_name | Value |
  14. +--------------------------+-------+
  15. | enforce_gtid_consistency | ON | #執行GTID一致
  16. | gtid_executed | |
  17. | gtid_mode | ON | #開啟GTID模組
  18. | gtid_owned | |
  19. | gtid_purged | |
  20. +--------------------------+-------+
  21. 5 rows in set (0.00 sec)
  22. mysql>

再次提示: 
主庫從庫都必須要開啟GTID,否則在做主從複製的時候就會報錯

 

4.5 配置主從複製(mysql-db02,mysql-db03)

 
  1. mysql> change master to \
  2. -> master_host='192.168.0.51',\ #主庫IP
  3. -> master_user='rep',\ #主庫複製使用者
  4. -> master_password='123123',\ #主庫複製用密碼
  5. -> master_auto_position=1; #GTID位置點(自動追蹤需要同步的position)
  6. Query OK, 0 rows affected, 2 warnings (