elasticsearch之python备份

摘要:
集群靠其独有的名称进行标识,默认名称为“elasticsearch”。Replicashard是PrimaryShard的副本,用于冗余数据及提高搜索性能。ES会根据需要自动增加或减少这些Replicashard的数量。ElasticSearch在设计上支持插件式体系结构,用户可根据需要通过插件来增强ElasticSearch的功能。向ElasticSearch发起查询操作有两种方式:一是通过RESTfulrequestAPI传递查询参数,也称“query-string”;另一个是通过发送RESTrequestbody,也称作JSON格式。

一:elasticsearch原理

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

不过,Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 分布式的实时分析搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。

二:概念

索引(Index)

ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。

索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。

类型(Type)

类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。

例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。类比传统的关系型数据库领域来说,类型相当于“表”。

文档(Document)

文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。

文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。

映射(Mapping)

ES中,所有的文档在存储之前都要首先进行分析。用户可根据需要定义如何将文本分割成token、哪些token应该被过滤掉,以及哪些文本需要进行额外处理等等。

另外,ES还提供了额外功能,例如将域中的内容按需排序。事实上,ES也能自动根据其值确定域的类型。

接下去再说说ES Cluster相关的一些概念。

集群(Cluster)

ES集群是一个或多个节点的集合,它们共同存储了整个数据集,并提供了联合索引以及可跨所有节点的搜索能力。

多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。

集群靠其独有的名称进行标识,默认名称为“elasticsearch”。节点靠其集群名称来决定加入哪个ES集群,一个节点只能属一个集群。

如果不考虑冗余能力等特性,仅有一个节点的ES集群一样可以实现所有的存储及搜索功能。

节点(Node)

运行了单个实例的ES主机称为节点,它是集群的一个成员,可以存储数据、参与集群索引及搜索操作。

类似于集群,节点靠其名称进行标识,默认为启动时自动生成的随机Marvel字符名称。

用户可以按需要自定义任何希望使用的名称,但出于管理的目的,此名称应该尽可能有较好的识别性。

节点通过为其配置的ES集群名称确定其所要加入的集群。

