mysql高可用集羣之MHA和Galera Cluster

Galera Cluster

    Galera本質是一個wsrep提供者(provider),運行依賴於wsrep的API接口。Wsrep API定義了一系列應用回調和複製調用庫,來實現事務數據庫同步寫集(writeset)複製以及相似應用。目的在於從應用細節上實現抽象的,隔離的複製。雖然這個接口的主要目標是基於認證的多主複製,但同樣適用於異步和同步的主從複製。

     Galera Cluster號稱是世界上最先進的開源數據庫集羣方案,mysql構建在Galera之上,當有新的寫操作產生時,數據庫之間的複製並不是通過mysql的複製線程來請求二進制日誌實現數據的重放,而是通過wsrep API調用galera replication庫來實現文件的同步複製,並在每個服務器上執行一遍,要不所有服務器都執行成功,要不就所有都回滾,保證所有服務的數據一致性,而且所有服務器同步實時更新。

   

Galera的架構:

wKioL1dWx9rBNA-hAAHxgwcnk1c691.png

wKioL1dWx-Xjpd6xAAE8tLZsMkc050.png

   優點:真正的多主服務模式:多個服務能同時被讀寫,不像Fabric那樣某些服務只能作備份用同步複製:無延遲複製,不會產生數據丟失熱備用:當某臺服務器當機後,備用服務器會自動接管,不會產生任何當機時間自動擴展節點:新增服務器時,不需手工複製數據庫到新的節點支持InnoDB引擎對應用程序透明:應用程序不需作修改

   缺點:由於同一個事務需要在集羣的多臺機器上執行,因此網絡傳輸及併發執行會導致性能上有一定的消耗。所有機器上都存儲着相同的數據,全冗餘。若一臺機器既作爲主服務器,又作爲備份服務器,出現樂觀鎖導致rollback的概率會增大,編寫程序時要小心。

不支持的SQL:LOCK / UNLOCK TABLES / GET_LOCK(), RELEASE_LOCK()…不支持XA Transaction


實驗準備:

    三臺虛擬機  172.18.250.77  172.18.250.78  172.18.250.79    CentOS 7 


一、安裝galera cluster     

    mysql支持galera cluster的三種方法:

            1、mysql官方提供支持galera cluster的版本

            2、percona-cluster支持的mysql版本

            3、Mariadb-Cluster 

]# yum -y install MariaDB-Galera-server MariaDB-shared MariaDB-client MariaDB-common galera
]# rpm -ql MariaDB-Galera-server
/etc/init.d/mysql                            //啓動文件
/etc/logrotate.d/mysql                       
/etc/my.cnf.d                              
/etc/my.cnf.d/server.cnf                     //配置文件

配置Galera Cluster:每臺節點都配置相同的配置文件

]# vim /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_provider = /usr/lib64/galera/libgalera_smm.so           
      //實現galera集羣的提供者
wsrep_cluster_address= "gcomm://172.18.250.77,172.18.250.78,172.18.250.79"
      //wsrep的IP地址, gcomm表示提供組會話
binlog_format=row         //二進制日誌的格式
default_storage_engine=InnoDB    //默認存儲引擎
innodb_autoinc_lock_mode=2       //鎖格式  
bind-address=0.0.0.0             //wsrep工作時監聽在哪個地址上
wsrep_cluster_name = 'mycluster'  //wsrep的名稱
# Optional setting         
wsrep_slave_threads=1               //從服務器線程數
innodb_flush_log_at_trx_commit=0    //事務提交時是否刷新日誌

配置各節點的主機名: 每天節點上都需要操作

172.18.250.77 node1.baidu.com
172.18.250.78 node2.baidu.com
172.18.250.79 node3.baidu.com
]# systemctl stop firewalld.service     //關閉防火牆,以免影響
]# setenforce  0                        //關閉selinux

啓動mysql:

]# /etc/init.d/mysql start --wsrep-new-cluster   //首次啓動時,需要初始化集羣,在其中一個節點上執行
]# service mysql start      //其它兩節點正常啓動
]# service mysql start  
Starting MySQL...SST in progress, setting sleep higher.   //顯示這個表示集羣配置成功
]# ss -tan             //查看啓動端口
State       Recv-Q Send-Q   Local Address:Port      Peer Address:Port 
LISTEN      0      50       *:3306                   *:*       
LISTEN      0      128      *:4567                   *:*

在其中一臺創建數據庫,看是否能正常複製到其它兩節點

MariaDB [(none)]> create database hellodb;
MariaDB [(none)]> show databases;        //在其它兩節點上查看
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |                  //數據庫複製成功
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.23 sec)

創建表,添加數據:

MariaDB [hellodb]> create table students (id int unsigned auto_increment not null primary key,name char(30) not null,age tinyint unsigned,gender enum('f','m'));
Query OK, 0 rows affected (0.92 sec)
MariaDB [hellodb]> insert into students (name) values ("Hi");    //在一臺節點上添加數據
Query OK, 1 row affected (0.01 sec)

