ProxySQL備份策略

ProxySQL Series : ProxySQL Backup Startegies

介紹

我們深知ProxySQL是MySQL的領先SQL感知代理之一。 在本博客中,我將解釋ProxySQL的備份和還原策略。 我認爲,關於該主題的博客仍然結構不完善。

如果您正在尋找我們的ProxySQL系列的其他文章:

ProxySQL真的需要備份嗎?

  • 您已經在單個ProxySQL下配置了產品服務器。 有人在AWS控制檯中意外終止了代理服務器,現在真的需要ProxySQL備份嗎?
  • 您有來自DEV團隊的請求,要使用現有的相同配置再構建一個ProxySQL,您準備好手動執行新ProxySQL設置配置的所有命令(複雜規則)了嗎?
  • 意外地,您的DC崩潰了,您需要在其他DC中構建ProxySQL,您將如何在短時間內做到這一點?

ProxySQL備份策略–

作爲一名DBA,我認爲以下四種策略在備份ProxySQL方面起着至關重要的作用。

  • sqlite3備份
  • 物理快照
  • 配置文件備份
  • mysqldump

在進入本主題之前,我將簡要介紹一下我的測試環境。 我在ProxySQL中配置了5臺服務器(1個主服務器3個從屬服務器1個備份節點)。

Master:192.168.33.25

Slaves:192.168.33.26,192.168.33.27,192.168.33.28

Backup:192.168.33.29

mysql> select hostgroup_id,hostname,port,status,comment from mysql_servers;
+--------------+---------------+------+--------+---------+
| hostgroup_id | hostname      | port | status | comment |
+--------------+---------------+------+--------+---------+
| 100          | 192.168.33.25 | 3306 | ONLINE | master  |
| 100          | 192.168.33.26 | 3306 | ONLINE | slave1  |
| 100          | 192.168.33.27 | 3306 | ONLINE | slave2  |
| 100          | 192.168.33.28 | 3306 | ONLINE | slave3  |
| 100          | 192.168.33.29 | 3306 | ONLINE | backup  |
+--------------+---------------+------+--------+---------+
5 rows in set (0.00 sec)

讓我們進入實際實驗

Sqlite3 backup

Sqlite是ProxySQL的後端數據庫。 Sqlite3是用於在Sqlite數據庫上執行備份的客戶端工具。 這也有助於查看數據文件中的可用內容,而無需還原備份。

Example

[root@mydbopslabs25 proxysql]# ls /var/lib/proxysql/
mysql_server.sql  proxysql.db proxysql.log  proxysql.pid proxysql_stats.db
[root@mydbopslabs25 proxysql]# sqlite3 proxysql.db 
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from mysql_servers;
100|192.168.33.25|3306|ONLINE|1|0|1000|0|0|0|master
100|192.168.33.26|3306|ONLINE|1|0|1000|0|0|0|slave1
100|192.168.33.27|3306|ONLINE|1|0|1000|0|0|0|slave2
100|192.168.33.28|3306|ONLINE|1|0|1000|0|0|0|slave3
100|192.168.33.29|3306|ONLINE|1|0|1000|0|0|0|backup
sqlite> .quit

以下是使用Sqlite3執行邏輯備份和還原的過程。

cmd -

[root@mydbopslabs25 proxysql]# sqlite3 proxysql.db .dump > data.sql 

Backup file output -

[root@mydbopslabs25 proxysql]# cat data.sql | head -n5
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE mysql_servers (hostgroup_id INT CHECK (hostgroup_id>=0) NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) );

INSERT INTO "mysql_servers" VALUES(100,'192.168.33.25',3306,'ONLINE',1,0,1000,0,0,0,'master');

INSERT INTO "mysql_servers" VALUES(100,'192.168.33.26',3306,'ONLINE',1,0,1000,0,0,0,'slave1');

備份還原

[root@mydbopslabs25 proxysql]# mv data.sql /
[root@mydbopslabs25 proxysql]# service proxysql stop
Shutting down ProxySQL: DONE!
[root@mydbopslabs25 proxysql]# sqlite3 /var/lib/proxysql/proxysql.db < /data.sql 
[root@mydbopslabs25 proxysql]# 
[root@mydbopslabs25 proxysql]# service proxysql start
Starting ProxySQL: 2019-05-02 20:51:46 [INFO] Using config file /etc/proxysql.cnf
DONE!
[root@mydbopslabs25 proxysql]# mysql -h127.0.0.1 -uadmin -padmin -P6032  -e "select hostgroup_id,hostname,port,status,comment from mysql_servers;"
+--------------+---------------+------+--------+---------+
| hostgroup_id | hostname      | port | status | comment |
+--------------+---------------+------+--------+---------+
| 100          | 192.168.33.25 | 3306 | ONLINE | master  |
| 100          | 192.168.33.26 | 3306 | ONLINE | slave1  |
| 100          | 192.168.33.27 | 3306 | ONLINE | slave2  |
| 100          | 192.168.33.28 | 3306 | ONLINE | slave3  |
| 100          | 192.168.33.29 | 3306 | ONLINE | backup  |
+--------------+---------------+------+--------+---------+

