基于JuiceFS 的低成本 Elasticsearch 云上备份存储

杭州火石创造是国内专注于产业大数据的数据智能服务商,为了解决数据存储及高效服务客户需求,选择了 Elasticsearch 搜索引擎进行云上存储。基于性能和成本的考虑,在阿里云选择用本地 SSD ECS 机型自建集群。但由于是自建集群,如何同步解决数据备份问题并实现最优成本呢?

1.背景介绍

Elasticsearch 的数据备份是通过快照机制实现的。为了完成集群的快照,需要依赖一个共享存储系统,即所有节点需要挂载到共享存储的同一个目录,并且每个节点对此目录需有读写权限,最初我们使用 NAS(即 NFS)来实现备份,这个方案也已经稳定运行多年。

在此,我还是再强调一下数据备份重要性。很多小伙伴误认为 Elasticsearch 具备副本机制,只要配置多副本就不怕数据丢失,为什么还要备份呢?需要指出是:再多的副本禁不住一个 DELETE 误操作;而且副本机制也要平衡成本,是在一定程度内的冗余,超过阈值一样会造成数据丢失,备份是业务持续性重要保障,有备才能无患!

云上成本的持续优化是运维人员始终面临的挑战。Snowflake 使用 S3 存储在成本效率方面给了我们很大的触动。接触到 JuiceFS 后,我们认为这是一款非常不错的存储产品。本着循序渐进原则,备份存储是一个非常不错的切入点,于是便有了基于 JuiceFS 来构建通用低成本云上备份存储解决方案,并着手实践。

2.成本比对

本文的标题就是低成本,成本低在哪里呢,我们用数据说话,以 10T NAS 和 OSS 资源包价格对比如下表所示:

资源型别原价(元/年)折扣价(元/年)
NAS存储-通用型36,86427,648
OSS-标准本地冗余13,2729,954

如果使用 OSS 替代 NAS,成本降低为原来 36%,接近 1/3,降本效果可谓显著,冲这咱就必须干!

等下,其他成本呢?JuiceFS 社区版还需要元数据存储,确实,这个也是需要计算成本。但是这年头,谁家的云上没有一个共享或者辅助用 RDS,作为备份系统,对 IO 的随机读写需求不高,这里咱就共享一个 MySQL RDS 来作为元数据存储。

3.部署过程

部署过程基本参照 JuiceFS 的官方文档完成,具体分成了三个步骤:

3.1 安装

安装过程很简单,一条命令搞定。默认是在安装 /usr/local/bin 下,考虑到不是所有的操作系统都是将该目录作为 PATH 的默认路径,从更加通用和省事的角度,我建议安装到 /usr/sbin 目录下,执行安装命令:

curl -sSL https://d.juicefs.com/install | sh - /usr/sbin

注意:该命令在所有的节点都要执行(所有的节点都要安装)

3.2 创建文件系统

有两个前置步骤这里略过:

  1. OSS 的 Bucket 及 AK 的准备这里略过,创建的 Bucket 名为: juicefs-backup

  2. 元数据存储因为使用了 MySQL,库及账号的创建也略过,创建的库名和用户名均为:juicefs。

有个小插曲,因为元数据使用了 MySQL,官方文档快速上手及元数据引擎最佳实践两个章节找不到参考和范例,有 PostgreSQL 没有 MySQL,开始我照猫画虎参照 PostgreSQL 写法,提示语法不对,最后在参考-如何设置元数据引擎章节找到了相关说明:

为啥要加这个括号我不是很理解,只能表示不明觉厉。不过建议官方文档元数据引擎最佳实践环节增加 MySQL 章节,这样前后可以呼应,方便读者查阅。

最终我的创建命令如下:


juicefs format \
    --storage oss \
    --bucket juicefs-backup.oss-cn-hangzhou-internal.aliyuncs.com \
    --access-key 【KEY】 \
    --secret-key 【SECRET】 \
    mysql://juicefs:【PASSWORD】@(【RDS-URL】:3306)/juicefs \
    elasticsearch

注意:

  1. 本条命令只需要在任一节点执行一次
  2. 【KEY】【SECRET】【PASSWORD】【RDS-URL】需要更换为实际值

3.3 挂载文件系统

挂载命令如下:

juicefs mount \
    --update-fstab \
    --background \
    --writeback \
    --cache-dir /data/juicefs-cache \
    --cache-size 10240 \
    -o user_id=$(id -u elasticsearch)  \
    mysql://juicefs:【PASSWORD】@\(【RDS-URL】:3306\)/juicefs \
    /backup

挂载相关参数说明如下:

  1. --update-fstab:更新 /etc/fstab,这样节点重启后,会自动挂载。

  2. --writeback:把数据写入本地缓存后再写到 OSS,提升备份效率,作为备份用途建议开启。

  3. --cache-dir /data/juicefs-cache--cache-size 10240:在 Elasticsearch 存储 SSD 上划出 10G 作为缓存(默认值是 100GB,考虑到成本因素,选用了 10GB),提高读写性能。

  4. -o user_id=$(id -u elasticsearch): 允许 elasticsearch 用户读写,经咨询官方工程师,这个参数不指定也可以。