MariaDB [hellodb]> insert into students (name) values ("Hello");
Query OK, 1 row affected (0.01 sec)

MariaDB [hellodb]> select * from students;
+----+-------+------+--------+
| id | name  | age  | gender |
+----+-------+------+--------+
|  1 | Hi    | NULL | NULL   |
|  4 | Hello | NULL | NULL   | //如果字段時自動增加的話,則時按集羣的節點數顯示下一個數據
+----+-------+------+--------+
2 rows in set (0.00 sec)
解決辦法:
1、設定一個全局分配ID生成器,解決數據插入時ID順序不一致
2、手動指定id號,不能自動生成

停止一臺節點上的mysql:

]# service mysql stop
Shutting down MySQL.......... SUCCESS! 
MariaDB [hellodb]> insert into students (name) values ("World");  //一節點插入數據
Query OK, 1 row affected (0.12 sec)

MariaDB [hellodb]> select * from students;
+----+-------+------+--------+
| id | name  | age  | gender |
+----+-------+------+--------+
|  1 | Hi    | NULL | NULL   |
|  4 | Hello | NULL | NULL   |
|  6 | World | NULL | NULL   |
+----+-------+------+--------+
3 rows in set (0.00 sec)

在啓動節點上的mysq:

]# service mysql start
Starting MySQL.........SST in progress, setting sleep higher.
MariaDB [hellodb]> select * from students;
+----+-------+------+--------+
| id | name  | age  | gender |
+----+-------+------+--------+
|  1 | Hi    | NULL | NULL   |
|  4 | Hello | NULL | NULL   |
|  6 | World | NULL | NULL   |          //數據自動同步
+----+-------+------+--------+
3 rows in set (0.01 sec)



HMA:

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


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

   MHA Manager:通常單獨不熟在一臺獨立機器上管理多個master/slave集羣,每個master/slave集羣稱作一個application;

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

MHA架構:

  wKiom1dXqlnyuRjyAAJjQmhyjTQ752.png

 實驗準備:

       1、虛擬機 172.18.250.77 CentOS 7 MHA Manger

       2、虛擬機 172.18.250.78 CentOS 7 MHA Node  mysql主

       3、虛擬機 172.18.250.79 172.18.250.80 CentOS 7 MHA Node mysql從


一、安裝MHA

]# yum -y install mha4mysql-manager-0.56-0.el6.noarch.rpm   
]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm  mariadb-server //mysql服務器上安裝

配置管理主節點:

]# rpm -ql mha4mysql-manager
/usr/bin/masterha_check_repl         //檢測MySQL複製集羣的連接配置參數是否正常;
/usr/bin/masterha_check_ssh          //檢測各節點ssh通信是否正常
/usr/bin/masterha_check_status       //顯示mysql主節點
/usr/bin/masterha_conf_host          //刪除或添加配置的節點
/usr/bin/masterha_manager            //啓動manager
/usr/bin/masterha_master_monitor     //監控mysql主節點可用性 
/usr/bin/masterha_master_switch      //master節點切換工具
/usr/bin/masterha_stop               //關閉MHA服務的工具

        Manager節點需要爲每個監控的master/slave集羣提供一個專用的配置文件,而所有的master/slave集羣也可共享全局配置。全局配置文件默認爲/etc/masterha_default .cnf,其爲可選配置。如果僅監控一組master/slave集羣,也可直接通過application的配置來提供各服務器的默認配置信息。而每個application的配置文件路徑爲自定義。

]# mkdir /etc/masterha
]# vim /etc/masterha/app1.cnf
[server default]
user=hauser                                      //MHA登錄mysql的賬號
password=hauser
manager_workdir=/data/masterha/app1             //MHA工作目錄
manager_log=/data/masterha/app1/manager.log     //MHA日誌文件
remote_workdir=/data/masterha/app1              //存儲到其它節點的文件信息 
ssh_user=root                                   //基於哪個用戶遠程
repl_user=admin                                 //mysql複製二進制用戶
repl_password=admin                              
ping_interval=1                                 //多長時間掃描一次mysql節點

[server1]
hostname=172.18.250.78                          //節點主機名稱,可以是IP和主機名
candidate_master=1                              //如果mysql主節點故障提升爲主節點

[server2]
hostname=172.18.250.79
candidate_master=1

[server3]
hostname=172.18.250.80

 配置各節點環境:

 MHA集羣中的各節點彼此之間是通過SSH通信,以實現遠程控制及數據管理 ,基於密鑰方式通信就無需輸入遠程賬號密碼

]# ssh-keygen -t rsa -P ''     //生成密鑰對
]# cat .ssh/id_rsa.pub >.ssh/authorized_keys     //把公鑰保存在認證文件中
]# chmod 600 .ssh/authorized_keys   
]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/   
]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/
]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/    
                               //複製私鑰和認證文件到其它節點上
]# systemctl stop firewalld.service          
]# setenforce 0                              //關閉防火牆和selinux

