MSE ZooKeeper 数据导入导出功能上线

news2025/1/22 23:52:47

作者:草谷

背景

MSE 提供了托管版的 ZooKeeper,拥有比自建开源 ZooKeeper 稳定性更高的SLA,同时管控面提供了丰富的服务自治功能。赶在2022年的岁末,MSE ZooKeeper 上线了一个非常实用的功能-数据导入导出功能,彻底解决了困恼用户长期以来无法自助处理数据的问题。通过阅读本文,你可以快速获得以下知识点和能力:

  • ZooKeeper 的持久化文件原理
  • 什么场景下会使用到导入导出功能
  • 如何在 MSE 上面使用导入导出功能

存储原理

此次上线的导出功能支持的数据类型包含快照文件snap和事物日志,在介绍功能之前,我们看下 ZooKeeper 的这2个数据文件是用来做什么的。

在 ZooKeeper 中,主要会产生2种和数据相关的持久化文件,一个是内存的数据快照 Snapshot 文件,另外一个是事务日志 log 文件;它们分别是什么作用,有什么区别呢?

下面2段代码是 Snap 快照的写入内容和产生的时机:

public void save(
    DataTree dataTree,
    ConcurrentHashMap<Long, Integer> sessionsWithTimeouts,
    boolean syncSnap) throws IOException {
    long lastZxid = dataTree.lastProcessedZxid;
    File snapshotFile = new File(snapDir, Util.makeSnapshotName(lastZxid));
    try {
        snapLog.serialize(dataTree, sessionsWithTimeouts, snapshotFile, syncSnap);
    } catch (IOException e) {
     //
    }
}

private boolean shouldSnapshot() {
    int logCount = zks.getZKDatabase().getTxnCount();
    long logSize = zks.getZKDatabase().getTxnSize();
    return (logCount > (snapCount / 2 + randRoll))
           || (snapSizeInBytes > 0 && logSize > (snapSizeInBytes / 2 + randSize));
}

可以看到,Snapshot 写入的是一个 DataTree 的数据结构,里面存储的是 ZooKeeper 的全量内存数据,而生成 Snapshot 的条件,主要涉及到 snapCount,snapCount 是一个可配置的参数,默认是10W,也就是 Snapshot 是 Zookeeper 的内存快照,是一份全量数据,而这份全量数据,也并非实时写入到磁盘中的,需要达到一定的条件才会写入。

再看 ZooKeeper 的事务日志,针对客户端的每一次事务操作,Zookeeper 都会将他们记录到事务日志中,同时也会将数据变更应用到内存数据库中。刚才说到 Snapshot 的生成并非实时的,在上一次内存快照生成后,到下一份生成之前,就会有一部分数据没有写入到 Snapshot 中,那么这部分增量的数据,我们可以从事务日志中找到。

总结一下,简单来说,Snapshot 是存储的全量数据,事务日志 log 文件是记录着完整的每次事务操作,所以如果要完整的恢复一个 ZooKeeper 集群的数据,需要同时具备这2个文件。

使用场景

MSE 数据导入导出功能主要来自于客户的需求反馈,主要有如下三种使用场景:

数据的备份

如果需要对集群某个时刻的数据进行备份,用于后续恢复或者容灾使用,可以使用 MSE 的数据导出功能,将集群的数据导出成文件进行存储,如果集群出现了数据不符合预期的情况下,可以通过导入的功能,将集群数据恢复到备份时的状态

集群的迁移

需要迁移到新的 ZooKeeper 集群,又依赖到原 ZooKeeper 集群的数据时,可以通过 MSE 的数据导出功能,将数据导出,然后再放到新集群中,重新初始化,这样就相当于做了一次全量的数据迁移,这种迁移是需要停机的,但胜在简单易操作

分析客户端业务

MSE 导出的 Snapshot 文件和 log 文件,可以通过 ZooKeeper 自带的解析工具,解析成明文,里面包含的信息非常丰富,每条数据的大小,访问频率等,通过这些,可以查到一部分客户端是否错用 Zookeeper,能具体到路径,帮助揪出有问题的客户端。例如我们遇到过有用户客户端错用导致一个 Session 写入了大量的数据,最后通过分析事务文件,找到了具体的客户端IP和应用名,解除了风险。

