首页 > 数据库 >ChaosBlade 项目指南:我是如何为社区贡献 Redis 故障场景

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

时间:2023-08-01 14:55:40浏览次数:38  
标签:指南 redis exec -- chaosblade Redis 缓存 ChaosBlade

作者:中国移动磐基 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 官方文档

https://chaosblade.io/docs/experiment-types/host/redis/blade_create_redis_cache_expire

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 官方文档

https://chaosblade.io/docs/experiment-types/host/redis/blade_create_redis_cache_limit

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 等中间件相关实验核心代码。
  • 项目地址:

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 具体代码:

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

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
  • 具体代码:

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

...
// 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...)
}
...

2.5.6 开发具体原子事件

  • 缓存过期实验:

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

  • 缓存内存限制实验:

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

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

2.6.1 搭建准备 Redis 服务

  • 参考相关文档:

2.6.2 使用 Goland Debug

    • 官方文档:
  1. 打开 main.go 点击三角按钮,选择 Modify Run  Configuration...

image

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

image

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

image

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

2.7.1 参考官方文档执行编译

  1. 如果在 mac 系统上,编译当前系统的版本,请执行:
make build_darwin
  1. 如果想在 mac 系统上,编译 linux 系统 x86 架构版本,请执行:
make build_linux
  1. 如果想在 mac 系统上,编译 linux 系统 arm 架构版本,请执行:
make build_linux_arm

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

https://github.com/chaosblade-io/chaosblade/blob/master/README_CN.md

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

image

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

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

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

image

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

2.8.1 测试模拟缓存过期实验

  1. 执行实验:
#示例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
  1. 验证实验结果:
# 实验前
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

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

  1. 执行实验:
# 示例:set maxmemory to 256M
blade create redis cache-limit --addr 192.168.56.101:6379 --password 123456  --size 256M
  1. 验证实验结果:
# 实验前
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 文档贡献

https://chaosblade.io/docs/1.7.0/community/docs/

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

image

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

image

联系我们:

ChaosBlade 官方网址:

https://chaosblade.io/

ChaosBlade Github:

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

ChaosBlade 钉钉社区交流群:23177705

标签:指南,redis,exec,--,chaosblade,Redis,缓存,ChaosBlade
From: https://www.cnblogs.com/alisystemsoftware/p/17596491.html

相关文章

  • 原生php 接入redis 详细步骤
    前言环境:win10php5.4IIS10 一.安装php-redis扩展下载地址:https://windows.php.net/downloads/pecl/releases/redis/注意选择好对应的版本,图中2.2.7指的是redis的版本,后边的5.4指php版本,还有vc9和x86,这些可以在phpinfo当中查到。 下载好之后解压,复制包里的php_redis.d......
  • Branch端口操作指南
    近期的版本升级中,我们的开发团队对Branch端口进行了优化改进。本文将使用最新的知行之桥2023-23.2.8605.0版本,为大家展开介绍。Branch端口概览使用场景:多种业务类型文件分类时,级联使用。端口功能:配置确定要查找的值以及要比较的目标值。如果传入值与目标值匹配,则消息将沿......
  • 设计走查指南:提升设计质量的关键步骤
    在产品设计过程中,确保产品设计质量是至关重要的。设计走查作为一种关键的质量控制方法,能够帮助设计团队发现问题并采取相应措施来提升设计质量。通过有效地进行设计走查,团队可以提高设计作品的一致性、可用性和用户满意度,从而创造出优秀的用户体验。在本文中,我们将一起探讨:● 设计......
  • 限制IP对接口的调用频率_基于Redis实现
    pom.xml引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>逻辑代码 privatebooleanli......
  • Redis 基础
    1.Redis入门1.1Redis简介Redis是一个基于内存的key-value结构数据库。Redis是互联网技术领域使用最为广泛的存储中间件。官网:https://redis.io中文网:https://www.redis.net.cn/key-value结构存储:主要特点:基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻......
  • windows安装redis
    前言RemoteDictionaryServer(Redis)是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的API,是跨平台的非关系型数据库。Redis通常被称为数据结构服务器,因为值(value)可以是字符串(Stri......
  • Java面试题 P24:Redis篇:redis集群有哪些方案?
    在Redis中提供的集群方案总共有三种:(1)主从模式(2)哨兵模式(3)分片集群redis主从数据同步的流程时什么?      ......
  • Java面试题 P25:Redis篇:redis是单线程的,但是为什么还那么快?
    一、Redis是单线程的,但是为什么还那么快1、Redis是纯内存操作,执行速度非常快2、采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题,加入并发锁,影响性能3、使用I/O多路复用模型,非阻塞IO二、你能解释一下I/O多路复用模型? ......
  • Java面试题 P23:Redis篇:redis分布式锁,是如何实现的?
       单台服务器:加synchronlzed解决方案。      (1)采用Watchdag给锁续期(2)抢不到锁的线程会尝试等待(3)所有的redis命令采用lua脚本,保证执行的原子性     ......
  • Java面试题 P22:Redis篇:Redis做为缓存,Redis的数据淘汰策略是什么?
          ......