基於MHA和Galera Cluster實現MySQL高可用

MHA:Master HA;是一款開源的MySQL的高可用程序,它爲MySQL主從複製架構提供了automating  master  failover功能。MHA在監控到master節點故障時,會將擁有最新數據的slave節點升爲新的master節點,在此期間,MHA會通過於slave節點獲取額外信息來避免一致性方面的問題。MHA還提供了master節點在線切換功能,即按需切換master/slave節點

  MHA服務有兩種角色:管理節點(MHA Manager)和數據節點(MHA Node)

    MHA Manager:通常單獨部署在一臺獨立服務器上管理多個master/slave集羣,每個master/slave集羣稱爲一個application

    MHA Node:運行在每臺MySQL服務器上(master/slave/manager),他通過監控具備解析和清理logs功能的腳本來加快故障轉移



Galera Cluster

  基於wsrep協議在全局實現複製,任何一節點都可實現讀寫操作,無延遲複製,不會產生數據丟失,當某臺服務器宕機後,備用服務器會自動接管。



一、基於Galera  Cluster實現MySQL高可用

準備環境:CentOS  7

節點1
IP:172.18.42.200
節點2
IP:172.18.42.201
節點3
IP:172.18.42.202


1、部署節點1

(1)安裝Galera服務

[root@node0 ~]# yum install MariaDB-Galera-server -y

(2)編輯其配置文件

[root@node0 ~]# rpm -ql galera  ##查看相關文件
/usr/lib64/galera/libgalera_smm.so    
[root@node0 ~]# vim /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings   ##強制設置
wsrep_provider=/usr/lib64/galera/libgalera_smm.so  ##wsrep的提供者,一般是一個插件,不同的安裝版本有可能不一樣  
wsrep_cluster_address="gcomm://172.18.42.200, 172.18.42.201, 172.18.42.202"   ##指明Galera-Cluster的各個節點
binlog_format=row   ##二進制日誌格式,默認是row格式,不建議更改
default_storage_engine=InnoDB   ##指明使用的引擎
innodb_autoinc_lock_mode=2    ##鎖格式
bind-address=0.0.0.0   ##wsrep在工作時監聽的地址
wsrep_cluster_name='mycluster'   ##指明Galera集羣的名稱

(3)首次啓動時,需要初始化集羣

[root@node0 ~]# /etc/rc.d/init.d/mysql start --wsrep-new-cluster   ##在某一個節點上啓動mysql服務


2、部署節點2

(1)安裝MariaDB-Galera-server服務

[root@node0 ~]# yum install MariaDB-Galera-server -y

(2)啓動服務

[root@node2 ~]# service mysql start
Starting MySQL....SST in progress, setting sleep higher. SUCCESS!


3、部署節點3

(1)安裝MariaDB-Galera-server服務

[root@node0 ~]# yum install MariaDB-Galera-server -y

(2)啓動服務

[root@node2 ~]# service mysql start
Starting MySQL....SST in progress, setting sleep higher. SUCCESS!


4、三個節點都連接mysql服務,隨後創建一個數據庫,查看其它兩個節點是否複製

[root@node0 ~]# mysql    ##節點1連接mysql服務
MariaDB [(none)]> create database MaGeRepo;   ##在節點1上創建數據庫“MaGeRepo”,並查看
MariaDB [(none)]> show databases;
+--------------------+
| Database           
+--------------------+
| information_schema 
| MaGeRepo           
| mysql              
| performance_schema 
| test               
+--------------------+
[root@node1 ~]# mysql   ##節點2連接至mysql服務
MariaDB [(none)]> show databases;   ##查看數據庫
+--------------------+
| Database           
+--------------------+
| information_schema 
| MaGeRepo           
| mysql              
| performance_schema 
| test               
+--------------------+
[root@node2 ~]# mysql   ##節點3連接至mysql服務
MariaDB [(none)]> show databases;   ##查看數據庫
+--------------------+
| Database           
+--------------------+
| information_schema 
| MaGeRepo           
| mysql              
| performance_schema 
| test               
+--------------------+
##數據庫實現了同步


5、把節點2宕機,隨後在數據庫“MaGeRepo”中創建表“MaGe“;

