Elasticsearch 集群
作者:互联网
一、集群原理
官网介绍:https://www.elastic.co/guide/cn/elasticsearch/guide/current/distributed-cluster.html
elasticsearch 是天生支持集群的,他不需要依赖其他的服务发现和注册的组件,如 zookeeper
这些,因为他内置了一个名字叫 ZenDiscovery 的模块,是 elasticsearch 自己实现的一套用
于节点发现和选主等功能的组件,所以 elasticsearch 做起集群来非常简单,不需要太多额外
的配置和安装额外的第三方组件。
1.1、单节点
一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同
cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群
中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
当一个节点被选举成为 主节点时, 它将负责管理集群范围内的所有变更,例如增加、
删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索
等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。
任何节点都可以成为主节点。我们的示例集群就只有一个节点,所以它同时也成为了主
节点。
作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知
道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。
无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数
据,并将最终结果返回給客户端。 Elasticsearch 对这一切的管理都是透明的。
1.2、集群健康
Elasticsearch 的集群监控信息中包含了许多的统计数据,其中最为重要的一项就是 集群健
康 , 它在 status 字段中展示为 green 、 yellow 或者 red 。
GET /_cluster/health
status 字段指示着当前集群在总体上是否工作正常。它的三种颜色含义如下:
green:所有的主分片和副本分片都正常运行。
yellow:所有的主分片都正常运行,但不是所有的副本分片都正常运行。
red:有主分片没能正常运行。
1.3、分片
一个 分片 是一个底层的 工作单元 ,它仅保存了全部数据中的一部分。我们的文档被
存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。分片就认为
是一个数据区
一个分片可以是 主 分片或者 副本 分片。索引内任意一个文档都归属于一个主分片,
所以主分片的数目决定着索引能够保存的最大数据量。
在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。
让我们在包含一个空节点的集群内创建名为 blogs 的索引。 索引在默认情况下会被分
配 5 个主分片, 但是为了演示目的,我们将分配 3 个主分片和一份副本(每个主分片
拥有一个副本分片):
PUT /blogs{ "settings" : { "number_of_shards" : 3, "number_of_replicas" : 1 }}
此时集群的健康状况为 yellow 则表示全部 主分片都正常运行(集群可以正常服务所有请
求),但是 副本 分片没有全部处在正常状态。 实际上,所有 3 个副本分片都是 unassigned —— 它们都没有被分配到任何节点。在同一个节点上既保存原始数据又保存副本是没有意
义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。
当前我们的集群是正常运行的,但是在硬件故障时有丢失数据的风险。
二、集群搭建
所有之前先运行:sysctl -w vm.max_map_count=262144
我们只是测试,所以临时修改。永久修改使用下面
#防止 JVM 报错
echo vm.max_map_count=262144 >> /etc/sysctl.conf sysctl -p
2.1 准备 docker 网络
Docker 创建容器时默认采用 bridge 网络,自行分配 ip,不允许自己指定。
在实际部署中,我们需要指定容器 ip,不允许其自行分配 ip,尤其是搭建集群时,固定 ip
是必须的。
我们可以创建自己的 bridge 网络 : mynet,创建容器的时候指定网络为 mynet 并指定 ip
即可。
查看网络模式
docker network ls
创建一个新的 bridge 网络
docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.1.1 mynet
查看网络信息
docker network inspect mynet
2.1、3个Master 节点创建
for port in $(seq 1 3); \ do \ mkdir -p /mydata/elasticsearch/master-${port}/config mkdir -p /mydata/elasticsearch/master-${port}/data chmod -R 777 /mydata/elasticsearch/master-${port} cat << EOF >/mydata/elasticsearch/master-${port}/config/elasticsearch.yml cluster.name: my-es #集群的名称,同一个集群该值必须设置成相同的 node.name: es-master-${port} #该节点的名字 node.master: true #该节点有机会成为 master 节点 node.data: false #该节点可以存储数据 network.host: 0.0.0.0 http.host: 0.0.0.0 #所有 http 均可访问 http.port: 920${port} transport.tcp.port: 930${port} discovery.zen.ping_timeout: 10s #设置集群中自动发现其他节点时 ping 连接的超时时间 discovery.seed_hosts: ["172.18.12.21:9301", "172.18.12.22:9302", "172.18.12.23:9303"] #设置集群中的 Master 节点的初始列表,可以通过这些节点来自动发现其他新加入集群的节点,es7的新增配置 cluster.initial_master_nodes: ["172.18.12.21"] #新集群初始时的候选主节点,es7 的新增配置 EOF docker run --name elasticsearch-node-${port} \ -p 920${port}:920${port} -p 930${port}:930${port} \ --network=mynet --ip 172.18.12.2${port} \ -e ES_JAVA_OPTS="-Xms300m -Xmx300m" \ -v /mydata/elasticsearch/master-${port}/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /mydata/elasticsearch/master-${port}/data:/usr/share/elasticsearch/data \ -v /mydata/elasticsearch/master-${port}/plugins:/usr/share/elasticsearch/plugins \ -d elasticsearch:7.4.2 done
2.2、3个Data-Node 创建
for port in $(seq 4 6); \
do \
mkdir -p /mydata/elasticsearch/node-${port}/config
mkdir -p /mydata/elasticsearch/node-${port}/data
chmod -R 777 /mydata/elasticsearch/node-${port}
cat << EOF >/mydata/elasticsearch/node-${port}/config/elasticsearch.yml
cluster.name: my-es
node.name: es-node-${port}
node.master: false
node.data: true
network.host: 0.0.0.0
#network.publish_host: 192.168.56.10
http.host: 0.0.0.0
http.port: 920${port}
transport.tcp.port: 930${port}
discovery.zen.ping_timeout: 10s
discovery.seed_hosts: ["172.18.12.21:9301", "172.18.12.22:9302", "172.18.12.23:9303"]
cluster.initial_master_nodes: ["172.18.12.21"]
EOF
docker run --name elasticsearch-node-${port} \
-p 920${port}:920${port} -p 930${port}:930${port} \
--network=mynet --ip 172.18.12.2${port} \
-e ES_JAVA_OPTS="-Xms300m -Xmx300m" \
-v /mydata/elasticsearch/node-${port}/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/node-${port}/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/node-${port}/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
done
标签:mydata,节点,elasticsearch,分片,集群,Elasticsearch,port 来源: https://www.cnblogs.com/jiutang001/p/16285536.html