是的,它運行正常。 這是一個邏輯備份,我們可以在RUNTIME上使用此方法而無需關閉ProxySQL。

Physical snapshot

這是我們用來進行冷備份的常用方法。 以下是此備份過程中涉及的步驟。

  • 關閉ProxySQL
  • 拷貝data directory到備份目錄
  • 啓動ProxySQL
[root@mydbopslabs25 proxysql]# pwd
/var/lib/proxysql
[root@mydbopslabs25 proxysql]# service proxysql stop
Shutting down ProxySQL: DONE!
[root@mydbopslabs25 proxysql]# cp -r /var/lib/proxysql/* /backup_snapshot/
[root@mydbopslabs25 proxysql]# service proxysql start
Starting ProxySQL: 2019-05-02 20:59:33 [INFO] Using config file /etc/proxysql.cnf
DONE!
[root@mydbopslabs25 proxysql]# ls -lrth /backup_snapshot/
total 168K
-rw------- 1 root root 108K May  2 20:59 proxysql_stats.db
-rw------- 1 root root  15K May 2 20:59 proxysql.log
-rw-r--r-- 1 root root  42K May 2 20:59 proxysql.db

下面的步驟是恢復過程

[root@mydbopslabs25 proxysql]# service proxysql stop
Shutting down ProxySQL: DONE!
[root@mydbopslabs25 proxysql]# pwd
/var/lib/proxysql
[root@mydbopslabs25 proxysql]# rm -rf /var/lib/proxysql/*
[root@mydbopslabs25 proxysql]# cp -r /backup_snapshot/* /var/lib/proxysql/
[root@mydbopslabs25 proxysql]# chown -R proxysql:proxysql /var/lib/proxysql/

[root@mydbopslabs25 proxysql]# ls -lrth
total 168K
-rw------- 1 proxysql proxysql  15K May 2 21:02 proxysql.log
-rw-r--r-- 1 proxysql proxysql  42K May 2 21:02 proxysql.db
-rw------- 1 proxysql proxysql 108K May  2 21:02 proxysql_stats.db

[root@mydbopslabs25 proxysql]# service proxysql start
Starting ProxySQL: 2019-05-02 21:03:02 [INFO] Using config file /etc/proxysql.cnf
DONE!

[root@mydbopslabs25 proxysql]# mysql -h127.0.0.1 -uadmin -padmin -P6032  -e "select hostgroup_id,hostname,port,status,comment from mysql_servers;"
+--------------+---------------+------+--------+---------+
| hostgroup_id | hostname      | port | status | comment |
+--------------+---------------+------+--------+---------+
| 100          | 192.168.33.25 | 3306 | ONLINE | master  |
| 100          | 192.168.33.26 | 3306 | ONLINE | slave   |
| 100          | 192.168.33.27 | 3306 | ONLINE | slave1  |
| 100          | 192.168.33.28 | 3306 | ONLINE | slave2  |
| 100          | 192.168.33.29 | 3306 | ONLINE | backup  |
+--------------+---------------+------+--------+---------+

在不停止ProxySQL的情況下拍攝快照可能會導致備份損壞。

注意:確保以相同的ProxySQL版本還原備份,以避免架構結構上的衝突。

Config file backup

我個人非常喜歡這種備份方法。 ProxySQL提供了我們可以在運行時完成的最大配置,而無需重新啓動ProxySQL。 無需配置文件條目。 但是,每當在ProxySQL中進行更改時,我建議也將這些條目添加到ProxySQL配置文件中,並進行備份。

這是我的備份ProxySQL配置文件,我在“ / etc /”下添加了

cat /etc/proxysql.cnf
.
.
mysql_servers =
(
        { address="192.168.33.25" , port=3306 , hostgroup=100, status="ONLINE", comment="master" },
        { address="192.168.33.26" , port=3306 , hostgroup=100, status="ONLINE", comment="slave1" },
        { address="192.168.33.27" , port=3306 , hostgroup=100, status="ONLINE", comment="slave2" },
        { address="192.168.33.28" , port=3306 , hostgroup=100, status="ONLINE", comment="slave3" },
        { address="192.168.33.29" , port=3306 , hostgroup=100, status="ONLINE", comment="backup" }
)
:

現在,我將使用更新的配置文件啓動ProxySQL,

#Linux shell 

