利用HDFS实现ElasticSearch7.2容灾方案

前言

​ Elasticsearch 副本提供了高可靠性,它们让你可以容忍零星的节点丢失而不会中断服务。但是,副本并不提供对灾难性故障的保护。对这种情况,就需要的是对集群真正的备份(在某些东西确实出问题的时候有一个完整的拷贝)。

​ 案例模拟ElasticSearch7.2集群环境,采用snapshot API基于快照的方式备份集群。

​ 案例演示HDFS分布式文件系统作为仓库举例。

快照版本兼容

备份集群

HDFS文件系统

软件下载

下载地址

  1. hadoop-3.3.0.tar.gz

JDK环境

hadoop java编写,运行需依赖jvm

  1. jdk-8u161-linux-x64.tar.gz

配置系统环境变量

  1. #JAVA
  2. export JAVA_HOME=/home/hadoop/jdk1.8.0_161
  3. export CLASSPATH=$JAVA_HOME/libdt.jar:$JAVA_HOME/tools.jar
  4. #hadoop
  5. export HADOOP_HOME=/home/hadoop/hadoop-3.3.0
  6. export PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

hadoop配置

hadoop-3.3.0/etc/hadoop 的目录下

配置JAVA_HOME

hadoop-env.sh

  1. export JAVA_HOME=/home/hadoop/jdk1.8.0_161

配置核心组件文件

core-site.xml需要在和之间添加

  1. <property>
  2. <name>fs.defaultFS</name>
  3. <value>hdfs://172.16.176.103:9000</value>
  4. </property>
  5. <property>
  6. <name>hadoop.tmp.dir</name>
  7. <value>/data</value>
  8. </property>

配置文件系统

hdfs-site.xml需要在和之间添加

  1. <!--namenode-->
  2. <property>
  3. <name>dfs.namenode.name.dir</name>
  4. <value>/data/namenode</value>
  5. </property>
  6. <!--datanode-->
  7. <property>
  8. <name>dfs.datanode.data.dir</name>
  9. <value>/data/datanode</value>
  10. </property>
  11. <!--副本数,默认1-->
  12. <property>
  13. <name>dfs.replication</name>
  14. <value>1</value>
  15. </property>
  16. <!--禁用权限检查,配合es-->
  17. <property>
  18. <name>dfs.permissions</name>
  19. <value>false</value>
  20. </property>

配置mapred

mapred-site.xml

  1. <property>
  2. <name>mapreduce.framework.name</name>
  3. <value>yarn</value>
  4. </property>

配置 yarn-site.xml

yarn-site.xml

  1. <property>
  2. <name>yarn.resourcemanager.hostname</name>
  3. <value>elasticsearch01</value>
  4. </property>

格式化文件系统

  1. hdfs namenode -format

启动hdfs

start-dfs.sh

  1. $ start-dfs.sh
  2. WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
  3. Starting namenodes on [host103]
  4. Starting datanodes
  5. Starting secondary namenodes [host103]

访问

  1. http://localhost:9870/

ES插件安装

集群中每个节点都必须安装hdfs插件,安装后需重启ES

插件下载

插件版本和ES版本相对应

下载地址

  1. repository-hdfs-7.2.0.zip

插件安装

提前下载软件包,离线安装

集群中各节点依次安装

