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各節點的配置文件時,主從都需要開啓中繼日誌、二進制日誌
主節點開啓中繼日誌和二進制日誌,是因爲主節點宕機以後啓用時會變爲從節點
從節點需要開啓中繼日誌和二進制日誌,是因爲主節點宕機以後,任何一個從節點都有可能轉移稱爲主節點