Redash(开源轻量级商业智能) 生产环境部署及实践 (without docker)

一直在调研一个轻量级开源的 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 版本

1. yum install 安装 prm 源
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

2. 安装 psql 客户端包
yum install postgresql11

3. 安装 postgresql-server
yum install postgresql11-server

设置开机启动和启动 postgresql
/usr/pgsql-11/bin/postgresql-11-setup initdb
systemctl enable postgresql-11
systemctl start postgresql-11

 

3. 安装 redis 

$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ 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]+\.[0-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

 

posted @ 2019-06-03 17:16  piperck  阅读(7061)  评论(0编辑  收藏  举报