背景: 公司项目生产环境的ES集群索引的初始分片创建时没有设置,默认为5个分片,一个副本。生产环境数据量激增,需要横向扩展,分片太少而无法横向扩展(ES的分片为最小逻辑单位,一个分片只能存在于一台物理机,一台物理机可以有多个分片)。由于ES2.2.1版本尚未支持分片的修改,所以需要重新建立索引(加大分片数),并将原有索引备份过来。
考虑方案:
1. 运用官方提供的API snapshot and restore,官方文档轻描淡写,但建立snapshot时需要利用分布式存储。优点是官方api比较靠谱。 网上有利用fuse和sshfs 在集群机器挂载共享目录的方式,但还是生产环境太烂,无外网,centos yum 用不了,单独安装软件还需要处理复杂的包依赖。。。。总之一堆问题的情况下决定放弃这个方法。
github上面的开源elasticsearch 插件,Knapsack 。优点是简单已用,不需要分布式存储,缺点是非官方(经过实验可用)。目前只支持到ES的2.3.4版本。Knapsack的github地址:https://github.com/jprante/elasticsearch-knapsack
下面对索引迁移的过程做了一下整理:
(1) 将原有索引进行备份,注意由于需要将数据导入新的索引,所以需要导出的时候就将索引改名。
curl -XPOST 'localhost:9200/vehicle/data/_export?map=\{"vehicle":"vehicle_new"\}'
文件超大的时候, 需要将文件分块:
curl -XPOST 'localhost:9200/ehlindex/_export?map=\{"ehlindex":"ehlindex_new"\}&archivepath=/data1/elasticsearch/logs/ehlindex.bulk&bytes=10g'
(2) 新建索引
curl -XPOST 'localhost:9200/vehicle_new' -d @settings.json
settings.json文件内容:
{
"settings": {
"number_of_shards" : 20,//分片
"number_of_replicas" : 1 //副本
}
}
(3) 新建类型,设置类型mapping
curl -XPOST 'localhost:9200/vehicle_new/_mapping/data' -d @mapping.json
(3) 将数据导入新索引(注:如果分块,需要指定导入的文件archivepath)
curl -XPOST 'localhost:9200/vehicle/_import?map=\{"vehicle":"vehicle_new"\}&createIndex=false&archivepath=/data1/elasticsearch/logs/ehlindex.bulk'
网友评论