动手实践

接下来,给大家介绍下,如何对一个集群的数据进行导入导出:

将集群的数据进行导出

导入导出功能在 ZooKeeper 专业版的数据管理-节点管理-面板中,基础版目前暂不支持,请升级到专业版:

在这里插入图片描述

点击数据导出按钮,即可将这个集群的数据进行导出:

在这里插入图片描述

此刻会出现导出的功能页面,这里支持导出的文件将分开展示,也就是,快照导出,和事务日志导出需要单独选择,这样也是为了满足不同需求的用户,同时也能提高导出效率;

按需选择,点击导出后,大概2-5分钟,可下载的文件会显示在下载列表中,进行下载即可。

在这里插入图片描述

将导出的数据导入到另一个集群中

点击数据导入按钮,出现导入数据对话框,这里直接选择上转上一步导出的 Snapshot 文件即可:

在这里插入图片描述

整体的数据导入导出功能就演示完了,简单高效,相比于自建 ZooKeeper 的数据腾挪,效率提高了100%,并且导入数据后,集群的初始化也是自动的,不用再担心因为操作步骤错误导致集群起不来了。

运营活动

重磅推出 MSE 专业版,更具性价比,可直接从基础版一键平滑升级到专业版!

在这里插入图片描述

点击此处查看购买

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis自动生成增删改查代码

GitHub项目地址 Gitee项目地址 使用 mybatis generator 自动生成代码&#xff0c;实现数据库的增删改查。 1 配置Mybatis插件 在pom文件添加依赖&#xff1a; <plugins> <plugin><groupId>org.mybatis.generator</groupId><artifactId>myba…

宝塔面板Nginx开启Brotli压缩,提升网站加载速度

前言Google 认为互联网用户的时间是宝贵的&#xff0c;他们的时间不应该消耗在漫长的网页加载中&#xff0c;因此在 2015 年 9 月 Google 推出了无损压缩算法 Brotli。Brotli 通过变种的 LZ77 算法、Huffman 编码以及二阶文本建模等方式进行数据压缩&#xff0c;与 Gzip相比效率…

图解cross attention

英文参考链接&#xff1a; https://vaclavkosar.com/ml/cross-attention-in-transformer-architecture 交叉注意力与自我注意力 除了输入&#xff0c;cross-attention 计算与self-attention相同。交叉注意力不对称地组合了两个相同维度的独立嵌入序列&#xff0c;相比之下&a…

移动互联网社交江湖已定,抖音为何仍不放过微信?

进入2023年&#xff0c;抖音集团依然放不下“社交梦”。2022年12月30日&#xff0c;抖音官网上线了一款名为“抖音聊天”的桌面端聊天软件&#xff0c;提供Windows和Mac两个版本&#xff0c;进入软件需使用抖音App扫码登录。这并不是抖音集团首次推出社交产品。2019年以来&…

Day854.两阶段终止模式 -Java 并发编程实战

两阶段终止模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于两阶段终止模式的内容。 从纯技术的角度看&#xff0c;都是启动多线程去执行一个异步任务。既启动&#xff0c;那又该如何终止呢&#xff1f; 那如何优雅地终止线程&#xff0c;正所谓有始有终。在Ja…

Kafka 概念

Kafka 属于分布式的消息引擎系统&#xff0c;主要功能 &#xff1a;提供一套完备的消息发布与订阅解决方案 生产者和消费者都是客户端&#xff08;Clients&#xff09;&#xff1a; 生产者&#xff08;Producer&#xff09;&#xff1a;向主题发布消息的客户端应用程序消费者…

前端基础(九)_this基本使用、this指向判断、改变this指向的方法

前言&#xff1a; 看这个例子&#xff1a; 例&#xff1a;给所有的div标签都添加点击事件&#xff0c;并打印当前节点的内容 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compa…

HW14基于规则化的终身学习Regularization-based Lifelong Learning

文章目录一、介绍-终身学习目标数据集任务示例代码-准备数据模型体系结构样本代码-训练和评估Training Pipeline:MAS - Memory Aware SynapseSISCP - Sliced Cramer Preservation二、实验1、baseline2、EWC3、MAS4、SI5、RWalk6、SCP一、介绍-终身学习 目标 一个模型可以打败…

