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 单机试玩模式

bash 复制代码
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集群

bash 复制代码
#使用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
bash 复制代码
# 查看详细默认配置
 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%';

  • 授权
sql 复制代码
--授权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
bash 复制代码
# 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交互
bash 复制代码
#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交互
bash 复制代码
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
sql 复制代码
-- 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
sql 复制代码
--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
sql 复制代码
    --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 ddl
    CREATE 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 dml
    insert 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)
sql 复制代码
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)
sql 复制代码
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

相关推荐
李元豪2 小时前
grpo nl2sql qwen3 模型强化学习训练有效果的成立条件有哪些
数据库·oracle
Hello.Reader5 小时前
RedisJSON 路径语法深度解析与实战
数据库·redis·缓存
TDengine (老段)5 小时前
TDengine 使用最佳实践(2)
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
C182981825757 小时前
分布式ID 与自增区别
分布式
设计师小聂!8 小时前
Linux系统中部署Redis详解
linux·运维·数据库·redis
kfepiza8 小时前
Debian-10编译安装Mysql-5.7.44 笔记250706
linux·数据库·笔记·mysql·debian·bash
Touper.8 小时前
Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)
java·数据库·redis
不剪发的Tony老师8 小时前
phpMyAdmin:一款经典的MySQL在线管理工具又回来了
数据库·mysql·phpmyadmin
极限实验室8 小时前
TDBC 2025 可信数据库发展大会,极限科技邀您来赴约!
数据库
lixia0417mul210 小时前
使用Starrocks替换Clickhouse的理由
数据库