话题 (elasicsearch) 已与当前话题合并
elasticsearch

elasticsearch

【求助】filebeat的配置文件问题,能否写成变量

回复

默认分类sweetpotato 回复了问题 • 1 人关注 • 2 个回复 • 19 次浏览 • 9 小时前 • 来自相关话题

elasticsearch多次查询得分不一致

Elasticsearchlaoyang360 回复了问题 • 4 人关注 • 3 个回复 • 194 次浏览 • 14 小时前 • 来自相关话题

es 集群索引 分片分配策略

Elasticsearchyayg2008 回复了问题 • 5 人关注 • 3 个回复 • 67 次浏览 • 17 小时前 • 来自相关话题

应使用哪个beats同步mysql数据到es

Beatschienx 回复了问题 • 4 人关注 • 2 个回复 • 279 次浏览 • 1 天前 • 来自相关话题

使用helpers.bulk无法更新index数据

Elasticsearchmedcl 回复了问题 • 5 人关注 • 4 个回复 • 75 次浏览 • 2 天前 • 来自相关话题

"[_na] query malformed, no field after start_object"

ElasticsearchelasticStack 回复了问题 • 2 人关注 • 1 个回复 • 28 次浏览 • 2 天前 • 来自相关话题

es多个部门使用的集群,是多个小集群好,还是一个大集群好?

Elasticsearchzqc0512 回复了问题 • 3 人关注 • 2 个回复 • 123 次浏览 • 2 天前 • 来自相关话题

关于elasticsearch内存分配策略的问题

Elasticsearchzqc0512 回复了问题 • 4 人关注 • 3 个回复 • 86 次浏览 • 2 天前 • 来自相关话题

Elastic日报 第396期 (2018-09-16)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 101 次浏览 • 3 天前 • 来自相关话题

1.(自备梯子)Kibana的第三方地图和平铺服务。 http://t.cn/EvfhXE9 2.Logstash教程:快速入门指南。 http://t.cn/Evf7oTo 3.(自备梯子)苹果想要挽救你的生命。 http://t.cn/Evfzk6z 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/801 订阅:https://tinyletter.com/elastic-daily
1.(自备梯子)Kibana的第三方地图和平铺服务。 http://t.cn/EvfhXE9 2.Logstash教程:快速入门指南。 http://t.cn/Evf7oTo 3.(自备梯子)苹果想要挽救你的生命。 http://t.cn/Evfzk6z 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/801 订阅:https://tinyletter.com/elastic-daily

hive的外表和es数据相连,能不能和内表进行联合查询?

ElasticsearchJackGe 回复了问题 • 2 人关注 • 2 个回复 • 64 次浏览 • 4 天前 • 来自相关话题

【求助】添加es的默认mapping模板的一些字段,但是出现报错

Elasticsearchlaoyang360 回复了问题 • 4 人关注 • 5 个回复 • 109 次浏览 • 5 天前 • 来自相关话题

es是如何解析querystring语法的AND、OR优先级的?

Elasticsearchdizhuang 回复了问题 • 11 人关注 • 5 个回复 • 3265 次浏览 • 5 天前 • 来自相关话题

es被攻击了,怎么处理?

Elasticsearchzhangyang 回复了问题 • 7 人关注 • 5 个回复 • 4322 次浏览 • 5 天前 • 来自相关话题

ES是否适合在超大磁盘空间的机器上运行

Elasticsearchyayg2008 回复了问题 • 5 人关注 • 5 个回复 • 150 次浏览 • 6 天前 • 来自相关话题

【求助】filebeat的配置文件问题,能否写成变量

回复

默认分类sweetpotato 回复了问题 • 1 人关注 • 2 个回复 • 19 次浏览 • 9 小时前 • 来自相关话题

elasticsearch多次查询得分不一致

回复

Elasticsearchlaoyang360 回复了问题 • 4 人关注 • 3 个回复 • 194 次浏览 • 14 小时前 • 来自相关话题

es 集群索引 分片分配策略

回复

Elasticsearchyayg2008 回复了问题 • 5 人关注 • 3 个回复 • 67 次浏览 • 17 小时前 • 来自相关话题

应使用哪个beats同步mysql数据到es

回复

Beatschienx 回复了问题 • 4 人关注 • 2 个回复 • 279 次浏览 • 1 天前 • 来自相关话题

使用helpers.bulk无法更新index数据

回复

Elasticsearchmedcl 回复了问题 • 5 人关注 • 4 个回复 • 75 次浏览 • 2 天前 • 来自相关话题

"[_na] query malformed, no field after start_object"

回复

ElasticsearchelasticStack 回复了问题 • 2 人关注 • 1 个回复 • 28 次浏览 • 2 天前 • 来自相关话题

es多个部门使用的集群,是多个小集群好,还是一个大集群好?

回复

Elasticsearchzqc0512 回复了问题 • 3 人关注 • 2 个回复 • 123 次浏览 • 2 天前 • 来自相关话题

关于elasticsearch内存分配策略的问题

回复

Elasticsearchzqc0512 回复了问题 • 4 人关注 • 3 个回复 • 86 次浏览 • 2 天前 • 来自相关话题

hive的外表和es数据相连,能不能和内表进行联合查询?

回复

ElasticsearchJackGe 回复了问题 • 2 人关注 • 2 个回复 • 64 次浏览 • 4 天前 • 来自相关话题

【求助】添加es的默认mapping模板的一些字段,但是出现报错

回复

Elasticsearchlaoyang360 回复了问题 • 4 人关注 • 5 个回复 • 109 次浏览 • 5 天前 • 来自相关话题

es是如何解析querystring语法的AND、OR优先级的?

回复

Elasticsearchdizhuang 回复了问题 • 11 人关注 • 5 个回复 • 3265 次浏览 • 5 天前 • 来自相关话题

es被攻击了,怎么处理?

回复

Elasticsearchzhangyang 回复了问题 • 7 人关注 • 5 个回复 • 4322 次浏览 • 5 天前 • 来自相关话题

ES是否适合在超大磁盘空间的机器上运行

回复

Elasticsearchyayg2008 回复了问题 • 5 人关注 • 5 个回复 • 150 次浏览 • 6 天前 • 来自相关话题

elasticsearch删除字段

回复

ElasticsearchEdgar 回复了问题 • 5 人关注 • 3 个回复 • 1749 次浏览 • 2018-09-12 19:08 • 来自相关话题

Elastic日报 第396期 (2018-09-16)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 101 次浏览 • 3 天前 • 来自相关话题

1.(自备梯子)Kibana的第三方地图和平铺服务。 http://t.cn/EvfhXE9 2.Logstash教程:快速入门指南。 http://t.cn/Evf7oTo 3.(自备梯子)苹果想要挽救你的生命。 http://t.cn/Evfzk6z 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/801 订阅:https://tinyletter.com/elastic-daily
1.(自备梯子)Kibana的第三方地图和平铺服务。 http://t.cn/EvfhXE9 2.Logstash教程:快速入门指南。 http://t.cn/Evf7oTo 3.(自备梯子)苹果想要挽救你的生命。 http://t.cn/Evfzk6z 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/801 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第389期 (2018-09-09)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 159 次浏览 • 2018-09-09 11:25 • 来自相关话题

1.ELK Stack完整指南 - 2018年。 http://t.cn/R9RHO6l 2.安全最佳实践:高增长初创企业的经验教训。 http://t.cn/RsoQXK2 3.(自备梯子)再见,面向对象编程。 http://t.cn/Rt4icdt 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/793 订阅:https://tinyletter.com/elastic-daily
1.ELK Stack完整指南 - 2018年。 http://t.cn/R9RHO6l 2.安全最佳实践:高增长初创企业的经验教训。 http://t.cn/RsoQXK2 3.(自备梯子)再见,面向对象编程。 http://t.cn/Rt4icdt 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/793 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第382期 (2018-09-02)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 127 次浏览 • 2018-09-02 08:40 • 来自相关话题

1.如何将Heroku日志导入到Logsene / Managed ELK Stack。 http://t.cn/RFSfTz6 2.5分钟将CoreOS日志导入到ELK。 http://t.cn/RFSxz0S 3.苹果圈:iPhone XS推出9月12日确认,新iPhone SE 2泄漏,苹果公司的恐慌方案。 http://t.cn/RFS9bWj 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 2、Elastic Meetup 9月8日 北京线下交流活动免费报名中 https://elasticsearch.cn/article/759 编辑:至尊宝 归档:https://elasticsearch.cn/article/782 订阅:https://tinyletter.com/elastic-daily 
1.如何将Heroku日志导入到Logsene / Managed ELK Stack。 http://t.cn/RFSfTz6 2.5分钟将CoreOS日志导入到ELK。 http://t.cn/RFSxz0S 3.苹果圈:iPhone XS推出9月12日确认,新iPhone SE 2泄漏,苹果公司的恐慌方案。 http://t.cn/RFS9bWj 活动预告: 1、Elastic 中国开发者大会门票发售中 https://conf.elasticsearch.cn/2018/shenzhen.html 2、Elastic Meetup 9月8日 北京线下交流活动免费报名中 https://elasticsearch.cn/article/759 编辑:至尊宝 归档:https://elasticsearch.cn/article/782 订阅:https://tinyletter.com/elastic-daily 

Curator从入门到实战

ElasticsearchLeon J 发表了文章 • 1 个评论 • 311 次浏览 • 2018-08-30 22:05 • 来自相关话题

Curator 是elasticsearch 官方的一个索引管理工具,可以通过配置文件的方式帮助我们对指定的一批索引进行创建/删除、打开/关闭、快照/恢复等管理操作。

场景

比如,出于读写性能的考虑,我们通常会把基于时间的数据按时间来创建索引。

indices当数据量到达一定量级时,为了节省内存或者磁盘空间,我们往往会根据实际情况选择关闭或者删除一定时间之前的索引。通常我们会写一段脚本调用elasticsearch的api,放到crontab中定期执行。这样虽然可以达到目的,但是脚本多了之后会变得难以维护。

