• 为elasticSearch开发c++接口


    一、    ElasticSearch是什么

    ElasticSearch是目前开源全文搜索引擎的首选,可以快速存储,搜索和分析海量数据。Stack Overflow,Github等都在使用。

    Elasticsearch 是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。

        ES提供的Client API:https://www.elastic.co/guide/en/elasticsearch/client/index.html

    包含多种语言:

    注意:没有C++接口,而我们需要基于c++操作ES

    二、    安装部署

    1.   服务器选择

    设备IP:10.3.246.224

    系统:linux-64

    磁盘空间:无  (df –h 发现磁盘没容量了)

    2.   解决磁盘占满

    du -sh /* | sort –nr  :找出系统中占容量最大的文件夹,系统中15scpp这个文件夹占41G

    du -sh /15scpp/* | sort -nr  :找出15scpp中占容量最大文件夹15scpp_testbin,占31G

    确认这个文件夹已无用,rm删除

    PS:在Linux中,当我们使用rm在linux上删除了大文件,但是如果有进程打开了这个大文件,却没有关闭这个文件的句柄,那么linux内核还是不会释放这个文件的磁盘空间。找出文件使用进程,kill掉,即可

    3.   JDK8安装

    Elastic 需要 Java 8 环境

    Java –version查看java是否安装或现在版本

    官网下载jdk-8u181-linux-x64.tar.gz,解压,安装,设置环境变量,这里就不赘述。

    1.   下载ES

    下载https://www.elastic.co/downloads/elasticsearch :

    elasticsearch-6.3.2.tar.gz

    tar解压

    2.   创建新用户

    因为安全问题elasticsearch 不让用root用户直接运行,所以要创建新用户:

    adduser pwrd-es

    passwd pwrd-es pwrd-es

    3.   修改安装文件权限

    chown -R pwrd-es:pwrd-es /home/elasticSearch/elasticsearch-6.3.2

    //因为安全问题,不让root用户执行安装,但是其他用户又没有文件操作权限,故而改之

    4.  修改ES配置

    Vim config/elasticSearch.yml

    cluster.name: pwrd-es   //Elasticsearch会自动发现在同一网段下的Elasticsearch 节点,用这个属性来区分不同的集群,cluster.name相同则自动组建成一个集群

    node.name: node-1   //节点名,默认随机指定一个name列表中名字,不能重复

    node.master: true      //指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master

    node.data: true  //指定该节点是否存储索引数据,默认为true

    path.data: /home/elasticSearch/log_export/data   //存储数据

    path.logs: /home/elasticSearch/log_export/logs   //存储日志

    #index.number_of_shards: 5 // 设置默认索引分片个数,默认为5片

    #index.number_of_replicas: 1 //设置默认索引副本个数,默认为1个副本

    network.host: 10.3.246.222 #该参数用于同时设置bind_host和publish_host

    network.bind_host: 0.0.0.0 #设置绑定的IP地址,可以是IPV4或者IPV6

    network.publish_host: 10.3.246.222 #设置其他节点与该节点交互的IP地址

    http.port: 9200

    transport.tcp.port: 9300 #节点之间交互端口

    transport.tcp.compress: true #设置是否压缩tcp上交互传输的数据

    http.max_content_length: 100mb #设置http内容的最大大小

    http.enabled: true #是否开启http服务对外提供服务

    # --------------------------------- Discovery ----------------------------------

    # Pass an initial list of hosts to perform discovery when new node is started:

    # The default list of hosts is ["127.0.0.1", "[::1]"]

    #设置集群中的Master节点的初始列表,可以通过这些节点来自动发现其他新加入集群的节点

    discovery.zen.ping.unicast.hosts: ["10.3.246.224", "10.3.246.223"]

    # Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1): 为了防止“脑裂”(master-slave分布式中核心难点),设置最低主节点数

    discovery.zen.minimum_master_nodes: 2  #集群中三个节点

    5.   修改系统最大虚拟内存

    vim /etc/sysctl.conf

    vm.max_map_count = 655360

    sysctl -p

    6.   切换用户执行程序

    切换用户: su pwrd-es

    ./elasticsearch

    7.   验证安装效果

    浏览器中输入10.3.246.224:9200

    或者

    curl 'http://localhost:9200/?pretty'   

    可以看到一个json数据,即为安装成功

    PS:pretty是为了json格式化,以至于返回的结果好看一些

    一、    基本概念

    1.   Node 与 Cluster

    Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。

    单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)

    通过cluster.name 属性配置集群的名字,用于唯一标识一个集群,不同的集群,其cluster.name 不同,集群名字相同的所有节点自动组成一个集群。当启动一个结点时,该结点会在当前局域网内自动寻找相同集群名字的主结点;如果找到主结点,该结点加入集群中;如果未找到主结点,该结点成为主结点

    2.   Index

    ES基本结构是 : index/type/id -> document (一般以json样式存储数据)

    所以Index(索引)是Elastic 数据管理的顶层单位,它是单个数据库的同义词。

    ES会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。

    PS:每个 Index (即数据库)的名字必须是小写。

    可以用如下命令,查看当前节点索引:

    curl -X GET 'http://localhost:9200/_cat/indices?v'

    3.   Document

    Index里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。

    Document 使用 JSON 格式表示,如下:

    {

        “name”:”张三”,

         “age”:18,

         “sex”:”male”

    }

    PS:对于json的编写与格式是否正确,可以借助在线json工具:http://www.bejson.com/

    4.   Type

    Type可以用来分类document,比如,china/Beijing/id-i ->doc-n

                                                      china/shanghai/id-j ->doc-m

    同一个Index下不同的 Type 应该有相似的结构。

    但是,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。

    我们部署的是当前最新6.3.2版本

    5.   Shared分片

    当一个索引下的数据太多,超过单一节点所能提供的磁盘空间,ES提供分片功能,可以将海量数据分片存储到集群中不同的节点中。当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。

    6.   Replicas副本

    为提高查询吞吐量或实现高可用性,可以使用分片副本。

    副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。

    当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。

    7.  ES数据架构概念与Mysql对比

     

    但是目前type即将作废。

    四、    CRUD简介

    1.   创建索引

    curl -XPUT "http://10.3.246.224:9200/tests/"

    返回数据

    {

           "acknowledged": true,

           "shards_acknowledged": true,

           "index": "testes"

    }

    2.   添加数据

    curl -XPUT "http://10.3.246.224:9200/tests/songs/1" -d '{"name":"deck the halls","year":"2018","month":"8"}' 会报错,如下指定header就可以了

     

    curl -H "Content-Type: application/json" -XPUT "http://10.3.246.224:9200/tests/songs/1" -d '{"name":"deck the halls","year":"2018","month":"8"}'

    返回结果:

    {

           "_index": "testes",

           "_type": "songs",

           "_id": "1",      //id 也可以不知道,由系统自主生成

           "_version": 1,

           "result": "created",//代表添加成功

           "_shards": {

                  "total": 2,

                  "successful": 1,

                  "failed": 0

           },

           "_seq_no": 0,

           "_primary_term": 1

    }

    3.   读取数据

    curl -XGET http://localhost:9200/music/songs/1?pretty

     

    返回数据:

    {

      "_index" : "testes",

      "_type" : "songs",

      "_id" : "1",

      "_version" : 1,

      "found" : true,  //查找成功

      "_source" : {    //目的数据

        "name" : "deck the halls",

        "year" : "2018",

        "month" : "8"

      }

    }

    4.   更新数据

    a)   查找更新某个key:

    curl -H "Content-Type: application/json" -XPOST "http://10.3.246.224:9200/testes/songs/1/_update?pretty" -d '{"doc":{"query":{"match":{"name":"qqqddd"}}}}'

    返回数据:

    {

      "_index" : "testes",

      "_type" : "songs",

      "_id" : "1",

      "_version" : 2,

      "result" : "updated",//更新成功

      "_shards" : {

        "total" : 2,

        "successful" : 1,

        "failed" : 0

      },

      "_seq_no" : 1,

      "_primary_term" : 1

    }

    b)   更新整条数据:

    curl -H "Content-Type: application/json" -XPOST "http://10.3.246.224:9200/testes/songs/1/_update?pretty" -d '{"doc":{"name":"qddd","year":"2018","month":"8"}}'

    返回数据同上

    c)   还有就是用添加数据的命令:只是将数据改了

    curl -H "Content-Type: application/json" -XPUT "http://10.3.246.224:9200/tests/songs/1" -d '{"name":"deck the halls","year":"2020","month":"8"}'

    5.   删除数据

    curl -XDELETE "http://localhost:9200/music/songs/1"

    返回数据:

    {

           "_index": "tests",

           "_type": "songs",

           "_id": "1",

           "_version": 2,

           "result": "deleted",//删除成功

           "_shards": {

                  "total": 2,

                  "successful": 1,

                  "failed": 0

           },

           "_seq_no": 1,

           "_primary_term": 1

    }

    注意:删除一个文档不会立即生效,它只是被标记成已删除。es将会在你之后添加更多索引的时候才会在后台进行删除内容的清理

    五、    ES的C++ API开发

    1.   ES没有C++的接口,而我们需要基于c++操作ES

    有两个办法

    一是嵌入其他语言的开发,利用ES已提供的接口,比如,在C++中嵌入python API,这在编译上可能引入新的问题

    二是需要自己构造如第四部分的http请求来获得数据,可以基于libcurl库,也可以基于系统中已有的httpproxy

    为了不破坏已有系统的一致性,基于httpproxy,来构造http请求,对外封装提供C++接口

    2.    基于业务需求设计思想

    /*es是面向文档,基于索引的弹性搜索引擎,故而

        *es中的数据结构:index/type/id ->对应一条数据,所以

    *es中帖子的数据结构设计:

    uid/tiezi/tid -> json{uid,tid,content,timestamp}

        *虽然存在uid和tid的冗余,但是这样设计的好处是:可以很方便处理某个人某条数据,因为uid就是索引,这样还利用了,索引的高处理性能

        */

    3.    C++ API

    1)   添加

    /*功能:向es中添加protobuf数据,但是在es中是以json样式存在

        *uid:用户id

        *tid:帖子id

        *msg:帖子结构,即(uid,tid,content,timestamp)

        */

    bool addDocument(const std::string &uid, const std::string &tid,const google::protobuf::Message *msg);

    封装后形成的http请求:

    curl -H "Content-Type: application/json" -XPUT "http://10.3.246.224:9200/ uid /tiezi/tid " -d ' msg .json_str()'

    2)   删除

        /*功能:向es中删除某个人uid的所有数据

        *uid:用户id

        */

    bool deleteAllByUid(const std::string &uid);

    封装后形成的http请求:

    curl -XDELETE http://localhost:9200/uid  -d ‘{“query”:{“match_all”:{}}}’

        /*功能:向es中删除某个人具体的某个数据

        *uid:用户id

        *tid:帖子id

        */

    bool deleteDocumentByUidTid(const std::string &uid, const std::string &tid);

    封装后形成的http请求:

    curl -XDELETE "http://localhost:9200/ uid / tiezi / tid "

        /*功能:向es中删除某个用户某个时间点以前的所有帖子,也就是 小于 某个时间的所有帖子

        *uid:用户id

        *beforeTimes:时刻以前的数据将全部会删除

        */

    bool deleteDocumentByUidBeforeTimes(const std::string &uid, const std::string &beforeTimes);

    封装后形成的http请求:

    curl -XPOST "http://localhost:9200/ uid /tiezi/_delete_by_query

    -d‘{"query":{"range":{"timestamp.keyword":{"gte":"2016-07-09 11:18:21","lte":"2018-08-17 11:18:21","format":"yyyy-MM-dd HH:mm:ss"}}}}’

    PS: timestamp是数据中一个字段,在时间段匹配中,要注意空格

    3)   查询

        /*功能:以或的逻辑关系操作查询帖子中是否存在包含词,并过滤返回结果,只返回并得到UID,tid

        *注:比如查询词是词组:"running swimming",查询之后的结果是,只要帖子content中至少包含一个词汇就可以,即帖子content中包含"running","swimming","running ... swimming ..."都返回

        *containsWords:查询词 或词组 ,比如 "sport","running swimming"

        *uid_tid:查询成功返回的N条uid和tid数据

        */

    int searchAllByContainWords_OR(const std::string &containsWords,vector<struct Uid_Tid> &uid_tid);

    封装后形成的http请求:

    curl -H "Content-Type: application/json" -XPOST "http://localhost:9200/_search

    -d ‘{"query":{"match": {"content":{"query":"swimming running"","operator":"or"}}},"_source":["uid","tid"]}’

    PS: operator 是or,表示是或逻辑操作,query中填写多个字段,匹配数据字段content中存在swimming或running,_source 中有数据字段uid和tid,用来控制返回结果的,当数据量很大的时候对结果裁剪,减少无用的数据传输

        /*功能:以与的逻辑关系操作查询帖子中是否存在包含词,并过滤返回结果,只返回并得到UID,tid

        *注:比如查询词是词组:"running swimming",查询之后的结果是,帖子content中包含每个词汇,即帖子content中包含running和 swimming才返回

        *containsWords:查询词 或词组 ,比如 "sport","running swimming"

        *uid_tid:查询成功返回的N条uid和tid数据

        */

        Int searchAllByContainWords_AND(const std::string &containsWords,vector<struct Uid_Tid> &uid_tid);

    封装后形成的http请求:

    curl -H "Content-Type: application/json" -XPOST "http://localhost:9200/_search

    -d ‘{"query":{"match": {"content":{"query":"swimming running"","operator":"and"}}},"_source":["uid","tid"]}’

    PS:同上,区别是operator是and,表示是与逻辑操作

     类似c++ API接口参考:https://github.com/QHedgeTech/cpp-elasticsearch

    六、    部署后运维

    1.    单节点集群中节点挂掉,数据会有损失吗?

    在Elasticsearch和磁盘之间是文件系统缓存。 在内存索引缓冲区中的文档会被写入到一个新的段中,但是这里新段会被先写入到文件系统缓存(这一步代价会比较低),稍后再被刷新(refresh)到磁盘(这一步代价比较高fsync)。不过只要文件已经在缓存中,就可以像其它文件一样被打开和读取了。在 Elasticsearch 中,写入和打开一个新段的过程叫做 refresh 。 默认情况下每个分片会每秒自动刷新一次。

    在fsync之后的数据是不会有损失的,如果你设置的refresh_interval刷新间隔过大,设备突然断电,这种情况避免不了数据丢失

    2.    假设是在集群单一节点挂掉中,数据会有损失吗?集群中多少个节点down机,会影响集群的健壮性,会导致数据丢失?

    当集群设置了分片(shard)和副本(replicats)时,(少部分节点挂掉)数据不会有损失。(PS:集群有3个节点,一个一个挂掉,只要有一个节点在,数据不会损失,集群可用)

    同时挂了多台,导致剩余节点中副本和分片拼不齐一个完整的数据时,集群将失效。(PS:集群有3个节点,同时挂掉2个,集群不可用,当只要再恢复一个,使能够拼齐一条完整的数据,集群恢复可用)。猜测,如果此时加入的是全新节点,可能不起作用。

    这部分还需要考虑主副数据一致性,参见6.15

    3.    集群节点挂掉是什么场景?挂掉的节点又及时加入集群是什么场景,有什么行为?挂掉的节点不可再用了(比如硬件问题),加入新的节点会有什么行为?

    答案同2

    4.    节点崩溃重启:

    1)节点崩溃后

    只要集群数据完整性没受到破坏,集群中Master 立即注意到了这个节点的离线,它决定在集群内提拔其他拥有该崩溃节点上面的主分片对应的副本分片为主分片,将找到该崩溃节点的副本

    在副本被提拔为主分片以后,master 节点开始执行恢复操作来重建缺失的副本。集群中的节点之间互相拷贝分片数据,网卡压力剧增

    由于目前集群处于非平衡状态,这个过程还有可能会触发小规模的分片移动。其他不相关的分片将在节点间迁移来达到一个最佳的平衡状态,集群状态变绿

    2)重启后

    该节点自动加入集群,这个节点被告知当前的数据已经没有用了, 数据已经在其他节点上重新分配了。所以 该节点 把本地的数据进行删除,然后重新开始恢复集群的其他分片,触发小规模的分片移动。其他不相关的分片将在节点间迁移来达到一个最佳的平衡状态,集群状态变绿

    3)如果明确知道该节点是瞬时中断,可以设置推迟分片的分配:

    curl -X PUT 10.3.246.224/_all/_settings -d '{"settings": {"index.unassigned.node_left.delayed_timeout": "5m" }}'

    4)如果节点在超时之后再回来,且集群还没有完成分片的移动,会发生什么事情呢?

    Elasticsearch 会检查该机器磁盘上的分片数据和当前集群中的活跃主分片的数据是不是一样 — 如果两者匹配, 说明没有进来新的文档,包括删除和修改 — 那么 master 将会取消正在进行的再平衡并恢复该机器磁盘上的数据。

    之所以这样做是因为本地磁盘的恢复永远要比网络间传输要快,并且我们保证了他们的分片数据是一样的,这个过程可以说是双赢。

    如果分片已经产生了分歧(比如:节点离线之后又索引了新的文档),那么恢复进程会继续按照正常流程进行。重新加入的节点会删除本地的、过时的数据,然后重新获取一份新的。

    5.    崩溃后起不来:

    只要集群数据完整性没受到破坏,集群可用,数据没有损失

    PS:什么叫数据完整性?即集群中对数据进行分片和副本,将分片副本按照一定算法分配到不同的节点上,任何一个节点down机或一个一个down机,都不会影响其他节点的分片或副本,可以将数据拼齐,恢复完整

    6.    集群节点扩展,加入新节点是什么场景,有什么行为?

    在集群正常使用下,加入新节点,将会使数据重新分布,以使任何一个(或部分)节点挂掉,仍能拼齐一条完整的数据。

    7.    集群监测哪些指标?

    集群健康:curl -X get http://10.3.246.224:9200/_cluster/health?pretty

    集群统计:

    curl -XGET 'http://10.3.246.224:9200/_cluster/stats?human&pretty'

    查看每个节点状态:

    curl -XGET  http://10.3.246.224:9200/_cat/nodes?v

    8.    分片(shard)和副本(replicats)怎么调整?

    主分片的数目在索引创建时就已经确定了下来。实际上,这个数目定义了这个索引能够 存储 的最大数据量。(实际大小取决于你的数据、硬件和使用场景。) 但是,读操作——搜索和返回数据——可以同时被主分片  副本分片所处理,所以当你拥有越多的副本分片时,也将拥有越高的吞吐量。

    在运行中的集群上是可以动态调整副本分片数目的,我们可以按需伸缩集群。让我们把副本数从默认的 1增加到 2 :

    对整个index调整副本数:

    curl -H "Content-Type: application/json" -X PUT http://10.3.246.222:9200/_settings  -d '{"number_of_replicas" : 2}'

    对某个index按需调整副本数2:

    curl -H "Content-Type: application/json" -X PUT http://10.3.246.222:9200/index/_settings  -d '{"number_of_replicas" : 2}'

    9.    路由一个文档到一个分片当中

    shard = hash(routing) % number_of_primary_shards

    routing:是一个可变值,默认是文档的id,也可以设置成一个自定义的值

    number_of_primary_shards :主分片的数量,如6,创建索引的时候就确定好主分片的数量并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了

    10. 多少个节点能组成一个正常的集群、业务功能、选举功能能正常使用

    这个没有要求。只有一个节点的,叫单节点集群。集群可用,是在可用节点中数据都具备完整性,即为可用。否则集群不可用。

    11. JVM SWAP

    12. 更新文档

    在 Elasticsearch 中文档是 不可改变 的,不能修改它们(倒排索引被写入磁盘后是 不可改变 的:它永远不会修改)。 相反,如果想要更新现有的文档,需要 重建索引或者进行替换。

    更新操作:1,从旧文档构建 JSON2,更改该 JSON 3,删除旧文档  4,索引一个新文档

     

    以下是部分更新一个文档的步骤:

    1)   客户端向 Node 1 发送更新请求。

    2)   它将请求转发到主分片所在的 Node 3 。

    3)   Node 3 从主分片检索文档,修改 _source 字段中的 JSON ,并且尝试重新索引主分片的文档。 如果文档已经被另一个进程修改,它会重试步骤 3 ,超过 retry_on_conflict 次后放弃。

    4)   如果 Node 3 成功地更新文档,它将新版本的文档并行转发到 Node 1 和 Node 2 上的副本分片,重新建立索引。 一旦所有副本分片都返回成功, Node 3 向协调节点也返回成功,协调节点向客户端返回成功。

    13. 系统升级

    14. 协调节点

    我们可以发送请求到集群中的任一节点。 每个节点都有能力处理任意请求。 每个节点都知道集群中任一文档位置,所以可以直接将请求转发到需要的节点上。每个节点都是这样的协调节点(coordinating node)

     

    以下是在主副分片和任何副本分片上面 成功新建,索引和删除文档所需要的步骤顺序:

    1)   客户端向 Node 1 发送新建、索引或者删除请求。

    2)   节点使用文档的 _id 确定文档属于分片 0 。请求会被转发到 Node 3`,因为分片 0 的主分片目前被分配在 `Node 3 上。

    3)   Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1 和 Node 2 的副本分片上。一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功。

    在客户端收到成功响应时,文档变更已经在主分片和所有副本分片执行完成,变更是安全的

     

    以下是从主分片或者副本分片检索文档的步骤顺序:

    1)   客户端向 Node 1 发送获取请求。

    2)   节点使用文档的 _id 来确定文档属于分片 0 。分片 0 的副本分片存在于所有的三个节点上。 在这种情况下,它将请求转发到 Node 2 。

    3)   Node 2 将文档返回给 Node 1 ,然后将文档返回给客户端。

    在处理读取请求时,协调结点在每次请求的时候都会通过轮询所有的副本分片来达到负载均衡

    15. 数据一致性

    consistency参数的值可以设为

     one:要主分片状态 ok 就允许执行_写_操作

    all:必须要主分片和所有副本分片的状态没问题才允许执行_写_操作

    quorum:默认为quorum,即大多数的分片副本状态没问题就允许执行_写_操作。

                                                                     ’quorum =( (primary + number_of_replicas) / 2 ) + 1

    如果你的索引设置中指定了当前索引拥有三个副本分片(number_of_replicas=3),那quorum=3 (primary=1)

    如果此时你只启动两个节点,那么处于活跃状态的分片副本数量就达不到规定数量,也因此您将无法索引和删除任何文档。

    16. 数据从内存到磁盘是个什么刷新机制 与 近实时

    在Elasticsearch和磁盘之间是文件系统缓存。 在内存索引缓冲区中的文档会被写入到一个新的段中,但是这里新段会被先写入到文件系统缓存(这一步代价会比较低),稍后再被刷新到磁盘(这一步代价比较高fsync)。不过只要文件已经在缓存中,就可以像其它文件一样被打开和读取了。

    在 Elasticsearch 中,写入和打开一个新段的轻量的过程叫做 refresh 。 默认情况下每个分片会每秒自动刷新一次。

    想优化索引速度而不是近实时搜索,可以通过创建索引时设置 refresh_interval

    curl -H "Content-Type: application/json" -X PUT http://10.3.246.223:9200/test_refresh -d '{"settings": {"refresh_interval": "30s" }}'

    停止刷新

    curl  -H "Content-Type: application/json"  -X PUT http://10.3.246.223:9200/test_refresh/_settings  -d '{"refresh_interval":-1}'

    refresh_interval 可以在既存索引上进行动态更新

    curl  -H "Content-Type: application/json"  -X PUT http://10.3.246.223:9200/test_refresh/_settings  -d '{"refresh_interval":"30m"}'//-1 不设置,1一毫秒,1s一秒,30m 30分钟

    17. 持久化

    一个文档被索引之后,就会被添加到内存缓冲区,并且追加到了 translog。

    translog 提供所有还没有被刷到磁盘的操作的一个持久化纪录。当 Elasticsearch 启动的时候,它会从磁盘中使用最后一个提交点去恢复已知的段,并且会重放 translog 中所有在最后一次提交后发生的变更操作。

    18. Translog 有多安全 ?

    在文件被fsync到磁盘前,被写入的文件在重启之后就会丢失。默认translog 是每5秒被fsync刷新到硬盘,或者在每次写请求完成之后执行。这个过程在主分片和复制分片都会发生。最终,基本上,这意味着在整个请求被fsync到主分片和复制分片的translog之前,你的客户端不会得到一个200 OK响应。

    可以设置异步fsync

    curl -H "Content-Type: application/json" -X PUT http://10.3.246.223:9200/tttt/_settings  -d '{"index.translog.durability": "async","index.translog.sync_interval": "5s"}'

    这个选项可以针对索引单独设置,并且可以动态进行修改。如果你决定使用异步 translog 的话,你需要 保证 在发生crash时,丢失掉 sync_interval 时间段的数据也无所谓

    如果你不确定这个行为的后果,最好是使用默认的参数( "index.translog.durability": "request" )来避免数据丢失

    七、    资料

    1.   ES参考手册

    https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

    2.   《ElasticSearch权威指南》

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/intro.html

    3.   中文社区

    https://elasticsearch.cn/

    4.   英文社区

    https://discuss.elastic.co/c/elasticsearch/

    八、    插件

    1.   Head插件

    在chrome中直接安装的插件,要比在linux下命令安装简单

    2.   Ik分词插件

    九、    其他

    ES也提供对数据的分析,功能非常强大,还有很多像ik这样分词插件,我们在浏览器中访问es服务,在web界面中也可以很方便的操作数据。了解的非常浅显,暂记于此,以待有机会深入了解。对于json格式以及json中数据空格也需要非常注意。

  • 相关阅读:
    给“file”类型的input框赋值的问题
    bootstrap-paginator分页插件的两种使用方式
    开发中使用UEditor编辑器的注意事项
    java图形界面设计
    ArrayList 、LinkList区别以及速度对比
    java中的ArrayList 、List、LinkedList、Collection关系详解
    Josephus问题的不同实现方法与总结
    浅谈JAVA中字符串常量的储存位置
    linux安装vmware出现Gtk-Message: Failed to load module pk-gtk-module canberra-gtk-module的解决方法
    ubuntu安装搜狗输入法的相关问题
  • 原文地址:https://www.cnblogs.com/woshare/p/9475379.html
Copyright © 2020-2023  润新知