注意:

  1. 本条命令需要在每个节点执行一次
  2. 【PASSWORD】【RDS-URL】需要更换为实际值

3.4 设置挂载目录权限

最后要确保挂载的目录能被 Elasticsearch 读写

chown elasticsearch:elasticsearch /backup

注意:本条命令需要在任一节点执行一次即可

3.5 注册Elasticsearch 快照仓库

首先需要在 Elasticsearch 的配置文件 elasticsearch.yaml 中配置 path.repo ,比如:

path:
      repo: 
             - /backup

注意:每个节点都需要修改配置,修改后需要重启服务

每个节点重启后,可以通过 Kibana 或者使用 Elasticsearch Snapshot API 注册。

PUT _snapshot/es-backup
{
    "type": "fs",
    "settings": {
      "location": "'/backup'",
      "compress": "true",
      "max_snapshot_bytes_per_sec": "100m",
      "max_restore_bytes_per_sec": "100m"
    }
  }

参数说明:

  1. es-bakup 是快照仓库的名称,可自定义

  2. compress 是否启用压缩,我们是启用,可以节约空间占用

  3. max_snapshot_bytes_per_sec/max_restore_bytes_per_sec 最大快照及恢复的速度根据自己的情况设置,我们设定为:100M/秒

最后,具体备份实施的操作这里就不再细写,可参考Elasticsearch 官方文档。

4. 踩坑经历

完成上述准备工作后,本来满心欢喜坐等备份成功,不想却出现了新事物尝试路上必有姿势:踩坑!

在备份点创建过程中出现了个别节点的权限异常问题,这个就碰到分布式集群读写共享存储的共性问题:不同节点进程的 username 和 id 是否完全一致?解决这个问题一般有两个思路:

  1. 不动现有的环境,通过用户映射的方式来解决这个问题,毫无疑问,这当然是最佳的方式。但是我翻了好几遍官方文档,并尝试根据节点 Elasticsearch 用户不同的 id 来挂载(见3.3 挂载命令),验证结果挂载的文件系统的用户属性还是取决于实际进程;于是就想到了 NFS 文件系统有个参数叫 all_squash,即将所有的用户都映射到一个特定的用户比如 nobody 上,但是很遗憾,JiuceFS 目前只能实现 root_squash,做不到 all_squash ,此问题最后反馈了 JuiceFS 的开发人员,详见 Github 上的 PR。

  2. 改变现有的环境,使所有的 Elasticsearch 用户的 id 保持一致,得益于 Elasticsearch 优秀的容灾迁移能力,最终我通过在特定节点重装了一下 Elasticserach 来解决这个问题(最后发现其实这个问题的产生源于 Elasticsearch 和 kibana 安装先后顺序)。

5.结语

通过上述步骤及措施的实施,最后 Elasticsearch 快照备份方案最终实现并持续运作,备份的效率也完全不输 NAS 存储。

本文以分布式集群备份为例,其方案完全可以用在其他各种单机系统备份中,同时借助 JuiceFS 广泛的数据存储和元数据引擎的适配性,也可以使其成为一个通用的低成本云上备份存储解决方案。

希望这篇内容能够对你有一些帮助,如果有其他疑问欢迎加入 JuiceFS 社区与大家共同交流。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机实验(一)