Curator是如何解决这类问题的呢?我们一步一步来:

安装

首先,Curator是基于python实现的,我们可以直接通过pip来安装,这种方式最简单。

pip install elasticsearch-curator

基本配置

接下来,需要为 Curator 配置es连接:

# ~/.curator/curator.yml

client:
  hosts:
    - 127.0.0.1
  port: 9200

logging:
  loglevel: INFO

其中hosts 允许配置多个地址,但是只能属于同一个集群。

这边只列举了最基本的配置,官方文档中包含了更详细的配置。

动作配置

然后需要配置我们需要执行的动作,每个动作会按顺序执行:

# /etc/curator/actions/maintain_log.yml

actions:
  1:
    #创建第二天的索引
    action: create_index
    description: "create new time-based index for log-*"
    options:
      name: '<log-{now/d+1d}>'
  2:
    #删除3天前的索引
    action: delete_indices
    description: "delete outdated indices for log-*"
    filters:
    - filtertype: pattern
      kind: prefix
      value: log
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 3

action 定义了需要执行的动作,curator支持十多种动作,可以在官方文档查看完整的动作列表。

options 定义了执行动作所需的参数,不同动作的参数也不尽相同,具体文档中都有写明。

filters 定义了动作的执行对象,通过设置filter,可以过滤出我们需要操作的索引。同一个action下的filter之间是的关系。比如在上面的定义中,delete_indices下定义了两个filters:

  • 模式匹配:匹配前缀为log的索引
  • “年龄”匹配:根据索引名中“%Y.%m.%d”时间格式,过滤出3天以前的索引

curator支持十多种filter,可以在官方文档查看完整列表。

执行

最后,我们通过curator命令行工具来执行:

curator --config /etc/curator/curator.yml /etc/curator/actions/maintain_log.yml

得到命令行输出:

2018-08-30 12:31:26,829 INFO      Preparing Action ID: 1, "create_index"
2018-08-30 12:31:26,841 INFO      Trying Action ID: 1, "create_index": create new time-based index for log-*
2018-08-30 12:31:26,841 INFO      "<log-{now/d+1d}>" is using Elasticsearch date math.
2018-08-30 12:31:26,841 INFO      Creating index "<log-{now/d+1d}>" with settings: {}
2018-08-30 12:31:27,049 INFO      Action ID: 1, "create_index" completed.
2018-08-30 12:31:27,050 INFO      Preparing Action ID: 2, "delete_indices"
2018-08-30 12:31:27,058 INFO      Trying Action ID: 2, "delete_indices": delete outdated indices for log-*
2018-08-30 12:31:27,119 INFO      Deleting selected indices: ['log-2018.08.24', 'log-2018.08.25', 'log-2018.08.27', 'log-2018.08.26', 'log-2018.08.23']
2018-08-30 12:31:27,119 INFO      ---deleting index log-2018.08.24
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.25
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.27
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.26
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.23
2018-08-30 12:31:27,282 INFO      Action ID: 2, "delete_indices" completed.
2018-08-30 12:31:27,283 INFO      Job completed.

从日志中可以看到,我们已经成功创建了隔天的索引,并删除了28号以前的索引。

定时执行

配置好curator后,还需要配置定时任务

使用crontab -e编辑crontab,

添加一行:

0 23 * * * /usr/local/bin/curator --config /root/.curator/curator.yml /etc/curator/actions/maintain_log.yml >> /var/curator.log 2>&1

crontab配置中的第一段是执行的周期,6个值分别是“分 时 日 月 周”,*表示全部。所以这段配置的含义是在每天23点执行我们的这段脚本。

单个执行

除了定时任务,我们也可以在不依赖action配置文件的情况下用curator执行一些临时的批量操作。curator提供了curator_cli的命令来执行单个action,比如我们想对所有log开头的索引做快照,使用一条命令即可完成:

curator_cli snapshot --repository repo_name --filter_list {"filtertype": "pattern","kind": "prefix", "value": "log"}

是不是特别方便?

执行流程

image-20180830200126973

在命令执行过程中,Curator 会进行以下几步操作:

  1. 从ES拉取所有的索引信息
  2. 根据设置的过滤条件过滤出需要操作的索引
  3. 对过滤后的索引执行指定的动作

复杂需求

实际生产中,会有一些更复杂的需求,简单的action和filter组合并不能满足我们的业务。Curator还提供了python包,方便我们自己写脚本时调用它提供的actions和filters,减少我们的开发工作量。

以上通过一个实际的场景向大家介绍了Curator的使用方式,但是只用到了它一小部分的功能。大家可以通过文中的链接查看官方文档,发掘出更多的使用姿势。希望对大家有所帮助!

elasticTalk,qrcode

​Elastic日报 第375期 (2018-08-26)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 145 次浏览 • 2018-08-26 08:22 • 来自相关话题

1.Kibana高级搜索入门。 http://t.cn/Rk1SYUC 2.(自备梯子)四大NoSQL数据库。 http://t.cn/Rk1anR2 3.(自备梯子)您必须在“按时交付的软件”和“良好软件”之间进行选择。 http://t.cn/Rk1abPX 活动预告: 1、Elastic 中国开发者大会最后一波早鸟票发售进行中 https://conf.elasticsearch.cn/2018/shenzhen.html 2、Elastic Meetup 9月8日 北京线下沙龙正在报名中 https://elasticsearch.cn/article/759 编辑:至尊宝 归档:https://elasticsearch.cn/article/772 订阅:https://tinyletter.com/elastic-daily
1.Kibana高级搜索入门。 http://t.cn/Rk1SYUC 2.(自备梯子)四大NoSQL数据库。 http://t.cn/Rk1anR2 3.(自备梯子)您必须在“按时交付的软件”和“良好软件”之间进行选择。 http://t.cn/Rk1abPX 活动预告: 1、Elastic 中国开发者大会最后一波早鸟票发售进行中 https://conf.elasticsearch.cn/2018/shenzhen.html 2、Elastic Meetup 9月8日 北京线下沙龙正在报名中 https://elasticsearch.cn/article/759 编辑:至尊宝 归档:https://elasticsearch.cn/article/772 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第368期 (2018-08-19)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 152 次浏览 • 2018-08-19 10:09 • 来自相关话题

1.如何使用Nginx作为CentOS 7上的反向代理来保护Kibana。 http://t.cn/RDes1PI 2.如何使用ELK stack管理Nginx日志。 http://t.cn/RkUKe2L 3.(自备梯子)数据科学项目最重要的部分是写博客文章。 http://t.cn/RkU9jJW 活动预告: 1、Elastic Meetup 北京线下沙龙征稿中 https://elasticsearch.cn/article/759 2、Elastic 中国开发者大会预热票今天发售! https://conf.elasticsearch.cn/2018/shenzhen.html  编辑:至尊宝 归档:https://elasticsearch.cn/article/763 订阅:https://tinyletter.com/elastic-daily
1.如何使用Nginx作为CentOS 7上的反向代理来保护Kibana。 http://t.cn/RDes1PI 2.如何使用ELK stack管理Nginx日志。 http://t.cn/RkUKe2L 3.(自备梯子)数据科学项目最重要的部分是写博客文章。 http://t.cn/RkU9jJW 活动预告: 1、Elastic Meetup 北京线下沙龙征稿中 https://elasticsearch.cn/article/759 2、Elastic 中国开发者大会预热票今天发售! https://conf.elasticsearch.cn/2018/shenzhen.html  编辑:至尊宝 归档:https://elasticsearch.cn/article/763 订阅:https://tinyletter.com/elastic-daily

推荐一个同步Mysql数据到Elasticsearch的工具

ElasticsearchMCTW 发表了文章 • 12 个评论 • 650 次浏览 • 2018-08-14 15:47 • 来自相关话题

把Mysql的数据同步到Elasticsearch是个很常见的需求,但在Github里找到的同步工具用起来或多或少都有些别扭。 例如:某记录内容为"aaa|bbb|ccc",将其按|分割成数组同步到es,这样的简单任务都难以实现,再加上配置繁琐,文档语焉不详... 所以我写了个同步工具MysqlsMom:力求用最简单的配置完成复杂的同步任务。目前除了我所在的部门,也有越来越多的互联网公司在生产环境中使用该工具了。 欢迎各位大佬进行试用并提出意见,任何建议、鼓励、批评都受到欢迎。 github: https://github.com/m358807551/mysqlsmom Alt text

简介:同步 Mysql 数据到 elasticsearch 的工具; QQ、微信:358807551

特点

  1. Python 编写;
  2. 支持基于 sql 语句的全量同步,基于 binlog 的增量同步,基于更新字段的增量同步三种同步方式;
  3. 全量更新只占用少量内存;支持通过sql语句同步数据;
  4. 增量更新自动断点续传;
  5. 取自 Mysql 的数据可经过一系列自定义函数的处理后再同步至 Elasticsearch
  6. 能用非常简单的配置完成复杂的同步任务;

环境

  • python2.7;
  • 增量同步需开启 redis
  • 分析 binlog 的增量同步需要 Mysql 开启 binlogbinlog-format=row);

快速开始

全量同步MySql数据到es

  1. clone 项目到本地;

  2. 安装依赖;

    cd mysqlsmom
    pip install -r requirements.txt

    默认支持 elasticsearch-2.4版本,支持其它版本请运行(将5.4换成需要的elasticsearch版本)

    pip install --upgrade elasticsearch==5.4
  3. 编辑 ./config/example_init.py,按注释提示修改配置;

    # coding=utf-8
    
    STREAM = "INIT"
    
    # 修改数据库连接
    CONNECTION = {
       'host': '127.0.0.1',
       'port': 3306,
       'user': 'root',
       'passwd': ''
    }
    
    # 修改elasticsearch节点
    NODES = [{"host": "127.0.0.1", "port": 9200}]
    
    TASKS = [
       {
           "stream": {
               "database": "test_db",  # 在此数据库执行sql语句
               "sql": "select * from person"  # 将该sql语句选中的数据同步到 elasticsearch
           },
           "jobs": [
               {
                   "actions": ["insert", "update"],
                   "pipeline": [
                       {"set_id": {"field": "id"}}  # 默认设置 id字段的值 为elasticsearch中的文档id
                   ],
                   "dest": {
                       "es": {
                           "action": "upsert",
                           "index": "test_index",   # 设置 index
                           "type": "test",          # 设置 type
                           "nodes": NODES
                       }
                   }
               }
           ]
       }
    ]
  4. 运行

    cd mysqlsmom
    python mysqlsmom.py ./config/example_init.py

    等待同步完成即可;

