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服务器寻找备份解决方案的人提供帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值