前言 实验一:用单片机控制多只数码管(屏)分别左、右滚动显示自己完整的学号; 实验二:用单片机控制LED1616点阵交替正序、逆序显示自己的中文姓名。 参考链接: LED数码管的静态显示与动态显示(KeilProteus&#xff0…

uboot 添加命令

前言 uboot 中有个 ping 命令&#xff0c;用来检查网络是否通畅。 我们照着这个命令添加一个 ping2 命令。 step1 cmd/net.c #if defined(CONFIG_CMD_PING2) static int do_ping2(struct cmd_tbl *cmdtp, int flag, int argc,char *const argv[]) {if (argc < 2)return …

【Phoenix】请求的生命周期

本文的目的是讨论Phoenix请求的生命周期。我们实战添加两个新的页面&#xff0c;并讨论整个过程是如何串起来的。 让我们从添加第一个新页面开始。 添加一个新页面 web应用通常通过将HTTP方法和路径映射到应用的某个函数来处理请求。Phoenix通过路由器来实现这个匹配。例如将…

uniapp app tabbar 页面默认隐藏

1.在page.json 中找到tabbar visible 默认为true,设为false则是不显示 uni.setTabBarItem({ index: 1, //列表索引 visible:true //显示或隐藏 })

【C++】-- 红黑树详解

目录 一、红黑树概念 1.概念 2.性质 二、红黑树定义 1.红黑树节点定义 &#xff08;1&#xff09;将新插入节点置为红色 &#xff08;2&#xff09;将新插入节点置为黑色 2.红黑树定义 三、红黑树插入 1.插入节点 2.控制颜色 &#xff08;1&#xff09;父亲为黑色 &#xff0…

Games104现代游戏引擎笔记 面向数据编程与任务系统

Basics of Parallel Programming 并行编程的基础 核达到了上限&#xff0c;无法越做越快&#xff0c;只能通过更多的核来解决问题 Process 进程 有独立的存储单元&#xff0c;系统去管理&#xff0c;需要通过特殊机制去交换信息 Thread 线程 在进程之内&#xff0c;共享了内存…

如何在 Nginx Proxy Manager(NPM)上部署静态网站

前言 众所周知&#xff0c;我们在之前介绍过 Nginx Proxy Manager&#xff08;以下简称 NPM) 这个反向代理的神器&#xff0c;对于一些 Docker 搭建的 Web 项目&#xff0c;NPM 能够很轻松地给他们做反向代理。 然而对于一些静态网站&#xff0c;小伙伴们可能不知道怎么用 NP…

15分钟,不,用模板做数据可视化只需5分钟

测试显示&#xff0c;一个对奥威BI软件不太熟悉的人来开发数据可视化报表&#xff0c;要15分钟&#xff0c;而当这个人去套用数据可视化模板做报表&#xff0c;只需5分钟&#xff01; 数据可视化模板是奥威BI上的一个特色功能板块。用户下载后更新数据源&#xff0c;立即就能获…

LeetCode【560】和为k的子数组

题目&#xff1a; 思路&#xff1a; 转化为前缀和问题&#xff0c;和为k&#xff0c;即为&#xff1a;前缀和差值为k的情况统计&#xff1b; 为什么要转化为前缀和呢&#xff1f;因为和为k的子数组可能有n个元素&#xff0c;但是前缀和差值为k&#xff0c;只有两个元素&#…

微机原理_9

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。 1.当运算结果的最高位为1时&#xff0c;标志位(&#xff09; A. CF1 B. OF1 C. SF1 D. ZF1 2、汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句中不可…

HTTP1.1协议详解

目录 协议介绍协议的特点存在的问题协议优化方案与HTTP 1.0协议的区别 协议介绍 HTTP 1.1是一种基于文本的互联网实体信息交互协议&#xff0c;是Web上任何数据交换和客户端-服务器交互的基础。它允许获取各种类型的资源&#xff0c;如HTML文档&#xff0c;并支持在互联网上交…

系列三、双亲委派机制

一、概述 当一个类收到了类加载的请求&#xff0c;它首先不会尝试自己去加载这个类&#xff0c;而是把这个请求委派给父类去完成&#xff0c;每一层的类加载器都是如此&#xff0c;因此所有的请求都应该传送到启动类加载器中&#xff0c;只有当父类加载器反馈自己无法完成这个…

arcgis--创建多分辨率DEM

方法一&#xff1a;技术链为【栅格转点】-【创建TIN】-【TIN转栅格】。首先需要将栅格转成点数据&#xff0c;再根据点数据创建TIN&#xff0c;再将TIN转栅格。 1、打开一幅DEM影像图&#xff0c;如下&#xff1a; 在【转换工具】-【由栅格转出】 -【栅格转点】工具中&#xf…

设计模式(4)-行为型模式

行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在类间…

LeetCode(18)整数转罗马数字【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 12. 整数转罗马数字 1.题目 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X …

SpringBoot--中间件技术-4:整合Shiro,Shiro基于会话SessionManager实现分布式认证,附案例含源代码!

SpringBoot整合安全中间件Shiro 技术栈&#xff1a;SpringBootShiro 代码实现 pom文件加坐标 Springboot版本选择2.7.14 &#xff1b;java版本1.8 &#xff1b; shiro做了版本锁定 1.3.2 <properties><java.version>1.8</java.version><!--shiro版本锁定…

鸿蒙:从0到“Hello Harmony”

效果展示 一.概述 明年华为鸿蒙就不再兼容Android生态了&#xff0c;作为拥有7亿终端用户的华为&#xff0c;建立自己的生态也是理所当然。 所以对HarmonyOS的研究也是众多开发者绕不开的坎了。 今天这篇博文主要实现一个“Hello Harmony&#xff01;”的Demo。 二.官方链接…

ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

SystemVerilog学习 (6)——验证平台

一、概述 测试平台&#xff08;Testbench&#xff09;是整个验证系统的总称。它包含了验证系统的各个组件、组件之间的互联关系&#xff0c;测试平台的配置与控制等&#xff0c; 从更系统的意义来讲&#xff0c;它还包括编译仿真的流程、结果分析报告和覆盖率检查等。 从狭义上…

【ArcGIS Pro二次开发】(76):面积平差工具

之前做过一个【三调土地利用现状分类面积汇总】的工具&#xff0c;在流程中使用了面积平差的方法。 考虑了在其它场合可能也需要进行面积平差&#xff0c;因此单独提取出来作为一个工具。 平差实现的方法如下图&#xff1a; 主要的计算过程如上图所示&#xff0c;算出总面积差…