1. 程式人生 > >MySQL叢集-PXC搭建以及使用innobackupex工具進行全域性備份和增量備份

MySQL叢集-PXC搭建以及使用innobackupex工具進行全域性備份和增量備份

環境:centos7

vm1:10.154.47.236

vm2:10.154.52.189

vm3:10.105.12.50

目的:pxc使用三個節點構建mysql叢集,使用innobackupex對資料進行全域性備份,增量備份;同時對三個節點做負載均衡(使用騰訊雲官方負載均衡器)

補充:整個應用使用的都是內網,做負載均衡時會有vip(內網)提供給PHP應用。安全組只開放對外的80,443,22常用介面,內網埠互通.

安裝PXC,innobackupex

安裝軟體依賴包(新增repl源,再安裝依賴,3臺server同樣安裝)

下載安裝Percona-XtraDB-Cluster

yum install epel*
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes socat nc -y
yum install -y libaio*
yum groupinstall -y 'Development tools'
yum install -y libssl.so.6
ln -sf /usr/lib64/libssl.so.10 /usr/lib64/libssl.so.6
ln -sf /usr/lib64/libcrypto.so.10 /usr/lib64/libcrypto.so.6

採用的是二進位制安裝,直接解壓即可
下載在官網,https://www.percona.com/ --> software --> Percona XtraDB Cluster --> download --> liunx Generic --> 選擇版本

#解壓
tar zxvf Percona-XtraDB-Cluster-5.7.21-rel20-29.26.1.Linux.x86_64.ssl101.tar.gz

#
mv Percona-XtraDB-Cluster-5.7.21-rel20-29.26.1.Linux.x86_64.ssl101 /usr/local/mysql

建立mysql使用者

useradd -M -s /sbin/nologin mysql

軟連線命令

