
# 使用自建Logstash导入数据
当企业用户拥有大量的业务日志（如JSON、CSV等格式）分散存储在本地服务器或其他云平台时，为了方便管理，需要将这些数据汇聚到CSS服务的OpenSearch集群中进行集中检索与分析。然而，出于安全考虑，CSS集群部署在私有网络（VPC）内，导致外部数据源无法直接写入。本文提供基于开源Logstash的数据导入方案，针对同VPC内网环境和外部公网环境，帮助用户打破网络隔离，安全高效地完成数据导入。
#### 方案介绍
Logstash是开源的服务器端数据处理管道，能够同时从多个来源采集数据，进行转换处理，然后发送到CSS集群。Logstash的详细介绍请参见官方文档[Getting started with Logstash](https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html)。
根据Logstash服务器部署位置的不同，分为以下两种网络架构：
- 网络架构一：内网直连（推荐） Logstash部署在与CSS集群同一VPC的弹性云服务器（ECS）上。
  特点：速度快，配置简单，安全性高。
  图1Logstash部署在内网的架构图   
  ![](https://support.huaweicloud.com/usermanual-css/figure/zh-cn_image_0000002515580312.png) 
- 网络架构二：公网通过SSH隧道访问 Logstash部署在本地数据中心或外网服务器，无法直接访问VPC内的CSS集群。需要通过一台绑定了公网IP的ECS作为跳转主机。需要利用SSH的端口转发功能，将本地Logstash的流量转发到云上集群。
  特点：适合本地数据上云，需配置端口转发。
  图2Logstash部署在外网的架构图   
  ![](https://support.huaweicloud.com/usermanual-css/figure/zh-cn_image_0000002515420396.png "点击放大") 
 
#### 前提条件
- 环境依赖：确认服务器已安装JDK 1.8或以上版本。推荐使用Linux操作系统的服务器。
- 下载Logstash：确认Logstash使用的是OSS版本（纯开源版），推荐使用Logstash OSS 7.10.2。 Logstash OSS下载地址：<https://www.elastic.co/downloads/past-releases?product=logstash-oss>
  
- 已准备好数据源和目的端集群的连接信息，包括IP地址、端口号、账号密码等。
- 准备待导入的数据。
  例如在部署Logstash服务器的"/tmp/access_log/"路径下存储了需要导入的数据文件"access_20181029.log"。数据示例如下：
  ```
  |   All |               Heap used for segments |                        |     18.6403 |      MB |
  |   All |             Heap used for doc values |                        |    0.119289 |      MB |
  |   All |                  Heap used for terms |                        |     17.4095 |      MB |
  |   All |                  Heap used for norms |                        |   0.0767822 |      MB |
  |   All |                 Heap used for points |                        |    0.225246 |      MB |
  |   All |          Heap used for stored fields |                        |    0.809448 |      MB |
  |   All |                        Segment count |                        |         101 |         |
  |   All |                       Min Throughput |           index-append |     66232.6 |  docs/s |
  |   All |                    Median Throughput |           index-append |     66735.3 |  docs/s |
  |   All |                       Max Throughput |           index-append |     67745.6 |  docs/s |
  |   All |              50th percentile latency |           index-append |     510.261 |      ms |
  ```
  
 
#### 场景一：Logstash部署在内网时导入数据
1. 准备网络。确保ECS与CSS集群在同一VPC，且安全组放通9200端口。 在部署Logstash的ECS上ping CSS集群的内网地址，能正常访问则表示网络连通。
   
2. 在ECS上安装Logstash。下面提供了Linux Red Hat操作系统的安装指导，其他方案请参见官方文档[Installing Logstash](https://www.elastic.co/guide/en/logstash/current/installing-logstash.html)。
   1. 使用yum安装JDK。由于Logstash依赖Java，需要先安装JDK。
      ```
      yum install java  # 替换为实际JDK版本名称
      ```
      
   
   2. 将下载的Logstash上传至ECS。
   
   3. 使用yum安装Logstash。
      ```
      yum install logstash-oss-7.10.0-x86_64.rpm
      ```
      其中"*logstash-oss-7.10.0-x86_64.rpm*"替换成实际Logstash安装包名称。
      
   
   
   
   1. 修改Logstash的jvm配置，提升集群数据的迁移效率。 Logstash默认的堆内存是1G，建议修改为集群节点内存的一半。
      ```
      vim /etc/logstash/jvm.options
      -Xms4g
      -Xmx4g
      ```
      
    
3. （可选）准备证书。当数据导入的CSS集群开启了安全模式和HTTPS协议，则需要将安全证书上传到ECS。
   1. [获取安全证书]。
   
   2. 将下载的安全证书上传到ECS。
    
4. 在Logstash的安装目录下新建配置文件。
   1. 新建配置文件，如"logstash-simple.conf"。
      ```
      cd /logstash-x.x/ # 进入Logstash的安装目录
      vi logstash-simple.conf # 新建配置文件
      ```
      
   
   2. 输入配置文件内容定义Input、Filter、Output逻辑。
      ```
      input {
          # 读取本地数据文件
          file {
              path => "/tmp/access_log/*.log" # 数据文件路径
              start_position => "beginning"   # 读取起始位置
          }
      }
      filter {
          # 在此添加数据过滤逻辑，如 grok, mutate等
      }
      output {
          elasticsearch {
              # 填写集群内网地址，多节点集群建议填多个节点实现负载均衡
              hosts => ["192.168.xxx.xxx:9200", "192.168.xxx.xxx:9200"]
              # 事件写入的索引名称
              index => "my_import_index"
              # 安全模式配置 (非安全模式请删除以下配置)
              # user => "username"           # CSS集群账号
              # password => "password"       # CSS集群密码
              # ssl => true                  # 是否启用SSL连接
              # ssl_certificate_verification => false               # 是否启用证书认证
              # cacert => "/logstash/config/CloudSearchService.cer" # 安全证书绝对路径
              # 避免兼容性问题的常用参数
              ilm_enabled => false             # 禁用索引生命周期管理(避免权限报错)
              manage_template => false         # 禁用模板管理
          }
      }
      ```
      
   
   3. 配置完成后，输入":wq"保存配置文件。
    
5. 执行配置文件，导入数据到CSS集群。
   ```
   ./bin/logstash -f logstash-simple.conf # 替换为配置文件名称
   ```
   当返回类似"Successfully started Logstash API endpoint"且无报错信息时，表示任务正在运行。
   
6. 数据导入后，验证数据完整性。
   1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
   
   2. 在左侧导航栏，选择"集群管理 \> OpenSearch"。
   
   3. 在集群列表，选择目标集群，单击操作列的"Dashboards"，登录OpenSearch Dashboards。
   
   4. 在OpenSearch Dashboards左侧导航栏选择"Dev Tools"，进入操作页面。 控制台左侧是命令输入框，其右侧的三角形图标为执行按钮，右侧区域则显示执行结果。
      
   
   5. 执行如下命令，搜索导入的索引数据。
      ```
      GET my_import_index/_count         # 查看数据量
      GET my_import_index/_search        # 查看数据内容
      ```
      如果返回的数据内容与源文件一致，则表示导入成功。
      
    
 
#### 场景二：Logstash部署在外网时导入数据
1. 准备跳转主机。在CSS集群所在VPC下，准备一台绑定了EIP的Linux ECS，并开放本地端口（如9100）。
2. 建立SSH隧道。
   1. 在跳转主机上建立端口映射，将发往跳转主机对外开放端口的请求转发到待导入数据的集群中。
      ```
      ssh -g -L <跳转主机本地端口>:<CSS节点内网IP>:9200 -N -f root@<跳转主机私网IP>
      ```
      例如，跳转主机对外开放的本地端口为9100，CSS节点内网IP为192.168.0.81，跳转主机私网IP为192.168.0.227，则端口映射命令如下：
      ```
      ssh -g -L 9100:192.168.0.81:9200 -N -f root@192.168.0.227
      ```
      ![](https://support.huaweicloud.com/usermanual-css/public_sys-resources/note_3.0-zh-cn.png)
      当CSS内网访问节点出现故障时，会导致命令执行失败，如果集群包含多个节点，可以将\<CSS节点内网IP\>替换为另一个节点的IP地址，如果集群只有一个节点，则需要等待节点修复之后再进行端口映射。
      关于SSH隧道的详细配置说明请参见[SSH官方文档](https://man.openbsd.org/ssh.1#L)。
      
   
   2. 验证连通性。
      ```
      curl http://<跳转主机公网IP>:<跳转主机本地端口>
      ```
      如果返回OpenSearch版本信息，说明隧道建立成功。后续配置Logstash配置文件时，hosts地址填写\<跳转主机公网IP\>:\<跳转主机本地端口\>。
      
    
3. （可选）在外网服务器安装Logstash。下面提供了Linux Red Hat操作系统的安装指导。
   1. 使用yum安装JDK。由于Logstash依赖Java，需要先安装JDK。
      ```
      yum install java  # 替换为实际JDK版本名称
      ```
      
   
   2. 将下载的Logstash上传至ECS。
   
   3. 使用yum安装Logstash。
      ```
      yum install logstash-oss-7.10.0-x86_64.rpm
      ```
      其中"*logstash-oss-7.10.0-x86_64.rpm*"替换成实际Logstash安装包名称。
      
   
   
   
   1. 修改Logstash的jvm配置，提升集群数据的迁移效率。 Logstash默认的堆内存是1G，建议修改为集群节点内存的一半。
      ```
      vim /etc/logstash/jvm.options
      -Xms4g
      -Xmx4g
      ```
      
    
4. （可选）准备证书。当数据导入的CSS集群开启了安全模式和HTTPS协议，则需要将安全证书上传到ECS。
   1. [获取安全证书]。
   
   2. 将下载的安全证书上传到ECS。
    
5. 在Logstash的安装目录下新建配置文件。
   1. 新建配置文件，如"logstash-simple.conf"。
      ```
      cd /logstash-x.x/ # 进入Logstash的安装目录
      vi logstash-simple.conf # 新建配置文件
      ```
      
   
   2. 输入配置文件内容定义Input、Filter、Output逻辑。
      ```
      input {
          # 读取本地数据文件
          file {
              path => "/tmp/access_log/*.log" # 数据文件路径
              start_position => "beginning"   # 读取起始位置
          }
      }
      filter {
          # 在此添加数据过滤逻辑，如 grok, mutate等
      }
      output {
          elasticsearch {
              # 填写建立隧道的本地地址
              hosts => ["<跳转主机公网IP>:<跳转主机本地端口>"]
              # 事件写入的索引名称
              index => "my_import_index"
              # 安全模式配置 (非安全模式请删除以下配置)
              # user => "username"           # CSS集群账号
              # password => "password"       # CSS集群密码
              # ssl => true                  # 是否启用SSL连接
              # ssl_certificate_verification => false               # 是否启用证书认证
              # cacert => "/logstash/config/CloudSearchService.cer" # 安全证书绝对路径
              # 避免兼容性问题的常用参数
              ilm_enabled => false             # 禁用索引生命周期管理(避免权限报错)
              manage_template => false         # 禁用模板管理
          }
      }
      ```
      
   
   3. 配置完成后，输入":wq"保存配置文件。
    
6. 执行配置文件，导入数据到CSS集群。
   ```
   ./bin/logstash -f logstash-simple.conf # 替换为配置文件名称
   ```
   当返回类似"Successfully started Logstash API endpoint"且无报错信息时，表示任务正在运行。
   
7. 数据导入后，验证数据完整性。
   1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
   
   2. 在左侧导航栏，选择"集群管理 \> OpenSearch"。
   
   3. 在集群列表，选择目标集群，单击操作列的"Dashboards"，登录OpenSearch Dashboards。
   
   4. 在OpenSearch Dashboards左侧导航栏选择"Dev Tools"，进入操作页面。 控制台左侧是命令输入框，其右侧的三角形图标为执行按钮，右侧区域则显示执行结果。
      
   
   5. 执行如下命令，搜索导入的索引数据。
      ```
      GET my_import_index/_count         # 查看数据量
      GET my_import_index/_search        # 查看数据内容
      ```
      如果返回的数据内容与源文件一致，则表示导入成功。
      
    
 
 #### 获取安全证书
当接入安全模式+HTTPS协议的OpenSearch集群时，如需加载安全证书，则可以参考如下步骤获取安全证书（CloudSearchService.cer）。
1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
2. 在左侧导航栏，选择"集群管理 \> OpenSearch"。
3. 在集群列表，单击目标集群名称，进入集群详情页。
4. 选择"概览"页签，在"网络信息"下方，单击"HTTPS访问"的"下载证书"获取安全证书。
   图3下载安全证书   
   ![](https://support.huaweicloud.com/usermanual-css/images/zh-cn_image_0000002515000613.png) 
 
