ElasticSearch最实用入门指南——初步环境

   ES作为全文检索引擎,在世界范围内被广泛实用,国内阿里在用、华为在用、58在用,不会用ES,是不对的...

    ES与关系型数据库的概念对比

关系型数据库

Databases

Tables

Rows

Columns

ElasticSearch

Indices

Types

Documents

Fields

    首先,ES是分布式的,可集群部署、数据分片存储,且分片有副本机制,ES集群的节点分类如下:


Master-eligible node :   主节点

负责管理 ES 集群,通过广播的机制与其他节点维持关系,负责集群中的 DDL 操作(创建/删除索引),管理其他节点上的分片(shard)


Data node :                     数据节点

数据节点主要是存储索引数据(主分片、复制分片)的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对cpu,内存,IO要求较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。


Ingest node :                  提取节点,也可称之为预处理节点

通过ingest pipeline机制,可将输入到Elasticsearch的数据格式化处理,也可按照定制的格式输出查询结果,通过这种定制,减少开发的工作量


coordinating node:        协调节点

也可称之为client nodes,即客户端节点,该类型节点只负责处理路由请求,处理搜索,分发索引操作等,是开发程序接入的入口,也负责节点间的负载均衡。


还有些特殊功能的节点,如Alert节点和Machine Learning节点,如果不分别设置的化,ES的每个节点都可以是以上任何类型的节点,什么都能干,但是对于华为或58这种级别的环境,让每个节点各司其职,是更好的方式。

比如配置ES的配置文件 elasticseach.yml,指定

node.master: true  

node.data: false  

node.ingest: false

那么这个节点就只是Master节点了,不负责数据存储,分片分不到这个节点上来。

下面的架构是ES内部的工程推荐的最佳实践:

可以简单实用docker-compose搭建一个三节点的环境,同样可以实现高可用,首先创建docker-compose.xml文件:

version: '2.2'    

services:    

  elasticsearch:    

    image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2    

    container_name: elasticsearch    

    environment:    

      - cluster.name=docker-cluster    

      - node.name=node1    

      - discovery.zen.minimum_master_nodes=2    

          - bootstrap.memory_lock=true    

          - http.cors.enabled=true    

          - http.cors.allow-origin=*    

          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"    

        ulimits:    

          memlock:    

            soft: -1    

            hard: -1    

        volumes:    

          - /Volumes/Docker/Volumes/es/data1:/usr/share/elasticsearch/data    

        ports:    

          - 9200:9200    

        networks:    

          - esnet    

      elasticsearch2:    

        image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2    

        container_name: elasticsearch2    

        environment:    

          - cluster.name=docker-cluster    

          - node.name=node2    

          - bootstrap.memory_lock=true    

          - discovery.zen.minimum_master_nodes=2    

          - http.cors.enabled=true    

          - http.cors.allow-origin=*    

          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"    

          - "discovery.zen.ping.unicast.hosts=elasticsearch"    

        ulimits:    

          memlock:    

            soft: -1    

            hard: -1    

        volumes:    

          - /Volumes/Docker/Volumes/es/data2:/usr/share/elasticsearch/data    

        ports:    

          - 9201:9200    

        networks:    

          - esnet    

      elasticsearch3:    

        image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2    

        container_name: elasticsearch3    

        environment:    

          - cluster.name=docker-cluster    

          - node.name=node3    

          - bootstrap.memory_lock=true    

          - discovery.zen.minimum_master_nodes=2    

          - http.cors.enabled=true    

          - http.cors.allow-origin=*    

          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"    

          - "discovery.zen.ping.unicast.hosts=elasticsearch"    

        ulimits:    

          memlock:    

            soft: -1    

            hard: -1    

        volumes:    

           - /Volumes/Docker/Volumes/es/data3:/usr/share/elasticsearch/data    

        ports:    

          - 9202:9200    

        networks:    

          - esnet    

        

      # kibana:     

      #   image: 'docker.elastic.co/kibana/kibana:6.3.2'    

      #   container_name: kibana    

      #   environment:    

      #     SERVER_NAME: kibana.local    

      #     ELASTICSEARCH_URL: http://elasticsearch:9200    

      #   ports:    

      #     - '5601:5601'    

      #   networks:    

      #     - esnet    

        

      headPlugin:    

        image: 'mobz/elasticsearch-head:5'    

        container_name: head    

        ports:    

          - '9100:9100'    

        networks:    

          - esnet            

    networks:    

      esnet:  

这个docker-compose使用的是ES官方的镜像,大可放心安全,另外需要修改的是每个elasticsearch节点的volumes, 我们挂载宿主机的卷,这样每次重启docker-compose,数据不会丢失; 

这个docker-compose文件里还有一个elasticsearch-header插件的节点,可以查看ES的集群和索引状态,说实话这个插件真的老了, cerebro是更好的选择

docker run -p 9000:9000 lmenezes/cerebro

浏览器直接打开http://localhost:9000,然后选择宿主机IP:9200去连接ES即可,一定是宿主机的IP:端口号,使用localhost:9200在cerebro容器里被理解为容器自己了

嗯,好看多了...

此外,这个docker-compose.xml还注释掉了kibana的节点,如果对kibana感兴趣,取消掉注释就可以了。

对于宿主的卷,是需要在docker指定的共享目录下才行,这是docker一个安全原则,下图即为docker指定的共享目录

设置好之后,不管你信不信,在docker-compose.xml文件所在的文件夹,运行docker-compose up, 三个节点+一个header插件节点就都启动了,我们在docker-compose.xml中,指定了每个节点

cluster.name=docker-cluster

因此集群自动创建好了

直接在终端输入 curl http://localhost:9200/_cluster/health?pretty

{

  "cluster_name" : "docker-cluster",

  "status" : "green",

  "timed_out" : false,

  "number_of_nodes" : 3,

  "number_of_data_nodes" : 3,

  "active_primary_shards" : 10,

  "active_shards" : 20,

  "relocating_shards" : 0,

  "initializing_shards" : 0,

  "unassigned_shards" : 0,

  "delayed_unassigned_shards" : 0,

  "number_of_pending_tasks" : 0,

  "number_of_in_flight_fetch" : 0,

  "task_max_waiting_in_queue_millis" : 0,

  "active_shards_percent_as_number" : 100.0

}

"status" : "green" 说明集群状态正常,我们现在可以放一些demo数据进去了

先用浏览器打开

https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json

再复制显示的内容到postman软件里,在文本末尾加上一个回车,必须加这个回车,否则报个

The bulk request must be terminated by a newline [\n]

这样的错误

postman的url设置为:

http://localhost:9200/bank-1/account/_bulk?pretty&refresh

account是索引名,account是mapping名,都可以随便指定,直接post就可以了,

看下cerebro

索引已经创建成功了, 接下来可以好好的做游戏了

下一次我们实际操作看看ES集群脑裂是怎么回事

敬请关注公众号 AI一大数据

猜你喜欢

转载自blog.csdn.net/qq_18730155/article/details/85407559