sudo bin/elasticsearch-plugin install file:///path/to/plugin.zip

  1. $ ./elasticsearch-plugin install file:///home/es/repository-hdfs-7.2.0.zip
  2. -> Downloading file:///home/es/repository-hdfs-7.2.0.zip
  3. [=================================================] 100%  
  4. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  5. @ WARNING: plugin requires additional permissions @
  6. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  7. * java.lang.RuntimePermission accessClassInPackage.sun.security.krb5
  8. * java.lang.RuntimePermission accessDeclaredMembers
  9. * java.lang.RuntimePermission getClassLoader
  10. * java.lang.RuntimePermission loadLibrary.jaas
  11. * java.lang.RuntimePermission loadLibrary.jaas_nt
  12. * java.lang.RuntimePermission loadLibrary.jaas_unix
  13. * java.lang.RuntimePermission setContextClassLoader
  14. * java.lang.RuntimePermission shutdownHooks
  15. * java.lang.reflect.ReflectPermission suppressAccessChecks
  16. * java.net.SocketPermission * connect,resolve
  17. * java.net.SocketPermission localhost:0 listen,resolve
  18. * java.security.SecurityPermission insertProvider.SaslPlainServer
  19. * java.security.SecurityPermission putProviderProperty.SaslPlainServer
  20. * java.util.PropertyPermission * read,write
  21. * javax.security.auth.AuthPermission doAs
  22. * javax.security.auth.AuthPermission getSubject
  23. * javax.security.auth.AuthPermission modifyPrincipals
  24. * javax.security.auth.AuthPermission modifyPrivateCredentials
  25. * javax.security.auth.AuthPermission modifyPublicCredentials
  26. * javax.security.auth.PrivateCredentialPermission javax.security.auth.kerberos.KerberosTicket * "*" read
  27. * javax.security.auth.PrivateCredentialPermission javax.security.auth.kerberos.KeyTab * "*" read
  28. * javax.security.auth.PrivateCredentialPermission org.apache.hadoop.security.Credentials * "*" read
  29. * javax.security.auth.kerberos.ServicePermission * initiate
  30. See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
  31. for descriptions of what these permissions allow and the associated risks.
  32. Continue with installation? [y/N]y
  33. -> Installed repository-hdfs
  34. $