MariaDB [MaGeRepo]> create table MaGe (ID int unsigned auto_increment not null primary key,Name char(10));  ##在節點1上創建表“MaGe”
MariaDB [MaGeRepo]> insert into MaGe (Name) values ('MaGe'),('Lweim');    ##在節點1中插入數據“Lweim”、“MaGe”
MariaDB [MaGeRepo]> insert into MaGe (Name) values ('Wtc'),('Wzx');    ##在節點3中插入數據“Wtc”、“Wzx”


6、節點2開啓mysql服務器,並查看其數據庫

[root@node1 ~]# service mysql start   ##啓動節點2
Starting MySQL.....SST in progress, setting sleep higher. SUCCESS!
[root@node1 ~]# mysql   ##連接至mysql服務
MariaDB [MaGeRepo]> select * from MaGe;   ##查看錶中的數據
+----+-------+
| ID | Name  
+----+-------+
|  1 | MaGe  
|  3 | Lweim
|  4 | Wtc   
|  6 | Wzx   
+----+-------+

由此可見,當其中某一臺服務器宕機後,即使數據發生改變,重新上線之後也可同步數據,但需要注意的是ID並不是按自動增長次序增長的,解決辦法如下:

a:設定一個全局分配ID生成器,解決數據插入時ID順序不一致問題

b:手動指定ID號,不讓其自動生成



二、基於MHA實現MySQL的高可用

準備環境:CentOS 7

MHA Manager節點
IP:172.18.42.200
MHA Node Master節點
IP:172.18.42.201
MHA Node Slave1節點
IP:172.18.42.202
MHA Node Slave2節點
IP:172.18.42.203

前提:基於MHA實現MySQL高可用時,各節點之間需要基於ssh祕鑰進行通信

[root@node0 ~]# ssh-keygen -t rsa -P ''  ##在Manager節點上基於rsa算法生成祕鑰,密碼爲空
[root@node0 ~]# cat .shh/id_rsa.pub &>> .shh/authorized_keys   ##先要確認能與本地進行通信
[root@node0 ~]# chmod  600 .ssh/id_rsa .ssh/authorized_keys   ##更改祕鑰權限
[root@node0  ~]#  scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/   ##Manager節點把祕鑰、公鑰發送給每個節點,使各個節點可以進行祕鑰通信(第一此通信需要祕鑰,後續不需要)
[root@node0  ~]#  scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/
[root@node0  ~]#  scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/
[root@node0 ~]# ssh 172.18.42.201 'ifconfig'  ##可基於此命令讓各個節點之間進行測試是否建立連接
Are you sure you want to continue connecting (yes/no)? yes   ##第一次建立連接需要認證
root@node1's password:


1、部署MHA Manager節點

(1)安裝mha4mysql-manager、mha4mysql-node

