RisingWave分布式SQL流处理数据库调研

2024-02-21 00:36

本文主要是介绍RisingWave分布式SQL流处理数据库调研,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

RisingWave是一款分布式SQL流处理数据库,旨在帮助用户降低实时应用的的开发成本。作为专为云上分布式流处理而设计的系统,RisingWave为用户提供了与PostgreSQL类似的使用体验,官方宣称具备比Flink高出10倍的性能(指throughput)以及更低的成本。RisingWave开发只需要关注SQL开发,而不需要像Flink那样去关注

  • RisingWave与Flink不同的是,RisingWave既可以做流处理也可以存储;而Flink只是流处理框架,而不能存储数据,计算后的数据需要存储到外部系统中。官方宣称可以完全替代FlinkSQL。
  • RisingWave与批数据库不同的是,RisingWave可以做流处理,按预定义逻辑实时处理数据,官网宣称可以做到流批一体,批数据库只能处理批数据。

使用场景

RisingWave 的强项是流处理,底层存储为行存,更加适合对已存储的数据高并发点查,而并非全表扫描。RisingWave 的主要使用场景包括了监控、报警、实时动态报表、流式 ETL、机器学习特征工程等。其已经运用到金融交易、制造业、新媒体、物流等领域。
但是,RisingWave 不适合做分析型随机查询。为支持分析型随机查询,用户还需将数据导入到实时分析数据库中进行操作。不少用户将 RisingWave 与 ClickHouse、Apache Doris 等实时分析数据库组合使用:他们使用 RisingWave 做流计算,同时使用实时分析数据库进行分析型随机查询。RisingWave 已经支持到sink ClickHouse、Apache Doris等OLTP中,具体可以参考RisingWave Sink

注意:
RisingWave 不支持读写事务处理,但其支持只读事务。在生产中,使用 RisingWave 的最佳实践是将 RisingWave 放在事务型数据库的下游。RisingWave 通过 CDC 从事务型数据库中读取已经被序列化过的数据。

RisingWave 应用

部署

RisingWave 单机试玩模式

docker run -itd \
-p 4566:4566 \
-p 5691:5691 \
--privileged \
--name=risingwave \
risingwavelabs/risingwave:latest playground

RisingWave 单机 Docker Compose 部署模式(测试推荐这种模式部署,以下测试基于此种模式)

clone the risingwave repository.

git clone https://github.com/risingwavelabs/risingwave.git

进入docker目录

cd docker

启动RisingWave集群

#使用MinIO存储状态后端,standalone模式启动
export RW_IMAGE=risingwavelabs/risingwave:latest
export ENABLE_TELEMETRY=true
docker compose up -d

安装postgresql客户端

由于RisingWave兼容postgresql协议,所以通过postgresql客户端可以直接操作RisingWave
安装postgresql客户端

yum install -y postgresql

使用 psql 连接

psql -h localhost -p 4566 -d dev -U root

启动mysql并开启binlog

  • 启动mysql
# 查看详细默认配置docker run -it --rm mysql:5.7 --verbose --help#启动mysql server
docker run -d \
--name mysql5.7 \
--restart=always \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/mysql5.7/data:/var/lib/mysql \#数据文件
-v /data/mysql5.7/conf:/etc/mysql/conf.d \#配置文件
-v /data/mysql5.7/log:/var/log \#日志文件
mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--log-bin=/var/lib/mysql/mysql-bin \#开启binlog配置
--server-id=2 #开启binlog配置
  • 链接mysql

docker exec -it mysql5.7 mysql -h127.0.0.1 -P3306 -p’123456’

  • 验证是否开启 binlog

show variables like ‘%log_bin%’;

  • 授权
--授权RisingWave作为slave访问mysql binlog
grant RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT, SELECT on *.* to 'root'@'%' IDENTIFIED BY '123456';
--grant ALL PRIVILEGES on db01.* to 'root'@'%' IDENTIFIED BY '123456';
flush  privileges;
--取消授权,如有需要
REVOKE  GRANT OPTION on *.* FROM 'root'@'%';
REVOKE  ALL PRIVILEGES on *.* FROM 'root'@'%';
REVOKE  ALL PRIVILEGES on db01.* FROM 'root'@'%';
flush  privileges;
--查看授权
show grants for root@'%';

部署kafka

  • 启动kafka
# step-1
docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper:latest
# step-2
# 启动Kafka,将以下的俩个192.168.1.100换为本身的IP地址bash
docker run  -d \
--name kafka \
--restart=always \
-p 8092:8092 \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.1.100:2181/kafka \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.100:8092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:8092 \
-t wurstmeister/kafka
  • 与kafka交互
#list
docker run -it --rm wurstmeister/kafka kafka-topics.sh --bootstrap-server 192.168.1.100:8092 --list
#create topic
docker run -it --rm wurstmeister/kafka kafka-topics.sh --bootstrap-server 192.168.1.100:8092 --create --replication-factor 1 --partitions 1 --topic test2
#producer
docker run -it --rm wurstmeister/kafka kafka-console-producer.sh --bootstrap-server 192.168.1.100:8092 --topic test1
#consumer
docker run -it --rm wurstmeister/kafka kafka-console-consumer.sh --bootstrap-server 192.168.1.100:8092 --topic test1
  • 或通过kcat与kafka交互
