一、集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个副本? 下面我们就来分析和回答这几个问题 1、我们需要多大规模的集群?需要从以下两个方面考虑: 1.1 当前的数据量有多大?数据增长情况如何? 推算的依据: ES JVM heap 最大可以设置32G 。 备注:集群规划满足当前数据规模+适量增长规模即可,后续可按需扩展。 两类应用场景: A. 用于构建业务搜索功能模块,且多是垂直领域的搜索。数据量级几千万到数十亿级别。一般2-4台机器的规模。 2、集群中的节点角色如何分配?2.1 节点角色: Master 说明: 一个节点可以充当一个或多个角色,默认三个角色都有 协调节点:一个节点只作为接收请求、转发请求到其他节点、汇总各个节点返回数据等功能的节点。就叫协调节点 2.2 如何分配: A. 小规模集群,不需严格区分。 3、如何避免脑裂问题?3.1 脑裂问题: 一个集群中只有一个A主节点,A主节点因为需要处理的东西太多或者网络过于繁忙,从而导致其他从节点ping不通A主节点,这样其他从节点就会认为A主节点不可用了,就会重新选出一个新的主节点B。过了一会A主节点恢复正常了,这样就出现了两个主节点,导致一部分数据来源于A主节点,另外一部分数据来源于B主节点,出现数据不一致问题,这就是脑裂。 3.2 尽量避免脑裂,需要添加最小数量的主节点配置: discovery.zen.minimum_master_nodes: (有master资格节点数/2) + 1 这个参数控制的是,选举主节点时需要看到最少多少个具有master资格的活节点,才能进行选举。官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量。 3.3 常用做法(中大规模集群): 1. Master 和 dataNode 角色分开,配置奇数个master,如3 discovery.zen.ping.multicast.enabled: false —— 关闭多播发现机制,默认是关闭的 discovery.zen.ping.unicast.hosts: ['master1', 'master2', 'master3'] —— 配置单播发现的主节点ip地址,其他从节点要加入进来,就得去询问单播发现机制里面配置的主节点我要加入到集群里面了,主节点同意以后才能加入,然后主节点再通知集群中的其他节点有新节点加入 3. 配置选举发现数,及延长ping master的等待时长 discovery.zen.ping_timeout: 30(默认值是3秒)——其他节点ping主节点多久时间没有响应就认为主节点不可用了 4、索引应该设置多少个分片?说明:分片数指定后不可变,除非重索引。 思考: 分片对应的存储实体是什么? 存储的实体是索引 分片是不是越多越好? 不是 分片多有什么影响? 分片多浪费存储空间、占用资源、影响性能 4.1 分片过多的影响:每个分片本质上就是一个Lucene索引, 因此会消耗相应的文件句柄, 内存和CPU资源。 4.2 分片设置的可参考原则:ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 推荐你最多分配7到8个分片。 5、分片应该设置几个副本?说明:副本数是可以随时调整的! 思考: 副本的用途是什么? 备份数据保证高可用数据不丢失,高并发的时候参与数据查询 一般一个分片有1-2个副本即可保证高可用 副本多浪费存储空间、占用资源、影响性能 5.1 副本设置基本原则:为保证高可用,副本数设置为2即可。要求集群至少要有3个节点,来分开存放主分片、副本。 注意:新增副本时主节点会自动协调,然后拷贝数据到新增的副本节点 二、集群搭建1. 准备3台虚拟机:192.168.152.128 、192.168.152.129、192.168.152.130 2. 在3台虚拟机里面都安装好elasticsearch安装教程参考我之前写的文章的ES的安装和配置部分: https://www.cnblogs.com/leeSmall/p/9189078.html 3. 修改3台虚拟机下ES的配置,使得它们组成一个集群进入elasticsearch的config目录,修改elasticsearch.yml的配置 3.1. IP访问限制、默认端口修改9200这里有两个需要提醒下,第一个就是IP访问限制,第二个就是es实例的默认端口号9200。IP访问限制可以限定具体的IP访问服务器,这有一定的安全过滤作用。 如果设置成0.0.0.0则是不限制任何IP访问。一般在生产的服务器可能会限定几台IP,通常用于管理使用。 默认的端口9200在一般情况下也有点风险,可以将默认的端口修改成另外一个,这还有一个原因就是怕开发人员误操作,连接上集群。当然,如果你的公司网络隔离做的很好也无所谓。 这里的9300是集群内部通讯使用的端口,这个也可以修改掉。因为连接集群的方式有两种,通过扮演集群node也是可以进入集群的,所以还是安全起见,修改掉默认的端口。 说明:记得修改安装了ES的3台虚拟机(三个节点)的相同配置,要不然节点之间无法建立连接工作,也会报错。 3.2 集群发现IP列表、node、cluster名称紧接着修改集群节点IP地址,这样可以让集群在规定的几个节点之间工作。elasticsearch,默认是使用自动发现IP机制。就是在当前网段内,只要能被自动感知到的IP就能自动加入到集群中。这有好处也有坏处。好处就是自动化了,当你的es集群需要云化的时候就会非常方便。但是也会带来一些不稳定的情况,如,master的选举问题、数据复制问题。 导致master选举的因素之一就是集群有节点进入。当数据复制发生的时候也会影响集群,因为要做数据平衡复制和冗余。这里面可以独立master集群,剔除master集群的数据节点能力。 固定列表的IP发现有两种配置方式,一种是互相依赖发现,一种是全量发现。各有优势吧,我是使用的依赖发现来做的。这有个很重要的参考标准,就是你的集群扩展速度有多快。因为这有个问题就是,当全量发现的时候,如果是初始化集群会有很大的问题,就是master全局会很长,然后节点之间的启动速度各不一样。所以我采用了靠谱点的依赖发现。 你需要在192.168.152.128的elasticsearch中配置成: # --------------------------------- 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]'] # discovery.zen.ping.unicast.hosts: [ '192.168.152.129:9300','192.168.152.130:9300' ] 让他去发现129,130的机器,以此内推,完成剩下的129和130机器的配置。 然后你需要配置下集群名称,就是你当前节点所在集群的名称,这有助于你规划你的集群。集群中的所有节点的集群名称必须一样,只有集群名称一样才能组成一个逻辑集群。 # ---------------------------------- Cluster ----------------------------------- # # Use a descriptive name for your cluster: # cluster.name: mycluster 配置你当前节点的名称 # # ------------------------------------ Node ------------------------------------ # # Use a descriptive name for the node: # node.name: node-1 以此类推,完成另外两个节点的配置。cluster.name的名称必须保持一样。然后分别设置node.name。 说明: 这里搭建的是一个简单的集群,没有做集群节点角色的区分,所以3个节点默认的角色有主节点、数据节点、协调节点 选举ES主节点的逻辑: 选举的大概逻辑,它会根据分片的数据的前后新鲜程度来作为选举的一个重要逻辑。(日志、数据、时间都会作为集群master全局的重要指标) 因为考虑到数据一致性问题,当然是用最新的数据节点作为master,然后进行新数据的复制和刷新其他node。 三、集群管理1. 监控APIhttp://localhost:9200/_cat GET /_cat/_cat/health/_cat/nodes/_cat/master/_cat/indices/_cat/allocation /_cat/shards /_cat/shards/{index}/_cat/thread_pool/_cat/segments /_cat/segments/{index} 2. x-pack为集群提供安全防护、监控、告警、报告等功能的收费组件; 官网安装介绍: https://www./guide/en/elasticsearch/reference/6.2/installing-xpack-es.html |
|