ChaosBlade 项目指南:我是如何为社区贡献 Redis 故障场景

2023年 8月 9日 63.7k 0

作者:中国移动磐基 CMChaos 混沌工程团队,晁元宁(@Yuaninga),Reviewer of ChaosBlade

01 Redis 新特性介绍

1.1 背景

Redis 实际使用过程中会存在一些故障演练需求。例如:模拟触发所有 key 过期的极端故障场景、模拟主动触发 Redis 内存淘汰策略释放内存场景等等。

所以,根据以上故障演练需求,决定对 ChaosBlade 新增模拟 Redis 缓存过期实验和模拟 Redis 缓存内存限制实验,丰富 ChaosBlade 的混沌实验场景。

1.2 模拟Redis缓存过期实验

1.2.1 实验用途

模拟 Redis 缓存单个 key 缓存过期,触发缓存指定 key 过期的实验场景。

模拟 Redis 缓存所有 key 缓存过期,触发缓存所有 key 过期的极端异常场景。

1.2.2 实现原理

通过使用 go-redis 包中的 Golang 接口修改 Redis 缓存 Key 的过期时间,来实现模拟 Redis 缓存过期实验。

1.2.3 使用示例

# 设置key 1分钟后过期
# blade create redis cache-expire --addr 192.168.56.101:6379 --password 123456 --key test1 --expiry 1m
{"code":200,"success":true,"result":"b6a0f477b7fb1f4c"}

# 当要设置的过期时间大于key当前过期时间时,设置新过期时间。不存在则直接设置。
# blade create redis cache-expire --addr 192.168.56.101:6379 --password 123456 --key test1 --option GT --expiry 1m
{"code":200,"success":true,"result":"b6a0f477b7fb1f4c"}

1.2.4 官方文档

chaosblade.io/docs/experi…

1.3 模拟 Redis 缓存内存限制实验

1.3.1 实验用途

通过修改 Redis 配置 maxmemory 的大小,模拟超出 Redis 缓存内存限制,从而触发 Redis 内存淘汰策略释放内存场景。

1.3.2 实现原理

通过使用 go-redis 包中的 Golang 接口修改 Redis maxmemory 配置,来实现模拟 Redis 缓存内存限制实验。

1.3.3 使用示例

# 设置Redis maxmemory为256M
# blade create redis cache-limit --addr 192.168.56.101:6379 --password 123456  --size 256M
{"code":200,"success":true,"result":"b6a0f477b7fb1f4c"}

# 设置Redis maxmemory为原值的50%
# blade create redis cache-limit --addr 192.168.56.101:6379 --password 123456  --percent 50
{"code":200,"success":true,"result":"b6a0f477b7fb1f4c"}

1.3.4 官方文档

chaosblade.io/docs/experi…

02 开源贡献新人入门

2.1 概述

本部分以两个新增 Redis 故障场景为例,帮助刚接触 ChaosBlade 的社区同学快速入门开源贡献。开源贡献新人入门前置条件为:了解混沌工程相关知识和掌握 Golang 开发。

2.2 贡献流程图

image

2.3 第一步:分析故障演练需求,确认新增原子事件

确认新增原子事件之前,首先要分析故障演练的需求价值。根据上述第一部分的背景介绍,我们了解到 Redis 实际使用过程中会存在模拟触发所有 key 过期的极端故障场景、模拟主动触发 Redis 内存淘汰策略释放内存场景等等故障演练需求。

所以,基于存在的故障演练需求价值,确认新增模拟 Redis 缓存过期实验和模拟 Redis 缓存内存限制实验。

2.4 第二步:Fork 项目&本地拉取代码并创建 dev 分支

image

2.5 第三步:正式开始新原子事件开发

2.5.1 拉取 chaosblade-exec-middleware 项目代码

  • middleware 项目:
    • 包含 Nginx、Redis 等中间件相关实验核心代码。
  • 项目地址:
    • github.com/chaosblade-…

2.5.2 新建 redis 目录

该目录放置 Redis 原子事件核心代码

mkdir chaosblade-exec-middleware/exec/redis

2.5.3 新建 redis.go 文件

