关于如何添加Elasticsearch存储的方法
我想增加用于Elasticsearch的存储空间,但由于有一些不确定的问题,我总结了一下。
关于环境
假设在一个由多个台服务器组成的环境中,建立了一个 Elasticsearch 集群,并且假设设置了一个索引中有多个分片的情况。
此外,我们考虑的是一个没有设置副本的环境,但是“数据丢失会让人难受”的情况。
在其他方案中,结果可能会有所不同?
如何添加新存储并将其附加到data.path中。
在每台需要添加存储的机器上停止Elasticsearch,并将其添加到./config/elasticsearch.yml文件的data.path中的方法。
即使添加了新的 data.path,现有的索引和分片也不会立即重新分配到新的位置。因此,当前的索引变得非常大并占用了存储空间的情况并不适合。
- Elasticsearch multi data path disk full – Stack Overflow https://stackoverflow.com/questions/56523276/elasticsearch-multi-data-path-disk-full
如果什么也不做的话,只有在存储使用率超过水印(cluster.routing.allocation.disk.watermark.high)时才会将其移动到另一个节点(存储)。
由于是向节点移动,所以不能有意地将分片移动到该存储。
磁盘分片分配
[2019-12-04T16:16:49,472][WARN ][o.e.c.r.a.DiskThresholdMonitor] [elasticsearch-node1] 高磁盘水印[90%]超过[-LcqY8CedtSkufWq0ba28w] [elasticsearch-node1] [/mnt/elasticsearch/data/nodes/0]空闲:8.4GB[8.4%],分片将会被重新分配移离这个节点
[2019-12-04T16:16:49,472][INFO ][o.e.c.r.a.DiskThresholdMonitor] [elasticsearch-node1] 分片正在重新路由:[一个或多个节点的磁盘水印过高]
而且,在使用elasticsearch查找了”elasticsearch increase storage”和”elasticsearch add data.path”的情况下,发现很少有添加data.path并增加存储的实例。
-
- Elasticsearchを終了して data.path を追加すればいいと「思うよ」 https://discuss.elastic.co/t/adding-another-disk-to-an-es-node/10425
Elasticsearchの data.path を追加したけど問題が起きなかったよ https://github.com/elastic/elasticsearch/issues/13210#issuecomment-136353406
有人提出了一个关于在旧版本中添加了data.path导致故障的例子。
-
- ノードの状態が RED のままになって使えなくなった https://stackoverflow.com/questions/33345002/elasticsearch-issue-when-adding-new-path-data
- シャードが消失した(不具合だと考えている) https://github.com/elastic/elasticsearch/issues/13210
如果添加 data.path,会发生什么变化?
我在本地创建了一个具有12个分片的索引,并进行了一些测试,结果发现,即使添加了 data.path ,状态仍然保持为 RED,并且没有发生数据丢失等情况,仍然可以正常使用。(尚未进行多台设备的验证)
您可以使用以下环境,并按照以下步骤进行确认。
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.6
BuildVersion: 17G7024
$ curl "http://localhost:9200/"
{
"version" : {
"number" : "5.6.8",
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
准备三个名为 path.data 的目录。
mkdir data1 data2 data3
在elasticsearch.yml中的data.path指定两个目录。
path.data: /path/to/data1,/path/to/data2
启动Elasticsearch,随意添加索引和文档,然后退出。然后将data3目录添加到path.data中。
path.data: /path/to/data1,/path/to/data2,/path/to/data3
再次启动Elasticsearch后,不会出现像上述所说的“状态仍然为RED”或“数据丢失”的情况,可以正常使用。
[2019-06-19T11:36:45,726][INFO][o.e.n.Node] [qp9CbAQ] 开始启动…
[2019-06-19T11:36:45,939][INFO][o.e.t.TransportService] [qp9CbAQ] 发布地址 {127.0.0.1:9300},绑定地址 {[::1]:9300},{127.0.0.1:9300}
[2019-06-19T11:36:49,003][INFO][o.e.c.s.ClusterService] [qp9CbAQ] 新主节点 {qp9CbAQ}{qp9CbAQFQL6m45priWfGSw}{yXd2PI0RSJe7PBJfCCgQIg}{127.0.0.1}{127.0.0.1:9300},原因:选举为主节点(加入了 [0] 个节点)
[2019-06-19T11:36:49,027][INFO][o.e.h.n.Netty4HttpServerTransport] [qp9CbAQ] 发布地址 {127.0.0.1:9200},绑定地址 {[::1]:9200},{127.0.0.1:9200}
[2019-06-19T11:36:49,027][INFO][o.e.n.Node] [qp9CbAQ] 已启动
[2019-06-19T11:36:49,350][INFO][o.e.g.GatewayService] [qp9CbAQ] 将 [1] 个索引恢复到群集状态
[2019-06-19T11:36:51,371][INFO][o.e.c.r.a.AllocationService] [qp9CbAQ] 群集健康状态从 [RED] 变为 GREEN.
$ curl "http://localhost:9200/_cat/shards"
es_sample_data 9 p STARTED 16124 161.1mb 127.0.0.1 qp9CbAQ
es_sample_data 8 p STARTED 16084 156.5mb 127.0.0.1 qp9CbAQ
es_sample_data 7 p STARTED 16155 163.6mb 127.0.0.1 qp9CbAQ
es_sample_data 6 p STARTED 15998 163.6mb 127.0.0.1 qp9CbAQ
es_sample_data 11 p STARTED 16348 162.7mb 127.0.0.1 qp9CbAQ
es_sample_data 10 p STARTED 16050 159.3mb 127.0.0.1 qp9CbAQ
es_sample_data 1 p STARTED 15869 158.4mb 127.0.0.1 qp9CbAQ
es_sample_data 4 p STARTED 16144 163.4mb 127.0.0.1 qp9CbAQ
es_sample_data 3 p STARTED 16210 162mb 127.0.0.1 qp9CbAQ
es_sample_data 2 p STARTED 16277 161mb 127.0.0.1 qp9CbAQ
es_sample_data 5 p STARTED 16340 159.8mb 127.0.0.1 qp9CbAQ
es_sample_data 0 p STARTED 16241 164.7mb 127.0.0.1 qp9CbAQ
data3 是一个新建立的文件夹,其中存放了与 Elasticsearch 相关的文件。
$ tree data3
data3
└── nodes
└── 0
├── _state
│ ├── global-2.st
│ └── node-1.st
├── indices
│ └── C57jAJENRq2AheQLA1V7SA
│ └── _state
│ └── state-14.st
└── node.lock
关于添加data.path后的分片再配置
只是将新的存储装载到data.path上,并不能重新配置现有索引的分片到新的存储空间,因此注意到容量不能被利用(尽管Elasticsearch能够识别此存储)。直到存储使用率达到watermark,分片才会一直保存在已使用的存储上。为了自动将分片重新配置到新的存储中,强烈建议将机器添加到集群中。
如果只是通过添加存储空间并增加 data.path 来进行扩容的话(虽然这可能不是正确的reroute API使用方式),可以通过将分片从其他节点移动到增加存储空间的节点上来使用新的存储空间。可惜手动移动分片到特定的存储空间的方法是不存在的。 ?
使用以下命令来查看/_cat/indices?v、/_cat/shards/{索引名称}?v和/_cat/segments?v,然后根据/path/to/data/nodes/0/indices/{索引的uuid}/{分片号码}/index目录的内容来确定重新分配的分片,然后使用下一个命令将新的分片重新配置到另一个节点上。
请注意,这个命令是用来将分片移动到另一台机器的。它会使用Elasticsearch识别到的新存储,但根据使用率的情况,分片可能不会移动到期望的存储上。
此外,也有可能会有(以其他分片被交换的形式)从目标节点移动到当前节点的分片。
在指定索引名称时不能使用别名。即使指定了别名,也会出现找不到分片的错误。
curl -XPOST 'nodes-1:9200/_cluster/reroute?pretty' -d '{
"commands" : [ {
"move" :
{
"index" : "es_sample", "shard" : {shard id},
"from_node" : "nodes-1", "to_node" : "nodes-2"
}
}
]
}'
如何向Elasticsearch集群添加节点
现在我们没有这里进行验证,但是已经确认当在Elasticsearch集群中添加节点(机器)时,整个集群的存储容量会增加。
使用这种方法,不需要先停止现有的Elasticsearch节点,可以无停机增加存储空间。
如果允许增加机器的话,您可以受益于这种方法的实力,可以无间断地进行扩展。
在这种情况下,需要考虑负载增加和防止脑裂等问题,涉及到分片的重新配置。
当向Elasticsearch集群中添加节点的时候,我们需要进行以下操作。
只需在新机器上设置Elasticsearch并将集群名称(cluster.name)设为与现有集群名称相同,新机器就会自动添加到集群中。数据的重新分配也会自动执行。
-
- Adding nodes to your cluster | Elasticsearch Reference [7.1] | Elastic
-
- https://www.elastic.co/guide/en/elasticsearch/reference/current/add-elasticsearch-nodes.html
Elasticsearchクラスタにノードを追加してみる – Qiita https://qiita.com/tsukapah/items/7b976cb2c59941875ec2
关于添加节点时的 zen.ping.unicast.hosts 设置。
基本上,您不需要在 elasticsearch.yml 文件的 zen.ping.unicast.hosts 中設置集群中的所有節點。因為主節點會將整個集群的信息傳播給其他節點,您只需指定潛在的主節點即可。
https://www.elastic.co/jp/blog/how-to-configure-elasticsearch-cluster-better -> 誤解:全てのノードのzen.ping.unicast.hostsにはクラスターに接続するノードを「全て」記述しないといけない
如果不明确设置node.master,由于默认值为true,当一个节点宕机时,无法确定哪个节点会成为新的主节点,这可能需要在zen.ping.unicast.hosts中列出所有节点的设置。
Master-eligible node
设置node.master为true(默认情况下)的节点,使其有资格被选为主节点,从而控制集群。
总结
要在Elasticsearch中添加存储,可以尝试以下方法吧 ☺️
-
- 新しいストレージをマウントしてから、Elasticsearchを終了し、elasticsearch.yml に data.path を追加して再起動する
ただし、同一ノードにストレージを追加しているのでノードが壊れてしまうとおしまいです
また、既存のインデックス・シャードは新しい場所に再配置されません。新しいインデックス用に容量を確保する場合しか使えないでしょう
新しいマシンでElasticsearchをセットアップしてクラスターにノードを追加する
管理するマシンは増えてしまいますが、シャードの再配置が自動的に実行されるため、インデックスが巨大になってストレージを圧迫している状況に有効でしょう