docker pull edenhill/kcat:1.7.1
docker run -it --rm edenhill/kcat:1.7.1 kcat -b 192.168.1.100:8092 -t test_sink_topic -C -J
docker run -it --rm edenhill/kcat:1.7.1 kcat -b 192.168.1.100:8092 -t test_sink_topic -C

RisingWave 使用demo

  1. 数据导出sink demo
-- create table
CREATE TABLE t1 (v1 int, v2 int) 
WITH (connector = 'datagen',fields.v1.kind = 'sequence',fields.v1.start = '1',fields.v2.kind = 'random',fields.v2.min = '-10',fields.v2.max = '10',fields.v2.seed = '1',datagen.rows.per.second = '10') ROW FORMAT JSON;
-- create sink
CREATE SINK test_sink_1
FROM t1 
WITH (properties.bootstrap.server = '192.168.1.100:8092',topic = 'test_sink_topic',connector = 'kafka',primary_key = 'v1'
)
FORMAT UPSERT ENCODE JSON;

查看kafka sink 结果

docker run -it --rm edenhill/kcat:1.7.1 kcat -b 192.168.1.100:8092 -t test_sink_topic -C -J

  1. 连接器 source
--source 连接器
CREATE SOURCE IF NOT EXISTS source_1 (v1 integer,v2 integer,
)
WITH (connector='kafka',topic='test_sink_topic',properties.bootstrap.server='192.168.1.100:8092',scan.startup.mode='latest',
) FORMAT PLAIN ENCODE JSON;
-- table连接器
CREATE TABLE IF NOT EXISTS table_1 (v1 integer,v2 integer,
)
WITH (connector='kafka',topic='test_sink_topic',properties.bootstrap.server='192.168.1.100:8092',scan.startup.mode='latest',
) FORMAT PLAIN ENCODE JSON;
  1. Change Data Capture (CDC) 直连 MySQL CDC
    --mysql ddl:create database db01;use db01;CREATE TABLE orders (order_id int(11) NOT NULL AUTO_INCREMENT,price decimal(11),PRIMARY KEY (order_id));-- risingwave ddlCREATE TABLE orders (order_id int,price decimal,PRIMARY KEY (order_id)) WITH (connector = 'mysql-cdc',hostname = '192.168.1.100',port = '3306',username = 'root',password = '123456',database.name = 'db01',table.name = 'orders',);--mysql dmlinsert into orders(price) values(12),(10),(23);insert into orders(price) values(12),(10);update orders set price=100  where order_id=1;delete from orders where order_id=3;-- risingwave验证数据select * from orders ;
  1. 直接导出物化视图/表数据 (CREATE SINK FROM)
CREATE TABLE t11 (v1 int, v2 int) 
WITH (connector = 'datagen',fields.v1.kind = 'sequence',fields.v1.start = '1',fields.v2.kind = 'random',fields.v2.min = '-10',fields.v2.max = '10',fields.v2.seed = '1',datagen.rows.per.second = '10') ROW FORMAT JSON;create materialized view mv_t11 as select count(*) from t11;CREATE SINK sink1 FROM mv_t11 
WITH (connector='kafka',properties.bootstrap.server='192.168.1.100:8092',topic='t_sink1'
)
FORMAT PLAIN ENCODE JSON(force_append_only='true'
);

check结果

docker run -it --rm edenhill/kcat:1.7.1 kcat -b 192.168.1.100:8092 -t t_sink1 -C -J

  1. 导出 Query 的数据(CREATE SINK AS)
CREATE TABLE t11 (v1 int, v2 int) 
WITH (connector = 'datagen',fields.v1.kind = 'sequence',fields.v1.start = '1',fields.v2.kind = 'random',fields.v2.min = '-10',fields.v2.max = '10',fields.v2.seed = '1',datagen.rows.per.second = '10') ROW FORMAT JSON;CREATE SINK sink2 AS 
SELECT avg(v1) as avg_v1, avg(v2) as avg_v2 
FROM t1
WITH (connector='kafka',properties.bootstrap.server='192.168.1.100:8092',topic='t_sink2'
)
FORMAT PLAIN ENCODE JSON(force_append_only='true'
);

check结果

docker run -it --rm edenhill/kcat:1.7.1 kcat -b 192.168.1.100:8092 -t t_sink1 -C -J

总结

RisingWave 提供与 PostgreSQL 兼容的标准SQL接口。用户可以像使用 PostgreSQL 一样处理数据流。屏蔽了实时处理底层需要遇到的一些技术细节(状态存储,数据一致性,分布式集群扩展等),供应用方快速的开发实时数据流,进行流式ETL。具有以下特性:同步的实时性(可以保证实时的新鲜度,doris等OLAP引擎采用异步实时)、强一致性(doris等OLAP引擎仅提供最终一致性)、高可用、高并发、流处理语义、资源隔离。可以应用在一些数据看版,监控,实时指标等场景。

相关文章

github 仓库
官方文档
中文文档
创始人知乎主页
Slack

这篇关于RisingWave分布式SQL流处理数据库调研的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/730052

相关文章

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5