redis

关于云基础的相关文章大家可以直接点击 tag:云基础

redis是一个kv缓存数据库,这个也是在各个云厂商里都会存在的东西。但是在实际使用的时候还是有些区别的。

而且redis新的这些版本差别还是很大的。

  1. redis 5.0 基本跟之前的老版本一样

  2. redis 6.0 增加了ssl连接,这样客户端跟服务端之间连接都是加密的,但是一样会损失很大的性能。如果需要的话需要在make的时候加上

    1
    make BUILD_TLS=yes
  3. redis 6.0 支持了多线程,以前redis我们都知道是单进程的,跑满单进程就玩球了,现在可以跑到多个CPU上了,但是性能绝对不是单核*CPU个数的。多核之后要考虑的东西就多了,不像单核那么容易了,所以redis的代码里增加了很多代码量。

集群架构

这个国内云厂商,比如阿里云,腾讯云这些说是集群版,但是他们其实前面还有一个proxy,当然实际是会有很多个proxy在处理。所以就算你程序客户端只是主从redis客户端,那也一样可以用,但是这样的缺点是相对慢一点,看你具体需求,如果一个request会产生N多的redis请求,那还是能节省点就节省点。但是这个没有实际压测过,这个我后面自己压测看看。

  1. 代理版本:客户端请求 —> proxy计算分片 —> 数据分片, 返回也是一样

    redis-proxy

  2. 原生cluster: 客户端通过slot hash直接计算好在哪个node上, 返回也一样,当然这里client要处理move的情况,因为redis cluster是使用CRC16来做HASH的,如果这当中添加或者减少节点,那必然会引发对应的数据迁移,你算出来的也不准。不过这种还得看你用的redis cluster的是怎么实现的。Java语言中就有用Lettuce或者Jedis的。

    redis-cluster

  3. aws的那种cluster:客户端请求 —> 协调节点 —> 返回 –> 数据分片, 请求的时候是过了一个协调节点,它来确定你到哪个分片,但是后面部分存疑,没有elasticache了,只能猜测是这样的方式。

    aws-redis

当然现在国内这些云厂商也提供了原生cluster的版本, 不过开了cluster版本要注意自己的vpc网段的子网大小,要是一个C类段的话那一个redis cluster可能直接256个分片就直接把所有地址都用了。

redis cluster很考验client的实现方式,曾经见过有client实现,当我一次迁移上千个slot的时候直接就挂了(锁太多直接把cpu干满了),只能一个slot迁移完后再进行下一个slot迁移。这些我们实在踩过太多的坑了,因此要是研发对这些client实现不清楚的话,那还是proxy方式来的省心。

SSL开关

aws默认你如果是在控制台创建的话,encryption at-rest(redis密码)按encryption at-transit这2个开关是要么同时开启,要么同时关闭。如果想单个控制的话,那就得用aws cli或者sdk来创建。

entryption

国内的云厂商是都可以单独来控制的。

重启

redis重启后里面是否还有数据?

理论上应该有,因为有aof或者rdb的数据,但是实际上aws没有的,咨询过说elasticache只是cache, 不是永久存储。这个就是故意为之的。但是还好主从切换这些是数据都还在的。

但是正常也不会有人真的去重启这个实例。

压测

redis的压测一般我们使用memtier-benchmark来进行,它可以压主从,也可以压测cluster。但还是要注意以下问题:

  1. 你业务使用了哪些key的类型,有些key类型可能只能是主从的。
  2. 这些key的大小和长度要确定,比如zset,hash这样的你有多少个member,总共占用多少内存。
  3. 读写比设置,相同key类型里大概多少是读,多少写,读的时候是全读还是就读其中一个或几个member。
  4. 设置是否跟生产环境一样,ssl加密,password等等。
  5. 加好监控,看看每个延迟是怎么样的,因为最后出来的报告是整体的一个情况,没有每分钟的情况。
  6. 添加和减少分片的处理(单次添加一个分片或减少一个分片,单次添加1倍的分片和减少50%的分片),是否出现读写异常,异常时间保持多久,异常比是怎么样的。这个不光是使用memtier-benchmark来测试,还要使用业务的代码来测试,业务使用redis client来测试,毕竟很多时候跟client实现有很大关系。