正如官方文档所自豪宣称的那样。Kibana更多的是一个平台,一个可以让插件独立开发,“独立部署”的可扩展性平台,可以让我们自由的发挥自己的想象力和能力,根据自己的需求往上添加原生Kibana所不提供的功能。你可以开发一个新的app,也可以只部署一个后台服务,也可以是一个隐藏的跳转页面,这些,都有赖于plugin的方式,自由的在kibana上install, update和remove。

问题描述

以上。看起来是比较美好的,但硬币的反面是kibana作为一个单页应用,任何都其他功能都是"/"路径下都一个子path,任何插件的安装(除非是一个纯后台的服务,但我没有测试)都需要和主页面、所有已安装都插件产生联系,即每次插件都变动,都需要将所有的页面和js重新bundle一次。这个捆绑不是简单的捆绑,而是经过优化后的打包操作,相当耗时。重点是,按照目前的方式,optimize(bundle)的过程必须是现场的,即必须在正在运行的kibana服务器上进行,因此在以下情况下你可能会遇到麻烦:

  • 你的kibana服务作为一个生产服务,不能停
  • 你没有给kibana做双活
  • 因为只是一个前端,你给kibana分配的硬件资源很少(单核2G,双核4G)
  • 你使用的是6.3之后的版本,kibana已经默认安装了xpack。或者你是之前的版本,自己手动安装了xpack

这时,你若是安装或者更新插件(包括remove插件),都可能会因为optimize过程占用大量的cpu和内存资源,而造成kibana停止服务响应。

这里有一个小tips,如果你开发了多个插件,需要同时更新当时候,安装当时候请使用命令kibana-plugin install --no-optimize file:///path_to_your_file,当全部的插件都安装完了之后,再重启kibana,一次性的执行optimize流程,或者通过bin/kibana --optimize命令触发

Kibana架构简述

如果我们的目标是让kibana零等待时间升级插件,找到解决方案的前提是我们能够了解Kibana的软件架构和部署方式。

首先,我们需要知道的是Kibana是一个基于node的web应用,前端后端都主要使用的javascript。web后端使用的hapi作为web服务器应用程序。并且node无需安装,已经包含在了kibana目录下。(node目录)

以下是kibana的目录,所有的插件都安装在plugins目录,而所有打包后的内容都放在optimize目录。

├── LICENSE.txt
├── NOTICE.txt
├── README.txt
├── bin
├── config
├── data
├── node
├── node_modules
├── optimize
├── package.json
├── plugins
├── src
└── webpackShims

plugins目录(这里,我有两个插件):

.
├── kibana_auth_plugin
│   ├── index.js
│   ├── node_modules
│   ├── package.json
│   ├── public
│   ├── server
│   └── yarn.lock
└── system_portal├── index.js├── node_modules├── package.json├── public├── server└── yarn.lock

每个插件都是类似的目录结构。public目录存放的是前端的页面和js,server目录存放的是后端的js。这里最终要的信息是,插件的开发其实也是一种 前后端分离的架构 。插件安装后后端主程序会调用server目录下的文件,而前端public目录下的文件会被压缩后打包到optimize目录,详见如下。

optimize目录:

├── bundles
│   ├── 176bcca991b07a6ec908fc4d36ac5ae0.svg
│   ├── 45c73723862c6fc5eb3d6961db2d71fb.eot
│   ├── 4b5a84aaf1c9485e060c503a0ff8cadb.woff2
│   ├── 69d89e51f62b6a582c311c35c0f778aa.svg
│   ├── 76a4f23c6be74fd309e0d0fd2c27a5de.svg
│   ├── 7c87870ab40d63cfb8870c1f183f9939.ttf
│   ├── apm.bundle.js
│   ├── apm.entry.js
│   ├── apm.style.css
│   ├── kibana-auth-plugin.bundle.js
│   ├── kibana-auth-plugin.entry.js
│   ├── kibana-auth-plugin.style.css
│   ├── canvas.bundle.js
│   ├── canvas.entry.js
│   ├── canvas.style.css
│   ├── cc17a3dbad9fc4557b4d5d47a38fcc56.svg
│   ├── commons.bundle.js
│   ├── commons.style.css
│   ├── dashboardViewer.bundle.js
│   ├── dashboardViewer.entry.js
│   ├── dashboardViewer.style.css
│   ├── dfb02f8f6d0cedc009ee5887cc68f1f3.woff
│   ├── fa0bbd682c66f1187d48f74b33b5bbd0.svg
│   ├── graph.bundle.js
│   ├── graph.entry.js
│   ├── graph.style.css
│   ├── infra.bundle.js
│   ├── infra.entry.js
│   ├── infra.style.css
│   ├── kibana.bundle.js
│   ├── kibana.entry.js
│   ├── kibana.style.css
│   ├── ml.bundle.js
│   ├── ml.entry.js
│   ├── ml.style.css
│   ├── monitoring.bundle.js
│   ├── monitoring.entry.js
│   ├── monitoring.style.css
│   ├── space_selector.bundle.js
│   ├── space_selector.entry.js
│   ├── space_selector.style.css
│   ├── src
│   ├── stateSessionStorageRedirect.bundle.js
│   ├── stateSessionStorageRedirect.entry.js
│   ├── stateSessionStorageRedirect.style.css
│   ├── status_page.bundle.js
│   ├── status_page.entry.js
│   ├── status_page.style.css
│   ├── system_portal.bundle.js
│   ├── system_portal.entry.js
│   ├── system_portal.style.css
│   ├── timelion.bundle.js
│   ├── timelion.entry.js
│   ├── timelion.style.css
│   ├── vendors.bundle.js
│   └── vendors.style.css

