1. 程式人生 > >Mysql高可用架構——MHA

Mysql高可用架構——MHA

MHA(Master High Availability)什麼是資料庫的高可用性呢??資料庫主機中我們會有做成主從關係的或者其他關係型資料庫,如果主掛了,不會影響資料的訪問,假如是一主三從架構,主庫掛了,但主庫能被從庫ssh上去的情況下,MHA從三個從庫中選擇同步最接近的作為新主,然後新主和s2,s3都ssh到原主上通過binlog補上還沒有同步的資料,io_thread讀取到binlog位置,傳到save_binary_logs,然後回放,達到s1,s2,s3和原主一致。

我們就用四臺主機來模擬生產環境中的配置。

MHA 172.18.254.136
Master 172.18.254.175
Slave1 172.18.254.176
Slave2 172.18.254.103

首先來配置主從關係

在Master上配置

1,安裝mariadb並啟動服務

[[email protected]張大帥哥 ~]# yum install -y mariadb-server
[[email protected]張大帥哥 ~]# systemctl start mariadb.service

2,配置配置檔案

[[email protected]張大帥哥 ~]# vim /etc/my.cnf
    
[mysqld]
server_id=1    #指定為主
datadir=/mariadb/data    #資料檔案位置
log_bin=/mariadb/logbin/log_bin    二進位制檔案位置
innodb_file_per_table
binlog_format=row
skip_name_resolve
socket=/var/lib/mysql/mysql.sock

3,建立資料庫檔案目錄並更改許可權

[[email protected]張大帥哥 ~]# mkdir -p /mariadb/{data,logbin}
[[email protected]張大帥哥 ~]# chown mysql.mysql -R /mariadb/

4,重啟資料庫,並寫授權使用者

[[email protected]張大帥哥 ~]# systemctl restart mariadb.service 
[[email protected]張大帥哥 ~]# mysqlMariaDB [(none)]> show master status;
+----------------+----------+--------------+------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+----------+--------------+------------------+
| log_bin.000003 |      245 |              |                  |
+----------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> grant replication slave on *.* to 
[email protected]
'172.18.254.%' identified by 'centos';

5,生成祕鑰實現免密登入

[[email protected]張大帥哥 ~]# cd .ssh/
[[email protected]張大帥哥 .ssh]# ssh-keygen
[[email protected]張大帥哥 .ssh]# ssh-copy-id -i id_rsa.pub [email protected]:/root/.ssh/
[[email protected]張大帥哥 .ssh]# ssh-copy-id -i id_rsa.pub [email protected]:/root/.ssh/
[[email protected]張大帥哥 .ssh]# ssh-copy-id -i id_rsa.pub [email protected]:/root/.ssh/

6,關閉ssh連線時的應答

[[email protected]張大帥哥 ~]# vim /etc/ssh/ssh_config 
   StrictHostKeyChecking no

7,關閉防火牆和selinux

[[email protected]張大帥哥 ~]# systemctl stop firewalld.service 
[[email protected]張大帥哥 ~]# setenforce 0

在Slave1上配置

1,同上第一步,安裝啟動資料庫

2,編輯配置檔案

[[email protected]張大帥哥 ~]# vim /etc/my.cnf
[mysqld]
server_id=2
datadir=/mariadb/data
log_bin=/mariadb/logbin/log_bin
read_only=1
socket=/var/lib/mysql/mysql.sock
relay_log_purge=0
skip_name_resolve=1

3,同上第三步,建立目錄並更改許可權

4,重啟資料庫,指定自己的主(那一長串可用help change master to來檢視然後複製出來修改)

[[email protected]張大帥哥 ~]# systemctl restart mariadb.service
[[email protected]張大帥哥 ~]# mysql

MariaDB [(none)]> CHANGE MASTER TO   MASTER_HOST='172.18.254.175',   MASTER_USER='repluser',   MASTER_PASSWORD='centos',   MASTER_PORT=3306,   MASTER_LOG_FILE='log_bin.000003',   MASTER_LOG_POS=245,   MASTER_CONNECT_RETRY=10;

MariaDB [(none)]> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

5,同上面第5步,生成金鑰並拷給另外三臺機器

6,同上面第6步,關閉連線時的應答

7,也同上

在Slave2上配置

跟在Slave1上的配置一摸一樣,在這裡不再重寫一遍

在MHA上配置

1,配置資料庫,不過配置檔案不用指定主從

配置檔案

[[email protected]張大帥哥 ~]# vim /etc/my.cnf

[mysqld]
datadir=/mariadb/data
log_bin=/mariadb/logbin/log_bin
innodb_file_per_table
socket=/var/lib/mysql/mysql.sock

2,建立MHA管理賬號,連線資料庫,之後建立使用者

MariaDB [(none)]> grant all on *.* to [email protected]'172.18.254.%' identified by 'centos';

3,安裝MHA管理節點包,和MHA節點(上面三臺機器需要安裝MHA節點包)

MHA節點管理包    mha4mysql-manager-0.56-0.el6.noarch.rpm

節點包  mha4mysql-node-0.56-0.el6.noarch.rpm

可百度下載最新版。

4,建立目錄並編輯管理端配置檔案

[[email protected]張大帥哥 ~]# mkdir /etc/mha/
[[email protected]張大帥哥 ~]# vim /etc/mha/app1.conf 

[server default]
user=mhauser
password=centos
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
master_binlog_dir=/mariadb/logbin
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1

[server1]
hostname=172.18.254.175
candidate_master=1
[server2]
hostname=172.18.254.176
candidate_master=1
[server3]
hostname=172.18.254.103

5,驗證SSH連線及MHA管理

[[email protected]張大帥哥 ~]# masterha_check_ssh --conf=/etc/mha/app1.conf
[[email protected]張大帥哥 ~]# masterha_check_repl --conf=/etc/mha/app1.conf

可能會出現錯誤

解決:在Master上建立mhauser使用者

6,執行MHA

[[email protected]張大帥哥 ~]#  nohup masterha_manager --conf=/etc/mha/app1.conf > mharun.log &

測試

模擬故障:直接停掉主Master的mysql服務,可看到主的切換。

模擬修復故障:啟動主的mysql服務

這時候主什麼也不算,不算主也不算從,也就是不在這個叢集中了,我們可以

[[email protected]張大帥哥 ~]# vim /etc/my.cnf
#增加以下兩行
read_only=ON
relay_log_purge=0
[[email protected]張大帥哥 ~]# systemctl restart mariadb.service

把Master作為從再次加入到叢集中

[[email protected]張大帥哥 ~]# systemctl restart mariadb.service

Master [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST='172.18.254.176',
    ->   MASTER_USER='repluser',
    ->   MASTER_PASSWORD='centos',
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE='bin_log.000003',
    ->   MASTER_LOG_POS=245,
    ->   MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.05 sec)

Master [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

至此,模擬完成

注:這些機器的時間必須一致,可以安裝ntp-server和ntpclient來使時間一致