天天看点

ElasticSearch 低成本高可用最佳实践

作者:冰心de小屋

1. 目标

本方案主要解决单节点故障对集群造成的影响,保证数据的完整性、集群功能的正确性。

2. 方案步骤

ElasticSearch 低成本高可用最佳实践
  1. Master 节点至少 3 个,不同物理主机部署
  2. 所有 Master 节点需配置在属性 discovery.seed_hosts 中,适用于所有节点
  3. 数据节点:当 number_of_replicas=1 时,不同物理主机部署;number_of_replicas=2 时,每台物理主机最多部署两个数据节点,也就是说每台物理主机最多部署的数据节点数量等于 number_of_replicas。

3. 方案说明

  1. Master 节点主要职责:集群管理、节点管理和索引管理,如果单 Master 挂掉,集群无法对外提供服务,所以 Master 至少 >=3 的奇数节点部署在其他物理机。
  2. 为了保证数据的完整性,1 份数据至少存储在两个不同的物理中。生产级的做法是存储 3 份数据,每份数据存储于不同物理主机。

4. 集群准备

4.1 主机资源

ElasticSearch 低成本高可用最佳实践

4.2 安装步骤

#!/bin/bash
# 1. 生成密钥
ssh-keygen
# 2. 免密其他机器
for ip in $(seq 1 7);do ssh-copy-id 172.17.48.2$ip;done
# 3. 下载
mkdir ~/shell
cd ~/shell
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.7-linux-x86_64.tar.gz


# 4. 安装master
tar -xvf elasticsearch-7.17.7-linux-x86_64.tar.gz


echo "-Xms4096m" >> elasticsearch-7.17.7/config/jvm.options
echo "-Xmx4096m" >> elasticsearch-7.17.7/config/jvm.options


for i in $(seq 1 3)
do


ip=172.17.48.2$i


cat << EoF > elasticsearch-7.17.7/config/elasticsearch.yml
cluster.name: zgg
node.name: master-$i
node.master: true
node.data: false
path.data: ./data
network.host: $ip
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["172.17.48.21:9300", "172.17.48.22:9300", "172.17.48.23:9300"]
cluster.initial_master_nodes: ["172.17.48.21", "172.17.48.22", "172.17.48.23"]
EoF


cp -R elasticsearch-7.17.7 master-$i
scp -r master-$i $ip:/home/hadoop
done


# 5. 安装data
for i in $(seq 4 7)
do


ip=172.17.48.2$i


cat << EoF > elasticsearch-7.17.7/config/elasticsearch.yml
cluster.name: zgg
node.name: data-$i
node.master: false
node.data: true
path.data: ./data
network.host: $ip
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["172.17.48.21:9300", "172.17.48.22:9300", "172.17.48.23:9300"]
cluster.initial_master_nodes: ["172.17.48.21", "172.17.48.22", "172.17.48.23"]
EoF


cp -R elasticsearch-7.17.7 data-$i


scp -r data-$i $ip:/home/hadoop
done           

复制代码

4.3 创建分片

PUT http://182.92.99.60:9200/patent_cn
{
  "settings": {
      "index": {
        "routing": {
          "allocation": {
            "include": {
              "_name": "data-3,data-4,data-5,data-6"
            },
            "total_shards_per_node": "12"
          }
        },
        "number_of_shards": "16",
        "number_of_replicas": "1"
      }
    }
}           

复制代码

ElasticSearch 低成本高可用最佳实践

4.4 批量写入数据

#!/bin/bash
for id in $(seq 1 100)
do


cat << EoF > test.json
{ "value": "`uuidgen`" }
EoF


curl -XPUT "http://182.92.99.60:9200/patent_cn/_doc/"$id"?pretty" -H 'Content-Type: application/json' [email protected]


done           

复制代码

ElasticSearch 低成本高可用最佳实践

5. 方案验证

5.1 单 master 挂掉对历史数据读、实时数据写的影响

ElasticSearch 低成本高可用最佳实践

这里面 master-2 为主节点,kill 掉

ElasticSearch 低成本高可用最佳实践

可以发现集群重启选择了 master 节点

ElasticSearch 低成本高可用最佳实践

5.1.1 验证历史数据的读请求

ElasticSearch 低成本高可用最佳实践

5.1.2 验证实时数据的写请求

ElasticSearch 低成本高可用最佳实践

通过 head,可以看到插入的数据

ElasticSearch 低成本高可用最佳实践

5.2 单数据节点挂掉对历史数据读、实时数据写的影响

ElasticSearch 低成本高可用最佳实践

这里面 kill data-3

ElasticSearch 低成本高可用最佳实践
ElasticSearch 低成本高可用最佳实践

5.2.1 验证历史数据的读请求

#!/bin/bash
for id in $(seq 1 100)
do


curl "http://182.92.99.60:9200/patent_cn/_doc/"$id"" -H 'Content-Type: application/json'
echo


done           

复制代码

ElasticSearch 低成本高可用最佳实践

5.2.2 验证实时数据的写请求

ElasticSearch 低成本高可用最佳实践

通过 head 进行查看

ElasticSearch 低成本高可用最佳实践

6. 结论

  1. 单 master 节点挂掉,对历史数据的读、实时数据的写无影响
  2. 单 node 节点挂掉,对历史数据的读、实时数据的写无影响

继续阅读