10. 分片集群
10.1简介
业务场景,需要存储50G的数据。对于内存和硬盘配置不足,选用两种方式
- 一种:纵向扩展:加内存,加硬盘,提高CPU。简单、直接。RDB存储效率要考虑。成本要考虑。
- 二种:横向扩展:加实例。(加机器)
10.2配置
步骤1:
- 创建一个mycluster目录,复制redis.conf文件
mkdir mycluster cp /opt/redis-6.2.6/redis.conf redis.conf
- 将后台启动打开
步骤2:
- 创建一个redis6379.conf
include redis.conf pidfile "/var/run/redis_6379.pid" port 6379 dbfilename "dump6379.rdb" #打开集群模式 cluster-enabled yes #设定节点配置文件 cluster-config-file nodes-6379.conf #设定节点失联时间,超过,会自动进行主从切换 cluster-node-timeout 15000
步骤3:
- 根据6379的配置文件,再配置5个不同的端口
:%S/原内容/要替换的内容 :%s/6379/6380
步骤4:
-
修改redis.conf配置文件,将bind ip地址加入
打开bind 127.0.0.1 加入 192.168.188.3
步骤5
- 启动六个服务,保证六个服务启动成功
步骤6
- 将六个服务合成一个集群
redis-cli --cluster create --cluster-replicas 1 192.168.188.3:6379 192.168.188.3:6380 192.168.188.3:6381 192.168.188.3:6579 192.168.188.3:6580 192.168.188.3:6581
- 输入yes去接受配置
注意:
当出现此错误时,需要把redis.conf配置文件中的protected-mode no
yes改为no,重启所有redis在执行步骤6
10.3 Hash Slot
10.3.1 简介
在使用redis cluster方案中,一个分片集群有16384个哈希槽。
根据键值对的key,按照CRC16算法计算一个16bit的值。再用这个值对16384取模运算,得到的数代表对应编号的hash slot
10.3.2部署方案
cluster create命令创建集群时,redis会自动把这些hash slot平均分布在集群实例上。如果集群中有N个实例(主库),每个实例上分配到的hash slot就是16384/N
使用cluster addslos 手工分配哈希槽。
10.4 集群中的数据操作
步骤1
- 使用集群方式启动redis的命令行,加 -c参数
redis-cli -c -p 6379
步骤2
- 向redis中设置一个键值对,key会经过运算后,得到相应的hash slot进行存储
set k1 v1 set k2 v2 get k1 get k2
步骤3
- 测试向集群中加入多个key-value,由于在不同的hash slot,此时会报错
mset k3 v3 k4 v4 k5 v5
- 要通过{}来定义组的概念,使用key中{}内相同内容的键值对放在一个slot中
mset name{user:001} zhangsan age{user:001} 18 gender{user:001} man
步骤4
- 获取key中的值
get k1 get name{user:001}
10.5 常用命令
- cluster nodes:显示集群节点的配置信息
- cluster keyslot < key>:获取key的哈希槽
- cluster countkeysinslot < slot>:返回当前哈希槽中key的数量(仅查询当前redis实例)
- cluster getkeysinslot < slot>< count>:返回当前槽中指定的count数量的key
10.6 故障演示
步骤1
- 将6379宕机,以集群方式登录6380
127.0.0.1:6379>shutdown exit redis-cli -c -p 6380
步骤2:
- 使用cluster nodes查看节点状态,6379的从机6581变成了主机
步骤3:
- 把6379再次启动,启动后,6379变成了6581的从机
如果有一段hash slot的主从节点都宕机,redis是否继续工作?
通过下面配置,默认是yes,如果主从都挂掉,整个集群就都挂掉
如果是no,就表示该hash slot数据全部都不能使用,也无法存储
cluster-require-full-coverage yes