我们ES集群主要解决的是这两个问题:海量数据存储问题、单点故障问题
海量数据存储问题:单机的ES,数据存储能力是有上限的
单点故障问题:如果单机上的Elasticsearch节点发生故障,整个系统会停止服务,导致数据不可访问甚至丢失,造成损失
单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。
·海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),每一份叫做一个分片,存储到多个节点,多台机器上,这样我的存储能力是多个节点存储能力总和,机器越多,理论存储的上限就可以越高,存储能力就得到提升了:
单点故障问题:将分片数据做一个备份,并且一个分片的主分片和副分片绝对不能放在同一个节点,避免这个节点挂了,什么都没有了 ,这样可以在一定的程度上解决单点故障问题,当然成本也越高。
部署es集群
docker-compose:在一个文本文件里描述多个容器的部署方式,从而实现一键部署,描述了三个es节点容器的部署方案;
部署es集群可以直接使用docker-compose来完成,不过要求你的Linux虚拟机至少有4G的内存空间,我们现在利用三个docker容器模拟3个ed节点(3个机器),容器之间相互隔离:
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.5
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.5
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.5
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
第一步:
vi /etc/sysctl.conf
第二步:
vm.max_map_count = 262144
第三步: 让配置生效
sysctl -p
[root@db301601 ~]# docker restart es
es
[root@db301601 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
877298bbcfdf elasticsearch:7.12.1 "/bin/tini -- /usr/l…" 22 minutes ago Up 23 seconds 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp es
881f28a337e6 kibana:7.12.1 "/bin/tini -- /usr/l…" 2 hours ago Up 2 hours 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp kibana
[root@db301601 ~]# vi /etc/sysctl.conf
[root@db301601 ~]# sysctl -p
vm.swappiness = 0
kernel.sysrq = 1
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_slow_start_after_idle = 0
vm.max_map_count = 262144
[root@db301601 ~]#
第四步:运行
如果报错请看这篇博客: docker-compose: command not found-CSDN博客
docker-compose up -d
我们可以用kibana去监控集群的状态,但是kibana默认只能连接到其中的一个节点,并且还依赖x-pack,所以采用cerebro:
然后你输入节点的地址,就可以访问虚拟机上任意节点的地址了:
集群下的数据查询、存储是什么样子的呢