首页
学习
活动
专区
圈层
工具
发布

由 Redis 故障场景,说说 ChaosBlade 贡献的二三事

作者:磐基CMChaos混沌工程团队,成为CNCF项目ChaosBlade的 Maintainer

概述

本文以 2 个新增 Redis 原子事件为例,帮助刚接触 ChaosBlade 的社区同学快速入门开源贡献。

开源贡献前提:了解混沌工程和掌握 Golang 开发。

原子事件贡献流程图如下:

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

Redis 实际使用过程中会存在故障演练需求。

例如:

  • 模拟 Key 过期故障:可以触发所有 key 过期的极端故障场景。
  • 模拟缓存内存限制故障:可以主动触发 Redis 内存淘汰策略释放内存场景。

根据故障演练需求价值,决定是否有必要新增相关混沌工程原子事件。

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

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

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

middleware 项目:包含 Nginx、Redis 等中间件相关实验核心代码。

项目地址:https://github.com/chaosblade-io/chaosblade-exec-middleware

3.2 新建 redis 目录

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

代码语言:javascript
复制
mkdir chaosblade-exec-middleware/exec/redis

3.3 新建 redis.go 文件

代码语言:javascript
复制
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{},
  },
 }
}

3.4 Redis 原子事件包含到 Model

model 目录位置:chaosblade-exec-middleware/exec/model/目录

model 目录不同文件对应不同系统支持:

  • model_darwin.go 支持 Mac 系统
  • model_linux.go 支持 linux 系统
  • model_windows.go 支持 windows 系统

model 具体代码:

chaosblade-exec-middleware/exec/model/[1]

代码语言:javascript
复制

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(),
 }

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

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

具体代码:

chaosblade-exec-middleware/build/spec.go[2]

代码语言:javascript
复制
...
// getModels returns experiment models in the project
func getModels() *spec.Models {
 modelCommandSpecs := []spec.ExpModelCommandSpec{
  nginx.NewNginxCommandSpec(),
  redis.NewRedisCommandSpec(), // <== Redis相关
 }
 specModels := make([]*spec.Models, 0)
 for _, modeSpec := range modelCommandSpecs {
  flagSpecs := append(modeSpec.Flags(), model.GetSSHExpFlags()...)
  modeSpec.SetFlags(flagSpecs)
  specModel := util.ConvertSpecToModels(modeSpec, spec.ExpPrepareModel{}, "host")
  specModels = append(specModels, specModel)
 }
 return util.MergeModels(specModels...)
}
...

3.6 开发具体原子事件

  1. 缓存过期实验:

chaosblade-exec-middleware/exec/redis/redis_cache_expire.go[3]

  1. 缓存内存限制实验

chaosblade-exec-middleware/exec/redis/redis_cache_limit.go[4]

第四步:使用 Goland 本地调试,有 bug 或优化再次开发调试。

4.1 搭建准备 Redis 服务

参考相关文档

4.2 修改 Goland Debug 配置

1.打开 main.go 点击三角按钮,选择 Modify Run Configuration...

2.修改 debug 配置:详细使用可以查看 Goland 官方文档

3.执行 Debug 操作:详细使用可以查看 Goland 官方文档

第五步:本地编译并替换测试环境旧编译文件

5.1 参考官方文档执行编译

如果在 mac 系统上,编译当前系统的版本,请执行:

make build_darwin

如果想在 mac 系统上,编译 linux 系统 x86 架构版本,请执行:

make build_linux

如果想在 mac 系统上,编译 linux 系统 arm 架构版本,请执行:

make build_linux_arm

说明:其他系统编译说明参考 官方文档[5]

5.2 编译后文件存放在 target 目录中

5.3 测试环境替换为新编译文件

将测试服务器 chaosblade 目录以下文件替换为新版本

  • chaosblade-1.7.2/bin/chaos_middleware
  • chaosblade-1.7.2/yaml/chaosblade-middleware-spec-1.7.2.yaml

第六步:测试环境测试直至通过

6.1 测试模拟缓存过期实验

执行实验:

代码语言:javascript
复制
#示例1:expire a key
blade create redis cache-expire --addr 192.168.56.101:6379 --password 123456 --key test1 --expiry 1m
#示例2:expire all keys only when the new expiry is greater than current one
blade create redis cache-expire --addr 192.168.56.101:6379 --password 123456 --option GT --expiry 1m

验证实验结果:

代码语言:javascript
复制
# 实验前
192.168.56.101:6379> 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

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

执行实验:

代码语言:javascript
复制
# 示例: set maxmemory to 256M
blade create redis cache-limit --addr 192.168.56.101:6379 --password 123456  --size 256M

验证实验结果:

代码语言:javascript
复制
# 实验前
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 或待优化,重复开发、调试和编译步骤

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

7.1 推送本地 dev 分支 GitHub 远程

代码语言:javascript
复制
# commit
git commit -s  -m "add 2 redis experiments"
# push
git push origin dev

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

7.3 提交 PR 后准备官网 ChaosBlade 文档贡献

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

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

ChaosBlade 官方网址:https://chaosblade.io/[6] ChaosBlade Github : https://github.com/chaosblade-io/chaosblade[7] ChaosBlade 钉钉社区交流群:23177705

参考资料

[1]

chaosblade-exec-middleware/exec/model/: https://github.com/chaosblade-io/chaosblade-exec-middleware/tree/main/exec/model

[2]

chaosblade-exec-middleware/build/spec.go: https://github.com/chaosblade-io/chaosblade-exec-middleware/blob/main/build/spec.go

[3]

chaosblade-exec-middleware/exec/redis/redis_cache_expire.go: https://github.com/chaosblade-io/chaosblade-exec-middleware/blob/main/exec/redis/redis_cache_expire.go

[4]

chaosblade-exec-middleware/exec/redis/redis_cache_limit.go: https://github.com/chaosblade-io/chaosblade-exec-middleware/blob/main/exec/redis/redis_cache_limit.go

[5]

官方文档: https://github.com/chaosblade-io/chaosblade/blob/master/README_CN.md

[6]

https://chaosblade.io/: https://chaosblade.io/

[7]

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

下一篇
举报
领券