Zabbix在線遷移方案(適用於MySQL5.7)


目錄

術語、定義

1. 遷移工具簡介

2. 架構圖


3. 前置檢查

3.1. 檢查主機物理內存

3.2. 檢查磁盤空間

3.3. 檢查操作系統版本

3.4. 檢查當前主機IO情況

3.5. 檢查當前MySQL服務器併發量

3.6. 檢查當前MySQL服務器線程情況

3.7. 獲取每一個數據庫的大小

3.8. 獲取每個庫中不同存儲引擎的表的個數

3.9. 存儲準備

3.10. xtrabackup安裝


4. 數據庫物理備份

4.1. xtrabackup部分參數說明

4.2. xtrabackup全量備份

4.2.1. 權限檢查

4.2.2. 創建備份目錄

4.2.3. 進行全量備份

4.2.4. 對全備prepare

4.2.5. 驗證備份是否成功


5. 物理備份創建從庫

5.1. 掛載備份NAS盤

5.2. 創建實例

5.3. 備份恢復

5.4. 主從搭建

5.5. 數據檢驗


6. Zabbix應用切割

6.1. 修改主從Zabbix服務配置

6.2. 停止備zabbix機上keepalived服務

6.3. 重啓主Zabbix服務

6.4. 啓動備zabbix機上keepalived服務

6.5. Web界面重新配置

6.6. 應用驗證

————

術語、定義

下列術語、定義和縮略語適用於本文。

詞語 解釋
zabbix 開源監控軟件
keepalived 高可用軟件
xtrabackup percona開源熱備工具
binlog mysql記錄所有修改數據據的二進制日誌
mysqlbinlog mysql提供的二進制文件解析工具
InnoDB mysql另一個存儲引擎,支持行鎖、事務安全
MyISAM mysql中的一個存儲引擎,不支持行鎖、事務
.frm 表元數據文件,存儲表結構的定義信息
.ibd InnoDB多表空間(獨享)存儲方式,每個表一個數據文件
ibdata InnoDB共享存儲方式,所有表共享一個或多個數據文件

1 遷移工具簡介

xtrabackup是一個對InnoDB做數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。xtrabackup有兩個主要的工具:xtrabackup、innobackupex,xtrabackup只能備份InnoDB和XtraDB兩種數據表,且只備份數據文件(.ibd),並不備份數據表結構文件(.frm),同時不能備份MyISAM數據表,所以使用xtrabackup恢復的時候,你必須有對應表結構文件(.frm);innobackupex-1.3.1則封裝了xtrabackup,是一個腳本封裝,所以能同時備份處理InnoDB和MyISAM,但在處理MyISAM時需要加一個讀鎖。

2 架構圖

架構

3 前置檢查

在全量備份,首先要確定需要備份的數據對象、備份數據庫的大小和備份文件存放位置的空間大小,檢查主機的基本情況。

3.1 檢查主機物理內存

# free -g
total       used       free     shared    buffers     cached
Mem:           126        103         96          0          0         22
-/+ buffers/cache:          6        119
Swap:          124          0        124

3.2 檢查磁盤空間

# df  -h
文件系統            容量  已用  可用 已用%% 掛載點
/dev/sda1             769G  229G  502G  32% /
tmpfs                  64G  260K   64G   1% /dev/shm
/dev/sda3             940G  276G  617G  31% /app
/dev/mapper/Mysqlvg-Mysqllv
                      493G  349G  119G  75% /data
192.168.203.41:/mnt/zxdfs/CM_South15/root/cccloud_tenant_id10001154
                      1.0T     0  1.0T   0% /mysql

3.3 檢查操作系統版本

#uname -a
Linux Mysqlmaster2 2.6.32-131.0.15.el6.x86_64 #1 SMP Tue May 10 15:42:40 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux

3.4 檢查當前主機IO情況

# iostat -cdx 2


重點關注參數:%util 表示磁盤忙碌情況,一般該值超過80%表示該磁盤可能處於繁忙狀態。

3.5 檢查當前MySQL服務器併發量

# mysqladmin extended -i1 -uroot -p  -S /tmp/mysql.sock |grep Threads_running
 


3.6 檢查當前MySQL服務器線程情況