[root@mydbopslabs25 proxysql]# service proxysql start 
Starting ProxySQL: 2019-05-03 00:02:01 [INFO] Using config file /etc/proxysql.cnf DONE! 
[root@mydbopslabs25 proxysql]# ls 
[root@mydbopslabs25 proxysql]# mysql -h127.0.0.1 -uadmin -padmin -P6032  -e "select hostgroup_id,hostname,port,status,comment from mysql_servers;" 

+--------------+---------------+------+--------+---------+
| hostgroup_id | hostname      | port | status | comment |
+--------------+---------------+------+--------+---------+
| 100          | 192.168.33.25 | 3306 | ONLINE | master  |
| 100          | 192.168.33.26 | 3306 | ONLINE | slave   |
| 100          | 192.168.33.27 | 3306 | ONLINE | slave1  |
| 100          | 192.168.33.28 | 3306 | ONLINE | slave2  |
| 100          | 192.168.33.29 | 3306 | ONLINE | backup  |
+--------------+---------------+------+--------+---------+

這是在ProxySQL中實現備份的最簡單方法之一。我們可以將這種方法用於新的部署。

Mysqldump

我們可以使用mysqldump執行ProxySQL備份。 但是,MySQL和Sqlite3數據庫之間有一組不同的管理命令。 不過,我們可以通過忽略MySQL轉儲文件中不需要的對象來實現此目的。

Example

cmd-
[root@mydbopslabs25 proxysql]# mysqldump -h127.0.0.1 -uadmin -padmin -P6032 --no-tablespaces --no-create-info --no-create-db --skip-triggers main mysql_servers | grep -i 'lock tables\|insert into' > mysqldump_data.sql

[root@mydbopslabs25 proxysql]# ls -lrth mysqldump_data.sql 
-rw-r--r-- 1 root root 470 May  3 00:20 mysqldump_data.sql

output-
[root@mydbopslabs25 proxysql]# cat mysqldump_data.sql 
LOCK TABLES `mysql_servers` WRITE;
INSERT INTO `mysql_servers` VALUES ('100','192.168.33.25','3306','ONLINE','1','0','1000','0','0','0','master'),('100','192.168.33.26','3306','ONLINE','1','0','1000','0','0','0','slave'),('100','192.168.33.27','3306','ONLINE','1','0','1000','0','0','0','slave1'),('100','192.168.33.28','3306','ONLINE','1','0','1000','0','0','0','slave2'),('100','192.168.33.29','3306','ONLINE','1','0','1000','0','0','0','backup');
UNLOCK TABLES;

恢復mysqldump文件,

[root@mydbopslabs25 proxysql]# service proxysql stop
Shutting down ProxySQL: DONE!
[root@mydbopslabs25 proxysql]# pwd
/var/lib/proxysql
[root@mydbopslabs25 proxysql]# rm -rf 
[root@mydbopslabs25 proxysql]# service proxysql start
Starting ProxySQL: 2019-05-03 00:26:23 [INFO] Using config file /etc/proxysql.cnf
DONE!

[root@mydbopslabs25 proxysql]# mysql -h127.0.0.1 -uadmin -padmin -P6032 -vvv < /mysqldump_data.sql 
--------------
LOCK TABLES `mysql_servers` WRITE
--------------
Query OK, 0 rows affected (0.00 sec)
--------------
INSERT INTO `mysql_servers` VALUES ('100','192.168.33.25','3306','ONLINE','1','0','1000','0','0','0','master'),('100','192.168.33.26','3306','ONLINE','1','0','1000','0','0','0','slave'),('100','192.168.33.27','3306','ONLINE','1','0','1000','0','0','0','slave1'),('100','192.168.33.28','3306','ONLINE','1','0','1000','0','0','0','slave2'),('100','192.168.33.29','3306','ONLINE','1','0','1000','0','0','0','backup')
--------------
Query OK, 5 rows affected (0.00 sec)
--------------
UNLOCK TABLES
--------------
Query OK, 0 rows affected (0.00 sec)
Bye

[root@mydbopslabs25 proxysql]# mysql -h127.0.0.1 -uadmin -padmin -P6032  -e "select hostgroup_id,hostname,port,status,comment from mysql_servers;"
+--------------+---------------+------+--------+---------+
| hostgroup_id | hostname      | port | status | comment |
+--------------+---------------+------+--------+---------+
| 100          | 192.168.33.25 | 3306 | ONLINE | master  |
| 100          | 192.168.33.26 | 3306 | ONLINE | slave   |
| 100          | 192.168.33.27 | 3306 | ONLINE | slave1  |
| 100          | 192.168.33.28 | 3306 | ONLINE | slave2  |
| 100          | 192.168.33.29 | 3306 | ONLINE | backup  |
+--------------+---------------+------+--------+---------+

如上所述,由於在Sqlite3中大多數情況下不支持MySQL轉儲文件中的SQL語句(代碼),因此恢復起來有點困難。

我相信該博客肯定會爲正在爲其ProxySQL服務器尋找備份解決方案的人提供幫助。

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