当前位置:首页 > 技术之家 > docker > 正文内容

制作Elasticsearch索引初始化docker镜像

背景

由于公司使用自己的编排系统(基于docker),所以在业务服务启动时,需要对某些服务对象进行初始化,本文就对es索引的初始做一个小的分享;

大致流程

初始化步骤主要是基于docker启动一个容器执行自己编写好的sh脚本

基础镜像选择

由于es大部分操作都是基于es的rest api进行,所以,选择alpine:latest这个轻量级操作系统进行操作
dockerfile如下:

FROM alpine:latestRUN apk add --update curl && rm -rf /var/cache/apk/*ADD ./*.sh /scripts/ADD ./*.json /scripts/ADD ./template/ /scripts/template/RUN mkdir -p /devops_runonceCMD sh -c 'echo start > /devops_runonce/status; /scripts/init-index.sh; echo ok > /devops_runonce/status'

镜像中将后缀为sh、json,template目录所有文件拷贝到对应目录,然后执行init-index.sh脚本,主要操作就是init-index.sh,你的任何初始化逻辑都在这里;

初始化脚本

#!/bin/shinit_elastic_address() {  if [ ${MEGCITY_ELASTIC_ADDRESS} ];  then
      echo "MEGCITY_ELASTIC_ADDRESS = $MEGCITY_ELASTIC_ADDRESS"
  else
      echo "no env: MEGCITY_ELASTIC_ADDRESS"
      exit 1  fi

  if [ ${MEGCITY_ELASTIC_USER} ];  then
      echo "MEGCITY_ELASTIC_USER = $MEGCITY_ELASTIC_USER"
  else
      MEGCITY_ELASTIC_USER=elastic  fi}init_elastic_setting() {  if [ ${NUMBER_OF_SHARDS} ];  then
      echo "NUMBER_OF_SHARDS = $NUMBER_OF_SHARDS"
  else
      NUMBER_OF_SHARDS=1  fi

  if [ ${NUMBER_OF_REPLICAS} ];  then
      echo "NUMBER_OF_REPLICAS = $NUMBER_OF_REPLICAS"
  else
      NUMBER_OF_REPLICAS=0  fi

  if [ ${MAX_RESULT_WINDOW} ];  then
      echo "MAX_RESULT_WINDOW = $MAX_RESULT_WINDOW"
  else
      MAX_RESULT_WINDOW=5000000  fi}# 初始化elastic地址配置init_elastic_address# 初始化elastic配置配置init_elastic_setting#根据.json后缀文件数据创建索引# 参数:索引名称、分片数量、副本数量、最大返回结果数create_index(){  echo "create index:$1 with shards: $2 replicas: $3! window: $4!"

  mappings=`cat /scripts/"$1"'.json'`

  curl --insecure -u ${MEGCITY_ELASTIC_USER}:${DEVOPS_INFRA_PASSWORD} -XPUT $MEGCITY_ELASTIC_ADDRESS'/'"$1"'?pretty' -H 'Content-Type: application/json' -d'
  {
      "settings" : {
          "index" : {
              "number_of_shards" : '"$2"',
              "number_of_replicas" : '"$3"',
              "max_result_window": '"$4"'
          }
      },
      "mappings" : '"$mappings"'
  }
  '
  curl --insecure -u ${MEGCITY_ELASTIC_USER}:${DEVOPS_INFRA_PASSWORD} -XPOST $MEGCITY_ELASTIC_ADDRESS'/_aliases?pretty' -H 'Content-Type: application/json' -d'
  {
      "actions" : [
          { "add" : { "index" : "'"$1"'", "alias" : "alias_'"$1"'" } }
      ]
  }
  '}# 初始化索引:在执行create_field_template函数后执行# 因为create_field_template只是创建一个索引模板,索引并没有真正创建init_index(){    echo "create index:$2"

    mappings=`cat /scripts/"$1"'.json'`    echo "init $2"

    curl --insecure -u ${MEGCITY_ELASTIC_USER}:${DEVOPS_INFRA_PASSWORD} -XPUT $MEGCITY_ELASTIC_ADDRESS'/'"$2"'?pretty' -H 'Content-Type: application/json' -d'
    {
        "mappings" : '"$mappings"'
    }
    '}# 根据模板文件创建索引#配置字段的模板alarm_template.jsoncreate_field_template(){  echo "create template:/scripts/template/$1_template.json"
  echo "with shards: $2 replicas: $3! window: $4!"
  mappings=`cat /scripts/template/"$1"_template.json`

    mappings=`cat /scripts/template/"$1"_template.json \
    | sed 's/SHARDS_NUM/'"$2"'/g' |  sed 's/REPLICAS_NUM/'"$3"'/g' |  sed 's/WINDOW_NUM/'"$4"'/g' \
    `
  curl --insecure -u ${MEGCITY_ELASTIC_USER}:${DEVOPS_INFRA_PASSWORD} -XPUT ${MEGCITY_ELASTIC_ADDRESS}'/_template/'"$1"'?pretty' -H 'Content-Type: application/json' -d'
  '"$mappings"'
  '}# 执行创建索引操作:基于.jsoncreate_index megcity-event ${NUMBER_OF_SHARDS} ${NUMBER_OF_REPLICAS} ${MAX_RESULT_WINDOW}# 执行创建索引操作:基于templatecreate_field_template alarm ${NUMBER_OF_SHARDS} ${NUMBER_OF_REPLICAS} ${MAX_RESULT_WINDOW}# init_index megcity-alarm megcity-alarm

以上shell脚本中有一定的注释说明

es索引模板

es索引模板:
就是把已经创建好的某个索引的参数设置(settings)和索引映射(mapping)保存下来作为模板, 在创建新索引时, 指定要使用的模板名, 就可以直接重用已经定义好的模板中的设置和映射.

索引模板一般用在时间序列相关的索引中.
—— 也就是说, 如果你需要每间隔一定的时间就建立一次索引, 你只需要配置好索引模板, 以后就可以直接使用这个模板中的设置, 不用每次都设置settings和mappings.

{
  "index_patterns": [
    "megcity-alarm"
  ],
  "order": 0,
  "mappings": {
    "properties": {
      "causeId": {
        "type": "keyword"
      },
      "caseNumber": {
        "type": "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "videoId": {
        "type": "keyword"
      },
      "causeArea": {
        "properties":{
          "x":{
            "type":"float"
          },
          "y":{
            "type":"float"
          }
        }
      },
      "createTime": {
        "type": "date",
        "format": "epoch_millis"
      },
      "location": {
        "type": "geo_point"
      },
      "state": {
        "type": "integer"
      }
    }
  },
  "settings" : {
    "index" : {
      "number_of_shards": "SHARDS_NUM",
      "number_of_replicas": "REPLICAS_NUM",
      "max_result_window": "WINDOW_NUM",
      "sort": {
        "field": [
          "createTime",
          "caseNumber.keyword"
        ],
        "order": [
          "desc",
          "desc"
        ]
      }
    }
  },
  "aliases": {
    "alias_alarm": {}
  }}

json

这个其实就是索引的mapping

{  "properties": {      "causeId": {        "type": "keyword"
      },      "caseNumber": {        "type": "text",        "fields" : {          "keyword" : {            "type" : "keyword",            "ignore_above" : 256
          }
        }
      },      "videoId": {        "type": "keyword"
      },      "causeArea": {        "properties":{          "x":{            "type":"float"
          },          "y":{            "type":"float"
          }
        }
      },      "createTime": {        "type": "date",        "format": "epoch_millis"
      },      "location": {        "type": "geo_point"
      },      "state": {        "type": "integer"
      }
    }
  }

目录结构

在这里插入图片描述


扫描二维码推送至手机访问。

版权声明:本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:luxd@aliyun.com,感谢支持理解。


本文链接:https://luxd.cc/post/192.html

“制作Elasticsearch索引初始化docker镜像” 的相关文章

Docker虚拟机配置手札(centos)

Docker虚拟机配置手札(centos)

一、Docker只支持CentOS7及以上系统,不支持6.x系统二、yum安装Docker1、安装相关环境和设置仓库yum install -y yum-utils device-mapper-persistent-data lvm2yum-conf...

Docker超详细基础教程,快速入门docker首选(万字长文建议收藏)

Docker超详细基础教程,快速入门docker首选(万字长文建议收藏)

一、docker概述1.什么是dockerDocker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制...

docker从入门到精通,看这一篇就够了

docker从入门到精通,看这一篇就够了

一、Docker简介1、背景物理机时代一个物理机上安装操作系统,然后直接运行我们的软件。也就是说你电脑上直接跑了一个软件,并没有开虚拟机什么的,资源极其浪费。缺点  ·  部署慢  ·  成本高虚拟机都不开,直接上物理机部署应用,那成本能不...

如何将当前在用的centos 7.6系统及数据 转成docker镜像

如何将当前在用的centos 7.6系统及数据 转成docker镜像

将当前正在使用的CentOS 7.6系统及数据转换成Docker镜像的步骤如下:首先,安装Docker。可以通过运行以下命令来安装Docker:sudo yum install docker然后启动Docker服务并设置为在系统启动时自动启动:sudo sys...

DOCKER 第一步

DOCKER 第一步

基本概念Docker 包括三个基本概念镜像( Image )容器( Container )仓库( Repository )容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序...

DOCKER 第二步 现有 CentOS8 系统打包 Docker 镜像

DOCKER 第二步 现有 CentOS8 系统打包 Docker 镜像

一、现有系统 Centos8.5 操作:系统里最好不安装 Docker,否则会报错卸载不必要软件包ndf remove -y iwl* *firmware* --exclude=kernel-firmware清理yum缓存ndf clean allrm -rf /var/cache/dnf ...