Mha-Atlas-MySQL高可用方案實踐。
Mha-Atlas-MySQL高可用方案實踐(一)
Mha-Atlas-MySQL高可用方案實踐
一,mysql-mha環境準備
1.1 實驗環境:
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/
1.4 關閉selinux和iptables(三臺都需要關閉)
[[email protected]-db01 ~]# vim /etc/sysconfig/selinux
[[email protected]-db01 ~]# cat /etc/sysconfig/selinux | grep -v "#"
SELINUX=disabled
SELINUXTYPE=targeted
[[email protected]-db01 ~]# setenforce 0
[[email protected]-db01 ~]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[[email protected]-db01 ~]# chkconfig iptables off
二,簡介
2.1 作者簡介
姓名:鬆信嘉範
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工具包,具體的說明如下
#Manager工具包主要包括以下幾個工具
masterha_check_ssh #檢查MHA的SSH配置狀況
masterha_check_repl #檢查MySQL複製狀況
masterha_check_status #檢測當前MHA執行狀態
masterha_master_monitor #檢測master是否宕機
masterha_manger #啟動MHA
masterha_master_switch #控制故障轉移(自動或者手動)
masterha_conf_host #新增或刪除配置的server資訊
masterha_secondary_check #試圖建立TCP連線從遠端伺服器
masterha_stop #停止MHA
#Node工具包主要包括以下幾個工具
save_binary_logs #儲存和複製master的二進位制日誌
apply_diff_relay_logs #識別差異的中繼日誌事件
filter_mysqlbinlog #去除不必要的ROLLBACK事件
purge_relay_logs #清除中繼日誌
三,mysql環境準備
3.1 環境檢查
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
3.2.3 加入開機自啟動並啟動mysql
chkconfig mysqld on
chkconfig mysqld --list
/etc/init.d/mysqld start
3.2.4 配置密碼
mysqladmin -uroot password 'linyaonie'
四,配置基於GTID的主從複製
4.1 先決條件
- 主庫和從庫都要開啟binlog
- 主庫和從庫server-id不同
- 要有主從複製使用者
4.2 主庫操作(mysql-db01)
4.2.1 修改配置檔案
#修改主庫配置檔案/etc/my.cnf
[[email protected]-db01 mysql]# cat /etc/my.cnf
[client]
socket = /usr/local/mysql/data/mysql.sock
[mysqld]
lower_case_table_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
#重啟動MySQL服務
[[email protected]-db01 mysql]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
4.2.2 登陸MySQL刪除不必要的使用者並建立主從複製使用者
1)刪除不必要的使用者
mysql> select user,host from mysql.user;
+------+------------+
| user | host |
+------+------------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | mysql-db01 |
| root | mysql-db01 |
+------+------------+
6 rows in set (0.00 sec)
mysql> drop user [email protected]'127.0.0.1';
Query OK, 0 rows affected (0.00 sec)
mysql> drop user [email protected]'::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-db01';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from mysql.user;
+------+------------+
| user | host |
+------+------------+
| root | localhost |
| root | mysql-db01 |
+------+------------+
2 rows in set (0.00 sec)
2)建立主從複製使用者
mysql> grant replication slave on *.* to [email protected]'192.168.0.%' identified by '123123';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from mysql.user;
+------+-------------+
| user | host |
+------+-------------+
| rep | 192.168.0.% |
| root | localhost |
| root | mysql-db01 |
+------+-------------+
3 rows in set (0.00 sec)
mysql> show grants for [email protected]'192.168.0.%';
+--------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected].168.0.% |
+--------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.0.%' IDENTIFIED BY PASSWORD '*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1' |
+--------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
4.3 從庫操作(mysql-db02和mysql-db03)
4.3.1 修改配置檔案
#修改mysql-db02配置檔案(和mysql-db01配置檔案一致)
#只需要修改server-id = 5選項
[[email protected]-db02 ~]# cat /etc/my.cnf
[client]
socket = /usr/local/mysql/data/mysql.sock
[mysqld]
lower_case_table_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 = 5 #僅需修改此項
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
[[email protected]-db02 ~]# /etc/init.d/mysqld restart #重啟mysql
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
#修改mysql-db03配置檔案(和mysql-db01配置檔案一致)
#只需要修改server-id = 10選項
[[email protected]-db03 ~]# cat /etc/my.cnf
[client]
socket = /usr/local/mysql/data/mysql.sock
[mysqld]
lower_case_table_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 = 10 #只需修改此項
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
[[email protected]-db03 ~]# /etc/init.d/mysqld restart #重啟mysql
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
特別提示:
在以往如果是基於binlog日誌的主從複製,則必須要記住主庫的master狀態資訊。
但是在MySQL5.6版本里多了一個Gtid的功能,可以自動記錄主從複製位置點的資訊,並在日誌中輸出出來。
4.4 開啟GTID
#沒開啟之前先看一下GTID狀態
mysql> show global variables like '%gtid%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| enforce_gtid_consistency | OFF |
| gtid_executed | |
| gtid_mode | OFF |
| gtid_owned | |
| gtid_purged | |
+--------------------------+-------+
5 rows in set (0.00 sec)
編輯mysql配置檔案(主庫從庫都需要修改)
mysql-db01,mysql-db02,mysql-db03都需要加入上圖的上行程式碼
修改完配置檔案以後重啟動資料庫
[[email protected]-db01 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
[[email protected]-db02 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
[[email protected]-db03 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
再次檢視GTID狀態
[[email protected]-db01 ~]# mysql -uroot -p123123
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.17-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show global variables like '%gtid%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| enforce_gtid_consistency | ON | #執行GTID一致
| gtid_executed | |
| gtid_mode | ON | #開啟GTID模組
| gtid_owned | |
| gtid_purged | |
+--------------------------+-------+
5 rows in set (0.00 sec)
mysql>
再次提示:
主庫從庫都必須要開啟GTID,否則在做主從複製的時候就會報錯
4.5 配置主從複製(mysql-db02,mysql-db03)
mysql> change master to \
-> master_host='192.168.0.51',\ #主庫IP
-> master_user='rep',\ #主庫複製使用者
-> master_password='123123',\ #主庫複製用密碼
-> master_auto_position=1; #GTID位置點(自動追蹤需要同步的position)
Query OK, 0 rows affected, 2 warnings (