mysql> SELECT * FROM performance_schema.threads WHERE processlist_command<>'sleep' AND processlist_id IS NOT NULL\G
*************************** 1. row ***************************
          THREAD_ID: 27
               NAME: thread/sql/compress_gtid_table
               TYPE: FOREGROUND
     PROCESSLIST_ID: 1
   PROCESSLIST_USER: NULL
   PROCESSLIST_HOST: NULL
     PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Daemon
   PROCESSLIST_TIME: 1815110
  PROCESSLIST_STATE: Suspending
   PROCESSLIST_INFO: NULL
   PARENT_THREAD_ID: 1
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: NULL
       THREAD_OS_ID: 16362
*************************** 2. row ***************************
          THREAD_ID: 101886
               NAME: thread/sql/one_connection
               TYPE: FOREGROUND
     PROCESSLIST_ID: 101860
   PROCESSLIST_USER: repl
   PROCESSLIST_HOST: 10.20.234.157
     PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Binlog Dump
   PROCESSLIST_TIME: 177564
  PROCESSLIST_STATE: Master has sent all binlog to slave; waiting for more updates
   PROCESSLIST_INFO: NULL
   PARENT_THREAD_ID: NULL
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: TCP/IP
       THREAD_OS_ID: 24901
*************************** 3. row ***************************
          THREAD_ID: 123682
               NAME: thread/sql/one_connection
               TYPE: FOREGROUND
     PROCESSLIST_ID: 123656
   PROCESSLIST_USER: root
   PROCESSLIST_HOST: localhost
     PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Query
   PROCESSLIST_TIME: 0
  PROCESSLIST_STATE: Sending data
   PROCESSLIST_INFO: SELECT * FROM performance_schema.threads WHERE processlist_command<>'sleep' AND processlist_id IS NOT NULL
   PARENT_THREAD_ID: NULL
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: Socket
       THREAD_OS_ID: 14484
*************************** 4. row ***************************
          THREAD_ID: 94022
               NAME: thread/sql/one_connection
               TYPE: FOREGROUND
     PROCESSLIST_ID: 93996
   PROCESSLIST_USER: repl
   PROCESSLIST_HOST: 10.20.234.158
     PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Binlog Dump
   PROCESSLIST_TIME: 259239
  PROCESSLIST_STATE: Master has sent all binlog to slave; waiting for more updates
   PROCESSLIST_INFO: NULL
   PARENT_THREAD_ID: NULL
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: TCP/IP
       THREAD_OS_ID: 31926
4 rows in set (0.00 sec)

3.7 獲取每一個數據庫的大小

mysql> SELECT TABLE_SCHEMA,CONCAT(ROUND(SUM(DATA_LENGTH)/1024/1024),'MB') AS DATA_LENGTH,CONCAT(ROUND(SUM(INDEX_LENGTH)/1024/1024),'MB') AS INDEX_LENGTH,CONCAT(ROUND(SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024),'MB') AS TOTAL_SIZE FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN('information_schema','performance_schema','mysql','test') GROUP BY TABLE_SCHEMA ORDER BY 4 DESC;


3.8 獲取每個庫中不同存儲引擎的表的個數

mysql> SELECT TABLE_SCHEMA,ENGINE,COUNT(1) AS C_TABLES FROM information_schema.TABLES WHERE TABLE_SCHEMA 
NOT IN('information_schema','performance_schema','mysql','sys','test') GROUP BY TABLE_SCHEMA, ENGINE ORDER BY 3 DESC;;


3.9 存儲準備

分配一塊備份使用的NAS盤

3.10 xtrabackup安裝

#配置好yum源
# yum -y install  perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL libev
#上傳介質包到/tmp目錄下
# cd /tmp
# rpm -ivh percona-xtrabackup-24-2.4.10-1.el7.x86_64.rpm

4 數據庫物理備份

4.1 xtrabackup部分參數說明

這裏介紹的是xtrabackup的部分參數,僅供參考

--defaults-file
指定my.cnf參數文件的位置[此配置文件裏必須指定datadir],全備、增備和恢復時要指定改參數,否則可能找不到datadir,特別注意該參數只能放在innobackupex命令後第一個參數的位置上。
 
--apply-log
同xtrabackup的--prepare參數,一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據 文件仍處理不一致狀態。--apply-log的作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態。對於沒有增量備份,只是全備的恢復,在恢復前對全備prepare時,要加上該參數。

