id: es title: 行为数据存储

author: xulishan@finogeeks.com

行为数据存储

对于用户行为数据,FinClip 采用 ElasticSearc 进行存储、检索和分析。Elasticsearch 是一种分布式 RESTful 搜 索和分析引擎,能够处理越来越多的用例。作为 Elastic Stack 的核心,它集中存储您的数据,以实现闪电般的快 速搜索、微调相关性和可轻松扩展的强大分析。

部署架构

ElasticSearch 的拓扑图如下

es

服务配置

节点(Node):此中间件默认(最低)交付状态下为三节点集群部署。

索引(Index):此中间件默认(最低)单个索引数据备份数1数据分片数5

数据目录

服务器 设计用途 路径
节点 1 持久化数据目录 /mnt/var/lib/container/elasticsearch
docker-compose 文件目录 /mnt/opt/docker-compose/elasticseaerch
节点 2 持久化数据目录 /mnt/var/lib/container/elasticsearch
docker-compose 文件目录 /mnt/opt/docker-compose/elasticseaerch
节点 3 持久化数据目录 /mnt/var/lib/container/elasticsearch
docker-compose 文件目录 /mnt/opt/docker-compose/elasticseaerch

网络

底层:此中间件基于 docker-compose 启动,docker-compose 基于 docker0 虚拟网卡进行通信,因此本中间件在所有服务器上的所有组件,均通过 docker0 网卡划分出的子网进行通信,并且通过 --network=host 配置运行。

子网网段可以通过 ifconfig docker0 进行确认。

业务层

服务器 设计用途 端口
节点 1 [占用宿主机固定端口] 对外服务 9200
[占用宿主机固定端口] 集群内部通信 9300
[占用宿主机固定端口] Prometheus Metrics 信息提供 9114
节点 2 [占用宿主机固定端口] 对外服务 9200
[占用宿主机固定端口] 集群内部通信 9300
[占用宿主机固定端口] Prometheus Metrics 信息提供 9114
节点 3 [占用宿主机固定端口] 对外服务 9200
[占用宿主机固定端口] 集群内部通信 9300
[占用宿主机固定端口] Prometheus Metrics 信息提供 9114

状态检查

集群状态:在任意一个节点服务器上,执行 curl http://localhost:9200/_cluster/health?pretty,应显示以下回显,查询结果字样应符合、或不低于下述要求:

  1. {
  2. ……
  3. "status" : "green", # 此项代表集群健康
  4. ……
  5. "number_of_nodes" : 3, # 此项代表集群当前节点数,需符合具体部署节点数。
  6. "number_of_data_nodes" : 3, # 此项代表集群当前数据节点数,需符合具体部署节点数。
  7. ……
  8. }

节点增、删

​ 节点由 docker-compose 启动时调用的 docker-compose.yaml 文件控制。配置位于于项 services.elasticsearch.environment 中的 discovery.zen.ping.unicast.hosts

新增节点:若需要新增节点,请依照下列步骤操作

  1. 确认新节点已经安装好 Docker 19.03 或更高版本、已经安装好 docker-compose 1.27 或更高版本
  2. 确认新节点的 IP 地址
  3. 确认新节点对于当前 ElasticSearch 所在的所有服务器的 9200、9300、9114 均为互相可达状态
  4. 在 ElasticSearch 所在的所有服务器上,切换至 docker-compose.yaml 文件所在目录
  5. 在 ElasticSearch 所在的所有服务器上执行 docker-compose down 停止所有 ElasticSearch 服务
  6. 在 ElasticSearch 所在的所有服务器上,编辑 docker-compose.yaml 文件中上述的值,以逗号 , 分割,并新增一个可达的 IP 地址
  7. 复制 docker-compose.yaml 文件到新节点上
  8. 在 ElasticSearch 所在的所有服务器上执行 docker-compose up -d 启动所有 ElasticSearch 服务
  9. 等待约 2 分钟让集群启动。若 Index 数据较多可能会需要更长的时间以同步数据
  10. 执行 “状态检查” 中的步骤,确保 number_of_nodes 为正确数量(即原数量 + 新增节点数)、number_of_data_nodes 为正确数量。

删除节点:若要移除任一节点,请依照下列步骤操作

  1. 通过 curl 或相应工具发送下列请求到 ElasticSearch

    1. PUT _cluster/settings
    2. {
    3. "transient" : {
    4. "cluster.routing.allocation.exclude._ip" : "<你需要移除的节点 IP>"
    5. }
    6. }
    1. 执行 “状态检查” 中的步骤,确保 relocating_shards 大于 0

    2. 稍等片刻后,再次执行 “状态检查” 中的步骤,确保 relocating_shards 等于 0

    3. 在 ElasticSearch 所在的所有服务器上,切换至 docker-compose.yaml 文件所在目录

    4. 在 ElasticSearch 所在的所有服务器上执行 docker-compose down 停止所有 ElasticSearch 服务

    5. 在 ElasticSearch 所在的所有服务器上,编辑 docker-compose.yaml 文件中上述的值,删除需要移除的节点的 IP。

    6. 删掉需要移除 ElasticSearch 节点的服务器上的 docker-compose.yaml 文件

    7. 在 ElasticSearch 剩余所在的所有服务器上执行 docker-compose up -d 启动所有 ElasticSearch 服务

    8. 等待约 2 分钟让集群启动。

    9. 执行 “状态检查” 中的步骤,确保 number_of_nodes 为正确数量(即原数量 - 移除节点数)、number_of_data_nodes 为正确数量。

数据导出、恢复

请参考 ElasticSearch Dump:https://github.com/elasticsearch-dump/elasticsearch-dump

常见灾难场景

  1. Q:节点重启后,集群重建失败,status 无法为 green:

    A:此情况先查看日志,通常可能由于配置原因导致。如果出现 Unable to Connect / Elect Master 等字样,可能由于 IP 地址获取失败导致无法通信,此时需要手动切换到 docker-compose.yaml 目录,停止所有集群,然后在 docker-compose.yaml 文件中的 services.elasticsearch.environment 里新增一个环境变量 network.publish_host=<本机 IP>,再启动所有集群。