分析 binlog 的增量同步

  1. 确保要增量同步的MySql数据库开启binlog,且开启redis(为了存储最后一次读到的binlog文件名及读到的位置。未来可能支持本地文件存储该信息。)

  2. 下载项目到本地,且安装好依赖后,编辑 ./config/example_init.py,按注释提示修改配置;

    # coding=utf-8
    
    STREAM = "BINLOG"
    SERVER_ID = 99  # 确保每个用于binlog同步的配置文件的SERVER_ID不同;
    SLAVE_UUID = __name__
    
    # 配置开启binlog权限的MySql连接
    BINLOG_CONNECTION = {
       'host': '127.0.0.1',
       'port': 3306,
       'user': 'root',
       'passwd': ''
    }
    
    # 配置es节点
    NODES = [{"host": "127.0.0.1", "port": 9200}]
    
    TASKS = [
       {
           "stream": {
               "database": "test_db",  # [table]所在的数据库
               "table": "person"  # 监控该表的binlog
           },
           "jobs": [
               {
                   "actions": ["insert", "update"],
                   "pipeline": [
                       {"only_fields": {"fields": ["id", "name", "age"]}},  # 只同步这些字段到es,注释掉该行则同步全部字段的值到es
                       {"set_id": {"field": "id"}}  # 设置es中文档_id的值取自 id(或根据需要更改)字段
                   ],
                   "dest": {
                       "es": {
                           "action": "upsert",
                           "index": "test_index",  # 设置 index
                           "type": "test",         # 设置 type
                           "nodes": NODES
                       }
                   }
               }
           ]
       }
    ]
  3. 运行

    cd mysqlsmom
    python mysqlsmom.py ./config/example_binlog.py

    该进程会一直运行,实时同步新增和更改后的数据到elasticsearch;

    注意:第一次运行该进程时不会同步MySql中已存在的数据,从第二次运行开始,将接着上次同步停止时的位置继续同步;

    同步旧数据请看全量同步MySql数据到es

基于更新时间的增量同步

Mysql 表中有类似 update_time 的时间字段,且在每次插入、更新数据后将该字段的值设置为操作时间,则可在不用开启 binlog 的情况下进行增量同步。

  1. 下载项目到本地,且安装好依赖后,编辑 ./config/example_cron.py,按注释提示修改配置;

    # coding=utf-8
    
    STREAM = "CRON"
    
    # 修改数据库连接
    CONNECTION = {
       'host': '127.0.0.1',
       'port': 3306,
       'user': 'root',
       'passwd': ''
    }
    
    # redis存储上次同步时间等信息
    REDIS = {
       "host": "127.0.0.1",
       "port": 6379,
       "db": 0,
       "password": "password",  # 不需要密码则注释或删掉该行
    }
    
    # 一次同步 BULK_SIZE 条数据到elasticsearch,不设置该配置项默认为1
    BULK_SIZE = 1
    
    # 修改elasticsearch节点
    NODES = [{"host": "127.0.0.1", "port": 9200}]
    
    TASKS = [
       {
           "stream": {
               "database": "test_db",  # 在此数据库执行sql语句
               "sql": "select id, name from person where update_time >= ?",  # 将该sql语句选中的数据同步到 elasticsearch
               "seconds": 10,  # 每隔 seconds 秒同步一次,
               "init_time": "2018-08-15 18:05:47"  # 只有第一次同步会加载
           },
           "jobs": [
               {
                   "pipeline": [
                       {"set_id": {"field": "id"}}  # 默认设置 id字段的值 为 es 中的文档id
                   ],
                   "dest": {
                       "es": {
                           "action": "upsert",
                           "index": "test_index",   # 设置 index
                           "type": "test"          # 设置 type
                       }
                   }
               }
           ]
       }
    ]
  2. 运行

    cd mysqlsmom
    python mysqlsmom.py ./config/example_cron.py

组织架构

Alt text

Mysqlsmom 使用实战

Mysqlsmom 的灵活性依赖于:

  • row_handlers.py 中添加自定义函数对取自Mysql的数据进行二次加工。
  • row_filters.py 中添加自定义函数决定是否要同步某一条数据。
  • config/ 目录下的任意配置文件应用上面的函数。

如果不了解 Python 也没关系,上述两个文件中自带的函数足以应付大多数种情况,遇到特殊的同步需求可以在 Github 发起 issue 或通过微信、QQ联系作者。

同步多张表

在一个配置文件中即可完成:

...
TASKS = [
    # 同步表1
    {
        "stream": {
            "database": "数据库名1",
            "table": "表名1"
        },
        "jobs": [...]
    }
    # 同步表2
    {
        "stream": {
            "database": "数据库名2",
            "table": "表名2"
        },
        "jobs": [...]
    }
]

一个 Mysql Connection 对应一个配置文件。

一张表同步到多个索引

分为两种情况。

一种是把相同的数据同步到不同的索引,配置如下:

...
TASKS = [
    {
        "stream": {...},
        "jobs": [
            {
                "actions": [...],
                "pipeline": [...],
                "dest": [
                    # 同步到索引1
                    {
                        "es": {"action": "upsert", "index": "索引1", "type": "类型1", "nodes": NODES},
                    },
                    # 同步到索引2
                    {
                        "es": {"action": "upsert", "index": "索引2", "type": "类型2", "nodes": NODES},
                    }
                ]
            }
        ]
    },
    ...
]

另一种是把同一个表产生的数据经过不同的 pipeline 同步到不同的索引:

...
TASKS = [
    {
        "stream": {...},
        "jobs": [
            {
                "actions": {...},
                "pipeline": [...],  # 对数据经过一系列处理
                "dest": {"es": {"index": "索引1", ...}}  # 同步到索引1
            },
            {
                "actions": {...},
                "pipeline": [...],  # 与上面的pipeline不同
                "dest": {"es": {"index": "索引2", ...}}  # 同步到索引2
            }
        ]
    }
]
  • TASKS 中的每一项对应一张要同步的表。
  • jobs 中的每一项对应对一条记录的一种处理方式。
  • dest 中的每一项对应一个es索引类型。

只同步某些字段

对每条来自 Mysql 的 记录的处理都在 pipeline 中进行处理。

"pipeline": [
    {"only_fields": {"fields": ["id", "name"]}},  # 只同步 id 和 name字段
    {"set_id": {"field": "id"}}  # 然后设置 id 字段为es中文档的_id
]

字段重命名

对于 Mysql 中的字段名和 elasticsearch 中的域名不一致的情况:

"pipeline": [
    # 将name重命名为name1,age 重命名为age1
    {"replace_fields": {"name": ["name1"], "age": ["age1"]}},
    {"set_id": {"field": "id"}}
]

pipeline 会依次执行处理函数,上面的例子等价于:

"pipeline": [
    # 先重命名 name 为 name1
    {"replace_fields": {"name": ["name1"]}},
    # 再重命名 age 为 age1
    {"replace_fields": {"age": ["age1"]}},
    {"set_id": {"field": "id"}}
]

还有一种特殊情形,es 中两个字段存相同的数据,但是分词方式不同。

例如 name_default 的分析器为 defaultname_raw 设置为不分词,需要将 name 的值同时同步到这两个域:

"pipeline": [
    {"replace_fields": {"name": ["name_default", "name_raw"]}},
    {"set_id": {"field": "id"}}
]

当然上述问题有一个更好的解决方案,在 esmappings 中配置 name 字段的 fields 属性即可,这超出了本文档的内容。

切分字符串为数组

有时 Mysql 存储字符串类似:"aaa|bbb|ccc",希望转化成数组: ["aaa", "bbb", "ccc"] 再进行同步

"pipeline": [
    # tags 存储类似"aaa|bbb|ccc"的字符串,将 tags 字段的值按符号 `|` 切分成数组
    {"split": {"field": "tags", "flag": "|"}},
    {"set_id": {"field": "id"}}
] 

同步删除文档

只有 binlog 同步 能实现删除 elasticsearch 中的文档,配置如下:

TASKS = [
    {
        "stream": {
            "database": "test_db",
            "table": "person"
        },
        "jobs": [
            # 插入、更新
            {
                "actions": ["insert", "update"],
                "pipeline": [
                    {"set_id": {"field": "id"}}  # 设置 id 字段的值为 es 中文档 _id
                ],
                "dest": {
                    "es": {
                        "action": "upsert",
                        ...
                    }
                }
            },
            # 重点在这里,配置删除
            {
                "actions": ["delete"],  # 当读取到 binlog 中该表的删除操作时
                "pipeline": [{"set_id": {"field": "id"}}],  # 要删除的文档 _id
                "dest": {
                    "es": {
                        "action": "delete",  # 在 es 中执行删除操作
                        ...  # 与上面的 index 和 type 相同
                    }
                }
            }
        ]
    },
    ...
]

更多示例正在更新

常见问题

为什么我的增量同步不及时?

  1. 连接本地数据库增量同步不及时

    该情况暂未收到过反馈,如能复现请联系作者。

  2. 连接线上数据库发现增量同步不及时

    2.1 推荐使用内网IP连接数据库。连接线上数据库(如开启在阿里、腾讯服务器上的Mysql)时,推荐使用内网IP地址,因为外网IP会受到带宽等限制导致获取binlog数据速度受限,最终可能造成同步延时。