创建仓库

  • 创建
  1. PUT _snapshot/my_hdfs_repository
  2. {
  3. "type": "hdfs", --类型
  4. "settings": {
  5. "uri": "hdfs://172.16.176.103:9000/", --hdfs访问url
  6. "path": "/data",
  7. "conf.dfs.client.read.shortcircuit": "false"
  8. }
  9. }
  • 查看
  1. GET /_snapshot
  2. {
  3. "my_hdfs_repository" : {
  4. "type" : "hdfs",
  5. "settings" : {
  6. "path" : "/data",
  7. "uri" : "hdfs://172.16.176.103:9000/",
  8. "conf" : {
  9. "dfs" : {
  10. "client" : {
  11. "read" : {
  12. "shortcircuit" : "false"
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }

创建快照

  • 创建快照

不等待快照完成,即刻返回结果

  1. PUT _snapshot/my_hdfs_repository/snapshot_i_xfjbblxt_cxfw_xfj_d12
  2. {
  3. "indices": "i_xfjbblxt_cxfw_xfj_d12"
  4. }
  • 查看快照当前状态
  1. GET _snapshot/my_hdfs_repository/snapshot_i_xfjbblxt_cxfw_xfj_d12
  2. {
  3. "snapshots" : [
  4. {
  5. "snapshot" : "snapshot_i_xfjbblxt_cxfw_xfj_d12",
  6. "uuid" : "-BS9XjxvS1Sp6wW_bT02lA",
  7. "version_id" : 7020099,
  8. "version" : "7.2.0",
  9. "indices" : [
  10. "i_xfjbblxt_cxfw_xfj_d12"
  11. ],
  12. "include_global_state" : true,
  13. "state" : "IN_PROGRESS", --正在做快照中
  14. "start_time" : "2020-10-12T14:04:49.425Z", --开始时间
  15. "start_time_in_millis" : 1602511489425,
  16. "end_time" : "1970-01-01T00:00:00.000Z",
  17. "end_time_in_millis" : 0,
  18. "duration_in_millis" : -1602511489425,
  19. "failures" : [ ],
  20. "shards" : {
  21. "total" : 0,
  22. "failed" : 0,
  23. "successful" : 0
  24. }
  25. }
  26. ]
  27. }
  • 完成状态
  1. {
  2. "snapshots" : [
  3. {
  4. "snapshot" : "snapshot_i_xfjbblxt_cxfw_xfj_d12", --快照名称
  5. "uuid" : "-BS9XjxvS1Sp6wW_bT02lA",
  6. "version_id" : 7020099,
  7. "version" : "7.2.0",
  8. "indices" : [
  9. "i_xfjbblxt_cxfw_xfj_d12" --索引
  10. ],
  11. "include_global_state" : true,
  12. "state" : "SUCCESS", --快照成功
  13. "start_time" : "2020-10-12T14:04:49.425Z", --开始时间
  14. "start_time_in_millis" : 1602511489425, --开始时间戳
  15. "end_time" : "2020-10-12T14:24:33.942Z", --结束时间
  16. "end_time_in_millis" : 1602512673942, --结束时间戳
  17. "duration_in_millis" : 1184517, --耗时(毫秒)
  18. "failures" : [ ],
  19. "shards" : {
  20. "total" : 5, --总分片
  21. "failed" : 0,
  22. "successful" : 5 --成功分片
  23. }
  24. }
  25. ]
  26. }

恢复快照

快照恢复如果恢复到原索引中,需要先把原索引关闭或者先删除后,在进行快照恢复

  • 恢复快照
  1. POST _snapshot/my_hdfs_repository/snapshot_i_xfjbblxt_cxfw_xfj_d12/_restore
  2. {
  3. "indices": "i_xfjbblxt_cxfw_xfj_d12" --快照备份索引名称
  4. ,"rename_pattern": "i_xfjbblxt_cxfw_xfj_d12" --检索匹配到的索引名称
  5. , "rename_replacement": "restored_i_xfjbblxt_cxfw_xfj_d12" --重命名索引
  6. }
  • 状态查看
  1. {
  2. "restored_i_xfjbblxt_cxfw_xfj_d12" : {
  3. "shards" : [
  4. {
  5. "id" : 4,
  6. "type" : "SNAPSHOT",
  7. "stage" : "INDEX",
  8. "primary" : true,
  9. "start_time_in_millis" : 1602571287856,
  10. "total_time_in_millis" : 1249147,
  11. "source" : {
  12. "repository" : "my_hdfs_repository",
  13. "snapshot" : "snapshot_i_xfjbblxt_cxfw_xfj_d12",
  14. "version" : "7.2.0",
  15. "index" : "i_xfjbblxt_cxfw_xfj_d12",
  16. "restoreUUID" : "KM1EaKsAQkO4OxB0PwKe0Q"
  17. },
  18. "target" : {
  19. "id" : "DWvUrfqQRxGLIWm6SQmunA",
  20. "host" : "172.16.176.104",
  21. "transport_address" : "172.16.176.104:9300",
  22. "ip" : "172.16.176.104",
  23. "name" : "node-104"
  24. },
  25. "index" : {
  26. "size" : {
  27. "total_in_bytes" : 8312825377,
  28. "reused_in_bytes" : 0,
  29. "recovered_in_bytes" : 6781859331,
  30. "percent" : "81.6%"
  31. },
  32. "files" : {
  33. "total" : 104,
  34. "reused" : 0,
  35. "recovered" : 86,
  36. "percent" : "82.7%"
  37. },
  38. "total_time_in_millis" : 1249039,
  39. "source_throttle_time_in_millis" : 0,
  40. "target_throttle_time_in_millis" : 0
  41. },
  42. "translog" : {
  43. "recovered" : 0,
  44. "total" : 0,
  45. "percent" : "100.0%",
  46. "total_on_start" : 0,
  47. "total_time_in_millis" : 0
  48. },
  49. "verify_index" : {
  50. "check_index_time_in_millis" : 0,
  51. "total_time_in_millis" : 0
  52. }
  53. },
  54. --部分省略

备份恢复时间

案例快照详情

第一次快照

节点数 主分片 副本分配 数据量 大小 快照大小 耗时(快照)
3 5 1 5149535 77.4gb 40gb 19.74195分钟

案例快照恢复详情

快照恢复过程为并行恢复

分片 耗时(恢复) 恢复字节
0(主) 27.42分钟 7.75G
1(主) 27.14分钟 7.72G
2(主) 27.45分钟 7.75G
3(主) 25.89分钟 7.74G
4(主) 25.5分钟 7.74G
0(副) 18.65分钟 7.75G
1(副) 10.3分钟 7.72G
2(副) 17.21分钟 7.75G
3(副) 10.6分钟 7.74G
4(副) 18.32分钟 7.74G

常见问题

启动hdfs

问题1

  1. $ start-dfs.sh
  2. WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
  3. Starting namenodes on [host103]
  4. Last login: Sun Oct 11 22:32:11 CST 2020 from 172.16.176.46 on pts/1
  5. host103: ERROR: JAVA_HOME is not set and could not be found.
  6. Starting datanodes
  7. Last login: Sun Oct 11 22:32:23 CST 2020 on pts/1
  8. localhost: ERROR: JAVA_HOME is not set and could not be found.
  9. Starting secondary namenodes [host103]
  10. Last login: Sun Oct 11 22:32:24 CST 2020 on pts/1
  11. host103: ERROR: JAVA_HOME is not set and could not be found.
  • 解决

配置java环境变量

  1. export JAVA_HOME=/home/hadoop/jdk1.8.0_161
  2. export CLASSPATH=$JAVA_HOME/libdt.jar:$JAVA_HOME/tools.jar
  3. export PATH=$JAVA_HOME/bin:$PATH

问题2

  1. $ start-dfs.sh
  2. WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
  3. Starting namenodes on [host103]
  4. host103: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
  5. Starting datanodes
  6. localhost: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
  7. Starting secondary namenodes [host103]
  8. host103: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
  • 解决

hadoop用户执行

  1. [hadoop@host103 ~]$ ssh-copy-id hadoop@host103
  2. /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/hadoop/.ssh/id_rsa.pub"
  3. /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
  4. /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
  5. hadoop@host103's password:
  6. Number of key(s) added: 1
  7. Now try logging into the machine, with: "ssh 'hadoop@host103'"
  8. and check to make sure that only the key(s) you wanted were added.

创建仓库

问题1

  • 创建
  1. PUT _snapshot/my_hdfs_repository
  2. {
  3. "type": "hdfs",
  4. "settings": {
  5. "uri": "hdfs://172.16.176.103:9000/",
  6. "path": "/",
  7. "conf.dfs.client.read.shortcircuit": "false"
  8. }
  9. }
  • 错误
  1. error": {
  2. "root_cause": [
  3. {
  4. "type": "repository_exception",
  5. "reason": "[my_hdfs_repository] cannot create blob store"
  6. }
  7. ],
  8. "type": "repository_exception",
  9. "reason": "[my_hdfs_repository] cannot create blob store",
  10. "caused_by": {
  11. "type": "unchecked_i_o_exception",
  12. "reason": "Cannot create HDFS repository for uri [hdfs://172.16.176.103:9000/]",
  13. "caused_by": {
  14. "type": "access_control_exception",
  15. "reason": "Permission denied: user=es, access=WRITE, inode=\"/\":hadoop:supergroup:drwxr-xr-x\n\tat org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:496)\n\tat org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:336)\n\tat org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermissionWithContext(FSPermissionChecker.java:360)\n\tat org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:239)\n\tat org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1909)\n\tat org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1893)\n\tat org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkAncestorAccess(FSDirectory.java:1852)\n\tat org.apache.hadoop.hdfs.server.namenode.FSDirMkdirOp.mkdirs(FSDirMkdirOp.java:60)\n\tat org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:3407)\n\tat org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:1161)\n\tat org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB.java:739)\n\tat org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)\n\tat org.apache.hadoop.ipc.ProtobufRpcEngine2$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:532)\n\tat org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1070)\n\tat org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:1020)\n\tat org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:948)\n\tat java.security.AccessController.doPrivileged(Native Method)\n\tat javax.security.auth.Subject.doAs(Subject.java:422)\n\tat org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1845)\n\tat org.apache.hadoop.ipc.Server$Handler.run(Server.java:2952)\n",
  • 问题解决

新增hdfs-site.xml

  1. <property>
  2. <name>dfs.permissions</name>
  3. <value>false</value>
  4. </property>

参考文档

  • HDFS插件

https://www.elastic.co/guide/en/elasticsearch/plugins/7.2/repository-hdfs.html

  • HDFS SingleCluster

https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/SingleCluster.html

利用HDFS实现ElasticSearch7.2容灾方案的更多相关文章

  1. [Hbase]Hbase容灾方案

    介绍两种HBase的数据备份或者容灾方案:Snapshot,Replication: 一.Snapshot 开启快照功能,在hbase-site.xml文件中添加如下配置项: <property ...

  2. hbase数据备份或者容灾方案

    HBase的数据备份或者容灾方案有这几种:Distcp,CopyTable,Export/Import,Snapshot,Replication,以下分别介绍(以下描述的内容均是基于0.94.20版本 ...

  3. Hbase数据备份&&容灾方案

    Hbase数据备份&&容灾方案 标签(空格分隔): Hbase 一.Distcp 在使用distcp命令copy hdfs文件的方式实现备份时,需要禁用备份表确保copy时该表没有数据 ...

  4. MongDB集群容灾方案步骤

    MongoDB复制集优/特点支持大数据量.高扩展性.高性能.灵活数据模型.高可用性.同步机制数据复制的目的是使数据得到最大的可用性,避免单点故障引起的整站不能访问的情况的发生,Mongodb的副本集在 ...

  5. 【亲述】Uber容错设计与多机房容灾方案 - 高可用架构系列

    此文是根据赵磊在[QCON高可用架构群]中的分享内容整理而成.转载请事先联系赵磊及相关编辑. 赵磊,Uber高级工程师,08年上海交通大学毕业,曾就职于微软,后加入Facebook主要负责Messen ...

  6. keepalived容灾方案,实现nginx负载均衡主从架构(1)

    一:环境准备:4台nginx服务器,两台用yum安装,两台使用源码安装 第一步:使用yum安装nginx服务器,在浏览器输入ip,可以显示以下内容,这步比较简单,安装好修改/usr/share/ngi ...

  7. QQ 相册后台存储架构重构与跨 IDC 容灾实践

    欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 作者简介:xianmau,2015 年加入腾讯 TEG 架构平台部,一直负责 QQ 相册平台的维护和建设,主导相册上传架构重构和容灾优化等工作. ...

  8. 华为云计算IE面试笔记-请描述华为容灾解决方案全景图,并解释双活数据中心需要从哪些角度着手考虑双活设计

    容灾全景图: 按照距离划分:分为本地容灾 同城容灾 异地容灾  本地容灾包括本地高可用和本地主备.(本数据中心的两机房.机柜) 本地高可用这个方案为了保持业务的连续性,从两个层面来考虑: ①一个是从主 ...

  9. 传统业务上云:跨AZ容灾架构解析

    本文由  网易云发布. 数字化转型浪潮之下,采用云计算服务提升业务敏捷性.降低运维成本,成为了传统企业的优选方案.网易云资深解决方案架构师张亮通过某物流企业客户的实际案例,分享了传统业务系统在云上的架 ...

随机推荐

  1. ES6特性整理

    ESMAScript6.0 ES6 兼容 IE10+ .Chrome.Firefox 要想兼容IE10以下的有两种方法: 用 babel 工具 borwer.js ,在 script 标签里添加 ty ...

  2. jackson读取json tree讲解

    待读取的json文本: {"data":{"count":4031,"list":[{"symbol":"SH ...

  3. Mybatis-解决属性名和字段名不一致的问题

    解决属性名和字段名不一致的问题 目录 解决属性名和字段名不一致的问题 1. 问题 2. ResultMap 1. 问题 在数据库中,密码字段为pwd,而在实体类中为password package c ...

  4. 借助Java的JDBC自制“DBMS”管理操作数据库

    package jdbc; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; imp ...

  5. HTML-CSS-JS Prettify 代码格式化插件

    前提:已经安装 node.js.安装插件 HTML-CSS-JS Prettify,修改node路径,即可通过单击右键 HTML-CSS-JS Prettify 中的 Prettify Code 使用 ...

  6. W5300中文手册

    如果链接没了就Q我吧1178875532 链接:https://pan.baidu.com/s/1HcNJN_T6QJCvPWymU1sFDQ 提取码:suBB

  7. 容器云平台No.1~基于Docker及Kubernetes构建的容器云平台

    开篇 最近整理笔记,不知不觉发现关于kubernetes相关的笔记已经达99篇了,索性一起总结了.算是对这两年做容器云平台的一个总结,本文是开篇,先介绍下所有用到的组件.首先来看下架构图(实在画的太丑 ...

  8. 运行时数据区--程序计数器(PC Register)

    程序计数器(PC Register) 这里的计数器(Program Counter Register)并非为广义上所指的物理寄存器,JVM中的PC寄存器(程序计数器)是对物理PC寄存器的一种抽象模拟, ...

  9. 《InnoDB存储引擎》笔记

    第1章 Mysql体系结构和存储引擎 1.1 定义数据库和实例 数据库:database,物理的操作系统文件或其他形式文件类型的集合.当使用NDB存储引擎时,数据库文件可能是存放在内存中而不是磁盘之上 ...

  10. 【PowerQuery】做了一万遍的工资条

    前面已经了解了Excel.VBA.Python实现工资条,今天尝试用PQ做一遍 做之前迷惑了很久,如何能自定义长度 Table有Repeat函数,但是List没有.看来另外想办法 一步步接近目标  请 ...