配置mysql:

]# vim /etc/my.cnf                                  //mysql主服務器上配置
skip_name_resolve=ON
innodb_file_per_table=ON
log-bin=master-bin
relay-log=relay-log

]# vim /etc/my.cnf                                  //mysql從服務器上配置
skip_name_resolve=ON
innodb_file_per_table=ON
log-bin=master-bin
relay-log=relay-log
read-only=1                                        //mha通過這來判斷哪個是mysql主服務器
relay-log-purge=0                               

]# service mariadb start

配置mysql複製所需的環境:

主服務器上:
MariaDB [(none)]> grant all on *.* to 'hauser'@'172.18.250.%' identified by 'hauser';
                 //授權mha能登錄mysql
MariaDB [(none)]> grant replication slave,replication client on *.* to 'admin'@'172.18.250.%' identified by 'admin';
                 // 授權mysql從服務器能遠程登錄複製
              
從服務器上:
MariaDB [(none)]> change master to master_host='172.18.250.78', master_user='admin', master_password='admin', master_log_file='master-bin.000003', master_log_pos=558; 
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.02 sec)     

MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.18.250.78
                  Master_User: admin
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000004
          Read_Master_Log_Pos: 245
               Relay_Log_File: relay-log.000003
                Relay_Log_Pos: 530
        Relay_Master_Log_File: master-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 245
              Relay_Log_Space: 1103
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
1 row in set (0.05 sec)

在MHA管理節點上檢測ssh,repl等是否正常:

]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

wKiom1dXxeHysqXEAAB5A2s8rOU089.png

]# masterha_check_repl --conf=/etc/masterha/app1.cnf

wKiom1dXxnCjQCMJAABpkXA8Qw4835.png

啓動manager:

]# masterha_manager --conf=/etc/masterha/app1.cnf 
Thu Jun  9 14:17:49 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Jun  9 14:17:49 2016 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Thu Jun  9 14:17:49 2016 - [info] Reading server configuration from /etc/masterha/app1.cnf..
manger處於前臺工作,一直檢測中

停止主服務器上的mysql,看是否會把從節點提升爲主節點,形成高可用:

]# masterha_manager --conf=/etc/masterha/app1.cnf 
Thu Jun  9 14:17:49 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Jun  9 14:17:49 2016 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Thu Jun  9 14:17:49 2016 - [info] Reading server configuration from /etc/masterha/app1.cnf..
  Creating /data/masterha/app1 if not exists..    ok.
  Checking output directory is accessible or not..
   ok.
  Binlog found at /var/lib/mysql, up to master-bin.000004
Thu Jun  9 14:20:01 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Jun  9 14:20:01 2016 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Thu Jun  9 14:20:01 2016 - [info] Reading server configuration from /etc/masterha/app1.cnf..
manger立馬停止
]# tail /data/masterha/app1/manager.log 

Started automated(non-interactive) failover.            //啓動主服務器流動
The latest slave 172.18.250.79(172.18.250.79:3306) has all relay logs for recovery.
Selected 172.18.250.79(172.18.250.79:3306) as a new master.
172.18.250.79(172.18.250.79:3306): OK: Applying all logs succeeded.
172.18.250.80(172.18.250.80:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
172.18.250.80(172.18.250.80:3306): OK: Applying all logs succeeded. Slave started, replicating from 172.18.250.79(172.18.250.79:3306)
172.18.250.79(172.18.250.79:3306): Resetting slave info succeeded.
Master failover to 172.18.250.79(172.18.250.79:3306) completed successfully.
                     //172.18.250.79已成爲主服務器
MariaDB [(none)]> show slave status\G;           //在250.80從服務器上看主節點已變更
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.18.250.79
                  Master_User: admin
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000002
          Read_Master_Log_Pos: 245
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 530
        Relay_Master_Log_File: master-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

注意:主服務器故障下線時,修復後不能立即讓主服務器上線,需要修改配置讓主服務器變成從服務,以防集羣腦裂。

]# service mariadb start
MariaDB [(none)]> change master to master_host='172.18.250.79', master_user='admin', master_password='admin', master_log_file='master-bin.000002', master_log_pos=245;
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.18.250.79
                  Master_User: admin
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000002
          Read_Master_Log_Pos: 245
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 530
        Relay_Master_Log_File: master-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

再次通過manger檢測複製功能:

]# masterha_check_repl --conf=/etc/masterha/app1.cnf

wKiom1dXy4PDpZCkAABjaKw2CkY019.png


這就是MHA的高可用mysql集羣的流程


配置MHA還需注意幾點:

1、masterha_manager 運行時是工作於前臺的(可以放到後臺工作),而且不能斷開,一旦進行主節點切換後,就停止工作,得手動在把masterha_manager啓動起來,這時需要腳本實現

2、提供額外檢測機制,以免對master的監控做出誤判

3、在master節點上提供虛擬IP地址向外提供服務,以免主節點改變時還需要到分離器上修改IP

4、進制故障轉移時對原有master節點執行stonith操作以避免腦裂,可通過指定shutdown_script實現

5、必要時,進行在線master節點轉換     

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