待改进

  1. 据部分用户反馈,全量同步百万级以上的数据性能不佳。

未完待续

文档近期会较频繁更新,任何问题、建议都收到欢迎,请在issues留言,会在24小时内回复;或联系QQ、微信: 358807551;

Elastic日报 第361期 (2018-08-12)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 166 次浏览 • 2018-08-12 09:58 • 来自相关话题

1.(自备梯子)ELK Stack 详细配置。 http://t.cn/RDWHBvW 2.Elasticsearch安全性:身份验证,加密,备份。 http://t.cn/RDWl15I 3.(自备梯子)数据科学中必备的数学知识。 http://t.cn/RDWYsfF 活动预告: Elastic 中国开发者大会预热票发售进行中  https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/752 订阅:https://tinyletter.com/elastic-daily
1.(自备梯子)ELK Stack 详细配置。 http://t.cn/RDWHBvW 2.Elasticsearch安全性:身份验证,加密,备份。 http://t.cn/RDWl15I 3.(自备梯子)数据科学中必备的数学知识。 http://t.cn/RDWYsfF 活动预告: Elastic 中国开发者大会预热票发售进行中  https://conf.elasticsearch.cn/2018/shenzhen.html 编辑:至尊宝 归档:https://elasticsearch.cn/article/752 订阅:https://tinyletter.com/elastic-daily

Elastic日报 第354 (2018-08-05)

Elastic日报至尊宝 发表了文章 • 0 个评论 • 141 次浏览 • 2018-08-05 09:57 • 来自相关话题

1.Kubernetes使用Fluentd和Logz.io记录日志。 http://t.cn/RDPaFVJ 2.Docker使用EFK记录日志。 http://t.cn/RDPNDt3 3.(自备梯子)如何像数据科学家一样思考的12个步骤。 http://t.cn/RDP9e3d 活动预告: Elastic 中国开发者大会 2018 ,开始接受演讲申请和赞助合作 https://conf.elasticsearch.cn/2018/shenzhen.html  编辑:至尊宝 归档:https://elasticsearch.cn/article/744 订阅:https://tinyletter.com/elastic-daily
1.Kubernetes使用Fluentd和Logz.io记录日志。 http://t.cn/RDPaFVJ 2.Docker使用EFK记录日志。 http://t.cn/RDPNDt3 3.(自备梯子)如何像数据科学家一样思考的12个步骤。 http://t.cn/RDP9e3d 活动预告: Elastic 中国开发者大会 2018 ,开始接受演讲申请和赞助合作 https://conf.elasticsearch.cn/2018/shenzhen.html  编辑:至尊宝 归档:https://elasticsearch.cn/article/744 订阅:https://tinyletter.com/elastic-daily

我曲解Elasticsearch了吗?

Elasticsearchandy chen 发表了文章 • 7 个评论 • 316 次浏览 • 2018-07-18 20:05 • 来自相关话题

我曲解了Elasticsearch,我以为是每个节点可以存放不同的数据,哈哈哈😄。既然不是这样,引发了我另一个思考,说是Elasticsearch能处理TB以及PB的数据,这样的话,一台存放PB级数据的机器该是个多“可怕”的配置。每个节点的数据都一样,这是真正意义的分布式吗?我觉得按Elasticsearch的概念只是利用了节点的硬件资源。我真心希望我的理解是错的,这样我将欢欣鼓舞。
我曲解了Elasticsearch,我以为是每个节点可以存放不同的数据,哈哈哈😄。既然不是这样,引发了我另一个思考,说是Elasticsearch能处理TB以及PB的数据,这样的话,一台存放PB级数据的机器该是个多“可怕”的配置。每个节点的数据都一样,这是真正意义的分布式吗?我觉得按Elasticsearch的概念只是利用了节点的硬件资源。我真心希望我的理解是错的,这样我将欢欣鼓舞。

如何解决ES的性能问题

Elasticsearchsterne vencel 发表了文章 • 0 个评论 • 882 次浏览 • 2018-07-10 21:56 • 来自相关话题

