技术好文:Redash(开源轻量级智能)生产环境部署及实践(withoutdocker)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: Redash(开源轻量级智能)生产环境部署及实践(withoutdocker)

一直在调研一个轻量级开源的 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 见 redash 目前的最新版 7.0.0 还在使用 Python 2.7 ,所以要安装对应的 2.7.x 的 conda 环境。


2. 安装 PostgreSQL11


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


1. yum install 安装 prm 源


yum install


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


$ 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=""


export REDASH_THROTTLE_LOGIN_PATTERN="10000/hour"


export REDASH_HOST=""


我暂时配置了这些参数,第一个是 redis 的访问地址,第二个是 redash 提供的一个接口频率限制函数读取的变量。我这里直接写得很大,不想去改代码。否则按照默认值可能经常都能看到这样的界面 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 (ECONNRESET) ()


参考了一些同样遇到问题的人,发现 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

//代码参考:https://weibo.com/u/5758833580

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


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


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


以上


Reference:


redash github


Developer Installation Guide


PostgreSQL Install


Redis Install


LTS NodeJs Install


命令行方式登录PostgreSQL、创建用户和数据库并赋权


【HPM】 Error occurred while trying to proxy request / from localhost:3000 to

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
敏捷开发 弹性计算 中间件
平台即服务(PaaS):简化开发与部署的新篇章
【6月更文挑战第21天】PaaS简化了应用开发与部署,提供资源池化、自动化管理及丰富的开发工具,助力企业降低成本、提高效率和系统稳定性。它支持敏捷开发、加速产品上市,改善用户体验,并推动创新,成为现代软件开发的关键。
|
6月前
|
Kubernetes Cloud Native 容器
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
1004 1
|
数据安全/隐私保护 开发者 异构计算
阿里巴巴开源可控视频生成框架VideoComposer!(内含体验、推理实践干货)
8月16日,时间、空间可控的视频生成模型 VideoComposer 在魔搭社区开源。
阿里巴巴开源可控视频生成框架VideoComposer!(内含体验、推理实践干货)
|
3月前
|
Prometheus 监控 Cloud Native
|
5月前
|
消息中间件 Kubernetes Kafka
AutoMQ 自动化持续测试平台技术内幕
Marathon 是一个针对流系统 AutoMQ 的自动化持续测试平台,旨在在模拟生产环境和各种故障场景中验证 SLA 的可靠性。设计原则包括易拓展、可观测和低成本。平台采用分布式架构,Controller 负责资源管理和任务编排,动态调整 Worker 数量和配置,而 Worker 是无状态的,用于生成负载和上报数据。系统基于 K8S,利用服务发现、事件总线和 Spot 实例降低成本并提高弹性。测试场景以代码形式描述,支持不同流量模型和断言,提供丰富的可观测性和告警功能。未来,Marathon 有望泛化为适用于各种分布式系统的测试平台。
58 0
AutoMQ 自动化持续测试平台技术内幕
|
6月前
|
Python
隐语环境的搭建
https://www.bilibili.com/video/BV12r421t77V/ 忙着改论文,blog没法写的太详细了
|
6月前
|
JSON 运维 监控
运维界的新宠!9.7K星认证的轻量级自动化平台等你体验
运维界的新宠!9.7K星认证的轻量级自动化平台等你体验
110 0
|
机器学习/深度学习 人工智能 资源调度
隐语1.0正式发布|MVP部署体验包、资源调度框架Kuscia全新亮相!
隐语1.0正式发布|MVP部署体验包、资源调度框架Kuscia全新亮相!
321 0
|
机器学习/深度学习 算法 安全
隐语V0.7.11版本更新:金融全链路算法完善 ,面向开发者发布配套的交互式教程
隐语V0.7.11版本更新:金融全链路算法完善 ,面向开发者发布配套的交互式教程
199 0
|
开发框架 Ubuntu JavaScript
浅谈USDToch(优多趣)模式系统开发源码搭建(成熟技术)
浅谈USDToch(优多趣)模式系统开发源码搭建(成熟技术)
322 0