Naive UI 组件使用体验之-级联选择 Cascader

使用场景 地址区域选择 简单使用 安装依赖 npm install naive-ui -D 按需引入之-手动引入 import {NCascader,CascaderOption } from naive-ui 使用 <n-cascader:value"regionValue":options"regionOptions":multiple"false"placehol…

一篇搞懂Python中的随机数

在 python 中生成随机样本的所有你需要的示例列表 长按关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 在这篇博客中&#xff0c;我将演示如何根据不同的需求在python…

Docker三剑客——Docekr Swarm

目录 一、概述 二、Swarm 的核心概念 1. Node&#xff08;节点&#xff09; 2. Service&#xff08;服务&#xff09; 3. Task&#xff08;任务&#xff09; 三、Swarm 服务的运行部分 1. 工作节点 2. 服务、任务和容器 3. 任务和调度 4. 副本服务和全局服务 四、Swa…

3. 【prometheus 学习】prometheus数据类型

prometheus 四种数据类型学习及测试 安装 1&#xff09;从官网下载对应版本的二进制压缩包并解压 2&#xff09;新建prometheus.yml 文件&#xff0c;静态指定抓取本机的9091端口&#xff0c;设置采样时间2秒1次&#xff0c;方便一会测试。 scrape_configs:- job_name: defin…

单细胞UMAP图只标记特定细胞群、圈定细胞群及坐标轴修改

最近有小伙伴私信我&#xff0c;如下的单细胞UMAP图怎么做&#xff1f;是啥样的图呢&#xff1f;就是UMAP图上其他群是灰色的&#xff0c;只有某个群或者某几个群是标记颜色的&#xff0c;比较突出。其实很简单&#xff0c;一种办法可参考我们之前写过的ggplot做UMAP图&#xf…

uni-app使用蓝牙

目录 前言 连接蓝牙 开启蓝牙适配器 发现蓝牙 连接蓝牙 收发蓝牙数据 获取服务ID 获取特征值 读取蓝牙数据 写蓝牙数据 遇到的坑 获取serviceId的坑 特征值不支持读写 notify成功后立刻写蓝牙数据 工具方法 前言 原因是公司要搞个共享单车给内部员工使用&#…

32位浮点数表示方法

今天开始给大家介绍计算机组成原理课程&#xff0c;本文主要内容是32位浮点数表示方法。 一、32位浮点数构成 32位浮点数是计算机中常见的一种数据类型&#xff0c;该数占据32bit空间&#xff0c;可以表示较大范围内的整数和小数。32位浮点数由三部分组成&#xff0c;分别是符…

Java集合List、Set、Map底层源码解析

目录集合介绍MapHashMapLinkedHashMapHashTablePropertiesCollectionListArrayListVectorLinkedListSetHashSetLinkedHashSetTreeSet集合介绍 为什么使用集合&#xff1f; 当我们想要保存一组数据时&#xff0c;可以使用到的变量类型有集合和数组。那么就像说一下数组的局限性…

1.9

完善案例 ​ this.$nextTick(function () {this.$refs.input.focus()})}​ //点击编辑直接获取焦点 this.$refs.input.focus() //但是这种写法 由于input是用v-show控制的 所以执行了上面代码 改变了isEdit值 但是不会立马去重新解析模板 input框还没有出来 //将handleedit回调…

springboot+xxl-job初体验

在日常开发中经常遇到任务调度的需求&#xff0c;下面体验一下分布式调度xxl-job。 1、常见定时任务的实现方式 Java自带的java.util.Timer类ScheduledExcutorServiceSpringboot自带的EnableScheduling注解Quartz框架Elastic-job框架XXL-JOB框架 下面对xxl-job实现任务调度尝…

【TypeScript】TS进阶-函数重载(七)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

一文读懂电商数字员工究竟是什么?| RPA铺第1期

百度的曦灵&#xff0c;中核的核小智、万科集团数字员工“崔筱盼”都曾在2022年度爆火&#xff0c;数字员工一夜之间成为众多行业追捧的对象&#xff0c;那么&#xff0c;他/她们究竟代表着什么&#xff0c;对企业而言&#xff0c;是噱头大于收益&#xff0c;还是收益大于噱头呢…