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一大数据