11.Redis系列之Stream消息队列及K8S部署单节点

1. K8S部署单节点

我们在部署Airflow的时候,用的外部数据源,本文我们实践下在K8S上部署Redis单节点,后续的部署我们均会优先考虑K8S部署学习实践的方式

1.1 Windows10下安装Kubectl

我的电脑是Windows10,首先访问https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-windows/下载最新版,目前的最新版是https://dl.k8s.io/release/v1.26.0/bin/windows/amd64/kubectl.exe

2.2 在Docker DeskTop中启用K8S

重启后执行如下命令查看可用节点

C:\Users\Administrator>kubectl get nodes
NAME             STATUS   ROLES           AGE   VERSION
docker-desktop   Ready    control-plane   77s   v1.25.2

2.3 创建命名空间middleware中间件

K8S命名空间类似Nacos命名空间,都是为了便于分类管理

kubectl create namespace middleware

2.4 编写redis.yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: middleware
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      project: redis
      app: redis
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  revisionHistoryLimit: 5
  template:
    metadata:
      labels:
        project: redis
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:7.0.5-alpine3.16
        imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: middleware
  labels:
    project: redis
    app: redis
spec:
  type: NodePort
  selector:
    project: redis
    app: redis
  ports:
  - port: 6379
    targetPort: 6379
    nodePort: 30000

2.5 运行并访问

kubectl apply -f redis.yaml

查看命名空间middleware下运行的pod,OK

kubectl get pod --namespace middleware
NAME                     READY   STATUS    RESTARTS   AGE
redis-5d7f465bc8-kkxhc   1/1     Running   0          106s

现在Airflow就可以在配置该redis的链接了

# 内部容器访问
--set data.brokerUrl=redis://redis-pod.middleware:6379/0
# 或者直接IP:Port方式访问
--set data.brokerUrl=redis://127.0.0.1:30000/0

2. Stream消息队列

在介绍redis5中新引入的数据类型Streams之前,我们先了解下redis中的发布、订阅机制

2.1 发布/订阅机制

# subscribe订阅channel
127.0.0.1:6379> subscribe shenjian.online
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "shenjian.online"
3) (integer) 1
# 新开一个shell,运行 publish channel msg,可以看到订阅窗口收到消息
127.0.0.1:6379> publish shenjian.online 'hello world'
(integer) 1

2.2 Stream消息队列基础操作

# xadd添加消息到流中, *表示根据时间戳自动创建id
127.0.0.1:6379> xadd mystream * name shenjian age 26 sex man
"1667619336374-0"
127.0.0.1:6379> xadd mystream * name shenjian age 26 sex man
"1667619516470-0"
# xdel删除指定id数据
127.0.0.1:6379> xdel mystream 1667619516470-0
(integer) 1
# xlen查看队列中消息数量
127.0.0.1:6379> xlen mystream
(integer) 1
# 获取消息列表,- +表示流中最小最大id
127.0.0.1:6379> xrange mystream - +
1) 1) "1667619336374-0"
   2) 1) "name"
      2) "shenjian"
      3) "age"
      4) "26"
      5) "sex"
      6) "man"
# xread读取消息
127.0.0.1:6379> xread count 1 block 1000 streams mystream 0
1) 1) "mystream"
   2) 1) 1) "1667619336374-0"
         2) 1) "name"
            2) "shenjian"
            3) "age"
            4) "26"
            5) "sex"
            6) "man"
# $查看消息最新,等待1s
127.0.0.1:6379> xread count 1 block 1000 streams mystream $
(nil)
(1.08s)
# xinfo查看流信息
127.0.0.1:6379> xinfo stream mystream
 1) "length"
 2) (integer) 1
 3) "radix-tree-keys"
 4) (integer) 1
 5) "radix-tree-nodes"
 6) (integer) 2
 7) "last-generated-id"
 8) "1667619516470-0"
 9) "max-deleted-entry-id"
10) "1667619516470-0"
11) "entries-added"
12) (integer) 2
13) "recorded-first-entry-id"
14) "1667619336374-0"
15) "groups"
16) (integer) 0
17) "first-entry"
18) 1) "1667619336374-0"
    2) 1) "name"
       2) "shenjian"
       3) "age"
       4) "26"
       5) "sex"
       6) "man"
19) "last-entry"
20) 1) "1667619336374-0"
    2) 1) "name"
       2) "shenjian"
       3) "age"
       4) "26"
       5) "sex"
       6) "man"

2.3 创建消费者组及消费消息

# xgroup create创建两个消费者组
127.0.0.1:6379> xgroup create mystream consumer-group 0
OK
127.0.0.1:6379> xgroup create mystream consumer-group2 0
OK
# xgroup createconsumer为两个消费者组分别创建两个消费者
127.0.0.1:6379> xgroup createconsumer mystream consumer-group consumer-group-consumer
(integer) 1
127.0.0.1:6379> xgroup createconsumer mystream consumer-group consumer-group-consumer2
(integer) 1
127.0.0.1:6379> xgroup createconsumer mystream consumer-group2 consumer-group2-consumer
(integer) 1
127.0.0.1:6379> xgroup createconsumer mystream consumer-group2 consumer-group2-consumer2
(integer) 1
127.0.0.1:6379> xadd mystream * blog shenjian.online
"1667621789492-0"
# xreadgroup使用消费者组1中消费者1读取1条消息
127.0.0.1:6379> xreadgroup group consumer-group consumer-group-consumer count 1 streams mystream >
1) 1) "mystream"
   2) 1) 1) "1667619336374-0"
         2) 1) "name"
            2) "shenjian"
            3) "age"
            4) "26"
            5) "sex"
            6) "man"