分片(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,例如增加节点或节点故障时。简而言之,分片实现了集群的分布式存储,而副本实现了其分布式处理及冗余功能。

下面说说ES系统及插件。

ES依赖于JDK,使用Oracke JDK或OpenJDK均可。

JDK在不同平台的安装方式各异,具体方法这里不再介绍。ES的安装也非常容易,通常只需要简单修改其配置文件中的集群名称,并启动服务即可,这里不再赘述。

ElasticSearch在设计上支持插件式体系结构,用户可根据需要通过插件来增强ElasticSearch的功能。

目前,常用的通过插件扩展的功能包括添加自定义映射类型、自定义分析器、本地脚本、自定义发现方式等等。

安装及移除插件

插件的安装有两种方式:直接将插件放置于plugins目录中,或通过plugin脚本进行安装。

Marvel、BigDesk及Head这三个是较为常用的插件。

ElasticSearch提供了易用但功能强大的RESTful API以用于与集群进行交互,这些API大体可分为如下四类:

(1) 检查集群、节点、索引等健康与否,以及获取其相关状态与统计信息;
(2) 管理集群、节点、索引数据及元数据;
(3) 执行CRUD操作及搜索操作;
(4) 执行高级搜索操作,例如paging、filtering、scripting、faceting、aggregations及其它操作;

下面简单说一说ES中的数据查询。

Query API是ElasticSearch的API中较大的一部分,基于Query DSL(JSON based language for building complex queries),可完成诸多类型查询操作,例如simple term query, phrase, range, boolean, fuzzy, span, wildcard, spatial等简单类型查询、组合简单查询类型为复杂类型查询,以及文档过滤等。

另外,查询执行过程通常要分成两个阶段,分散阶段及合并阶段。

分散阶段是向所查询的索引中的所有shard发起执行查询的过程,合并阶段是将各shard返回的结果合并、排序并响应给客户端的过程。

向ElasticSearch发起查询操作有两种方式:一是通过RESTful request API传递查询参数,也称“query-string”;另一个是通过发送REST request body,也称作JSON格式。

了解原理之后,so ....备份开始

elasticsearch之python备份第1张

迁移注意事项

  • 保证ES集群不再接受新的数据(如果是备份的话,这一点可以不考虑,但是做数据迁移的话,建议这样做).
  • 不建议直接在生产环境做这些操作,最好是先在本地搭建一个和生产环境一样的集群环境,创建一些测试数据,把整个过程先跑一遍,然后再到生产环境操作。

注册快照仓库

ES是通过快照的方式来实现数据备份,并且是以增量的方式,所以一般第一次做的话会花费较长的时间。为了做快照,那么就需要注册一个快照仓库,告诉ES我们的快照应该如何保存以及将快照保存到哪里.

curl -XPUT 192.168.1.2:9200/_snapshot/backup -d '
>{
> "type":"fs",
> "settings":{"location":"/data/elasticsearch_backup/data"}
> }'
{"acknowledged":true}

注:/data/elasticsearch_backup/data需有写入权限,并需挂着到节点服务器中,并需创建/data/elasticsearch_data/zip目录,存放备份压缩

例如:192.168.1.2安装nfs并挂载(步骤略)

192.168.1.3node2执行挂载目录mount 192.168.1.2:/data/elasticsearch_backup/data/data/elasticsearch_backup/data

开始备份

elasticsearch之python备份第2张elasticsearch之python备份第3张
1 #!/usr/bin/python
2 #-*- coding:UTF-8 -*- #
3 #_author_: patrick
4 """
5 自动备份ElaticSearch
6 """
7 
8 importsys,requests
9 importsimplejson
10 importtime,os
11 importzipfile
12 
13 URL="http://192.168.1.2:9200/_snapshot/backup?$filename?pretty"
14 BAK_DIR="/data/elasticsearch_backup/data"
15 ZIP_DIR="/data/elasticsearch_backup/zip"
16 
17 if __name__=='__main__':
18     date=time.strftime('%Y.%m.%d',time.localtime(time.time()-86400))
19     index='logstash-sec-'+date
20     url=URL+'/'+index+'?wait_for_completion=true'
21     #开始备份指定INDEX
22     r2=requests.post(url)
23     print "----------->",r2.text
24 
25     #查询备份状态
26     r3=requests.get(url)
27     dic=simplejson.loads(r3.text)
28     printdic
29     while  (dic['snapshots'][0]['state']=='IN_PROGRESS'):
30         print "%s Backup is IN_PROGRESS..." %index
31         time.sleep(10)
32         r3=requests.get(url)
33         dic=simplejson.loads(r3.text)
34 
35     if dic['snapshots'][0]['state']=='SUCCESS':
36         print '%s 备份成功' %index
37         try:
38             #压缩文件
39             zfile=ZIP_DIR+'/'+index+'.zip'
40             z = zipfile.ZipFile(zfile,'w',zipfile.ZIP_DEFLATED,allowZip64=True)
41             print "开始压缩文件..."
42             for dirpath, dirnames, filenames inos.walk(BAK_DIR):
43                 for filename infilenames:
44 z.write(os.path.join(dirpath,filename))
45 z.close()
46 
47             #os.system('rm -rf '+BAK_DIR) #删除原文件目录
48 
49             print "备份结束"
50 
51 
52         exceptException,e:
53             printe
54         print "开始删除index: %s" %index
55         os.system('curl -XDELETE "http://192.168.31.8:9200/_snapshot/backup/%s"' %index)
56 
57     else:
58         print '%s 备份失败' % index
python备份ES

恢复备份

curl -XPOST http://192.168.1.2:9200/_snapshot/backup/logstash-sec-2016.10.22/_restore

免责声明:文章转载自《elasticsearch之python备份》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇BAT教程 :第四节(批处理中的变量)Android Native C 之 Helloworld的四种编译方式_转载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python机器学习(6)——逻辑回归分类

在本系列文章中提到过用Python机器学习(2)数据拟合与广义线性回归中提到过回归算法来进行数值预测。逻辑回归算法本质还是回归,只是其引入了逻辑函数来帮助其分类。实践发现,逻辑回归在文本分类领域表现的也很优秀。现在让我们来一探究竟。 1、逻辑函数 假设数据集有n个独立的特征,x1到xn为样本的n个特征。常规的回归算法的目标是拟合出一个多项式函数,使得预测...

用python从redis的有序集合中一次性删除多个值

最近做的一个东西,需要用python从redis的有序集合中一次性删除多个值; redis的自带方法zrem是支持此功能的 # 移除多个元素 redis> ZREM page_rank baidu.com bing.com (integer) 2 python redis 的api 中也支持 zrem(self, name, *values)...

python调用摄像头

1.python实时调取本地摄像头 import numpy as np import cv2 cap = cv2.VideoCapture(0)    #参数为0时调用本地摄像头;url连接调取网络摄像头;文件地址获取本地视频 while(True): ret,frame=cap.read() #灰度化 gray=cv2.cvtColor(frame,...

【python】Threadpool线程池任务终止简单示例

需求 加入我们需要处理一串个位数(0~9),奇数时需要循环打印它;偶数则等待对应时长并完成所有任务;0则是错误,但不需要终止任务,可以自定义一些处理。 关键点 定义func函数处理需求 callback处理返回结果,只有偶数和0返回;奇数会一直执行;要控制线程池状态,则需要针对偶数和0时抛出异常,并捕获异常处理。 threadpool定义线程池并发 实现...

pycharm+python+Django之web开发环境的搭建(windows)

转载:https://blog.csdn.net/yjx2323999451/article/details/53200243/ pycharm+python+Django之web开发环境的搭建(windows) 最近在学习python,总感觉网上写的一些东西对新手(python方面的程序员)来说不是太友好。有些文章写得不是太详细,有些又写得比较高升。对于...

mssql性能优化

总结下SQL SERVER数据库性能优化相关的注意事项,在网上搜索了一下,发现很多文章,有的都列出了上百条,但是仔细看发现,有很多似是而非或者过时(可能对SQL SERVER6.5以前的版本或者ORACLE是适用的)的信息,只好自己根据以前的经验和测试结果进行总结了。我始终认为,一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开...