中怎么備份分布式邏輯,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
摘要
創(chuàng)新互聯(lián)建站是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護、成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)站備案、服務(wù)器租用、國際域名空間、軟件開發(fā)、重慶小程序開發(fā)等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運營推廣經(jīng)驗的科技公司,有著多年的網(wǎng)站建站經(jīng)驗,致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開一個面向全國乃至全球的業(yè)務(wù)窗口:建站服務(wù)電話:18980820575
定期備份的重要性在數(shù)據(jù)庫生命周期中已得到體現(xiàn)。有不同的風格:二進制的(Percona XtraBackup),二進制日志備份,磁盤快照(lvm,ebs等)和經(jīng)典的:邏輯備份,可以使用mysqldump,mydumper或mysqlpump等工具進行的備份。它們每個都有特定的用途,MTTR,保留策略等。
定期備份的重要性在數(shù)據(jù)庫生命周期中已得到體現(xiàn)。有不同的風格:二進制的(Percona XtraBackup),二進制日志備份,磁盤快照(lvm,ebs等)和經(jīng)典的:邏輯備份,可以使用mysqldump,mydumper或mysqlpump等工具進行的備份。它們每個都有特定的用途,MTTR,保留策略等。
另一個事實是,一旦datadir增長,進行備份可能是一項非常緩慢的任務(wù):存儲更多數(shù)據(jù),讀取和備份更多數(shù)據(jù)。而且,另一個事實是,不僅數(shù)據(jù)會增長,而且環(huán)境中可用的MySQL實例的數(shù)量也會增加(通常)。那么,為什么不利用更多的MySQL實例來進行邏輯備份以使此操作更快呢?分布式備份(或使用所有可用的從站)
這個想法很簡單:不要從單個上獲取整個備份,而要使用所有可用的服務(wù)器。本概念證明僅專注于在主/從拓撲上使用副本。也可以使用Master,但是在這種情況下,我決定不使用它,以免增加備份開銷。測試
在主/從屬拓撲中:
來自O(shè)rchestrator GUI的圖形
使用約64GB數(shù)據(jù)(不包括索引大?。┖?00個表(模式“ sb”)的小datadir:+--------------+--------+--------+-----------+----------+-----------+----------+| TABLE_SCHEMA | ENGINE | TABLES | ROWS | DATA (M) | INDEX (M) | TOTAL(M) |+--------------+--------+--------+-----------+----------+-----------+----------+| meta | InnoDB | 1 | 0 | 0.01 | 0.00 | 0.01 || percona | InnoDB | 1 | 2 | 0.01 | 0.01 | 0.03 || sb | InnoDB | 300 | 295924962 | 63906.82 | 4654.68 | 68561.51 || sys | InnoDB | 1 | 6 | 0.01 | 0.00 | 0.01 |+--------------+--------+--------+-----------+----------+-----------+----------+
使用3個副本,使用mysqldump進行的分布式邏輯備份花費了6分13秒:[root@mysql1 ~]# ls -lh /data/backups/20200101/total 56G-rw-r--r--. 1 root root 19G Jan 1 14:37 mysql2.sql-rw-r--r--. 1 root root 19G Jan 1 14:37 mysql3.sql-rw-r--r--. 1 root root 19G Jan 1 14:37 mysql4.sql[root@mysql1 ~]# stat /data/backups/20200101/mysql2.sql File: '/data/backups/20200101/mysql2.sql' Size: 19989576285 Blocks: 39042144 IO Block: 4096 regular fileDevice: 10300h/66304d Inode: 54096034 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Context: unconfined_u:object_r:unlabeled_t:s0Access: 2020-01-01 14:31:34.948124516 +0000Modify: 2020-01-01 14:37:41.297640837 +0000Change: 2020-01-01 14:37:41.297640837 +0000 Birth: -
單個副本上的相同備份類型花費了11分59秒:[root@mysql1 ~]# time mysqldump -hmysql2 --single-transaction --lock-for-backup sb > /data/backup.sql real 11m58.816suser 9m48.871ssys 2m6.492s[root@mysql1 ~]# ls -lh /data/backup.sql-rw-r--r--. 1 root root 56G Jan 1 14:52 /data/backup.sql
換一種說法:
分布式服務(wù)器快48%!
這是一個相當小的數(shù)據(jù)集。值得一試。那么它是怎樣工作的?概念
邏輯很簡單,可以分為多個階段。階段1:準備
找出可用的副本數(shù)
找出要備份的架構(gòu)中的表數(shù)
在所有可用副本之間劃分表的數(shù)量。結(jié)果塊將是每個副本將備份的表。階段2:保證一致性
阻止主服務(wù)器執(zhí)行更改二進制日志位置的操作。通常,這是通過帶有讀取鎖的FLUSH TABLES完成的,但是此PoC使用的是Percona Server for MySQL上的LOCK BINLOG FOR BACKUP的很酷的功能, 并且破壞性較小。
查找最新副本
使用START SLAVE UNTIL使所有其他副本與最新副本匹配
使用相應(yīng)的表塊為每個副本啟動一個mysqldump,并使用–lock-for-backup(Percona Server的另一個功能)
完整的腳本可以在這里找到:
https://github.com/nethalo/parallel-mysql-backup/blob/master/dist_backup.sh
值得一提的是,腳本具有自己的日志,該日志將描述每個步驟,它看起來像這樣:[200101-16:01:19] [OK] Found 'mysql' bin[200101-16:01:19] [Info] SHOW SLAVE HOSTS executed[200101-16:01:19] [Info] Count tables OK[200101-16:01:19] [Info] table list gathered[200101-16:01:19] [Info] CREATE DATABASE IF NOT EXISTS percona[200101-16:01:19] [Info] CREATE TABLE IF NOT EXISTS percona.metabackups[200101-16:01:19] [Info] TRUNCATE TABLE percona.metabackups[200101-16:01:19] [Info] Executed INSERT INTO percona.metabackups (host,chunkstart) VALUES('mysql3',0)[200101-16:01:19] [Info] Executed INSERT INTO percona.metabackups (host,chunkstart) VALUES('mysql4',100)[200101-16:01:19] [Info] Executed INSERT INTO percona.metabackups (host,chunkstart) VALUES('mysql2',200)[200101-16:01:19] [Info] lock binlog for backup set[200101-16:01:19] [Info] slave status position on mysql3[200101-16:01:19] [Info] slave status file on mysql3[200101-16:01:19] [Info] slave status position on mysql4[200101-16:01:19] [Info] slave status file on mysql4[200101-16:01:19] [Info] slave status position on mysql2[200101-16:01:19] [Info] slave status file on mysql2[200101-16:01:19] [Info] set STOP SLAVE; START SLAVE UNTIL MASTER_LOG_FILE = 'mysql-bin.000358', MASTER_LOG_POS = 895419795 on mysql3[200101-16:01:20] [Info] set STOP SLAVE; START SLAVE UNTIL MASTER_LOG_FILE = 'mysql-bin.000358', MASTER_LOG_POS = 895419795 on mysql4[200101-16:01:20] [Info] set STOP SLAVE; START SLAVE UNTIL MASTER_LOG_FILE = 'mysql-bin.000358', MASTER_LOG_POS = 895419795 on mysql2[200101-16:01:20] [Info] Created /data/backups/20200101/ directory[200101-16:01:20] [Info] Limit chunk OK[200101-16:01:20] [Info] Tables list for mysql3 OK[200101-16:01:20] [OK] Dumping mysql3[200101-16:01:20] [Info] Limit chunk OK[200101-16:01:20] [Info] Tables list for mysql4 OK[200101-16:01:20] [OK] Dumping mysql4[200101-16:01:20] [Info] Limit chunk OK[200101-16:01:20] [Info] Tables list for mysql2 OK[200101-16:01:20] [OK] Dumping mysql2[200101-16:01:20] [Info] UNLOCK BINLOG executed[200101-16:01:20] [Info] set start slave on mysql3[200101-16:01:20] [Info] set start slave on mysql4[200101-16:01:20] [Info] set start slave on mysql2一些基本要求
由于該工具使用命令SHOW SLAVE HOSTS ,因此必須設(shè)置變量report_host,如果使用的是Orchestrator,則很可能已經(jīng)設(shè)置了該變量。
在“ report_host”變量中設(shè)置的主機應(yīng)該是可訪問的主機。例如,可以實際解析的IP或主機(,編輯/ etc / hosts文件)。
任何涉及的副本上都沒有復(fù)制過濾器。這樣可以保證數(shù)據(jù)的一致性。
該腳本當前應(yīng)在主服務(wù)器中本地運行。
由于使用了備份鎖,因此只能在Percona Server上使用。
預(yù)計MySQL用戶憑據(jù)將在.my.cnf文件內(nèi)的主目錄中可用。