Part4:如何解决ES的性能问题 本文是对一篇外文博客的翻译 This post is the final part of a 4-part series on monitoring Elasticsearch performance. Part 1 provides an overview of Elasticsearch and its key performance metrics, Part 2 explains how to collect these metrics, and Part 3describes how to monitor Elasticsearch with Datadog. 这篇文章是监控ES性能系列文章的最后一部分。第1部分概述了ES及其关键性能指标,第2部分解释了如何收集这些指标,第3部分描述了如何使用Datadog监视ES。 Like a car, Elasticsearch was designed to allow its users to get up and running quickly, without having to understand all of its inner workings. However, it’s only a matter of time before you run into engine trouble here or there. This article will walk through five common Elasticsearch challenges, and how to deal with them. 就像汽车一样,用户可以在无需了解其所有内部工作原理的情况下,快速地站起来并运行。然而,在这里或那里遇到引擎故障只是时间问题。本文将介绍五种常见的ES的挑战,以及如何处理它们。 Problem #1: My cluster status is red or yellow. What should I do? 问题#1:我的集群状态是红色或黄色。我应该做什么?
21.png
If you recall from Part 1, cluster status is reported as red if one or more primary shards (and its replicas) is missing, and yellow if one or more replica shards is missing. Normally, this happens when a node drops off the cluster for whatever reason (hardware failure, long garbage collection time, etc.). Once the node recovers, its shards will remain in an initializing state before they transition back to active status. 回顾第1部分,如果丢失一个或多个主分片(及其副本),集群状态将报告为红色;如果丢失一个或多个副本分片,则报告为黄色。通常,这种情况发生在节点出于某些原因(硬件故障、长时间的垃圾收集时间等)退出集群时。一旦节点恢复,它的分片在转换会活跃状态之前将保持初始化状态。 The number of initializing shards typically peaks when a node rejoins the cluster, and then drops back down as the shards transition into an active state, as shown in the graph below. 初始化碎片的数量通常在节点重新加入集群时达到峰值,然后随着分片转换为活跃状态而下降,如下图所示。
22.png
During this initialization period, your cluster state may transition from green to yellow or red until the shards on the recovering node regain active status. In many cases, a brief status change to yellow or red may not require any action on your part. 在此初始化期间,集群状态可能从绿色转变为黄色或红色,直到恢复节点上的分片重新恢复到活跃状态。在很多情况下,一个简短的状态变化为黄色或红色可能不需要你的任何行动。
23.png
However, if you notice that your cluster status is lingering in red or yellow state for an extended period of time, verify that the cluster is recognizing the correct number of Elasticsearch nodes, either by consulting Datadog’s dashboard or by querying the Cluster Health API detailed in Part 2. 但是,如果您注意到您的集群状态在红色或黄色状态中徘徊了很长一段时间,请通过查阅Datadog的仪表板或查询第2部分中详细介绍的集群健康API来验证集群是否识别了正确的ES节点数量。
24.png
If the number of active nodes is lower than expected, it means that at least one of your nodes lost its connection and hasn’t been able to rejoin the cluster. To find out which node(s) left the cluster, check the logs (located by default in the logs folder of your Elasticsearch home directory) for a line similar to the following: 如果活动节点的数量低于预期,则意味着至少有一个节点失去了连接,无法重新加入集群。要找出离开集群的节点,请检查日志(默认位于您的Elasticsearch home目录的logs文件夹中),查找与以下内容类似的行::
[TIMESTAMP] ... Cluster health status changed from [GREEN] to [RED]
Reasons for node failure can vary, ranging from hardware or hypervisor failures, to out-of-memory errors. Check any of the monitoring tools outlined here for unusual changes in performance metrics that may have occurred around the same time the node failed, such as a sudden spike in the current rate of search or indexing requests. Once you have an idea of what may have happened, if it is a temporary failure, you can try to get the disconnected node(s) to recover and rejoin the cluster. If it is a permanent failure, and you are not able to recover the node, you can add new nodes and let Elasticsearch take care of recovering from any available replica shards; replica shards can be promoted to primary shards and redistributed on the new nodes you just added. 节点失败的原因可能不同,从硬件失败,管理程序失败到内存不足的错误。检查监视工具,这些工具可能是在节点失败的同时出现的性能指标的异常变化,比如当前搜索或索引请求的速度突然激增。一旦您知道可能发生了什么,如果是临时故障,您可以尝试让断开连接的节点恢复并重新加入集群。如果是永久性故障,您无法恢复节点,您可以添加新节点,并让Elasticsearch负责从任何可用的副本分片中恢复,副本分片可以提升到主分片,并在刚刚添加的新节点上重新分布。 However, if you lost both the primary and replica copy of a shard, you can try to recover as much of the missing data as possible by using Elasticsearch’s snapshot and restore module. If you’re not already familiar with this module, it can be used to store snapshots of indices over time in a remote repository for backup purposes. 但是,如果您同时丢失了分片的主分片和副本,那么您可以使用ES的快照和恢复模块尽可能多地恢复丢失的数据。如果您还不熟悉这个模块,那么可以使用它在远程存储库中存储索引的快照,以便进行备份。 Problem #2: Help! Data nodes are running out of disk space 问题#2:数据节点空间将要耗尽
25.png
If all of your data nodes are running low on disk space, you will need to add more data nodes to your cluster. You will also need to make sure that your indices have enough primary shards to be able to balance their data across all those nodes. 如果所有数据节点的磁盘空间都很低,那么将需要向集群添加更多的数据节点。你还需要确保您的索引拥有足够的主分片,以便能够跨所有这些节点能够平衡它的数据。 However, if only certain nodes are running out of disk space, this is usually a sign that you initialized an index with too few shards. If an index is composed of a few very large shards, it’s hard for Elasticsearch to distribute these shards across nodes in a balanced manner. 但是,如果只有特定的节点耗尽了磁盘空间,这通常是你用了太多的分片在初始化索引的时候。如果一个索引是由一些非常大的分片组成的,那么用ES很难以一种平衡的方式在节点之间分布这些分片。 Elasticsearch takes available disk space into account when allocating shards to nodes. By default, it will not assign shards to nodes that have over 85 percent disk in use. In Datadog, you can set up a threshold alert to notify you when any individual data node’s disk space usage approaches 80 percent, which should give you enough time to take action. 当master将分片分配给节点时,ES会考虑到节点可用的磁盘空间。默认情况下,它不会将分片分配给使用超过85%磁盘的节点。在Datadog中,您可以设置一个阈值警报,当任何单个数据节点的磁盘空间使用量接近80%时通知您,这应该会给您足够的时间采取行动。 There are two remedies for low disk space. One is to remove outdated data and store it off the cluster. This may not be a viable option for all users, but, if you’re storing time-based data, you can store a snapshot of older indices’ data off-cluster for backup, and update the index settings to turn off replication for those indices. 对于低磁盘空间有两种补救方法。一种是删除过时的数据并将其存储在集群之外。对于所有用户来说,这可能不是一个可行的选择,但是,如果您正在存储基于时间的数据,您可以将旧索引的数据快照存储到集群之外进行备份,并更新索引设置,以关闭对这些索引的复制。 The second approach is the only option for you if you need to continue storing all of your data on the cluster: scaling vertically or horizontally. If you choose to scale vertically, that means upgrading your hardware. However, to avoid having to upgrade again down the line, you should take advantage of the fact that Elasticsearch was designed to scale horizontally. To better accommodate future growth, you may be better off reindexing the data and specifying more primary shards in the newly created index (making sure that you have enough nodes to evenly distribute the shards). 如果需要继续将所有数据存储在集群上,那么第二种方法是惟一的选择:垂直或横向地伸缩集群。如果选择垂直伸缩,就意味着升级硬件。然而,为了避免再次升级,最好使用ES的横向伸缩。为了更好地适应未来的增长,你最好对数据进行索引重建,并在新创建的索引中指定更多的主碎片(确保您有足够的节点来均匀分布碎片)。 Another way to scale horizontally is to roll over the index by creating a new index, and using an alias to join the two indices together under one namespace. Though there is technically no limit to how much data you can store on a single shard, Elasticsearch recommends a soft upper limit of 50 GB per shard, which you can use as a general guideline that signals when it’s time to start a new index. 横向扩展的另一种方法是创建一个新索引,并使用别名滚动改变索引。虽然从技术上讲,您可以在一个分片上存储多少数据没有限制,但Elasticsearch建议在每个碎片上设置一个50 GB的软上限,您可以将其作为一个通用指南,在开始创建新索引时发出信号。 Problem #3: My searches are taking too long to execute 问题#3:我的搜索执行时间太长了 Search performance varies widely according to what type of data is being searched and how each query is structured. Depending on the way your data is organized, you may need to experiment with a few different methods before finding one that will help speed up search performance. We’ll cover two of them here: custom routing and force merging. 根据搜索的数据类型以及每个查询的结构,搜索性能会有很大的不同。根据您的数据的组织方式,您可能需要在找到一个有助于提高搜索性能的方法之前尝试一些不同的方法。我们将介绍其中的两个:自定义路由和强制合并。 Typically, when a node receives a search request, it needs to communicate that request to a copy (either primary or replica) of every shard in the index. Custom routing allows you to store related data on the same shard, so that you only have to search a single shard to satisfy a query. 通常,当一个节点收到一个搜索请求时,它需要将该请求传递给索引中的每个分片的副本(主分片和副本分片)。自定义路由允许你将相关数据存储在同一个shard上,这样您只需要搜索一个分片来满足查询。 For example, you can store all of blogger1’s data on the same shard by specifying a _routing value in the mapping for the blogger type within your index, blog_index. 例如,你可以在索引blog_index中为blogger类型指定一个_routing值,从而将blogger1的所有数据存储在相同的分片上。 First, make sure _routing is required so that you don’t forget to specify a custom routing value whenever you index information of the blogger type. 首先,确保需要_routing,以便在索引blogger类型的信息时不会忘记指定一个定制的路由值。
curl -XPUT "localhost:9200/blog_index" -d '
{
  "mappings": {
    "blogger": {
      "_routing": {
        "required": true 
      }
    }
  }
}'
当您准备索引与blogger1相关的文档时,请指定路由值:
curl -XPUT "localhost:9200/blog_index/blogger/1?routing=blogger1" -d '
{
  "comment": "blogger1 made this cool comment"
}'
Now, in order to search through blogger1’s comments, you will need to remember to specify the routing value in the query like this: 现在,为了搜索blogger1的评论,您需要记住在查询中指定如下的路由值:
curl -XGET "localhost:9200/blog_index/_search?routing=blogger1" -d '
{
  "query": {
    "match": {
      "comment": {
        "query": "cool comment"
      }
    }
  }
}'
In Elasticsearch, every search request has to check every segment of each shard it hits. So once you have reduced the number of shards you’ll have to search, you can also reduce the number of segments per shard by triggering the Force Merge API on one or more of your indices. The Force Merge API (or Optimize API in versions prior to 2.1.0) prompts the segments in the index to continue merging until each shard’s segment count is reduced to max_num_segments (1, by default). It’s worth experimenting with this feature, as long as you account for the computational cost of triggering a high number of merges. 在ES中,每个搜索请求都必须检查它所命中的每个分片的每一段。一旦你可以减少了搜索的分片数量,你也可以通过在一个或多个索引上触发Force Merge API来减少每个分片的段数量。强制合并API(或在2.1.0之前的版本中优化API)提示索引中的段合并,直到每个分片的段计数减少到max_num_segment(默认为1)。考虑一下这个成本和查询的时间成本,值得对该特性进行试验。 When it comes to shards with a large number of segments, the force merge process becomes much more computationally expensive. For instance, force merging an index of 10,000 segments down to 5,000 segments doesn’t take much time, but merging 10,000 segments all the way down to one segment can take hours. The more merging that must occur, the more resources you take away from fulfilling search requests, which may defeat the purpose of calling a force merge in the first place. In any case, it’s usually a good idea to schedule a force merge during non-peak hours, such as overnight, when you don’t expect many search or indexing requests. 当涉及到索引具有大量的段,段合并过程的计算开销就会大得多。例如,强制合并10000个段的索引到5000个段并不需要花费太多时间,但是将10000个段一直合并到一个段需要花费数小时。合并越多,搜索请求越快,这是调用force merge的目的。在任何情况下,通常最好在非高峰时间(比如在一夜之间)安排一个force merge,这样就不会有太多的搜索或索引请求。 Problem #4: How can I speed up my index-heavy workload? 问题#4:怎样才能加快我的索引沉重的工作量? Elasticsearch comes pre-configured with many settings that try to ensure that you retain enough resources for searching and indexing data. However, if your usage of Elasticsearch is heavily skewed towards writes, you may find that it makes sense to tweak certain settings to boost indexing performance, even if it means losing some search performance or data replication. Below, we will explore a number of methods to optimize your use case for indexing, rather than searching, data. ES具有许多预先配置的设置,这些设置试图确保您保留足够的资源用于搜索和索引数据。但是,如果您对ES的使用严重偏向于写操作,可能会发现调整某些设置以提高索引性能是有意义的,即使这意味着丢失一些搜索性能或数据副本。下面,我们将探索一些方法来优化索引而不是优化搜索性能。 Shard allocation: As a high-level strategy, if you are creating an index that you plan to update frequently, make sure you designate enough primary shards so that you can spread the indexing load evenly across all of your nodes. The general recommendation is to allocate one primary shard per node in your cluster, and possibly two or more primary shards per node, but only if you have a lot of CPU and disk bandwidth on those nodes. However, keep in mind that shard overallocation adds overhead and may negatively impact search, since search requests need to hit every shard in the index. On the other hand, if you assign fewer primary shards than the number of nodes, you may create hotspots, as the nodes that contain those shards will need to handle more indexing requests than nodes that don’t contain any of the index’s shards. 分片分配:作为一种高级策略,如果你正在创建频繁更新索引的集群,请确保指定了足够的主分片,这样你就可以将索引负载均匀地分布到所有节点上。一般的建议是为集群中的每个节点分配一个主分片,可能为每个节点分配两个或多个主分片,但前提是这些节点上有大量的CPU和磁盘带宽。但是,请记住,分片过度分配会增加开销,并可能对搜索产生负面影响,因为搜索请求需要命中索引中的每个分片。另一方面,如果你分配的主碎片数量少于节点数量,那么您可能会创建热点(热节点),因为包含这些分片的节点将需要处理更多的索引请求,而不包含索引分片的节点将不做什么操作。 Disable merge throttling: Merge throttling is Elasticsearch’s automatic tendency to throttle indexing requests when it detects that merging is falling behind indexing. It makes sense to update your cluster settings to disable merge throttling (by setting indices.store.throttle.type to “none”) if you want to optimize indexing performance, not search. You can make this change persistent (meaning it will persist after a cluster restart) or transient (resets back to default upon restart), based on your use case. 禁用合并节流:合并节流是ES在检测到合并落后于索引时自动抑制索引请求的趋势。更新集群设置以禁用合并节流是有意义的(设置index .store.throttle.type为none)。这样做可以优化索引性能,而不是搜索。根据你的用例,你可以使这个设置为persist(意味着在集群重新启动之后它将持续)或transient(在重新启动时重新设置为默认)。 Increase the size of the indexing buffer: This setting (indices.memory.index_buffer_size) determines how full the buffer can get before its documents are written to a segment on disk. The default setting limits this value to 10 percent of the total heap in order to reserve more of the heap for serving search requests, which doesn’t help you if you’re using Elasticsearch primarily for indexing. 增加索引缓冲区的大小:此设置(indices.memory.index_buffer_size)确定将文档写到磁盘上的段之前缓冲区的容量。默认设置限制为总堆的10%,以便为服务搜索请求保留更多的堆,如果您主要是在使用Elasticsearch进行索引,这对你是没有帮助。 Index first, replicate later: When you initialize an index, specify zero replica shards in the index settings, and add replicas after you’re done indexing. This will boost indexing performance, but it can be a bit risky if the node holding the only copy of the data crashes before you have a chance to replicate it. *先索引,后复制:初始化索引时,在索引设置中指定0个复制碎片,索引完成后添加副本。这将提高索引性能,但如果拥有数据惟一副本的节点在您有机会复制数据之前崩溃,则可能存在一些风险。 Refresh less frequently: Increase the refresh interval in the Index Settings API. By default, the index refresh process occurs every second, but during heavy indexing periods, reducing the refresh frequency can help alleviate some of the workload. 不经常刷新:增加索引设置API中的刷新间隔。默认情况下,索引refresh过程每秒钟发生一次,但是在索引不断更新的时期,减少刷新频率可以帮助减轻一些工作负载。 Tweak your translog settings: As of version 2.0, Elasticsearch will flush translog data to disk after every request, reducing the risk of data loss in the event of hardware failure. If you want to prioritize indexing performance over potential data loss, you can change index.translog.durability to async in the index settings. With this in place, the index will only commit writes to disk upon every sync_interval, rather than after each request, leaving more of its resources free to serve indexing requests. 调整您的translog设置:在2.0版本中,弹性搜索将在每次请求之后将translog数据刷新到磁盘,从而在硬件故障时降低数据丢失的风险。如果希望将索引性能优先于潜在的数据丢失,可以更改index.translog.durability为async。有了这一点,索引将在sync_interval上提交对磁盘的写操作,而不是在每个请求之后,从而使更多的资源可以用于索引请求。 For more suggestions on boosting indexing performance, check out this guide from Elastic. 有关提高索引性能的更多建议,请参阅《ES》。 Problem #5: What should I do about all these bulk thread pool rejections? 问题#5:对于所有这些大容量线程池拒绝,我应该怎么做?
26.png
Thread pool rejections are typically a sign that you are sending too many requests to your nodes, too quickly. If this is a temporary situation (for instance, you have to index an unusually large amount of data this week, and you anticipate that it will return to normal soon), you can try to slow down the rate of your requests. However, if you want your cluster to be able to sustain the current rate of requests, you will probably need to scale out your cluster by adding more data nodes. In order to utilize the processing power of the increased number of nodes, you should also make sure that your indices contain enough shards to be able to spread the load evenly across all of your nodes. 线程池的拒绝通常表明向节点发送了过多的请求或者请求速度太快。如果这是一个临时的情况(例如,本周必须索引超大量的数据,并且预期它将很快恢复正常),可以尝试降低请求的速度。但是,如果您希望集群能够维持当前的请求速率,您可能需要通过添加更多的数据节点来扩展集群。为了利用增加的节点数量的处理能力,还应该确保索引包含足够的分片,以便能够在所有节点上均匀地分配负载。 Go forth and optimize! 优化 Even more performance tips are available in Elasticsearch’s learning resources and documentation. Since results will vary depending on your particular use case and setup, you can test out different settings and indexing/querying strategies to determine which approaches work best for your clusters. 在ES的学习资源和文档中可以找到更多的性能技巧。由于结果将根据您的特定用例和设置而变化,您可以测试不同的设置和索引/查询策略,以确定哪种方法最适合您的集群。 As you experiment with these and other optimizations, make sure to watch your Elasticsearch dashboards closely to monitor the resulting impact on your clusters’ key Elasticsearch performance metrics. 当您尝试这些优化和其他优化时,请确保密切关注您的ES仪表盘,以监视由此对集群的关键ES性能指标的影响。 With a built-in Elasticsearch dashboard that highlights key cluster metrics, Datadog enables you to effectively monitor Elasticsearch in real-time. If you already have a Datadog account, you can set up the Elasticsearch integrationin minutes. If you don’t yet have a Datadog account, sign up for a free trialtoday. 有了一个内置的ES仪表盘,它突出关键的集群指标,Datadog使您能够实时监控弹性搜索。如果您已经有了一个Datadog帐户,那么您可以在几分钟内设置Elasticsearch集成。如果你还没有一个Datadog帐户,那么今天就注册一个免费试用。 Source Markdown for this post is available on GitHub. Questions, corrections, additions, etc.? Please let us know.