# xreadgroup使用消费者组1中消费者2读取1条消息,可以看到消息为第二条,说明消费者组中消费者为竞争关系
127.0.0.1:6379> xreadgroup group consumer-group consumer-group-consumer2 count 1 streams mystream >
1) 1) "mystream"
   2) 1) 1) "1667621789492-0"
         2) 1) "blog"
            2) "shenjian.online"
# xreadgroup使用消费者组2中消费者1读取1条消息,还可以返回第一条消息,说明不同消费者组消息互不影响
127.0.0.1:6379> xreadgroup group consumer-group2 consumer-group2-consumer count 1 streams mystream >
1) 1) "mystream"
   2) 1) 1) "1667619336374-0"
         2) 1) "name"
            2) "shenjian"
            3) "age"
            4) "26"
            5) "sex"
            6) "man"
# xgroup delconsumer删除消费者
127.0.0.1:6379> xgroup delconsumer mystream consumer-group consumer-group-consumer
(integer) 1
# xgroup destroy删除消费者组
127.0.0.1:6379> xgroup destroy mystream consumer-group2
(integer) 1

2.4 redis stream总结

Stream实际上是一个具有消息发布/订阅功能的组件,也就常说的消息队列。其实这种类似于 broker/consumer(生产者/消费者)的数据结构很常见,比如 RabbitMQ 消息中间件、 Kafka 分布式消息系统等,而 Redis Stream 正是借鉴了 Kafaka 系统。

  • 优点: Stream 除了拥有很高的性能和内存利用率外, 它最大的特点就是提供了消息的持久化存储,以及主从复制功能,从而解决了网络断开、Redis 宕机情况下,消息丢失的问题,即便是重启 Redis,存储的内容也会存在。

  • 流程: Stream 消息队列主要由四部分组成,分别是:消息本身、生产者、消费者和消费组

2

一个 Stream 队列可以拥有多个消费组,每个消费组中又包含了多个消费者,组内消费者之间存在竞争关系。当某个消费者消费了一条消息时,同组消费者,都不会再次消费这条消息。被消费的消息 ID 会被放入等待处理的 Pending_ids 中。每消费完一条信息,消费组的游标就会向前移动一位,组内消费者就继续去争抢下消息。

3

2.5 Redis系列之配置文件详解

本文基于Redis7讲解配置文件的一些基础内容

# 自定义配置文件,必须启动时指定配置文件位置,如我们之前在docker-compose中执行
# redis-server /usr/local/redis/conf/redis.conf
# 
# 注意k与kb、m与mb的区别,不区分大小写
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# 导入其他配置文件,支持通配符
# include /path/to/local.conf
#
# 启动时加载指定模块
# loadmodule /path/to/my_module.so
#
# 该配置与默认值相同,所有地址可访问
bind * -::*
#
# 在主从复制模式、Sentinel(哨兵)模式、Cluster 模式中,当主机有多个IP地址时,指定源IP地址
# bind-source-addr 10.0.0.1
#
# yes之允许本地连接,no允许远程客户端连接
protected-mode no
#
# 监听端口
port 6379
# 
# 设置TCP的backlog,backlog是一个连接队列=未完成三次握手队列+已完成三次握手队列。
# 在高并发环境下,需要backlog大些来避免慢连接问题
# 为了起作用/proc/sys/net/core/somaxconn【默认128】与
# /proc/sys/net/ipv4/tcp_max_syn_backlog【阿里云默认1024】同样需要设置
tcp-backlog 511
#
# Close the connection after a client is idle for N seconds (0 to disable)
timeout 0
#
# 心跳存活检查间隔300s
tcp-keepalive 300
#
# 是否运行为后台守护进程,默认否
daemonize no
#
# 存放pid文件的位置,每个实例产生一个pid文件
pidfile /var/run/redis_6379.pid
#
# 日志级别
loglevel notice
# 日志路径,非守护进程运行时,日志发送至/dev/null,即不记录日志
logfile ""
#
# 设置数据库的数量
databases 16
#
# 设置密码
requirepass shenjian.online
#
# 最大连接数,默认支持10000个客户端同时建立连接
# maxclients 10000
#
# 最大可使用内存,当最大内存满,依据maxmemory-policy过期策略剔除数据
# maxmemory <bytes>
#
# volatile-lru -> 根据LRU算法[最近最少使用,淘汰最长时间未被使用]移除key,只针对设置过过期时间的key
# allkeys-lru -> 根据LRU算法移除key,针对所有key
# volatile-lfu -> 根据LFU算法[最近最不常用,淘汰一定时期内被访问次数最少]移除key,只针对设置过过期时间的key
# allkeys-lfu -> 根据LFU算法移除key,针对所有key
# volatile-random -> 在设置过过期时间的key中随机移除
# allkeys-random -> 在所有key中随机移除
# volatile-ttl -> 移除即将过期的key
# noeviction -> 不移除数据,对于写操作报错
# maxmemory-policy noeviction

欢迎关注公众号算法小生查看最新文章

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法小生Đ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值