一直在调研一个轻量级开源的 BI 系统。之前我们生产环境使用的 aliyun 的 QuickBi,也调研了另外一个 airflow 的开源商业智能 superset。不得不承认 QuickBI 正在日益完善变得好用,但是因其重量级,不灵活,支持数据源单一(比如普通版本只支持 自建 MySQL | RDS 阿里云内部的一些组件)superset 有类似问题。不支持 Hive(高级版支持) | Presto 等数据源数据读取给 QuickBi 的灵活性带来很多挑战。

不支持多数据源带来的困难表现在灵活性上,例如一个数据在集群完成计算之后,我需要再经过清洗 ETL 之后导入新建表  MySQL。给临时提数 | 可视化覆盖率 等带来很多 ETL 上的时间成本。动则半天多则一天时间,可能都浪费在了数据的导来导去的过程之中。

所以基于上面原因,选择一个轻量级且可以方便定制的 BI 工具会让效率得到一定提升。

部署到生产环境 (withoud docker)

在选择部署到生产环境之前,我尝试了使用 docker 部署了一套环境在测试服。但是服务器经常不知道怎么就被莫名打死,有时候也很卡。所以生产环境我还是尝试去部署在物理机器上。后来也碰到一些问题,会在下面把这些问题都分享一下。(官方其实是推荐使用 docker 进行部署的,在 18年社区还发生过多次讨论,最终 owner 还是提供了部署物理机的方法,我个人不喜欢把简单的应用多个组件打包部署,不好查问题)

这里我使用的环境是 Aliyun CentOS 7.4

1. 安装 miniconda

readsh 有几个比较重要的组件,后端有 Python Flask 有PostgreSQL 有 redis , 前端有 NodeJs 的转发。首先我们在 CentOs 上为部署 redash 单独创建 redash 的账户 然后为其安装 miniconda,安装 miniconda 见 https://www.cnblogs.com/piperck/p/5156493.html, redash 目前的最新版 7.0.0 还在使用 Python 2.7 ,所以要安装对应的 2.7.x 的 conda 环境。

2. 安装 PostgreSQL11

根据官网的引导,选择自己想要安装的版本和平台。目前最新的版本是 ver11 然后 CentOS7.x 版本

. yum install 安装 prm 源
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm . 安装 psql 客户端包
yum install postgresql11 . 安装 postgresql-server
yum install postgresql11-server 设置开机启动和启动 postgresql
/usr/pgsql-/bin/postgresql--setup initdb
systemctl enable postgresql-
systemctl start postgresql-

3. 安装 redis 

$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0..tar.gz
$ cd redis-5.0.
$ make 使用
$ src/redis-server 即可启动服务器了

4. 安装或更新 NodeJs

安装下载 Linux 二进制文件 x64 版本。并参考 NodeJS wiki

解压 NodeJs 二进制文件到指定路径

比如 目标地址 /usr/local/lib/nodejs
VERSION=v10.15.0
DISTRO=linux-x64
sudo mkdir -p /usr/local/lib/nodejs
sudo tar -xJvf node-$VERSION-$DISTRO.tar.xz -C /usr/local/lib/nodejs

设置环境变量 ~/.proofile or ~/.bashrc

# Nodejs
VERSION=v10.15.0
DISTRO=linux-x64
export PATH=/usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin:$PATH

refresh 环境变量。

测试安装是否成功

$ node -v

$ npm version

$ npx -v

这里要注意相关版本号的情况。有一些版本的系统里面可能不安静之前就被人安装过 node 这里要通过版本号判断一下是否是用的就是你自己的版本。

设置完成之后做个 ln 到目标地址

sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/node /usr/bin/node

sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/npm /usr/bin/npm

sudo ln -s /usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin/npx /usr/bin/npx

如果确认要使用现在的版本可以直接使用 ln -sf 指定。

5. 前端部分

所有环境都安装完毕之后终于可以愉快的开始启动项目了

从 git 上 clone 下 redash 并且用 conda source 一个新的环境 使用

pip install -r requirements.txt -r requirements_all_ds.txt

这里的 requirements_all_ds 是大家为 redash 提供的数据源的相关 python 库。也可以不全部都装,装你自己需要使用到的即可。

依托勤劳的社区,使得 redash 可以支持海量的数据源。

使用 npm 安装前端相关依赖

npm install 

npm run build 

前端这边不得不提一点,redash 项目前后端分离。中间依托了前端 node 的一个叫 dev-server 的服务器用于转发前后端请求。所以当我们在访问 redash 的时候其实请求会先打到  node 服务器那边然后再由 node 的服务器进行转发到后端 flask 服务器。

这里因为我只打算在入口的位置来配置 nginx 服务器,并不打算在 redash 服务器这边再用 nginx 转发一下。所以这里我需要配置 redash 的 node 服务器去监听 0.0.0.0 所有范围的8080 端口。8080端口是默认的所以我修改了 node 里面的 webpack.config.js 配置指定让 devServer 监听 0.0.0.0 地址。