Elastic日报 第323期 (2018-07-05)

Elastic日报sterne vencel 发表了文章 • 0 个评论 • 156 次浏览 • 2018-07-05 09:34 • 来自相关话题

1.使用python操作ES http://t.cn/RBzKP6H 2.使用Beats模块将日志和指标导入ES http://t.cn/RdLtJJp 3.如何在生产环境中重启Elasticsearch集群 http://t.cn/RdL4oxk  活动预告 1. 7月21日上海meetup演讲申请中 https://elasticsearch.cn/m/article/655  编辑:sterne vencel 归档:https://elasticsearch.cn/article/700 订阅:https://tinyletter.com/elastic-daily
1.使用python操作ES http://t.cn/RBzKP6H 2.使用Beats模块将日志和指标导入ES http://t.cn/RdLtJJp 3.如何在生产环境中重启Elasticsearch集群 http://t.cn/RdL4oxk  活动预告 1. 7月21日上海meetup演讲申请中 https://elasticsearch.cn/m/article/655  编辑:sterne vencel 归档:https://elasticsearch.cn/article/700 订阅:https://tinyletter.com/elastic-daily

玩转 Elasticsearch 的 SQL 功能

Elasticsearchmedcl 发表了文章 • 9 个评论 • 3769 次浏览 • 2018-06-27 21:54 • 来自相关话题

最近发布的 Elasticsearch 6.3 包含了大家期待已久的 SQL 特性,今天给大家介绍一下具体的使用方法。

首先看看接口的支持情况

目前支持的 SQL 只能进行数据的查询只读操作,不能进行数据的修改,所以我们的数据插入还是要走之前的常规索引接口。

目前 Elasticsearch 的支持 SQL 命令只有以下几个:

命令 说明
DESC table 用来描述索引的字段属性
SHOW COLUMNS 功能同上,只是别名
SHOW FUNCTIONS 列出支持的函数列表,支持通配符过滤
SHOW TABLES 返回索引列表
SELECT .. FROM table_name WHERE .. GROUP BY .. HAVING .. ORDER BY .. LIMIT .. 用来执行查询的命令

我们分别来看一下各自怎么用,以及有什么效果吧,自己也可以动手试一下,看看。

首先,我们创建一条数据:

POST twitter/doc/
{
  "name":"medcl",
  "twitter":"sql is awesome",
  "date":"2018-07-27",
  "id":123
}

RESTful下调用SQL

在 ES 里面执行 SQL 语句,有三种方式,第一种是 RESTful 方式,第二种是 SQL-CLI 命令行工具,第三种是通过 JDBC 来连接 ES,执行的 SQL 语句其实都一样,我们先以 RESTful 方式来说明用法。

RESTful 的语法如下:

POST /_xpack/sql?format=txt
{
    "query": "SELECT * FROM twitter"
}

因为 SQL 特性是 xpack 的免费功能,所以是在 _xpack 这个路径下面,我们只需要把 SQL 语句传给 query 字段就行了,注意最后面不要加上 ; 结尾,注意是不要!

我们执行上面的语句,查询返回的结果如下:

          date          |      id       |     name      |    twitter    
------------------------+---------------+---------------+---------------
2018-07-27T00:00:00.000Z|123            |medcl          |sql is awesome 

ES 俨然已经变成 SQL 数据库了,我们再看看如何获取所有的索引列表:

POST /_xpack/sql?format=txt
{
    "query": "SHOW tables"
}

返回如下:

              name               |     type      
---------------------------------+---------------
.kibana                          |BASE TABLE     
.monitoring-alerts-6             |BASE TABLE     
.monitoring-es-6-2018.06.21      |BASE TABLE     
.monitoring-es-6-2018.06.26      |BASE TABLE     
.monitoring-es-6-2018.06.27      |BASE TABLE     
.monitoring-kibana-6-2018.06.21  |BASE TABLE     
.monitoring-kibana-6-2018.06.26  |BASE TABLE     
.monitoring-kibana-6-2018.06.27  |BASE TABLE     
.monitoring-logstash-6-2018.06.20|BASE TABLE     
.reporting-2018.06.24            |BASE TABLE     
.triggered_watches               |BASE TABLE     
.watcher-history-7-2018.06.20    |BASE TABLE     
.watcher-history-7-2018.06.21    |BASE TABLE     
.watcher-history-7-2018.06.26    |BASE TABLE     
.watcher-history-7-2018.06.27    |BASE TABLE     
.watches                         |BASE TABLE     
apache_elastic_example           |BASE TABLE     
forum-mysql                      |BASE TABLE     
twitter      

有点多,我们可以按名称过滤,如 twitt 开头的索引,注意通配符只支持 %_,分别表示多个和单个字符(什么,不记得了,回去翻数据库的书去!):

POST /_xpack/sql?format=txt
{
    "query": "SHOW TABLES 'twit%'"
}

POST /_xpack/sql?format=txt
{
    "query": "SHOW TABLES 'twitte_'"
}

上面返回的结果都是:

     name      |     type      
---------------+---------------
twitter        |BASE TABLE     

如果要查看该索引的字段和元数据,如下:

POST /_xpack/sql?format=txt
{
    "query": "DESC twitter"
}

返回:

    column     |     type      
---------------+---------------
date           |TIMESTAMP      
id             |BIGINT         
name           |VARCHAR        
name.keyword   |VARCHAR        
twitter        |VARCHAR        
twitter.keyword|VARCHAR        

都是动态生成的字段,包含了 .keyword 字段。 还能使用下面的命令来查看,主要是兼容 SQL 语法。

POST /_xpack/sql?format=txt
{
    "query": "SHOW COLUMNS IN twitter"
}