package redis

import (
  "github.com/chaosblade-io/chaosblade-spec-go/spec"
)

type RedisCommandSpec struct {
  spec.BaseExpModelCommandSpec
}

func (*RedisCommandSpec) Name() string {
  return "redis"
}

func (*RedisCommandSpec) ShortDesc() string {
  return "Redis experiment"
}

func (*RedisCommandSpec) LongDesc() string {
  return "Redis experiment"
}

func NewRedisCommandSpec() spec.ExpModelCommandSpec {
  return &RedisCommandSpec{
    spec.BaseExpModelCommandSpec{
      ExpActions: []spec.ExpActionCommandSpec{
        NewCacheExpireActionSpec(),
        NewCacheLimitActionSpec(),
      },
      ExpFlags: []spec.ExpFlagSpec{},
    },
  }
}

2.5.4 Redis 原子事件包含到 Model

  • model 目录位置:
    • chaosblade-exec-middleware/exec/model/ 目录
  • model 目录不同文件对应不同系统支持:
    • model_darwin.go 支持 Mac 系统
    • model_linux.go 支持 linux 系统
    • model_windows.go 支持 windows 系统
  • model 具体代码:

github.com/chaosblade-…

package model

import (
  "github.com/chaosblade-io/chaosblade-exec-middleware/exec/nginx";
  "github.com/chaosblade-io/chaosblade-exec-middleware/exec/redis";
  "github.com/chaosblade-io/chaosblade-spec-go/spec";
)

// GetAllExpModels returns the experiment model specs in the project.
// Support for other project about chaosblade
func GetAllExpModels() []spec.ExpModelCommandSpec {
  return []spec.ExpModelCommandSpec{
    nginx.NewNginxCommandSpec(),
    redis.NewRedisCommandSpec(),
  }

2.5.5 Redis 原子事件包含到编译文件

  • 具体文件:
    • 添加 Redis 到 chaosblade-exec-middleware/build/spec.go
  • 具体代码:

github.com/chaosblade-…

...
// getModels returns experiment models in the project
func getModels() *spec.Models {
  modelCommandSpecs := []spec.ExpModelCommandSpec{
    nginx.NewNginxCommandSpec(),
    redis.NewRedisCommandSpec(), //  set  test1 test2
OK
192.168.56.101:6379> get test1
"test2"
192.168.56.101:6379> expire test1 3000
(integer) 1
192.168.56.101:6379> ttl test1
(integer) 2924
# 实验后
# blade create redis cache-expire --addr 192.168.56.101:6379 --password 123456 --option GT --expiry 1m
192.168.56.101:6379> ttl test1
(integer) 58

2.8.2 测试模拟缓存内存限制实验

  • 执行实验:
  • # 示例:set maxmemory to 256M
    blade create redis cache-limit --addr 192.168.56.101:6379 --password 123456  --size 256M
    
  • 验证实验结果:
  • # 实验前
    192.168.56.101:6379> config get maxmemory
    1) "maxmemory"
    2) "0"
    # 实验后
    # blade create redis cache-limit --addr 192.168.56.101:6379 --password 123456  --size 256M
    192.168.56.101:6379> config get maxmemory
    1) "maxmemory"
    2) "256000000"
    

    说明:测试有 bug 或待优化,重复开发、调试和编译步骤

    2.9 第七步:使用 dev 分支创建和提交 PR

    2.9.1 推送本地 dev 分支 GitHub 远程

    # commit
    git commit -s  -m "add 2 redis experiments"
    # push
    git push origin dev
    

    2.9.2  登录 GitHub 使用 dev 分支创建和提交 PR

    image

    2.9.3  提交 PR 后准备官网 chaosblade 文档贡献

    chaosblade.io/docs/1.7.0/…

    2.10 第八步:PR 审查直至审查通过

    image

    2.11 第九步:PR 合并至 main,新增原子事件贡献成功

    image

    联系我们:

    ChaosBlade 官方网址:

    chaosblade.io/

    ChaosBlade Github:

    https://github.com/chaosblade-io/chaosblade

    ChaosBlade 钉钉社区交流群:23177705

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论