刚好工作中用到 Redpanda,这里就写了一篇在部署过程中的操作和小 Tips。
前言
虽然 redpanda 是基于 Kafka 的流处理系统,但是它是用 C++写的,因此启动方式并不一样,不像kafka那样用脚本就可以实现简单的topic管理和收发消息。
Redpanda有自己的工具集,主要是rpk命令行工具,而不是使用Kafka的启动脚本和管理工具。rpk工具旨在提供一种简单、一致的方式来管理Redpanda集群,包括配置、启动、监控和维护等任务。
由于是 C++ 编写,而且不需要 Zookeeper 和 JVM ,因此速度相比 Kafka 提升很多,大概有下三点:
操作简单。只有一个二进制可执行文件,部署简单,无需jvm、zk。
尽可能的零数据丢失。使用raft协议保障数据安全。
实测比kafka快10倍。Thread-Per-Core架构和io_uring的加持,使得其比kafka更快。
官方说明:
Redpanda 的设计目标是在任何数据流工作负载上实现最佳性能。
它可以扩展以使用单台机器上的所有可用资源,也可以扩展以将性能分布到多个节点。Redpanda 基于 C++ 构建,与其他平台相比,它提供更高的吞吐量和低 10 倍的 p99 延迟。这实现了以前难以想象的使用案例,这些用例需要高吞吐量、低延迟和最小的硬件占用空间。
Redpanda 被打包为单个二进制文件:它不依赖于任何外部系统。
它与 Kafka API 兼容,因此可以与基于 Kafka 构建的完整工具和集成生态系统配合使用。Redpanda 可以部署在数据中心或云中的裸机、容器或虚拟机上。Redpanda 控制台可让您轻松设置、管理和监控集群。此外,分层存储可让您近乎实时地将日志段卸载到对象存储,从而提供长期数据保留和主题恢复。
Redpanda在整个平台上使用Raft 共识算法来协调将数据写入日志文件并在多个服务器之间复制该数据。
Raft 促进了 Redpanda 集群中节点之间的通信,以确保它们同意变更并保持同步,即使其中少数节点处于故障状态。这使得 Redpanda 能够容忍部分环境故障,并在高负载下提供可预测的性能。
Redpanda 提供数据主权。
注意需要设置环境变量,或者手动把docker compose 文件修改,用指定的 console 版本或者 redpanda 版本。
- 手动设置环境变量:
export REDPANDA_VERSION=<desired_version> # 如23.3.8
export REDPANDA_CONSOLE_VERSION=<desired_version> # 如 2.6.0
- 或者直接指定版本 (并声明外部地址)
version: "3.7"
name: redpanda-quickstart-one-broker
networks:
redpanda_network:
driver: bridge
volumes:
redpanda-0: null
services:
redpanda-0:
command:
- redpanda
- start
- --kafka-addr internal://0.0.0.0:9092,external://0.0.0.0:19092
# Address the broker advertises to clients that connect to the Kafka API.
# Use the internal addresses to connect to the Redpanda brokers'
# from inside the same Docker network.
# Use the external addresses to connect to the Redpanda brokers'
# from outside the Docker network.
- --advertise-kafka-addr internal://redpanda-0:9092,external://10.1.0.132:19092
- --pandaproxy-addr internal://0.0.0.0:8082,external://0.0.0.0:18082
# Address the broker advertises to clients that connect to the HTTP Proxy.
- --advertise-pandaproxy-addr internal://redpanda-0:8082,external://10.1.0.132:18082
- --schema-registry-addr internal://0.0.0.0:8081,external://0.0.0.0:18081
# Redpanda brokers use the RPC API to communicate with each other internally.
- --rpc-addr redpanda-0:33145
- --advertise-rpc-addr redpanda-0:33145
# Mode dev-container uses well-known configuration properties for development in containers.
- --mode dev-container
# Tells Seastar (the framework Redpanda uses under the hood) to use 1 core on the system.
- --smp 1
- --default-log-level=info
image: docker.redpanda.com/redpandadata/redpanda:v23.3.18-amd64
container_name: redpanda-0
volumes:
- redpanda-0:/var/lib/redpanda/data
networks:
- redpanda_network
ports:
- 18081:18081
- 18082:18082
- 19092:19092
- 19644:9644
console:
container_name: redpanda-console
image: docker.redpanda.com/redpandadata/console:v2.6.0
networks:
- redpanda_network
entrypoint: /bin/sh
command: -c 'echo "$$CONSOLE_CONFIG_FILE" > /tmp/config.yml; /app/console'
environment:
CONFIG_FILEPATH: /tmp/config.yml
CONSOLE_CONFIG_FILE: |
kafka:
brokers: ["redpanda-0:9092"]
schemaRegistry:
enabled: true
urls: ["http://redpanda-0:8081"]
redpanda:
adminApi:
enabled: true
urls: ["http://redpanda-0:9644"]
ports:
- 8080:8080
depends_on:
- redpanda-0
Kafka 原生脚本测试
使用kafka下的脚本进行测试:
# create topic
bin/kafka-topics.sh --create --topic wangzhichuang --bootstrap-server localhost:19092
# 发送消息
bin/kafka-console-producer.sh --topic wangzhichuang --bootstrap-server localhost:19092
# 消费消息
bin/kafka-console-consumer.sh --topic wangzhichuang --from-beginning --bootstrap-server localhost:19092
注意端口一般是19092。
结果如下:
Redpanda 提供的 rpk 工具
- 获取集群信息:
docker exec -it redpanda-0 rpk cluster info
- 创建一个名为聊天室的主题:
docker exec -it redpanda-0 rpk topic create chat-room
- 向主题生成一条消息:
docker exec -it redpanda-0 rpk topic produce chat-room
- 消费一条消息
docker exec -it redpanda-0 rpk topic consume chat-room --num 1
- 测试完销毁资源
docker compose down
- 手动部署单节点
官方给出的链接里有在 debian 系统上直接安装的,但是好像有些镜像问题,就不随便搞了,换了一个通用的指令,自己解压。
自动部署:https://docs.redpanda.com/current/deploy/deployment-option/self-hosted/manual/production/production-deployment-automation/ 使用 Terraform 和 Ansible 等自动化工具部署 Redpanda。
- 安装
curl -1sLf 'https://dl.redpanda.com/nzc4ZYQK3WRGd9sy/redpanda/cfg/setup/bash.deb.sh' | \
sudo -E bash && sudo apt install redpanda -y
可能会遇到这种问题:
这是因为镜像源的问题,我的解决方法是注释掉该kitware的源: 文件:
vim /etc/apt/sources.list.d/kitware.list
注释掉唯一的源。然后重新 apt-get update。最后重新执行上述命令。
正常情况下会得到:
同理有需要的话安装 redpanda console
curl -1sLf 'https://dl.redpanda.com/nzc4ZYQK3WRGd9sy/redpanda/cfg/setup/bash.deb.sh' | \
sudo -E bash && sudo apt-get install redpanda-console -y
初始化
接下来就是启动 Redpanda。
- 首先确定配置值
sudo rpk redpanda config bootstrap --self <listener-address> --advertised-kafka <advertised-kafka-address> --ips <seed-server1-ip>,<seed-server2-ip>,<seed-server3-ip> && \
sudo rpk redpanda config set redpanda.empty_seed_starts_cluster false
listener-address
: 你可以将其设置为0.0.0.0:9092,这表示Redpanda将监听所有可用的网络接口上的9092端口,用于接收Kafka客户端的连接。advertised-kafka-address
: 这个地址是客户端用来连接到Redpanda的地址。在单节点配置中,这通常是该节点的外部或公网IP地址与端口的组合。假设你的服务器IP是192.168.1.100,那么你可以将其设置为192.168.1.100:9092。seed-server-ips
: 在单节点集群中,这将是该节点自己的IP地址。使用相同的IP地址,例如192.168.1.100。
比如我自己的:
由于redpanda版本在23.3.8以后才能用 rpk 在后面拼接监听器地址,所以我这里之后要手动修改配置文件:
/etc/redpanda/redpanda.yaml
如下部分改为
暂时无法在飞书文档外展示此内容
随后启动:
sudo rpk redpanda config bootstrap --self 10.1.0.132 --ips 10.1.0.132 && sudo rpk redpanda config set redpanda.empty_seed_starts_cluster false
sudo rpk redpanda config set redpanda.empty_seed_starts_cluster false
启动 Redpanda
- 系统服务启动
sudo systemctl start redpanda-tuner redpanda
- 启动成功后可以通过 status 命令查看服务状态如下:
sudo systemctl status redpanda
Redpanda-tuner 是Redpanda提供的一个工具,它的主要目的是自动调整Linux系统的配置,以确保Redpanda能够以最佳性能运行。这个工具专门针对Redpanda的运行环境进行优化,包括内核参数、磁盘设置、网络设置等方面的调整。
因此不会被启动为持久的可用服务,不需要查看状态。
如果出现启动过程中卡住的情况,并且查看状态时提示错误,可以着重检查配置文件,即
/etc/redpanda/redpanda.yaml
文件,注意地址要填成你的服务器ip地址。
- 使用 rpk 工具查看集群状态
rpk cluster info
- 尝试创建 topic
rpk topic create <topic-name>
其他命令和 docker-compose 部署后使用相同,请参考之前的内容。
- 部署集群
其实和上述类似,只是配置文件需要指定多台机器。
主要是修改配置文件/etc/redpanda/redpanda.yaml
:
redpanda:
data_directory: /var/lib/redpanda/data
empty_seed_starts_cluster: false
seed_servers:
- host:
address: <seed-server1-ip>
port: 33145
- host:
address: <seed-server2-ip>
port: 33145
- host:
address: <seed-server3-ip>
port: 33145
rpc_server:
address: <listener-address>
port: 33145
kafka_api:
- address: <listener-address>
port: 9092
admin:
- address: <listener-address>
port: 9644
advertised_rpc_api:
address: <listener-address>
port: 33145
advertised_kafka_api:
- address: <advertised-kafka-address>
port: 9092
至此 redpanda 的部署已经完成!
下面开始集成到 KPC 项目。