某项目中客户自建Elastic Search向腾讯云上迁移总结(一)

背景描述:

在某婚恋客户合作过程中,由于以前该客户的所有基础架构环境全部部署在客户自己的IDC中,但是该IDC建设于10年前,IDC已经使用很久了,而且是运营商IDC,外网带宽有限,资源机架扩展有很大局限,还出现过多次DDOS攻击,而且客户的技术团队人员基本都在深圳,在北京还配备了一个单独的机房本地巡检维护团队,因此该客户基于云的很多好处,考虑将业务迁移到腾讯云。

本文主要聚焦于ElasticSearch的迁移,客户在IDC现有环境自建ElasticSearch分片集群(数据量500G以内),迁移到云上的虚拟机自建ES集群。

ELK生态基本介绍:

ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。

Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。如下是一种常见的ELK架构:

由于本文聚焦于ElasticSearch本身和其上数据的迁移,因此ELK本身不展开更多描述,网上有更详尽的描述。

ElasticSearch基本结构和数据存储:

 索引(Index)

   ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。

 类型(Type)

   类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。类比传统的关系型数据库领域来说,类型相当于“表”。

 文档(Document)

   文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。

ElasticSearch存储结构(很重要):

分片(Shard)和副本(Replica)    ES的“分片(shard)”机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。每个分片其内部都是一个全功能且独立的索引,因此可由集群中的任何主机存储。创建索引时,用户可指定其分片的数量,默认数量为5个。 

   Shard有两种类型:primary和replica,即主shard及副本shard。Primary shard用于文档存储,每个新的索引会自动创建5个Primary shard,当然此数量可在索引创建之前通过配置自行定义,不过,一旦创建完成,其Primary shard的数量将不可更改。Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。每个Primary shard默认配置了一个Replica shard,但也可以配置多个,且其数量可动态更改。ES会根据需要自动增加或减少这些Replica shard的数量。

   ES集群可由多个节点组成,各Shard分布式地存储于这些节点上。

ES可自动在节点间按需要移动shard,例如增加节点或节点故障时。简而言之,分片实现了集群的分布式存储,而副本实现了其分布式处理及冗余功能。

此部分内容请参考:http://www.cnblogs.com/wenBlog/p/8482326.html

Elastic数据的读出与写入:

ES提供restful接口API和客户端以及工具交互,如下所示:

curl -X<VERB> '<PROTOCOL>://<HOST>/<PATH>?<QUERY_STRING>' -d '<BODY>'

VERB:HTTP协议的请求方法,常用的有GET、POST、PUT、HEAD以及DELETE;

PROTOCOL:协议类型,http或https;

HOST:ES集群中的任一主机的主机名;

PORT:ES服务监听的端口,默认为9200;

QUERY_STRING:查询参数,例如?pretty表示使用易读的JSON格式输出;

BODY:JSON格式的请求主体;

通过前面介绍,总结几种常见的ElasticSearch迁移方式:

ElasticSearch迁移:

1.ElasticSearch Reindex/logstash方式迁移,本质是将ES中的数据读出,再写入的过程,由于本文中没有使用该方式,暂时不详细介绍。

2.使用ES集群的Rebalance方式,实现数据的迁移。

  • 在腾讯云构建一套与idc elasticsearch版本一致的es集群;
  • 配置idc机房的elasticsearch的数据allocation参数,对数据迁移进⾏行限流,主要参数包括:
    1. cluster.routing.allocation.enable 该参数用来控制允许分配哪种分片。默认是 all,可选项还包括 primaries 和 new_primaries,none 则彻底拒绝分片。
    2. cluster.routing.allocation.allow_rebalance 该参数用来控制什么时候允许数据均衡。默认是 indices_all_active,即要求所有分⽚片都正常启动成功以后,才可以进行数据均衡操作,否则的话,在集群重启阶段,会浪费太多流量了。
    3. cluster.routing.allocation.cluster_concurrent_rebalance 该参数用来控制集群内同时运行的数据均衡任务个数,默认是 2 个,如果有节点增减,且集群负载压力不高的时候,可以适当加大。 参考:

https://www.elastic.co/guide/en/elasticsearch/reference/5.6/shards-allocation.html

  • 将腾讯云的elasticsearch服务加入到idc的elasticsearch集群,关键配置项:discovery.zen.ping.unicast.hosts,不需要重启elasticsearch的集群即可加入;等待部分数据自动迁移到腾讯云的elasticsearch节点,备注:数据在没有人工干预的情况下,不会全部迁移到腾讯云的节点;
  • 通过elasticsearch的api,分单台或者分批次下线idc的elasticsearch节点,api为:cluster.routing.allocation.exclude._ip,备注:此处ip可以是list,但是只执行最后一次的exclude,所以如果节点数据未彻底迁移完成,请勿执行第二次的下线节点操作;

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏生信宝典

测序文章数据上传找哪里

在我们发表高通量测序文章之前通常要上传测序数据到GEO数据库,现总结流程如下。 注册账户、填写MetaSheet 在NCBI GEO官网注册一个账号,然后登陆。...

25860
来自专栏京东技术

Android Architecture Paging Library详解 | Google I/O大会上的最新发布

Android高级工程师,6年以上开发经验,有丰富的代码重构和架构设计经验,负责京东商城我的京东的开发工作,热衷于学习和研究新技术。

42220
来自专栏owent

近期的一个协程流程BUG

最近一直没什么时间整理近期碰到的问题,今天思考了一下之前碰到的一个临时处理的BUG,顺便写点东西清理一下思路。

8520
来自专栏杨建荣的学习笔记

简单分析percona-zabbix-templates(r10笔记第6天)

当Zabbix和Percona两者相遇,会擦出不少的开源火花来,众人拾柴火焰高,最终受益的还是大部分运维人员。 我很早就用过Percona提供的...

39160
来自专栏IT可乐

Linux系列教程(三)——Linux学习技巧

  前面我们讲了Linux系统的详细安装教程,大家跟着教程一步一步的操作,应该能完美的完成安装。那么这篇博客跟大家聊聊如何来学习Linux。 1、工欲善其事必先...

30370
来自专栏Java帮帮-微信公众号-技术文章全总结

day28.Redis【Python教程】

下载:打开redis官方网站 https://redis.io/,推荐下载稳定版本(stable)

8910
来自专栏企鹅号快讯

如何提升Java应用程序性能

作者 | Eugen Paraschiv 翻译 | 雁惊寒 【摘要】本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代...

28680
来自专栏服务端技术杂谈

服务化配置的另一种可能

项目背景 项目是给内部团队用的,也算是业务场景较为复杂的系统,这种系统较于互联网C端产品,用户量不大,QPS峰值不会太高,但业务会比较复杂,业务变动比较频繁。 ...

28030
来自专栏大数据文摘

业界 | Dropbox力荐!我们如何应对Python桌面应用程序的崩溃

揭秘Crashpad系统如何帮助Dropbox这样复杂的桌面程序捕获并报告崩溃,且兼容Python的多种语言。

11410
来自专栏腾讯移动品质中心TMQ的专栏

Android内存泄露测试不再蓝瘦,香菇

在进行Android内存泄露分析时,面对成千上万个对象,你是否蓝瘦,香菇?作为测试人员你在进行内存泄露测试之后,是否有勇气告诉开发同事程序已经没有内存泄露,可以...

32470

扫码关注云+社区

领取腾讯云代金券