我们公司生产环境是部署在微软云上的 mysql 数据库,大约有 1tb 。经过几次代码 bug ,导致数据库崩溃,现在迫切需求一种可以快速恢复的备份方案。 方案一:每天使用 mysqldump 分库全备,同时备份每小时的 binlog ,但是这个样子全备速度太慢了,全备一次得 20 小时。
有没有更好的方案呢?我们不介意付费的厂商或者方案,请大家不吝赐教。 需求就是在生产环境极限灾难下,主备机器全部挂掉,可以快速恢复至半小时前的状态。
1
SpMozzi 2023-11-15 09:52:54 +08:00
可以快速恢复至半小时前的状态,说明对数据一致性要求不高,可以考虑
|
3
SpMozzi 2023-11-15 09:56:47 +08:00
可以快速恢复至半小时前的状态,说明对数据一致性要求不高,可以考虑
1. 跨区 在部署一个 slave,不同区域同时挂的概率相对是很低很低的, 当同一个区挂了,可以直接切到另一个区,数据延迟也不会高. 2. 通过 xtrabackup 进行每天的全量备份, 然后将备份拷贝到另一个地方, binlog 可以根据实际情况进行备份走. 3. 直接上云实例,一样跨区部署 |
4
yekern 2023-11-15 10:00:18 +08:00
xtrabackup 全量备份以后,每几个小时或者每天走增量备份.
``` #!/bin/bash DATA_DIR="/opt/mysql/data" BACKUP_DIR="/data/backup" OLD_DIR=`cat /data/backup/log/mysql-last-backup.log` NEW_DIR=`date +%F` MYSQL_DATABASE_HOST="地址" MYSQL_DATABASE_USERNAME="用户名" MYSQL_DATABASE_PASSWORD="密码" MYSQL_DATABASE_PORT=3306 if [[ ! -d ${BACKUP_DIR}/base ]];then echo "还未全量备份" exit 1 fi /usr/bin/xtrabackup --defaults-file=/opt/mysql/conf/my.cnf --backup --compress=lz4 --datadir=${DATA_DIR} --incremental-basedir=${BACKUP_DIR}/${OLD_DIR} --target-dir=${BACKUP_DIR}/${NEW_DIR} --user=${MYSQL_DATABASE_USERNAME} --password=${MYSQL_DATABASE_PASSWORD} --port=${MYSQL_DATABASE_PORT} --host=${MYSQL_DATABASE_HOST} --no-server-version-check --apply-log-only &> /data/backup/log/mysql-last-backup.log tail -n 1 /data/backup/log/mysql-last-backup.log | grep 'completed OK!' if [[ $? -eq 0 ]];then echo "${NEW_DIR}" > /data/backup/log/mysql-last-backup.log else echo "备份失败" echo "${OLD_DIR}" > /data/backup/log/mysql-last-backup.log exit 1 fi ``` |
5
clacf1 OP @SpMozzi 我们有次,是因为代码问题,切了备机以后,备机也被整挂了。主从这种模式,没法低于来自代码 bug 导致的问题。这个 xtrabackup 的备份效率高吗?和 mysqldump 比较起来呢?因为涉及到快速恢复,最好可以分库备份。
|
6
chuckzhou 2023-11-15 10:57:33 +08:00
这么大数据量想要迅速恢复,只能用 btrfs 的快照,zfs 应该也可以。
采样主从方式,在从服务器上隔半个小时就建立一次快照。 出问题了就恢复最近一次的快照,然后把从切为主。 如果你网卡是 10G 以上的,用 xtrabackup 也行,恢复 1T 数据估计得 20 分钟。 |
7
joyhub2140 2023-11-15 11:23:26 +08:00
只有快照才能满足楼主需求了,不用运维去做把,我记得云厂商都有快照功能,根据快照的大小进行计费。只对数据库的的云盘打快照就行了。
|
8
jixiangqd 2023-11-15 11:24:14 +08:00
云上数据库不建议搞这么大,建议拆成多个库,使用中间件访问。
比如阿里云以前的 DRDS ,现在的 Polar-X 。 如果非要搞这么大,建议不要用开源,用云各家厂商搞的存算分离架构数据库恢复会快一些 |
9
Worldispow 2023-11-15 11:26:34 +08:00
xtrabackup 我记得是要登录服务器操作的,云数据库不具备操作条件,最好的办法是购买云厂商的数据备份服务
|
10
buchikoma 2023-11-15 11:30:40 +08:00
数据量大,还有时间点恢复的需求,为啥不直接用 rds 实例
|
11
tool2d 2023-11-15 11:34:39 +08:00 1
你那么大的数据量,用 binlog 也不是那么靠谱,太慢了。
最好就是二进制数据和文本数据分离,严重怀疑 1tb 直接把图片之类的保存进去了。应该学 github ,大文件走专门的通道,不要图省事用 blob ,和文本数据库混合在一起。 |
12
wps353 2023-11-15 11:53:01 +08:00
应该招个 DBA 来解决问题。/dog
|
13
Itesting 2023-11-15 13:06:01 +08:00
如果快速恢复到 X 小时前的话,可以设置配置一个 slave 节点,配置:CHANGE MASTER TO MASTER_DELAY = N;
,比如:30 分钟,180 分钟,这样这个实例就是历史的状态,如果 线上 DB 出问题可以马上恢复。相关参数官网说明链接: https://dev.mysql.com/doc/refman/5.7/en/replication-delayed.html 注意:上述方案按照钱来换时间,即使开启这个,也要开启相应的全量备份。同时设置的时间要把握好,如果决策慢了,这个 slave 节点的数据会和线上一致也无法提供服务了。 |
14
0x1111 2023-11-15 13:13:06 +08:00
1 ,还可以考虑主从外,再加一个跨区的延时 slave ,指定同步延时 1 小时或 1 天这种思路,实时业务真出问题,能有一个延时数据可以快速提供服务
2 ,xtrabackup+binlog ,这么大的数据量,备份需要时间,恢复也是需要很久的,这种可能磁盘快照会更合适,云服务快照,lvs 快照 3 ,单实例这么大的数据量,可运维性非常不友好,还是核心存储的话,真的建议治理下,看看怎么拆分。 |
15
fredcc 2023-11-15 14:10:44 +08:00 1
Azure Mysql 支持每日快照,每 5 分钟事务日志,可以还原到备份保留期内到任意时间点。https://learn.microsoft.com/zh-cn/azure/mysql/single-server/concepts-backup
上云了还自建 mysql 自建备份还原? |
16
SpMozzi 2023-11-15 14:17:11 +08:00
@clacf1 这里可以考虑用多个 slave 进行分流,不要所有业务全部打到一个实例上去.xtrabackup 备份恢复速度都是远远高于 mysqldump 的. 还有你可以考虑把业务拆分成独立的实例,这样会减少数据量,恢复起来也会快很多
|
17
whileFalse 2023-11-15 14:54:46 +08:00 via Android
你是在 azure 的虚拟机上自己部署的 mysql ,还是用的 azure 托管 maysql ?
|
18
shadowyw 2023-11-15 15:05:18 +08:00
听上去像是用的 Azure Database for MySQL; 如果真是这样的话, azure 技术支持会很积极帮您选购解决方案的
|
19
buchikoma 2023-11-15 15:52:19 +08:00
@whileFalse #17 听 op 描述肯定是虚机自建 Mysql 的场景,直接用托管服务不会直接用 mysqldump ,直接用 rds 提供的定时备份就行了
|
20
wuhao1 2023-11-15 16:14:54 +08:00
不知你们是哪些内容占用了数据库的存储空间,
我们是只要是 文字内容占用,最近刚搞了,把所有文字存 硬盘,一下子节省了几百鸡的数据 不存数据库后性能上应该还会有提升! |
21
liuliancao 2023-11-15 17:44:33 +08:00
把库拆一下 然后规范数据库变更流程
|
22
vincent7245 2023-11-15 19:13:12 +08:00 1
最简单的办法,两个 slave ,一个业务备份,一个数据备份,业务永远不要切到数据备份的 slave
|
23
nilai 2023-11-15 21:48:17 +08:00 1
最简单办法, 搜索关键字: 延时从库
|
24
vczyh 2023-11-15 22:26:13 +08:00
推荐一下备份工具: https://github.com/vczyh/dbbackup
|
25
rekulas 2023-11-15 22:43:49 +08:00
数据库 1tb 不影响,主要看修改量有多大,我们以前几百 G 数据同步备份能做到延迟 1 秒内,因为修改量不多
用的方案是直接开 binlog,canal 解析然后同步给从库,解析和同步都可以用其他服务器处理,避免影响主库 当然如果你从库扛不住压力挂了那就是硬件层面问题了,只有提高下 |