--apply-log  --redo-only
強制備份日誌時只redo,跳過rollback,這在做增量備份時非常必要。對於全備+增量的恢復,在恢復之前,要分別對全備和增量做prepare,那麼全備的prepare和每次增量的prepare 均要加上該參數--apply-log  --redo-only,
不要只加--apply-log而忘記--redo-only。而對於最後一次增量的prepare, --redo-only可加可不加。


--copy-back
做數據恢復時將備份數據文件拷貝到mysql服務器的datadir 
  
--remote-host=HOSTNAME
通過ssh將備份數據存儲到進程服務器上
  
--stream=[tar]
備份文件輸出格式, 該文件可在XtarBackup binary文件中獲得。在使用參數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候併發寫入較大的話,xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以通過參數--tmpdir指定目錄來解決這個問題.
  
--tmpdir=DIRECTORY
當有指定--remote-host or --stream時, 事務日誌臨時存儲的目錄, 默認採用MySQL配置文件中所指定的臨時目錄tmpdir 
  
--use-memory=*
該參數在prepare的時候使用,控制prepare時innodb實例使用的內存
 
--databases=LIST
列出需要備份的databases,如果沒有指定該參數,所有包含MyISAM和InnoDB表的database都會被備份

 
--slave-info
備份從庫, 加上--slave-info備份目錄下會多生成一個xtrabackup_slave_info 文件, 這裏會保存主日誌文件以及偏移, 文件內容類似於:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0 

  
--incremental-basedir 
指定之前完整備份的目錄,該參數在增量備份時候使用


--incremental
將會生成新的目錄用於存放增量備份數據,該參數在增量備份時候使用


--incremental-dir 
指定增量備份與全庫備份合併去建立一個新的全備份的目錄,該參數在對備份文件做恢復之前的prepare操作時使用,要與--apply-log --redo-only 參數共同使用

--socket=SOCKET
指定mysql.sock所在位置,以便備份進程登錄mysql, 全備和增備時要指定改參數,否則可能本地連接不上mysql

4.2 xtrabackup全量備份

4.2.1 權限檢查

備份過程中系統用戶需要對存放備份數據的系統文件目錄具備讀寫執行權限,而對數據庫進行備份的時候,建議具備下面的權限能力:

  1. Reload,lock tables(除非指定--no-lock參數)以便具備flush tables with read lock能力;
  2. Replication client 具備獲得二進制文件備份的能力;
  3. Create tablespace 具備恢復整個表空間,並導入表的能力;
  4. Super 用於啓動、關閉從服務器複製線程環境。

4.2.2 創建備份目錄

# mkdir -p /backup/mysql_backup
# mount 192.168.0.13:/backup /backup/mysql_backup

4.2.3 進行全量備份

  1. 執行全備命令
# innobackupex   --defaults-file=’mysql參數文件的路徑’
--user=root   --password=root    --socket=’SOCKET文件的路徑’    /backup/mysql_backup/
innobackupex 重點參數:--defaults-file 、--socket(參數說明見文檔3.1)
  1. 查看上述全備命令後的輸出
Xtrabackup: The latest check point (for incremental): '470308686'
xtrabackup: Stopping log copying thread.
.>> log scanned up to (470308686)

//備份過程中會終止日誌線程,並以上一次checkpoint作爲日誌備份時間點。

4.2.4 對全備prepare

全備prepare

# innobackupex   --defaults-file=’mysql參數文件的路徑’ --user=root --password=root   --socket=’SOCKET文件的路徑’
--apply-log    /backup/mysql_backup/

innobackupex 重點參數:--defaults-file 、--socket 、--apply-log(參數說明見文檔4.1)

在這裏值得注意的是:當前全庫備份只備份至上文提到checkpoint '470308686' 序號的事務及已經完成同步至磁盤中的數據。而已經執行,但還沒有提交的事務仍然存放在內存中(innodb buffer),導致當前數據文件處於非一致性狀態。

假設當前要對全備進行恢復,則要利用回滾未提交的事務,使得數據文件處於一致狀態,因此,在執行完整全備之後,切記要對全備執行一次prepare操作 (--apply-log),這點是十分重要的。執行--apply-log時,必須要指定之前的備份目錄(因爲需要獲得正確的xtrabackup_checkpoints文件)。

默認情況下,--apply-log 參數,只調用系統 100M 內存,如果當前 innodb buffer pool 比較大,則同步內存中數據時間可能會比較長,可以通過定義內存大小加快備份速度, 如參數 --use-memory=4G。