这里不指定 host 默认会监听 127.0.0.1:8080
devServer: {
host: '0.0.0.0',
inline: true,
index: "/static/index.html",
historyApiFallback: { 修改了这里之后我们还需要去 package.json 去修改一个 start 参数去后面追加 --disableHostCheck=true
start": "node --max-http-header-size=16385 ./node_modules/webpack-dev-server/bin/webpack-dev-server.js --disableHostCheck=true

之后我们再使用 npm run start 将前端的服务器启动起来即可。

6.后端部分

服务器端部分其实有很多值得注意的地方。首先 readsh 给我们的默认配置是默认我们刚才将那些组件都安装在了同一台机器上面,否则你就必须面临一个重新配置相关配置参数的局面。好在 redash 将配置文件的修改放在了还算清晰的地方。

如果你没有在代码里面添加 .env 文件,所有后端服务启动的时候会默认去读取环境变量中的配置。如果环境变量里面没有配置相关的参数,那么将会直接使用所有参数的默认值加载。

redash 的配置写在 -> redash/redash/settings/__init__.py 中,这里囊括了所有的配置。如果使用环境变量的配置要到这里来这里参考 key 的名称。

例如我的 redis 就不是安装在本地而是直接使用我们服务器集群的 redis 所以我需要重新指定 redis 地址。

# >>>> redash config
export REDIS_URL="redis://10.163.13.219:19736/0"
export REDASH_THROTTLE_LOGIN_PATTERN="10000/hour"
export REDASH_HOST="http://redash.hundun.cn"

我暂时配置了这些参数,第一个是 redis 的访问地址,第二个是 redash 提供的一个接口频率限制函数读取的变量。我这里直接写得很大,不想去改代码。否则按照默认值可能经常都能看到这样的界面 https://discuss.redash.io/t/429-too-many-requests/1013 Too Many Requests。

配置设置好之后可以使用命令 bin/run ./manage.py check_settings 看下现在加载的配置是否是想要的。

7. 数据库部分

数据库部分就是使用 psql 客户端去 PostgreSQL 创建一下 redash 这个账户 并且授予相关的权限。由于我还没有使用过 PostgreSQL 。。。。操作的时候真的非常不习惯。

创建新用户

postgres=# CREATE USER redash WITH PASSWORD '*****';

这里不配置其他数据库会默认使用 postgres 这个数据库

可以使用 psql -d postgres 访问数据库。

使用

bin/run ./manage.py database create_tables

自动 mapper 数据表。 redash 在 python 中建立了 orm 模型,并且其使用的 SQLAlchemy 支持直接映射。

8 启动服务。

我们在 nginx 配置上我们要转发的 前端 dev_server 地址,然后启动相关服务。

前端 server
npm run staart flask server
bin/run ./manage.py runserver --debugger --reload celery server
./bin/run celery worker --app=redash.worker --beat -Qscheduled_queries,queries,celery -c2

即可访问 redash 的 login 页面了。到此也就配置完毕了。

需要注意的地方

1. 在整个配置过程中涉及到的部分还是非常多。需要注意前端的 node 环境虽然官方网站上说 npm 6.9 以上即可,但是实际操作中很多包都无法正常安装,我是重新更新到最新的 node 才完成了安1. 装。

2. 在配置 setting 的过程中注意仔细检查各部分参数,并且使用 manage 提供的参数检查命令来检查参数是否符合预期。

3. Too Many Requests 上面也提到了,需要配置一下 REDASH_THROTTLE_LOGIN_PATTERN 环境变量来控制这个频率,不需要的话可以从代码中将相关控制频率的地方给删除掉。

4. 还有 email 的配置,我这里直接使用 postfix 来代理邮件服务,但是我发现如果我启动邮件服务之后,创建帐号那边将不再提供设置密码的操作了,必须要邮箱认证,所以我就先关闭了。

5. 生产环境如果压力比较大,可以使用 gunicorn 把 wsgi 那边包一下。 redash 为了提供方便已经将 wsgi 单独提出来写了一个文件,并在里面给大家准备好了 app = xxxx。。。。贴心。

6. devServer 报错

[HPM] Error occurred while trying to proxy request /api/session from redash.hundun.cn to http://localhost:5000/ (ECONNRESET) (https://nodejs.org/api/errors.html#errors_common_system_errors)

参考了一些同样遇到问题的人,发现 7.0 里面有个配置

    proxy: [
{
context: [
"/login",
"/logout",
"/invite",
"/setup",
"/status.json",
"/api",
"/oauth"
],
target: redashBackend + "/",
changeOrigin: false,
secure: false
},
{
context: path => {
// CSS/JS for server-rendered pages should be served from backend
return /^\/static\/[a-z]+\.[-9a-fA-F]+\.(css|js)$/.test(path);
},
target: redashBackend + "/",
changeOrigin: true,
secure: false
}

这里的 proxy 的第一个元素的 changeOrigin 需要设置为 true,即可解决这个问题。

其实在使用过程中,还觉得蛮顺利的。非常好的查询复用功能,意外的支持一些骚操作比如词云,感觉二次开发可以很好的提供的功能会丰富 redash 。

唯一觉得不太好的地方是,后端代码感觉有点乱。。。包括 import 之类的写法都很随意,还没有整个仔细来看。之后使用过程中如果要进行二次开发,还会再记录一些有趣的东西。

以上

Reference:

https://github.com/getredash/redash    redash github

https://redash.io/help/open-source/dev-guide/setup    Developer Installation Guide

https://www.postgresql.org/download/linux/redhat/    PostgreSQL Install

https://redis.io/download    Redis Install

https://nodejs.org/zh-cn/download/    LTS NodeJs Install

https://github.com/nodejs/help/wiki/Installation

https://blog.csdn.net/zhangzeyuaaa/article/details/77941039    命令行方式登录PostgreSQL、创建用户和数据库并赋权

https://github.com/saikat/react-apollo-starter-kit/issues/20    [HPM] Error occurred while trying to proxy request / from localhost:3000 to http://localhost:8080

Redash(开源轻量级商业智能) 生产环境部署及实践 (without docker)的更多相关文章

  1. Django + Uwsgi + Nginx 的生产环境部署

    使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归 ...

  2. Spring Boot (二)集成Jsp与生产环境部署

    一.简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下S ...

  3. 【原创】大数据基础之Airflow(2)生产环境部署airflow研究

    一 官方 airflow官方分布式部署结构图 airflow进程 webserver scheduler flower(非必须) worker airflow缺点 scheduler单点 通过在sch ...

  4. 八、SpringBoot生产环境部署

    1.下载安装Tomcat 下载地址:https://tomcat.apache.org/download-90.cgi 如下图所示: 2.入口类继承SpringBootServletInitializ ...

  5. 10: Django + Uwsgi + Nginx 的生产环境部署

    1.1 一些重要概念 1.Web协议介绍 Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi 1. CGI:  最早的协议 2. FCGI:  比CGI快 ...

  6. Spring Boot 集成Jsp与生产环境部署

    一.简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下S ...

  7. Django+Nginx+uWSGI生产环境部署

    生产环境中的数据流 参考文档: wsgi详解:https://blog.csdn.net/li_101357/article/details/52748323 wsgi协议介绍(萌新版):https: ...

  8. Centos7 HyperLedger Fabric 1.4 生产环境部署

    Kafka生产环境部署案例采用三个排序(orderer)服务.四个kafka.三个zookeeper和四个节点(peer)组成,共准备八台服务器,每台服务器对应的服务如下所示: kafka案例网络拓扑 ...

  9. 深度学习Tensorflow生产环境部署(上·环境准备篇)

    最近在研究Tensorflow Serving生产环境部署,尤其是在做服务器GPU环境部署时,遇到了不少坑.特意总结一下,当做前车之鉴. 1 系统背景 系统是ubuntu16.04 ubuntu@ub ...

随机推荐

  1. SSRF绕过IP限制方法总结

    SSRF绕过IP限制方法总结 - Summary of SSRF methods for bypassing IP restrictions -https://www.cnblogs.com/iAmS ...

  2. day35-python之协程

    1.协程 # import time # import queue # # def consumer(name): # # print("--->ready to eat baozi. ...

  3. Kconfig和Makefile

    内核源码树的目录下都有Kconfig和Makefile.在内核配置make menuconfig时,从Kconfig中读出菜单,用户勾选后保存到.config中.在内核编译时,Makefile调用这个 ...

  4. php基本数据类型

    trim()函数,用于去除字符串首尾空格和特殊字符返回的是去掉的空格和特殊字符后的字符串 string trim(string str [,string charlist]); str 要操作的字符串 ...

  5. HTML&CSS基础-前端免费开发工具Hbuilder介绍

    HTML&CSS基础-前端免费开发工具Hbuilder介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 工欲善其事必先利其器,想要干好活得有一个好的工具. 一.文本编辑工 ...

  6. ISCC之web1

    由题意知,爆破可行. 简单说一下抓包过程,第一个抓到的POST包直接放掉,右键扫描站点,扫出来第二个POST包,第二个POST包cookie,验证码,密码均为空,于是我开始尝试去利用, 经过几次rep ...

  7. java 静态代码块和spring @value等注解注入顺序

      java 静态代码块和spring @value等注解注入顺序 问题所在 先上代码 java方法 @Value("${mf.cashost}") public static S ...

  8. 使用AutoIt实现文件上传

    在网页上上传文件的时候,Selenium无法直接操作如Flash.JavaScript 或Ajax 等技术所实现的上传功能,这时候我们需要借用一个叫做AutoIt的软件来帮助我们事先自动化的上传操作. ...

  9. npm start a http server( 在windows的任意目录上开启一个http server 用来测试html 页面和js代码,不用放到nginx的webroot目录下!!)

    原文:https://stackabuse.com/how-to-start-a-node-server-examples-with-the-most-popular-frameworks/#:~:t ...

  10. LGOJP1941 飞扬的小鸟

    题目链接 题目链接 题解 \(f[i][j]\)表示位置\((i,j)\)到达需要的最小点击数. \(f[i][j]=\min\{{f[i-1][j-kx]+k},f[i-1][j+y]\}\) \( ...