Redash(開源輕量級商業智能) 生產環境部署及實踐 (without docker)

一直在調研一個輕量級開源的 BI 系統。以前咱們生產環境使用的 aliyun 的 QuickBi,也調研了另一個 airflow 的開源商業智能 superset。不得不認可 QuickBI 正在日益完善變得好用,可是因其重量級,不靈活,支持數據源單一(好比普通版本只支持 自建 MySQL | RDS 阿里雲內部的一些組件)superset 有相似問題。不支持 Hive(高級版支持) | Presto 等數據源數據讀取給 QuickBi 的靈活性帶來不少挑戰。css

不支持多數據源帶來的困難表如今靈活性上,例如一個數據在集羣完成計算以後,我須要再通過清洗 ETL 以後導入新建表  MySQL。給臨時提數 | 可視化覆蓋率 等帶來不少 ETL 上的時間成本。動則半天多則一天時間,可能都浪費在了數據的導來導去的過程之中。html

因此基於上面緣由,選擇一個輕量級且能夠方便定製的 BI 工具會讓效率獲得必定提高。前端

 

部署到生產環境 (withoud docker)node

在選擇部署到生產環境以前,我嘗試了使用 docker 部署了一套環境在測試服。可是服務器常常不知道怎麼就被莫名打死,有時候也很卡。因此生產環境我仍是嘗試去部署在物理機器上。後來也碰到一些問題,會在下面把這些問題都分享一下。(官方實際上是推薦使用 docker 進行部署的,在 18年社區還發生過屢次討論,最終 owner 仍是提供了部署物理機的方法,我我的不喜歡把簡單的應用多個組件打包部署,很差查問題)python

這裏我使用的環境是 Aliyun CentOS 7.4react

1. 安裝 minicondalinux

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 環境。webpack

 

2. 安裝 PostgreSQL11 nginx

根據官網的引導,選擇本身想要安裝的版本和平臺。目前最新的版本是 ver11 而後 CentOS7.x 版本git

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

相關文章
相關標籤/搜索