ln -s /usr/local/mysql/bin/* /usr/bin/

更改許可權

chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /usr/local/mysql

配置檔案my.cnf

#需要新增的配置項
log_error=error.log
innodb_autoinc_lock_mode=2
wsrep_cluster_name=pxc-fss #節點名稱保持一致
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_cluster_address=gcomm://10.105.12.50,10.154.52.189,10.154.47.236 #所有節點的ip,新增節點這裡就需要新增
wsrep_node_address=10.154.47.236 #本機ip ,不同的server寫各自ip
wsrep_slave_threads=8
wsrep_sst_auth=fss:u8u8uu8 #
wsrep_sst_method=xtrabackup-v2
wsrep_provider_options="gcache.size=8G;"
log-slave-updates

配置好後後面的啟動會有很多錯誤,根據error.log排查
我遇到的典型的就是binlog_format的問題,需要設定為binlog_format = ROW

mysql複製主要有三種方式:基於SQL語句的複製(statement-based replication, SBR),基於行的複製(row-based replication, RBR),混合模式複製(mixed-based replication, MBR)。對應的,binlog的格式也有三種:STATEMENT,ROW,MIXED

初始化以及啟動測試

mysqld --initialize --datadir=/data/mysql --user=mysql --basedir=/usr/local/mysql/
#初始化成功會在`/data/mysql`下產生資料檔案

啟動測試

在主節點10.154.47.236,其他節點啟動方式不一樣

mysqld_safe --defaults-file=/etc/my.cnf --ledir=/usr/local/mysql/bin --datadir=/data/mysql --wsrep-new-cluster &
#第一個節點啟動需要加上--wsrep-new-cluster 引數,表示新建立叢集

主節點啟動後需要新增使用者授權,從節點在使用SST時會使用賬號(my.cnf中的賬號wsrep_sst_auth=

不然會報錯如下

2018-03-14T11:23:22.982182+08:00 0 [ERROR] WSREP: Process completed with error: wsrep_sst_xtrabackup-v2 --role 'joiner' --address 'IP地址省略' --datadir '/data/mysql/' --defaults-file '/etc/my.cnf' --defaults-group-suffix '' --parent '13752' '' : 2 (No such file or directory)
2018-03-14T11:23:22.982229+08:00 0 [ERROR] WSREP: Failed to read uuid:seqno from joiner script.
2018-03-14T11:23:22.982239+08:00 0 [ERROR] WSREP: SST script aborted with error 2 (No such file or directory)
2018-03-14T11:23:22.982275+08:00 0 [ERROR] WSREP: SST failed: 2 (No such file or directory)
2018-03-14T11:23:22.982277+08:00 0 [Warning] WSREP: 1.0 (VM_52_189_centos): State transfer to 0.0 (VM_47_236_centos) failed: -22 (Invalid argument)
2018-03-14T11:23:22.982286+08:00 0 [ERROR] Aborting

其他節點

mysqld_safe --defaults-file=/etc/my.cnf --ledir=/usr/local/mysql/bin --datadir=/data/mysql &

檢視叢集狀態

MySQL [(none)]> SHOW STATUS LIKE '%wsrep%';

wsrep_cluster_conf_id | 4
wsrep_cluster_size | 2
wsrep_cluster_state_uuid | f6fcb98a-269b-11e8-a781-1af3e5d62be6
wsrep_cluster_status | Primary
wsrep_connected | ON
#wsrep_cluster_size 指出叢集節點數
#wsrep_cluster_status 叢集狀態

到此PXC搭建完成!可以操作資料庫測試下
裡面很多細節沒講到,比如5.7版的資料庫初始化後,密碼竟然在error.log裡面,/pass定位下就能看到,初始化時候資料目錄不能有檔案等等,細節問題及其多...

innobackupex備份恢復

之前在備份資料庫都是用的mysqldump,現在的測試,生產環境也是做的計劃任務定時執行,備份的也是整庫,innobackupex則可以在全域性備份後進行增量備份,這樣就不用每次都將整個資料庫打包壓縮下來。整個原理也比較好理解,通過命令列也能大致瞭解到備份恢復邏輯

在是上面PXC叢集搭建好後,我本來準備將用mysqldump備份下來的資料解壓,然後通過命令 mysql -root -p 庫名 < /備份資料檔案匯入進去,然而,發現並不行,好煞筆的感覺

進入重點,理論參考以下部落格,很詳細

備份恢復原理這篇文章很詳細,可以仔細瞭解下

先全域性備份正在執行的Mysql5.7

innobackupex --password=xxx /backup/
#backup為備份目錄
#你會看到一個 ok ...

執行完命令後,/backup/目錄下會生成一個時間戳目錄,/backup/2018-03-13_16-33-41/

增量備份

innobackupex --password=xxx --incremental /backup/ --incremental-basedir=/backup/2018-03-13_16-33-41/
#--incremental-basedir 指向全域性備份目錄
# --incremental 指向備份目錄

執行完命令後,/backup/目錄下會生成一個新的時間戳目錄,2018-03-13_16-35-46/

再次增量備份 新的時間戳,2018-03-13_16-37-59/

備份就是以上,還原如下。

停止資料庫,並清空資料目錄檔案,包括之前的初始化資料

innobackupex --apply-log --redo-only /backup/2018-03-13_16-33-41/
innobackupex --apply-log --redo-only /backup/2018-03-13_16-33-41/ --incremental-dir=/backup/2018-03-13_16-35-46/
innobackupex --apply-log /backup/2018-03-13_16-33-41/ --incremental-dir=/backup/2018-03-13_16-37-59/
innobackupex --apply-log /backup/2018-03-13_16-33-41/

#注意:一定要按照完整備份、第一次增量備份、第二次增量備份的順序進行整合,在整合最後一次增量備份時不要使用--redo-only引數

開始還原

innobackupex --copy-back /backup/2018-03-13_16-33-41/

#還原成功後你會看到“completed OK!”的字樣

啟動資料庫

啟動時候會報錯,可以很清楚看出是許可權問題,chown -R ...

嗯,使用備份下來的mysql5.7的賬號密碼可以直接使用

在另外一臺伺服器上,直接啟動加入集群后會自動通不主上的資料,資料量大的情況下肯定是要先備份恢復的