另外,如果不记得 ES 支持哪些函数,只需要执行下面的命令,即可得到完整列表:

SHOW FUNCTIONS

返回结果如下,也就是当前6.3版本支持的所有函数,如下:

      name      |     type      
----------------+---------------
AVG             |AGGREGATE      
COUNT           |AGGREGATE      
MAX             |AGGREGATE      
MIN             |AGGREGATE      
SUM             |AGGREGATE      
STDDEV_POP      |AGGREGATE      
VAR_POP         |AGGREGATE      
PERCENTILE      |AGGREGATE      
PERCENTILE_RANK |AGGREGATE      
SUM_OF_SQUARES  |AGGREGATE      
SKEWNESS        |AGGREGATE      
KURTOSIS        |AGGREGATE      
DAY_OF_MONTH    |SCALAR         
DAY             |SCALAR         
DOM             |SCALAR         
DAY_OF_WEEK     |SCALAR         
DOW             |SCALAR         
DAY_OF_YEAR     |SCALAR         
DOY             |SCALAR         
HOUR_OF_DAY     |SCALAR         
HOUR            |SCALAR         
MINUTE_OF_DAY   |SCALAR         
MINUTE_OF_HOUR  |SCALAR         
MINUTE          |SCALAR         
SECOND_OF_MINUTE|SCALAR         
SECOND          |SCALAR         
MONTH_OF_YEAR   |SCALAR         
MONTH           |SCALAR         
YEAR            |SCALAR         
WEEK_OF_YEAR    |SCALAR         
WEEK            |SCALAR         
ABS             |SCALAR         
ACOS            |SCALAR         
ASIN            |SCALAR         
ATAN            |SCALAR         
ATAN2           |SCALAR         
CBRT            |SCALAR         
CEIL            |SCALAR         
CEILING         |SCALAR         
COS             |SCALAR         
COSH            |SCALAR         
COT             |SCALAR         
DEGREES         |SCALAR         
E               |SCALAR         
EXP             |SCALAR         
EXPM1           |SCALAR         
FLOOR           |SCALAR         
LOG             |SCALAR         
LOG10           |SCALAR         
MOD             |SCALAR         
PI              |SCALAR         
POWER           |SCALAR         
RADIANS         |SCALAR         
RANDOM          |SCALAR         
RAND            |SCALAR         
ROUND           |SCALAR         
SIGN            |SCALAR         
SIGNUM          |SCALAR         
SIN             |SCALAR         
SINH            |SCALAR         
SQRT            |SCALAR         
TAN             |SCALAR         
SCORE           |SCORE          

同样支持通配符进行过滤:

POST /_xpack/sql?format=txt
{
    "query": "SHOW FUNCTIONS 'S__'"
}

结果:

     name      |     type      
---------------+---------------
SUM            |AGGREGATE      
SIN            |SCALAR         

那如果要进行模糊搜索呢,Elasticsearch 的搜索能力大家都知道,强!在 SQL 里面,可以用 match 关键字来写,如下:

POST /_xpack/sql?format=txt
{
    "query": "SELECT SCORE(), * FROM twitter WHERE match(twitter, 'sql is') ORDER BY id DESC"
}

最后,还能试试 SELECT 里面的一些其他操作,如过滤,别名,如下:

POST /_xpack/sql?format=txt
{
    "query": "SELECT SCORE() as score,name as myname FROM twitter as mytable where name = 'medcl' OR name ='elastic' limit 5"
}

结果如下:

     score     |    myname     
---------------+---------------
0.2876821      |medcl          

或是分组和函数计算:

POST /_xpack/sql?format=txt
{
    "query": "SELECT name,max(id) as max_id FROM twitter as mytable group by name limit 5"
}

结果如下:

     name      |    max_id     
---------------+---------------
medcl          |123.0          

SQL-CLI下的使用

上面的例子基本上把 SQL 的基本命令都介绍了一遍,很多情况下,用 RESTful 可能不是很方便,那么可以试试用 CLI 命令行工具来执行 SQL 语句,妥妥的 SQL 操作体验。

切换到命令行下,启动 cli 程序即可进入命令行交互提示界面,如下:

➜  elasticsearch-6.3.0 ./bin/elasticsearch-sql-cli

     .sssssss.`                     .sssssss.
  .:sXXXXXXXXXXo`                `ohXXXXXXXXXho.
 .yXXXXXXXXXXXXXXo`            `oXXXXXXXXXXXXXXX-
.XXXXXXXXXXXXXXXXXXo`        `oXXXXXXXXXXXXXXXXXX.
.XXXXXXXXXXXXXXXXXXXXo.    .oXXXXXXXXXXXXXXXXXXXXh
.XXXXXXXXXXXXXXXXXXXXXXo``oXXXXXXXXXXXXXXXXXXXXXXy
`yXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
 `oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo`
   `oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo`
     `oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo`
       `oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo`
         `oXXXXXXXXXXXXXXXXXXXXXXXXXXXXo`
           .XXXXXXXXXXXXXXXXXXXXXXXXXo`
         .oXXXXXXXXXXXXXXXXXXXXXXXXo`
       `oXXXXXXXXXXXXXXXXXXXXXXXXo`   `odo`
     `oXXXXXXXXXXXXXXXXXXXXXXXXo`   `oXXXXXo`
   `oXXXXXXXXXXXXXXXXXXXXXXXXo`   `oXXXXXXXXXo`
 `oXXXXXXXXXXXXXXXXXXXXXXXXo`   `oXXXXXXXXXXXXXo`
`yXXXXXXXXXXXXXXXXXXXXXXXo`    oXXXXXXXXXXXXXXXXX.
.XXXXXXXXXXXXXXXXXXXXXXo`   `oXXXXXXXXXXXXXXXXXXXy
.XXXXXXXXXXXXXXXXXXXXo`     /XXXXXXXXXXXXXXXXXXXXX
.XXXXXXXXXXXXXXXXXXo`        `oXXXXXXXXXXXXXXXXXX-
 -XXXXXXXXXXXXXXXo`            `oXXXXXXXXXXXXXXXo`
  .oXXXXXXXXXXXo`                `oXXXXXXXXXXXo.
    `.sshXXyso`        SQL         `.sshXhss.`

sql> 

当你看到一个硕大的创口贴,表示 SQL 命令行已经准备就绪了,查看一下索引列表,不,数据表的列表:

15301043943573.jpg

各种操作妥妥的,上面已经测试过的命令就不在这里重复了,只是体验不一样罢了。

如果要连接远程的 ES 服务器,只需要启动命令行工具的时候,指定服务器地址,如果有加密,指定 keystone 文件,完整的帮助如下:

➜  elasticsearch-6.3.0 ./bin/elasticsearch-sql-cli --help
Elasticsearch SQL CLI

Non-option arguments:
uri                  

Option                   Description                                           
------                   -----------                                           
-c, --check <Boolean>    Enable initial connection check on startup (default:  
                           true)                                               
-d, --debug              Enable debug logging                                  
-h, --help               show help                                             
-k, --keystore_location  Location of a keystore to use when setting up SSL. If 
                           specified then the CLI will prompt for a keystore   
                           password. If specified when the uri isn't https then
                           an error is thrown.                                 
-s, --silent             show minimal output                                   
-v, --verbose            show verbose output  

JDBC 对接

JDBC 对接的能力,让我们可以与各个 SQL 生态系统打通,利用众多现成的基于 SQL 之上的工具来使用 Elasticsearch,我们以一个工具来举例。

和其他数据库一样,要使用 JDBC,要下载该数据库的 JDBC 的驱动,我们打开: https://www.elastic.co/downloads/jdbc-client

15301048139518.jpg

只有一个 zip 包下载链接,下载即可。

然后,我们这里使用 DbVisualizer 来连接 ES 进行操作,这是一个数据库的操作和分析工具,DbVisualizer 下载地址是:https://www.dbvis.com/

下载安装启动之后的程序主界面如下图:

15301049453527.jpg

我们如果要使用 ES 作为数据源,我们第一件事需要把 ES 的 JDBC 驱动添加到 DbVisualizer 的已知驱动里面。我们打开 DbVisualizer 的菜单【Tools】-> 【Driver Manager】,打开如下设置窗口:

15301054144234.jpg

点击绿色的加号按钮,新增一个名为 Elasticsearch-SQL 的驱动,url format 设置成 jdbc:es:,如下图:

15301054340439.jpg

然后点击上图黄色的文件夹按钮,添加我们刚刚下载好且解压之后的所有 jar 文件,如下:

15301055143574.jpg

添加完成之后,如下图:

15301055446598.jpg

就可以关闭这个 JDBC 驱动的管理窗口了。下面我们来连接到 ES 数据库。

选择主程序左侧的新建连接图标,打开向导,如下:

15301057385898.jpg

选择刚刚加入的 Elasticsearch-SQL 驱动:

15301057824336.jpg

设置连接字符串,此处没有登录信息,如果有可以对应的填上:

15301064989466.jpg

点击 Connect,即可连接到 ES,左侧导航可以展开看到对应的 ES 索引信息:

15301065711818.jpg

同样可以查看相应的库表结果和具体的数据:

15301066251658.jpg

用他自带的工具执行 SQL 也是不在话下:

15301068015599.jpg

同理,各种 ETL 工具和基于 SQL 的 BI 和可视化分析工具都能把 Elasticsearch 当做 SQL 数据库来连接获取数据了。

最后一个小贴士,如果你的索引名称包含横线,如 logstash-201811,只需要做一个用双引号包含,对双引号进行转义即可,如下:

POST /_xpack/sql?format=txt
{
"query":"SELECT COUNT(*) FROM \"logstash-*\""
}

关于 SQL 操作的文档在这里:

https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-jdbc.html

Enjoy!

【线下活动】【袋鼠云技术团队】2018-06-30-杭州-Devops运维沙龙

活动moyu 发表了文章 • 1 个评论 • 188 次浏览 • 2018-06-25 16:32 • 来自相关话题