前端浏览器在访问"/"目录的时候会最先获取到kibana.*.js相关的文件。我们看一下
kibana.entry.js, 里面是包含了所有插件的信息的,即,每次插件的变动,这些文件也会跟着跟新

/*** Kibana entry file** This is programmatically created and updated, do not modify** context: ä"env": "production","kbnVersion": "6.5.0","buildNum": 18730,"plugins": Ä"apm","apm_oss","beats_management","kibana_auth_plugin","canvas","cloud","console","console_extensions","dashboard_mode","elasticsearch","graph","grokdebugger","index_management","infra","input_control_vis","inspector_views","kbn_doc_views","kbn_vislib_vis_types","kibana","kuery_autocomplete","license_management","logstash","markdown_vis","metric_vis","metrics","ml","monitoring","notifications","region_map","reporting","rollup","searchprofiler","spaces","state_session_storage_redirect","status_page","system_portal","table_vis","tagcloud","tile_map","tilemap","timelion","vega","watcher","xpack_main"Å
å*/// import global polyfills before everything else
import 'babel-polyfill';
import 'custom-event-polyfill';
import 'whatwg-fetch';
import 'abortcontroller-polyfill';
import 'childnode-remove-polyfill';import ä i18n å from 'Ékbn/i18n';
import ä CoreSystem å from '__kibanaCore__'const injectedMetadata = JSON.parse(document.querySelector('kbn-injected-metadata').getAttribute('data'));
i18n.init(injectedMetadata.legacyMetadata.translations);new CoreSystem(äinjectedMetadata,rootDomElement: document.body,requireLegacyFiles: () => ärequire('plugins/kibana/kibana');å
å).start()

优化部署的方案(前后端分离的部署)

我们已经初步了解了kibana和kibana plugins的架构。那kibana插件的安装方案是怎么样的呢?
kibana为了简化我们的工作,只需要我们将打包好的源码丢给kibana,然后执行命令:kibana-plugin install file:///path_to_your_file,这样貌似省事,但也把所有的工作都丢给了kibana服务器去完成。
在kibana服务器性能不佳的情况下,这部分工作可能会造成服务中断。因此,我们要代替kibana服务器完成这部分工作,做一个前后端分离的部署

后端部署

后端部署的速度是极快的,只需要把文件解压缩到具体目录就可以:

`kibana-plugin install --no-optimize file:///path_to_your_file`

这里特别要注意: --no-optimize参数是必须的,这时,插件的安装只是一个解压的过程,不会让kibana服务器去做繁重的optimize工作。

注意,执行这一步之后,不能重启kibana服务器,否则会自动做optimize

前端部署

这里说的前端,主要是指bundle之后的内容。在你的开发环境上,安装插件。当插件安装完成后,把bundles目录整体打包(bundles.zip)。将打包好之后的内容,上传到kibana服务器,删除旧的optimize/bundles目录,把打包好的bundles目录解压到optimize目录下

注意,这里开发环境上的kibana版本,和kibana安装的插件必须是和生产环境上是一致的,否则会造成无法启动或者自动重做optimize

重启kibana服务器

当以上两步完成之后,重启kibana service即可,你会发现,内容已经更新,但是不会触发任何的optimize过程。

参考示例

以下是该过程的一个ansible playbook供大家参考

---- name: deploy bundles zipcopy: src=bundles.zip dest={{kibana_home}}/optimize force=yes mode={{file_mask}}- name: deploy system plugins zipcopy: src=system_portal-0.0.0.zip dest={{kibana_home}}/ force=yes mode={{file_mask}}- name: deploy auth zipcopy: src=kibana_auth_plugin-6.5.0.zip dest={{kibana_home}}/ force=yes mode={{file_mask}}- name: remove system pluginshell: "{{kibana_home}}/bin/kibana-plugin remove system_portal"ignore_errors: True- name: remove auth pluginshell: "{{kibana_home}}/bin/kibana-plugin remove kibana_auth_plugin"ignore_errors: True- name: install system pluginshell: "{{kibana_home}}/bin/kibana-plugin install --no-optimize file://{{kibana_home}}/system_portal-0.0.0.zip"register: install_state- name: install auth pluginshell: "{{kibana_home}}/bin/kibana-plugin install --no-optimize file://{{kibana_home}}/kibana_auth_plugin-6.5.0.zip"register: install_state
#  failed_when: "'Extraction complete' in install_state.stdout_lines"- name: delete old bundlsfile: dest={{kibana_home}}/optimize/bundles state=absent- name: delete old bundlsunarchive:src: "{{kibana_home}}/optimize/bundles.zip"dest: "{{kibana_home}}/optimize/"copy: nogroup: "kibana"owner: "kibana"mode: "{{file_mask}}"- name: delete zip filesfile: dest={{kibana_home}}/optimize/bundles.zip state=absent- name: restart kibanabecome: yesservice: name={{kibana_init_script | basename}} state=restarted enabled=yes

