如何修改elasticsearch 副本数中默认副本数量

> 博客详情
Elasticsearch已经有很好的默认值,特别是涉及到性能相关的配置或者选项。如果你有什么拿不准的,最好就不要动它。我们已经目睹了数十个因为错误的设置而导致集群毁灭,因为它的管理者总认为他改动一个配置或者选项就可以带来100倍的提升。
注意:请阅读全文,所有的配置项都同等重要,和描述顺序无关,请阅读所有的配置选项,并应用到你的集群中。
其它数据库可能需要调优,但总得来说,Elasticsearch不需要。如果你遇到了性能问题,最好的解决方法通常是更好的数据布局或者更多的节点。在Elasticsearch中有很少的”神奇的配置项”,如果存在,我们也已经帮你优化了。
Elasticsearch默认启动的集群名字叫elasticsearch,你最好给你的生产环境的集群改个名字,改名字的目的很简单,就是防止某个人的笔记本加入到了集群,造成意外。简单修改成elasticsearch_production ,会省掉多次心痛~。你可以在你的elasticsearch.yml中修改:cluster.name: elasticsearch_production
同样,修改节点的名字也是明智的,就像你现在可能发现的那样,Elasticsearch会在你的节点启动的时候随机给它指定一个名字。这在你开发 的时候可能觉得很萌,但是当凌晨3点钟,你还在尝试会议哪台物理机是Tagak the Leopard Lord.的时候,你就不觉得萌了。
更重要的是,这些名师是在启动的时候产生的,每次启动节点,它都会得到一个新的名字,这可以使日志混淆,因为所有节点的名称都是不断变化的。这些可能性都是很无聊的,我们建议你给每个及诶点一个有意义的名字-一个清楚的,描述性的名字,同样你可以在elasticsearch.yml中配置:node.name: elasticsearch_005_data
默认情况下,Eleasticsearch会把插件、日志以及你最重要的数据放在安装目录下。这会带来不幸的事故。即如果你重新安装Elasticsearch的时候就可能不小心把安装目录覆盖了,如果你不小心,你就可能把你的全部数据删掉了。
不要笑,这种情况,我们见过很多次了。
最好的选择就是把你的数据目录配置到安装目录以外的地方,同样你也可以选择转移你的插件和日志目录。
可以更改如下:path.data: /path/to/data1,/path/to/data2
# Path to log files:path.logs: /path/to/logs
# Path to where plugins are installed:path.plugins: /path/to/plugins
注意:你可以通过逗号分隔指定多个目录。
数据可以保存到多个不同的目录,每个目录如果是挂载在不同的硬盘,做一个人RAID 0是一个简单而有效的方式。Elasticsearch会自动把数据分隔到不同的目录,以便提高性能。
最小主节点数
minimum_master_nodes的设定对你的集群的稳定及其重要,当你的集群中有两个masters的时候,这个配置有助于防止集群分裂。
如果你发生了一个集群分裂,你集群就会处在丢失数据的危险中,因为master节点是被认为是这个集群的最高统治者,它决定了什么时候新的索引可以 创建,多少分片要移动等等。如果你有两个master节点,你的数据的完整性将得不到保证,因为你有两个master节点认为他们有集群的控制权。
这个配置就是告诉Elasticsearch当没有足够master候选节点的时候,就不要进行master选举,等master候选节点足够了才进行选举。
该配置必须应该配置成master候选节点的法定个数(大多数个),法定个数就是(master候选节点个数*2)+1. 这里有几个例子:*如果你有10个节点(能保存数据,同时能成为master) 法定数就是6*如果你有3个候选master,和100个数据节点,法定数就是2,你只要数数那些可以做master的节点数就可以了。*如果你有两个节点,你遇到难题了,法定数当然是2,但是这意味着如果有一个节点挂掉,你整个集群就不可用了。设置成1可以保证集群的功能,但是就无法保证集群分裂了,想这样的情况,你最好至少保证有3个节点。
elasticsearch.yml中这样配置:discovery.zen.minimum_master_nodes: 2
但是由于ELasticsearch是动态的,你可以很容易的添加和删除节点,这会改变这个法定个数,如果你不得不修改索引的节点的配置并且重启你的整个集群为了让配置生效,这将是非常痛苦的一件事情。基于这个原因,minimum_master_nodes (还有一些其它配置),允许通过API调用的方式动态进行配置,当你的集群在线运行的时候,你可以这样修改配置:PUT /_cluster/settings{“persistent” : {“discovery.zen.minimum_master_nodes” : 2}}
这将成为一个永久的配置,并且无论你配置项里配置的如何,这个将优先生效。当你添加和删除master节点的时候,你需要更改这个配置。
集群恢复方面的配置项
当你集群重启时,几个配置项影响你的分片恢复的表现。首先,我们必须明白,如果什么也没配置将会发生什么。
想象一下假设你有10个节点,每个节点保存一个分片,主分片或者副分片,也就是有一个有5个主分片/1个副本 的索引。你需要停止整个集群进行休整(举个例子,为了安装一个新的驱动程序)。当你重启你的集群,很自然会出现5个节点已经起动了,还有5个还没启动的场景。
假设其它五个节点出问题,或者他们根本没有收到立即重启的命令。无论什么原因,你只要五个节点在线上。这五个节点会相互通信,选出一个master,从而形成一个集群,他们注意到数据不再均匀分布,因为有个节点在集群中丢失了,他们之间会立马启动分片复制。
最后,你的其它5个节点打开加入了集群,这些节点会发现他们的数据已经成为其它节点的副本了,所以他们删除本地数据(因为这份数据要么是多余的,要么是过时的)。然后整个集群重新进行平衡,因为集群的大小已经从5变成了10。
在整个过程中,你的节点会消耗磁盘和网盘,来回移动数据,因为没有更好的理由。对于有上T数据的大集群,这种数据的传输需要很长时间。如果等待所有的节点重启好了,整个集群再上线,所有的本地的数据都不需要移动。
现在我们知道问题的所在了,我们可以修改一个小配置就可以缓解这个事情,首先我们要给ELasticsearch一个严格的限制:gateway.recover_after_nodes: 8
这将放置Elasticsearch进行数据恢复,在发现8个节点(数据节点或者master节点)之前。这个值的设定取决于个人喜好: 整个集群提供服务之前你希望有多少个节点在线?我们设置为8, 这意味着至少要有8个节点,该集群才可用。
现在我们要告诉Ealsticsearch集群中应该有多少个节点,并且我们希望集群需要多久等待所有节点:
gateway.expected_nodes: 10gateway.recover_after_time: 5m
这意味着Elasticsearch会采取如下操作:*至少等待8个节点上线*等待5分钟,或者10个节点上线后,才进行数据恢复,这取决于哪个条件先达到。
这三个设置可以在集群重启的时候避免过多的分片交换。这可能会让数据恢复从数个小时缩短为几秒钟。这些配置只能设置在config/elasticsearch.yml文件中,或者是在命令行里(这些配置是无法东塔修改的),它们只在整个集群重启的时候有实质性作用。
最好使用单播代替组播
Elasticsearch默认是被配置成使用多播发现节点。多播就是通过在你的网络中发送UDP的ping请求以发现节点,其它Elasticsearch会收到这些ping请求并且进行响应,这样随后就会形成一个集群。多播对于开发环境是很好的,你不需要做什么事情,打开一些节点,他们自然的会发现对方形成一个集群。正是因为这种易用性,你在生产环境中必须禁掉它。否在你得到的结果就是一个节点意外的加入到了你的生产环境,因为他们收到了一个错误的组播信号。对于组播 本身并没有错。组播会导致一些愚蠢的问题,并且导致集群变的脆弱(例如:一个网络工程师正在捣鼓网络,而没有告诉你,你会发现所有的节点突然发现不了对方 了)。
在生产环境中,建议使用单播代替组播,也就是说为Elasticsearch提供一些它应该去尝试连接的节点列表。一旦这个节点联系到组播列表中的一员,它就会得到整个集群所有节点的状态,然后它会联系master节点,并加入集群。
这意味着你的单播列表不需要包含你的集群中的所有节点,它只需要包含足够一个新节点联系上其中一个并且说上话就ok了。如果你使用master候选节点作为单播列表,你只要列出三个就可以了。这个配置在elasticsearch.yml文件中:discovery.zen.ping.multicast.enabled: falsediscovery.zen.ping.unicast.hosts: [“host1″, “host2:port”]
备注:请确认你已经关闭了组播(discovery.zen.ping.multicast.enabled: false),否则它会和单播同时存在。
参考地址:https://www.elastic.co/guide/en/elasticsearch/guide/current/_important_configuration_changes.html
人打赏支持
码字总数 184440
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥2253人阅读
java(16)
elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日志的,所以logging.yml里的设置按普通log4j配置文件来设置就行了。下面主要讲解下elasticsearch.yml这个文件中可配置的东西。
cluster.name: elasticsearch
配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
node.name: &Franz Kafka&
节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。
node.master: true
指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
node.data: true
指定该节点是否存储索引数据,默认为true。
index.number_of_shards: 5
设置默认索引分片个数,默认为5片。
index.number_of_replicas: 1
设置默认索引副本个数,默认为1个副本。
path.conf: /path/to/conf
设置配置文件的存储路径,默认是es根目录下的config文件夹。
path.data: /path/to/data
设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开,例:
path.data: /path/to/data1,/path/to/data2
path.work: /path/to/work
设置临时文件的存储路径,默认是es根目录下的work文件夹。
path.logs: /path/to/logs
设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.plugins: /path/to/plugins
设置插件的存放路径,默认是es根目录下的plugins文件夹
bootstrap.mlockall: true
设置为true来锁住内存。因为当jvm开始swapping时es的效率会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过`ulimit -l unlimited`命令。
network.bind_host: 192.168.0.1
设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0。
network.publish_host: 192.168.0.1
设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
network.host: 192.168.0.1
这个参数是用来同时设置bind_host和publish_host上面两个参数。
transport.tcp.port: 9300
设置节点间交互的tcp端口,默认是9300。
press: true
设置是否压缩tcp传输时的数据,默认为false,不压缩。
http.port: 9200
设置对外服务的http端口,默认为9200。
http.max_content_length: 100mb
设置内容的最大容量,默认100mb
http.enabled: false
是否使用http协议对外提供服务,默认为true,开启。
gateway.type: local
gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器,其它文件系统的设置方法下次再详细说。
gateway.recover_after_nodes: 1
设置集群中N个节点启动时进行数据恢复,默认为1。
gateway.recover_after_time: 5m
设置初始化数据恢复进程的超时时间,默认是5分钟。
gateway.expected_nodes: 2
设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。
cluster.routing.allocation.node_initial_primaries_recoveries: 4
初始化数据恢复时,并发恢复线程的个数,默认为4。
cluster.routing.allocation.node_concurrent_recoveries: 2
添加删除节点或负载均衡时并发恢复线程的个数,默认为4。
indices.recovery.max_size_per_sec: 0
设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。
indices.recovery.concurrent_streams: 5
设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。
discovery.zen.minimum_master_nodes: 1
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.ping.timeout: 3s
设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。
discovery.zen.ping.multicast.enabled: false
设置是否打开多播发现节点,默认是true。
discovery.zen.ping.unicast.hosts: [&host1&, &host2:port&, &host3[portX-portY]&]
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
下面是一些查询时的慢日志参数设置
index.search.slowlog.level: TRACE
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500ms
index.search.slowlog.threshold.fetch.warn: 1s
index.search.slowlog.: 800ms
index.search.slowlog.threshold.fetch.debug:500ms
index.search.slowlog.threshold.fetch.trace: 200ms
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:21346次
排名:千里之外
原创:30篇
转载:22篇
(2)(2)(3)(8)(7)(1)(2)(6)(1)(5)(1)(14)Elasticsearch 主分片以及副本数量设定 - 跟谁学
搜索你想学的科目、老师试试,例如“舞蹈”搜索无锡
&&Elasticsearch 主分片以及副本数量设定我有30个多项目,每个项目一个索引,每个索引的大小都在100MB以下; 我单个项目的索引并不大。那在这种场景下; 我的主分片以及副本的数量设定多少比较合适?zplzplpacoli
这分片数取决于你的es集群有多大,以及你想要达到的并发程度。副本数量取决于你想要达到多高的数据可用性和你有多少存储空间可用。这其中有各种现实情况的权衡,直接回答你数量是不负责任的,系统参数的调优还是得实践得出。
相关问题大家都在看最新提问
关注我们官方微信关于跟谁学服务支持帮助中心Elasticsearch常用接口命令
1、查询集群健康状态
curl -XGET 'http://127.0.0.1:9200/_cluster/health?pretty
执行结果如下:
[root@web1 ~]# curl -XGET 'http://127.0.0.1:9200/_cluster/health?pretty'{ "cluster_name" : "ESBigData", "status" : "green", "timed_out" : false, "number_of_nodes" : 3, "number_of_data_nodes" : 1, "active_primary_shards" : 355, "active_shards" : 355, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0}
在Elasticsearch集群中可以监控统计很多信息,但是只有一个是最重要的:集群健康(cluster health)。集群健康有三种状态:green、yellow或red。
status字段提供一个综合的指标来表示集群的的服务状况。三种颜色各自的含义:
所有主要分片和复制分片都可用
所有主要分片可用,但不是所有复制分片都可用
不是所有的主要分片都可用,此状态集群不可用
2、查询集群中存活的所有节点
curl -XGET 'http://localhost:9200/_cat/nodes'
执行结果如下:
[root@web1 ~]# curl -XGET 'http://127.0.0.1:9200/_cat/nodes?v'host ip heap.percent ram.percent load node.role master name esdata1 10.0.2.69 37 34 0.46 d - esdata1 esdata2 10.0.2.68 24 53 0.01 - * es-data2esdata3 10.0.2.67 4 69 1.61 - m es-data3
node.role = "-" master = "m" 代表它是主(master)节点,而node.role = "-" master = "*"代表的是正在使用的master节点。
node.role = "d" master = "-" 代表它是数据(data)节点。
node.role = "-" master = "-" 代表它是客户端(client)节点。
当我们启动Elasticsearch的实例,就会启动至少一个节点。相同集群名的多个节点的连接就组成了一个集群,在默认情况下,集群中的每个节点都可以处理http请求,和集群节点的数据传输,集群中所有的节点都知道集群中其他所有的节点,可以将客户端请求转发到适当的节点。节点有以下类型:
主(master)节点:在一个节点上当node.master设置为True(默认)的时候,它有资格被选作为主节点,控制整个集群。
数据(data)节点:在一个节点上node.data设置为True(默认)的时候。该节点保存数据和执行数据相关的操作,如增删改查,搜索,和聚合。
客户端节点:当一个节点的node.master和node.data都设置为false的时候,它既不能保持数据也不能成为主节点,该节点可以作为客户端节点,可以响应用户的情况,并把相关操作发送到其他节点。
3、查看集群中所有的索引
curl -XGET 'http://localhost:9200/_cat/indices?v'
这个请求会列举出集群中所有索引的信息,信息包括:
health status index pri rep docs.count docs.deleted store.size pri.store.size green open agenttopic_ 1
317.7mb 158.8mb green open mobilesdk_ 1
129.5mb 64.7mb
索引健康状态、索引名称、主分片数、副本数、总文档数、删除文档数、总存储空间、主分片存储空间。
4、查看集群中所有分片信息
curl -XGET '127.0.0.1:9200/_cat/shards'
执行结果如下 :
index shard prirep state docs store ip node agenttopic_ p STARTED mb 10.0.2.69 esdata1 agenttopic_ p STARTED mb 10.0.2.69 esdata1 agenttopic_ p STARTED 23553 3mb 10.0.2.69 esdata1 agenttopic_ p STARTED mb 10.0.2.69 esdata1 agenttopic_ p STARTED mb 10.0.2.69 esdata1mobilesdk_ p STARTED 0 144b 10.0.2.69 esdata1 mobilesdk_ p STARTED 0 144b 10.0.2.69 esdata1 mobilesdk_ p STARTED 0 144b 10.0.2.69 esdata1 mobilesdk_ p STARTED 0 144b 10.0.2.69 esdata1 mobilesdk_ p STARTED 0 144b 10.0.2.69 esdata1
索引名称、分片、分片的身份(p代表主分片,r代表副本)、分片状态、文档数、存储空间
5、集群中打开或关闭索引
# 打开索引curl -XPOST '127.0.0.1:9200/agenttopic_/_open'# 关闭索引curl -XPOST '127.0.0.1:9200/agenttopic_/_close'
执行结果如下:
[root@web1 ~]# curl -XPOST '127.0.0.1:9200/agenttopic_/_open'{"acknowledged":true}[root@web1 ~]# curl -XPOST '127.0.0.1:9200/agenttopic_/_close'{"acknowledged":true}
返回true表示打开或关闭索引成功,返回error表示打开或关闭索引失败
6、集群中删除索引
curl -XDELETE '127.0.0.1:9200/agenttopic_'
执行结果如下:
[root@web1 ~]# curl -XDELETE '127.0.0.1:9200/agenttopic_'{"acknowledged":true}
返回true表示索引删除成功,返回error表示索引删除失败
7、手动创建索引
curl -XPUT "127.0.0.1:9200/agenttopic_" -d '{ "settings": { "number_of_shards":5, "number_of_replicas":0 } }';
执行结果如下:
[root@web1 ~]# curl -XPUT "127.0.0.1:9200/agenttopic_" -d '{ "settings": { "number_of_shards":5, "number_of_replicas":0 } }'{"acknowledged":true}
返回true表示创建索引成功,返回error表示创建索引失败
"number_of_shards":5表示创建索引时指定的分片数,“5”表示指定5个分片
"number_of_replicas":0表示创建索引时的副本数,“0”表示不设置副本
8、手动修改集群索引副本数
curl -XPUT '127.0.0.1:9200/agenttopic_/_settings' -d '{ "number_of_replicas": 0}'
number_of_replicas:指定需要修改的索引副本数
9、Elasticsearch手动进行索引分片的分配
想要完全手动,必须先把cluster.routing.allocation.disable_allocation参数设置为true,禁止es进行自动索引分片分配,否则你从一节点把分片移到另外一个节点,那么另外一个节点的一个分片又会移到那个节点.
一共有三种操作,分别为:移动(move),取消(cancel)和分配(allocate)。下面分别介绍这三种情况:
移动(move)把分片从一节点移动到另一个节点。可以指定索引名和分片号。
取消(cancel)取消分配一个分片。可以指定索引名和分片号。node参数可以指定在那个节点取消正在分配的分片。allow_primary参数支持取消分配主分片。取消(cancel)不常用就不在此解释了。
分配(allocate)分配一个未分配的分片到指定节点。可以指定索引名和分片号。node参数指定分配到那个节点。allow_primary参数可以强制分配主分片,不过这样可能导致数据丢失,不建议加此参数。
移动(move)具体命令:
curl -XPOST '127.0.0.1:9200/_cluster/reroute' -d '{ "commands" : [ { "move" : { "index" : "javatopic_", "shard" : 0, "from_node" : "node1", "to_node" : "node2" }
分配(allocate)具体命令:
curl -XPOST '127.0.0.1:9200/_cluster/reroute' -d '{ "commands" : [ { "allocate" : { "index" : "javatopic_", "shard" : 2, "node" : "esdata1", "allow_primary" : true} } ] }'
"index" : "javatopic_"指定要分配分片的索引名
"shard" : 2指定要分配的分片,“2”表示要手动分配javatopic_的第二个分片
"node" : "esdata1"指定分配索引分片的的目标节点
"from_node" : "node1"索引分片当前所在节点
"to_node" : "node2"移动分片的目标节点
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点

我要回帖

更多关于 elasticsearch 副本数 的文章

 

随机推荐