標籤:mysql高可用 manager master slave mha galera cluster
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服務
[[email protected] ~]# yum install MariaDB-Galera-server -y
(2)編輯其設定檔
[[email protected] ~]# rpm -ql galera ##查看相關檔案/usr/lib64/galera/libgalera_smm.so [[email protected] ~]# 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)初次開機時,需要初始化叢集
[[email protected] ~]# /etc/rc.d/init.d/mysql start --wsrep-new-cluster ##在某一個節點上啟動mysql服務
2、部署節點2
(1)安裝MariaDB-Galera-server服務
[[email protected] ~]# yum install MariaDB-Galera-server -y
(2)啟動服務
[[email protected] ~]# service mysql startStarting MySQL....SST in progress, setting sleep higher. SUCCESS!
3、部署節點3
(1)安裝MariaDB-Galera-server服務
[[email protected] ~]# yum install MariaDB-Galera-server -y
(2)啟動服務
[[email protected] ~]# service mysql startStarting MySQL....SST in progress, setting sleep higher. SUCCESS!
4、三個節點都串連mysql服務,隨後建立一個資料庫,查看其它兩個節點是否複製
[[email protected] ~]# mysql ##節點1串連mysql服務MariaDB [(none)]> create database MaGeRepo; ##在節點1上建立資料庫“MaGeRepo”,並查看MariaDB [(none)]> show databases;+--------------------+| Database +--------------------+| information_schema | MaGeRepo | mysql | performance_schema | test +--------------------+[[email protected] ~]# mysql ##節點2串連至mysql服務MariaDB [(none)]> show databases; ##查看資料庫+--------------------+| Database +--------------------+| information_schema | MaGeRepo | mysql | performance_schema | test +--------------------+[[email protected] ~]# 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伺服器,並查看其資料庫
[[email protected] ~]# service mysql start ##啟動節點2Starting MySQL.....SST in progress, setting sleep higher. SUCCESS![[email protected] ~]# 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秘鑰進行通訊
[[email protected] ~]# ssh-keygen -t rsa -P ‘‘ ##在Manager節點上基於rsa演算法產生秘鑰,密碼為空白[[email protected] ~]# cat .shh/id_rsa.pub &>> .shh/authorized_keys ##先要確認能與本地進行通訊[[email protected] ~]# chmod 600 .ssh/id_rsa .ssh/authorized_keys ##更改秘鑰許可權[[email protected] ~]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/ ##Manager節點把秘鑰、公開金鑰發送給每個節點,使各個節點可以進行秘鑰通訊(第一此通訊需要秘鑰,後續不需要)[[email protected] ~]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/[[email protected] ~]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/[[email protected] ~]# ssh 172.18.42.201 ‘ifconfig‘ ##可基於此命令讓各個節點之間進行測試是否建立串連Are you sure you want to continue connecting (yes/no)? yes ##第一次建立串連需要認證[email protected]‘s password:
1、部署MHA Manager節點
(1)安裝mha4mysql-manager、mha4mysql-node
[[email protected] ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56-0.el6.noarch.rpm -y
(2)建立設定檔,並編輯
[roo[email protected] ~]# 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=replpassping_interval=1 ##每隔多長時間探測一次Master節點是否線上 [server1] ##定義mysql節點hostname=172.18.42.201candidate_master=1 ##當主節點宕機以後,這個節點是否可以成為新的主節點##no_master=1 ##當主節點宕機後,這個節點不會成為新的主節點[server2]hostname=172.18.42.202candidate_master=1[server3]hostname=172.18.42.203candidate_master=1
2、部署Master節點
(1)安裝mariadb-server、mha4mysql-node服務
[[email protected] ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y
(2)編輯其設定檔
[[email protected] ~]# vim /etc/my.cnf[mysqld]innodb_file_per_table = ONskip_name_resolve = ONlog_bin=mysql-bin relay-log=relay-logserver-id=1[[email protected] ~]# systemctl start mariadb.serviceMariaDB [(none)]> show master status;mysql-bin.000003 245MariaDB [(none)]> grant replication slave,replication client on *.* to ‘repluser‘@‘172.18.%.%‘ identified by ‘replpass‘; ##建立具有複製許可權的使用者
3、部署Slave1
(1)安裝mariadb-server、mha4mysql-node服務
[[email protected] ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y
(2)編輯其設定檔
[[email protected] ~]# vim /etc/my.cnf[mysqld]innodb_file_per_table = ONskip_name_resolve = ONlog_bin=mysql-binrelay-log=relay-logserver-id=2read_only=1 ##MHA通過這個來判斷那個是mysql主伺服器 relay_log_purge=0[[email protected] ~]# systemctl start mariadb.serviceMariaDB [(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服務
[[email protected] ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y
(2)編輯其設定檔
[[email protected] ~]# vim /etc/my.cnfinnodb_file_per_table = ONskip_name_resolve = ONlog_bin=mysql-binrelay-log=relay-logserver-id=3read_only=1relay_log_purge=0[[email protected] ~]# systemctl start mariadb.serviceMariaDB [(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節點也會建立[[email protected] ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf ##測試各節點之間ssh互相通訊是否okWed Apr 20 10:17:40 2016 - [info] All SSH connection tests passed successfully.[[email protected] ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf ##檢查各個節點之間主從複製是否ok172.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節點宕機,查看是否轉換
[[email protected] ~]# 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..[[email protected] ~]# 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節點,看其是否成為從節點
[[email protected] ~]# 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[[email protected] ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf ##在Manager節點上查看一次,主從複製是否ok172.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各節點的設定檔時,主從都需要開啟中繼日誌、二進位日誌
主節點開啟中繼日誌和二進位日誌,是因為主節點宕機以後啟用時會變為從節點
從節點需要開啟中繼日誌和二進位日誌,是因為主節點宕機以後,任何一個從節點都有可能轉移稱為主節點
本文出自 “wtc” 部落格,請務必保留此出處http://wangtianci.blog.51cto.com/11265133/1790229
基於MHA和Galera Cluster實現MySQL高可用