如何让kibana零等待时间升级插件(前后端分离的部署)相关推荐

  1. Vue2+Node.js前后端分离项目部署到云服务器

    本文参考教程: NodeJS项目部署到阿里云ECS服务器全程详解 - 知乎本文详细介绍如何部署NodeJS项目到阿里云ECS上,以及本人在部署过程中所遇到的问题.坑点和解决办法,可以说是全网最全最详细 ...

  2. 前后端分离项目部署(部署在同一台服务器)

    前后端分离项目部署(部署在同一台服务器) 博主现在参与的项目是前后端分离的,前端是用vue写的并用npm构建的,后端是用java写的用maven构建的,但是前端和后端在同一个项目中,之前的部署方式是前 ...

  3. 前后端分离项目部署(服务器或本地)

    文章目录 前后端分离项目部署(服务器或本地) 前端部署(以vue项目为例) 后端部署(以Springboot项目为例) 补充 前后端分离项目部署(服务器或本地) 前端部署(以vue项目为例) 部署环境 ...

  4. web前后端分离开发部署模式

    web前后端分离开发部署模式 在开始讨论这个话题之前我们先来认识一下传统的开发模式. 一.传统开发模式 相信很多做过Web开发童鞋应该都会经历这样一种开发模式,利用后端语言提供的模版引擎编写HTML/ ...

  5. 前后端分离Nginx部署解决方案

    前后端分离Nginx部署解决方案 转自:https://www.yuque.com/dukang-hfttn/mo27v1/po8zc3 一.获取前端代码编译发布步骤 获取FE前端源码 安装Nodej ...

  6. 前后端分离前端部署方案是什么?

    这段时间,粉丝朋友会经常问到一个问题,即:前后端分离如何部署?前端部署方案是什么?虽然我们回复了很多次,但是依然有不少朋友有疑问.今天,小编就给大家整理出来,如果对这个问题感兴趣,就可以收藏起来随时查 ...

  7. 若依前后端分离框架部署Linux服务器

    若依前后端分离框架部署Linux服务器 第一次使用若依框架进行部署Linux服务器,出现了很多的问题,也可能是自身对若依框架的不太熟悉导致接下来说一下我的部署 第一步:首先我们把我们的前端打包,如果不 ...

  8. 若依前后端分离项目部署最简单的方式(推荐)

    对应若依前后端分离项目来说,部署的方式有很多种: 第1种方式:可以将前端打包整合到后端部署 第2种方式:可以使用tomcat部署(后端打war包+前端打dist包) 第3种方式:可以使用tomcat+ ...

  9. 前后端分离项目部署上线详细教程

    " 大家好,我是雄雄,欢迎关注微信公众号:????雄雄的小课堂???? " 今天,给大家分享的是,Springboot+Vue项目如何部署上线的详细步骤. 代码编辑器 前端:Web ...

最新文章

  1. 从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附代码)
  2. 'eval' is null or not an object
  3. 循环测试:结果为空时的处理
  4. 七夕节福利,一套java架构师资源等你拿
  5. Linux学习笔记(一)|目录结构
  6. 程序员最喜欢说的十句话,看看你最喜欢说哪句?
  7. 前端学习(3002):vue+element今日头条管理--模块介绍
  8. UVA - 11246 - K-Multiple Free set(容斥原理)
  9. 软件设计原则和方法通俗理解
  10. 嵌入式操作系统风云录:历史演进与物联网未来.
  11. 蓝牙解码格式哪个最好_柏韵Pureaudio AirDSD Pro 串流播放解码前级
  12. 一分钟了解业务流程图与功能流程图的区别
  13. 【不积跬步_无以至千里】 数学知识(不定时整理)
  14. Mysql事务操作及存储引擎
  15. JSP打开是源码解决
  16. 你没见过的中文编程工具,用中文开发android安卓应用,安卓开发的初体验!
  17. Axure实战——实现登录注册功能
  18. HPB钱包与中间件接口
  19. 扫雷游戏 (15 分)
  20. UDP TCP socket EtherCAT都是什么?

热门文章

  1. 快速构建pyqt5界面UI
  2. 使用inuit.css揉鼻子
  3. 基于FPGA的CAN总线控制器的设计(上)
  4. 车载客流统计计数器有用吗?
  5. 倍福TwinCAT(贝福Beckhoff)基础教程2.0 TwinCAT常用快捷键
  6. 该怎么写邮件给期刊编辑询问投稿状态?
  7. 每日一句-为什么熬夜
  8. endnote一打开就自动关闭_EndNote系列教程(一):功能介绍与软件安装使用
  9. 文件如何生成下载链接?
  10. 享拍app v1.8.1官方iPhone版