4.2.5 驗證備份是否成功

----當上面的操作看到以下信息時,說明全量備份已經成功
151205 12:22:42  innobackupex: completed OK!

當上面3.2.3(全備)和3.2.4(全備prepare)中的兩次操作都出現innobackupex: completed OK!字符串時,才表示本次全量備份成功。

5 物理備份創建從庫

5.1 掛載備份NAS盤

掛在主庫的物理備份數據至新從庫主機

# mount 192.168.0.13:/backup /backup/mysql_backup

5.2 創建實例

使用實例創建腳本,創建一個空的mysql實例,用於物理備份的恢復。空實例創建完成後,停止該實例,並刪除該實例下的部分文件。

(新從庫主機上執行)
1. 新的mysql空實例信息如下:
    base_dir:  /data/mysql/db_ngoc
 配置文件:/data/mysql/db_ngoc/conf/ngoc.cnf
  
2. 停止該實例
   /data/mysql/db_ngoc/bin/shutdown.sh
   
3. 刪除該實例下的部分文件(刪除前一定要確認清楚IP與實例路徑)
   cd /data/mysql/db_ngoc
   rm -rf ./data/*
   rm -rf ./ulog/*
   rm -rf ./rlog/*

5.3 備份恢復

利用物理備份數據恢復至新建MYSQL空實例中

(新從庫主機上執行)
1. 備份文件恢復至空實例
   innobackupex --defaults-file=/data/mysql/db_ngoc/conf/ngoc.cnf --copy-back /backup/mysql_backup
2. 修改數據目錄權限
   chown mysql. -R /data/mysql

5.4 主從搭建

根據物理備份數據中“xtrabackup_info”文件記錄的備份時刻的“gtid、position”信息,進行主從數據複製搭建,以進行數據間的時時同步.



(新從庫上執行)
1. 啓動mysql實例,並登陸
   /data/mysql/db_ngoc/bin/startup.sh
   /data/mysql/db_ngoc/bin/login.sh

2. 清空master/slave相關信息
   reset master;
   reset slave all;
   show master status;
   
3. 設置數據同步起點GTID(來自:xtrabackup_info文件)
   set global  gtid_purged ="7d58ee1a-93a0-11e7-8ff5-f44c7f785650:1-3,d2cf8b03-939f-11e7-99db-407d0f46034d:1-14193879"
   
4. 使用命令搭建主從
   CHANGE MASTER TO
     MASTER_HOST='',
     MASTER_USER='',
     MASTER_PASSWORD='',
     MASTER_PORT=,
     MASTER_AUTO_POSITION=1;
  
5. 啓動主從複製,並查看狀態
   start slave;
   show slave status\G

5.5 數據檢驗

主從搭建完成後,進行主從數據條數的驗證

1. 主從分別執行以下命令
   mysqlshow -u zabbix -pzabbix -S /data/mysql/db_ngoc/mysql.sock --count zabbix
主庫執行結果

 

2. 從庫執行結果


6 Zabbix應用切割

6.1 修改主從Zabbix服務配置

(新Zabbix主備機上執行)
# cp /zabbix/server/etc/zabbix_server.conf /zabbix/server/etc/zabbix_server.conf.bak
# sed -i "s/DBHost=.*/<新從庫地址>/g" /zabbix/server/etc/zabbix_server.conf

6.2 停止備zabbix機上keepalived服務

# systemctl stop keepalived

6.3 重啓主Zabbix服務

(主zabbix機上執行)
# systemctl restart zabbix-server

6.4 啓動備zabbix機上keepalived服務

(備zabbix機上執行)
# systemctl stop keepalived

6.5 Web界面重新配置

瀏覽器訪問:http://<zabbix ip>/setup.php




6.6 應用驗證

瀏覽器訪問:http://<zabbix ip>/zabbix.php





往期推薦


_

Zabbix學習資料申請(歷屆峯會ppt)


_


_

 案例|中移在線:雲原生下的監控能力演進


_


_

● 交通銀行新一代運維監控系統建設和成果


_


_

什麼是Zabbix優秀模板,如何製作?規範和實踐演示


_


備註“使用Zabbix年限+企業+姓名”

進入交流羣,4000+用戶已加入

一個人走得快,一羣人走得遠


本文分享自微信公衆號 - Zabbix開源社區(china_zabbix)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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