1. 程式人生 > >如何在滴滴雲 DC2 上搭建高可用 MySQL 叢集

如何在滴滴雲 DC2 上搭建高可用 MySQL 叢集

前言

MySQL 高可用叢集

MySQL 高可用叢集是通過第三方軟體實現的故障轉移技術,通常是通過 MHA+Keepalived 或者 MHA+ 指令碼等來實現,本例子將採用 Keepalived 實現。

準備

系統硬體

滴滴雲伺服器(DC2):安全可靠,擁有極高的價效比高,為開發者的需求而設計。適合大中小型使用者購買使用。

本文示例採用:通用型 2核CPU 4GB記憶體 500G的EBS 雲盤的伺服器配置

數量:3 臺,2 臺 MySQL 主從伺服器,1 臺 MHA 管理伺服器

依賴軟體

系統:CentOS 7.4

MySQL 5.7.24

daemontools-0.76.tar.gz

mha4mysql-manager-0.56-0.el6.noarch.rpm

mha4mysql-node-0.56-0.el6.noarch.rpm

Keepalived v1.2.13

安裝過程

1. 登入2臺伺服器

SSH 登入購買的滴滴雲 DC2 主機

ssh [email protected]

2. 安裝並配置 MySQL 主從複製關係

兩臺伺服器的 MySQL 都安裝完成後開始配置主從複製關係。(如果不會安裝 MySQL 可以參考另一篇如何安裝 MySQL 的文章:如何在滴滴雲 DC2 上搭建 MySQL 服務)。

在主庫上建立從庫賬號

mysql>CREATE USER 'repl'@'ip' IDENTIFIED BY '****';
mysql>GRANT  REPLICATION SLAVE ON *.* TO 'repl'@'ip' ;

從庫執行 change master 命令指向主庫,配置的是 GTID 複製,所以不需要 binlog 的資訊。

mysql>change master to master_host = 'master_ip', master_port = port, master_heartbeat_period = 10, master_user ='repl', master_password = '******',master_auto_position = 1;

需要注意的地方:

  • server_id 不能相同
  • 主從開啟 GTID 複製

3. 建立主從複製關係後,校驗一下複製是否成功開啟

登入從庫,檢視 IO 和 SQL 執行緒是否啟動

mysql> show slave status\G;

4. 安裝 MHA

登入到第三臺 DC2 的伺服器安裝 MHA,可以下載最新的 MHA: https://github.com/yoshinorim/mha4mysql-manager

yum -y install perl-DBI 
yum -y install perl-DBD-mysql 
yum -y install perl-Time-HiRes 
yum -y install perl-Config-Tiny 
yum -y install perl-Log-Dispatch 
yum -y install perl-Parallel-ForkManager
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm 
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm 

在兩臺 MySQL 伺服器安裝 MHA Node

yum -y install perl-DBD-mysql 
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

在 etc 目錄下建立 MHA 資料夾

mkdir -p /etc/mha/

建立 manager 日誌目錄

mkdir -p /var/log/mha/app1 
chmod 755 /var/log/mha/app1 

配置 app1.cnf

vim /etc/mha.d/app1.cnf


[server default] 
manager_log=/var/log/mha/app1/app1.log 
manager_workdir=/var/log/mha/app1 

[server1] 
candidate_master=1 
hostname=master_ip 

[server2] 
candidate_master=1 
hostname=slave_ip 

配置 masterha_default.cnf 檔案

vim /etc/mha.d/masterha_default.cnf

[server default] 
ssh_user=root 

user=mha 
password=mha_password 

repl_user=repl
repl_password=repl_password 

master_binlog_dir= /data/mysql  #MySQL的binlog所在目錄
remote_workdir=/var/log/mha #mysql主從work目錄,需要在mysql主從上建立目錄 

ping_interval=3 
master_ip_failover_script=/etc/mha.d/script/master_ip_failover 
report_script= /etc/mha.d/script/send_master_failover_mail

5. 配置 SSH 互信和 MHA 使用者

MySQL 主從伺服器配置戶型:

生成 pub 祕鑰,一直回車就可以,生成成功後複製 id_rsa.pub 裡面的祕鑰到從庫,同樣從庫也是先生成祕鑰再複製到主庫伺服器。

cd ~/.ssh

MHA 管理端到 MySQL Node 的互信配置,生成祕鑰,同時複製到 MySQL 的兩臺伺服器上。

建立MHA使用者:

登入到 MySQL 主庫

mysql> CREATE USER 'mha'@'%' IDENTIFIED BY 'mha2018REPL'; 
mysql> GRANT all privileges ON *.* TO 'mha'@'%';

校驗 MHA 的 SSH 互信配置與 MySQL 複製狀態

masterha_check_ssh --conf=/etc/mha.d/app1.cnf 
masterha_check_repl --conf=/etc/mha.d/app1.cnf --global_conf=/etc/mha.d/masterha_default.cnf

MHA 的指令碼修改 master_ip_failovermaster_ip_online_changesend_master_failover_mail
可以把例子的指令碼複製下來,放到 /etc/mha/script 的目錄下,適當按需修改內容。

6. Keepalived 安裝

在兩臺 MySQL 伺服器上安裝 Keepalived

yum install -y keepalived

vrrp_script mysql_5001 {
    script "/etc/keepalived/checkmysql.sh"
    interval 60
}
vrrp_instance VI_82 {
    state BACKUP
    nopreempt
    interface eth0
    virtual_router_id 82
    priority 100
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
       mysql_5001
    }
    virtual_ipaddress {
        192.168.1.188
    }
}
vim checkmysql.sh

res = `ps -ef | grep -v grep | grep mysql | wc -l`
if [ $res > 0 ]; then
    exit 0
else
    exit 1
fi  

7. 設定守護程式

#tar zxf daemontools-0.76.tar.gz
# cd admin/daemontools-0.76/
# sed -i 's/extern int errno;/#include <errno.h>/1' ./src/error.h 
#./package/install

#sed -i '$acsh -cf \x27\/command\/svscanboot &\x27' /etc/rc.d/rc.local 
#sh /etc/rc.local
#nohup sh /command/svscanboot &
#ps -ef | grep svscanboot
mkdir /service/app1/run
chmod 750 /service/app1/run
vim  /service/app1/run
#!/bin/sh
exec masterha_manager --global_conf=/etc/mha/masterha_default.cnf --conf=/etc/mha/app1.cnf --wait_on_monitor_error=60 --wait_on_failover_error=60 --ignore_last_failover --last_failover_minute=6   >> /var/log/mha/app1/app1.log 2>&1

啟動 app1

svc -u /service/app1

停止

svc -d /service/app1