[root@node0 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56-0.el6.noarch.rpm -y

(2)創建配置文件,並編輯

[root@node0 ~]# vim /etc/masterha/app1.cnf
[server default]
user=wtc   ##能遠程連接至各mysql節點的用戶管理賬號,需要mysql節點創建此用戶
password=wtc   
manager_workdir=/data/masterha/app1   ##管理節點的工作目錄    
manager_log=/data/masterha/app1/manager.log   ##管理節點的日誌文件路徑
remote_workdir=/data/masterha/app1  ##遠程的每個mysql節點爲Manager節點提供工作目錄,會自動創建 
ssh_user=root   ##以root用戶遠程管理,,基於祕鑰認證無需密碼;如果不基於密碼,需要指明密碼
repl_user=repluser   ##複製權限用戶賬號
repl_password=replpass
ping_interval=1    ##每隔多長時間探測一次Master節點是否在線
 
[server1]    ##定義mysql節點
hostname=172.18.42.201
candidate_master=1    ##當主節點宕機以後,這個節點是否可以成爲新的主節點
##no_master=1    ##當主節點宕機後,這個節點不會成爲新的主節點

[server2]
hostname=172.18.42.202
candidate_master=1

[server3]
hostname=172.18.42.203
candidate_master=1


2、部署Master節點

(1)安裝mariadb-server、mha4mysql-node服務

[root@node1 ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y

(2)編輯其配置文件

[root@node1 ~]# vim /etc/my.cnf
[mysqld]
innodb_file_per_table = ON
skip_name_resolve = ON
log_bin=mysql-bin  
relay-log=relay-log
server-id=1
[root@node1 ~]# systemctl start mariadb.service
MariaDB [(none)]> show master status;
mysql-bin.000003      245
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'172.18.%.%' identified by 'replpass';   ##創建具有複製權限的用戶


3、部署Slave1

(1)安裝mariadb-server、mha4mysql-node服務

[root@node2 ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y

(2)編輯其配置文件

[root@node2 ~]# vim /etc/my.cnf
[mysqld]
innodb_file_per_table = ON
skip_name_resolve = ON
log_bin=mysql-bin
relay-log=relay-log
server-id=2
read_only=1   ##MHA通過這個來判斷那個是mysql主服務器    
relay_log_purge=0
[root@node2 ~]# systemctl start mariadb.service
MariaDB [(none)]> change master to master_host='172.18.42.201',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000003',master_log_pos=245;  ##連接至Master節點
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes


4、部署Slave2

(1)安裝mariadb-server、mha4mysql-node服務

[root@wxpp ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y

(2)編輯其配置文件

[root@wxpp ~]# vim /etc/my.cnf
innodb_file_per_table = ON
skip_name_resolve = ON
log_bin=mysql-bin
relay-log=relay-log
server-id=3
read_only=1
relay_log_purge=0
[root@wxpp ~]# systemctl start mariadb.service
MariaDB [(none)]> change master to master_host='172.18.42.201',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000003',master_log_pos=245;  ##連接至Master節點
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes


5、在Master節點創建管理用戶賬號,在Manager節點檢測各檢點之間的連接

MariaDB [(none)]> grant all on *.* to 'wtc'@'172.18.%.%' identified by 'wtc';  ##實現了主從複製,在Msater節點創建的同時,slave節點也會創建
[root@node0 ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf   ##測試各節點之間ssh互相通信是否ok
Wed Apr 20 10:17:40 2016 - [info] All SSH connection tests passed successfully.
[root@node0 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf   ##檢查各個節點之間主從複製是否ok
172.18.42.201(172.18.42.201:3306) (current master)   ##201是主節點,202、203是從節點
 +--172.18.42.202(172.18.42.202:3306)
 +--172.18.42.203(172.18.42.203:3306)
MySQL Replication Health is OK.


6、啓動Manager節點服務,把Master節點宕機,查看是否轉換

[root@node0 ~]# masterha_manager --conf=/etc/masterha/app1.cnf    ##啓動Manager服務
Wed Apr 20 10:27:35 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Apr 20 10:27:35 2016 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Wed Apr 20 10:27:35 2016 - [info] Reading server configuration from /etc/masterha/app1.cnf..
[root@node1 ~]# systemctl stop mariadb.service    ##關掉節點2的mariadb服務
MariaDB [(none)]> show slave status\G;    ##查看Slave2節點的複製線程狀態
 Master_Host: 172.18.42.202   ##Master節點轉爲Slave1節點了
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes


7、現在我們開啓Master節點,看其是否成爲從節點

[root@node1 ~]# systemctl start mariadb.service   ##開啓Master節點的mariadb服務
MariaDB [(none)]> change master to master_host='172.18.42.202',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000003',master_log_pos=245;  
##此時“master_host”應該指向Slave1的IP
##使用的二進制日誌文件、事件是事先備份好的(在實現主從複製之前,備份一份)
MariaDB [(none)]> start slave;  ##啓動複製線程
MariaDB [(none)]> show slave status\G;
 Master_Host: 172.18.42.202   ##此時IP爲Slave1的IP
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

[root@node0 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf   ##在Manager節點上查看一次,主從複製是否ok
172.18.42.202(172.18.42.202:3306) (current master)   ##此時,主節點成爲了Slave1
 +--172.18.42.201(172.18.42.201:3306)
 +--172.18.42.203(172.18.42.203:3306)
MySQL Replication Health is OK.



問題小結:

1、masterha_manager運行時是工作於前臺的,而且不能斷開,一旦進行主從切換後,就停止工作,我們需要手動把它開啓,這時需要腳本來實現自行監控

2、在使用MHA方法時,啓動Manager節點的服務有可能會失敗,可以嘗試一下先把Manager節點的日誌文件路徑創建好"/data/masterha/app1"

3、在配置mysql各節點的配置文件時,主從都需要開啓中繼日誌、二進制日誌

  主節點開啓中繼日誌和二進制日誌,是因爲主節點宕機以後啓用時會變爲從節點

  從節點需要開啓中繼日誌和二進制日誌,是因爲主節點宕機以後,任何一個從節點都有可能轉移稱爲主節點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章