Devops运维沙龙.png
 活动简介: 互联网时代,创新、高效、速度是企业保持核心竞争力的必要条件。DevOps被描述为“开发团队与运营团队之间更具协作性、更高效的关系”。本次活动邀请到阿里云Docker团队,ES团队、袋鼠云日志团队的同学从各个方面向大家介绍Devops的实践经验,帮助企业更敏捷、更自动化、更高效地实现持续交付。   主办方:袋鼠云 特别支持:养码场、高效运维社区、DBAPLUS、Elastic中文社区、阿里云、跨星、杭州创业大街 报名平台:活动行 直播支持:IT大咖说 活动时间:2018年6月30日13:00-17:00 活动地点:杭州市滨江区阡陌路459号聚光中心内 杭州创业大街C1-105室跨星空间   分享嘉宾:
赵汉青圆形.jpg
赵汉青 阿里巴巴集团搜索事业部 高级工程师 Elasticsearch运维实践分享 简介:2014年硕士毕业于中国科学技术大学 曾就职于思科系统(中国)研发有限公司云服务部,本次主题针对Elasticsearch集群运维:监控,诊断,优化,升级进行详细的介绍,并向大家分享阿里云Elasticsearch服务。
30943092626455172.jpg
南方   袋鼠云日志产品经理 企业日志中心建设思路   简介:企业日志中心建设是一个整体和复杂的过程,本次主题向大家分享袋鼠云日志产品在迭代过程踩过的坑,并通过什么样的方案去解决这些问题,同时向大家分享我们在天弘基金、新网银行中建设企业日志中心中的几个实践案例。
朱延生圆形.jpg
朱延生   阿里云Docker团队专家 ​Kubernetes日志实践 简介:从第一代PaaS平台cloudfoundry到现在的kubernetes容器编排平台,一直从事关于容器云平台研发及解决方案相关工作。容器时代越来越多的传统应用将会逐渐容器化,那么如何在应用容器化过程中方便快捷地自动发现和采集应用日志、如何与日志存储系统协同来高效存储和搜索应用日志将会是关键;本次分享主要介绍容器原生日志输出到容器日志的自动发现与采集,以及高性能容器日志采集部署架构及性能测试。
30363093978132308.png
直播报名
30963093980632463.jpeg
​线下报名 欢迎关注“袋鼠云技术团队”微信公众号,获取最新线下及线上活动信息。
qrcode_for_gh_cd7aa4cb729b_258.jpg
Devops运维沙龙.png

Elasticsearch snapshot 备份的使用方法

Elasticsearchrockybean 发表了文章 • 1 个评论 • 802 次浏览 • 2018-05-31 23:23 • 来自相关话题

常见的数据库都会提供备份的机制,以解决在数据库无法使用的情况下,可以开启新的实例,然后通过备份来恢复数据减少损失。虽然 Elasticsearch 有良好的容灾性,但由于以下原因,其依然需要备份机制。

  1. 数据灾备。在整个集群无法正常工作时,可以及时从备份中恢复数据。
  2. 归档数据。随着数据的积累,比如日志类的数据,集群的存储压力会越来越大,不管是内存还是磁盘都要承担数据增多带来的压力,此时我们往往会选择只保留最近一段时间的数据,比如1个月,而将1个月之前的数据删除。如果你不想删除这些数据,以备后续有查看的需求,那么你就可以将这些数据以备份的形式归档。
  3. 迁移数据。当你需要将数据从一个集群迁移到另一个集群时,也可以用备份的方式来实现。

Elasticsearch 做备份有两种方式,一是将数据导出成文本文件,比如通过 elasticdumpesm 等工具将存储在 Elasticsearch 中的数据导出到文件中。二是以备份 elasticsearch data 目录中文件的形式来做快照,也就是 Elasticsearch 中 snapshot 接口实现的功能。第一种方式相对简单,在数据量小的时候比较实用,当应对大数据量场景效率就大打折扣。我们今天就着重讲解下第二种备份的方式,即 snapshot api 的使用。

备份要解决备份到哪里、如何备份、何时备份和如何恢复的问题,那么我们接下来一个个解决。

1. 备份到哪里

在 Elasticsearch 中通过 repository 定义备份存储类型和位置,存储类型有共享文件系统、AWS 的 S3存储、HDFS、微软 Azure的存储、Google Cloud 的存储等,当然你也可以自己写代码实现国内阿里云的存储。我们这里以最简单的共享文件系统为例,你也可以在本地做实验。

首先,你要在 elasticsearch.yml 的配置文件中注明可以用作备份路径 path.repo ,如下所示:

path.repo: ["/mount/backups", "/mount/longterm_backups"]

配置好后,就可以使用 snapshot api 来创建一个 repository 了,如下我们创建一个名为 my_backup 的 repository。

PUT /_snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "/mount/backups/my_backup"
  }
}

之后我们就可以在这个 repository 中来备份数据了。

2. 如何备份

有了 repostiroy 后,我们就可以做备份了,也叫快照,也就是记录当下数据的状态。如下所示我们创建一个名为 snapshot_1 的快照。

PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true

wait_for_completion 为 true 是指该 api 在备份执行完毕后再返回结果,否则默认是异步执行的,我们这里为了立刻看到效果,所以设置了该参数,线上执行时不用设置该参数,让其在后台异步执行即可。

执行成功后会返回如下结果,用于说明备份的情况:

{
  "snapshots": [
    {
      "snapshot": "snapshot_1",
      "uuid": "52Lr4aFuQYGjMEv5ZFeFEg",
      "version_id": 6030099,
      "version": "6.3.0",
      "indices": [
        ".monitoring-kibana-6-2018.05.30",
        ".monitoring-es-6-2018.05.28",
        ".watcher-history-7-2018.05.30",
        ".monitoring-beats-6-2018.05.29",
        "metricbeat-6.2.4-2018.05.28",
        ".monitoring-alerts-6",
        "metricbeat-6.2.4-2018.05.30"
      ],
      "include_global_state": true,
      "state": "SUCCESS",
      "start_time": "2018-05-31T12:45:57.492Z",
      "start_time_in_millis": 1527770757492,
      "end_time": "2018-05-31T12:46:15.214Z",
      "end_time_in_millis": 1527770775214,
      "duration_in_millis": 17722,
      "failures": [],
      "shards": {
        "total": 28,
        "failed": 0,
        "successful": 28
      }
    }
  ]
}

返回结果的参数意义都是比较直观的,比如 indices 指明此次备份涉及到的索引名称,由于我们没有指定需要备份的索引,这里备份了所有索引;state 指明状态;duration_in_millis 指明备份任务执行时长等。

我们可以通过 GET _snapshot/my_backup/snapshot_1获取 snapshot_1 的执行状态。

此时如果去 /mount/backups/my_backup 查看,会发现里面多了很多文件,这些文件其实都是基于 elasticsearch data 目录中的文件生成的压缩存储的备份文件。大家可以通过 du -sh . 命令看一下该目录的大小,方便后续做对比。

3. 何时备份

通过上面的步骤我们成功创建了一个备份,但随着数据的新增,我们需要对新增的数据也做备份,那么我们如何做呢?方法很简单,只要再创建一个快照 snapshot_2 就可以了。

PUT /_snapshot/my_backup/snapshot_2?wait_for_completion=true

当执行完毕后,你会发现 /mount/backups/my_backup 体积变大了。这说明新数据备份进来了。要说明的一点是,当你在同一个 repository 中做多次 snapshot 时,elasticsearch 会检查要备份的数据 segment 文件是否有变化,如果没有变化则不处理,否则只会把发生变化的 segment file 备份下来。这其实就实现了增量备份。

elasticsearch 的资深用户应该了解 force merge 功能,即可以强行将一个索引的 segment file 合并成指定数目,这里要注意的是如果你主动调用 force merge api,那么 snapshot 功能的增量备份功能就失效了,因为 api 调用完毕后,数据目录中的所有 segment file 都发生变化了。

另一个就是备份时机的问题,虽然 snapshot 不会占用太多的 cpu、磁盘和网络资源,但还是建议大家尽量在闲时做备份。

4. 如何恢复

所谓“养兵千日,用兵一时”,我们该演练下备份的成果,将其恢复出来。通过调用如下 api 即可快速实现恢复功能。

POST /_snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true
{
  "indices": "index_1",
  "rename_replacement": "restored_index_1"
}

通过上面的 api,我们可以将 index_1 索引恢复到 restored_index_1 中。这个恢复过程完全是基于文件的,因此效率会比较高。

虽然我们这里演示的是在同一个集群做备份与恢复,你也可以在另一个集群上连接该 repository 做恢复。我们这里就不做说明了。

5. 其他

由于 Elasticsearch 版本更新比较快,因此大家在做备份与恢复的时候,要注意版本问题,同一个大版本之间的备份与恢复是没有问题的,比如都是 5.1 和 5.6 之间可以互相备份恢复。但你不能把一个高版本的备份在低版本恢复,比如将 6.x 的备份在 5.x 中恢复。而低版本备份在高版本恢复有一定要求:

1) 5.x 可以在 6.x 恢复

2) 2.x 可以在 5.x 恢复

3) 1.x 可以在 2.x 恢复

其他跨大版本的升级都是不可用的,比如1.x 的无法在 5.x 恢复。这里主要原因还是 Lucene 版本问题导致的,每一次 ES 的大版本升级都会伴随 Lucene 的大版本,而 Lucene 的版本是尽量保证向前兼容,即新版可以读旧版的文件,但版本跨越太多,无法实现兼容的情况也在所难免了。

6. 继续学习

本文只是简单对 snapshot 功能做了一个演示,希望这足够引起你的兴趣。如果你想进一步深入的了解该功能,比如备份的时候如何指定部分索引、如何查询备份和还原的进度、如何跨集群恢复数据、如何备份到 HDFS 等,可以详细阅读官方手册https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html,如果在使用的过程中遇到了问题,欢迎留言讨论。