概述
- Redis集群实现了对Redis的
水平扩容
,即启动N个Redis节点,将整个数据库分布式存储在这N个节点中,每个节点存储数据的1/N- 优点:
(1)实现扩容、分摊压力
(2)无中心配置相对简单- 缺点:
(1)多键操作是不被支持的
(2)多键的Redis事务是不被支持的,lua脚本不支持
搭建集群
- 在
myredis
文件夹中创建6个配置文件,并填入一下内容,然后根据6个redis配置文件,启动6个redis服务器
include /home/dl/myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
# 后续的3条指令是集群需要的
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
-
启动后会在
myredis
文件夹中生成6个node-xxx.conf
文件
-
将6个redis服务器合成一个集群:
(1)进入安装文件夹的src目录下:
(2)执行以下命令创建集群(必须在src下的目录中执行)
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6389 127.0.0.1:6390 127.0.0.1:6391
--cluster-replicas 1
表示1主1从模式
4. 使用集群策略连接,设置数据会自动切换到相应的写主机:
redis-cli -c -p 6379
- slots
- 一个Redis集群包含16384个插槽(hash slots),数据库中的每个键都属于这16384个插槽的其中一个
- 集群使用公式
CRC(key) % 16384
来计算键key
属于哪个槽,其中CRC16(key)
语句用于计算键key的CRC16校验和
- 集群中的每个节点负责一部分插槽
集群的使用
- 插入操作:
- 即使是在服务器
6389
中插入的,但是通过计算插槽为12706
归6381
这个主机使用,因此会将键插入6381
服务器中
- 无法在同一条语句中插入多个
key-value
,可以使用分组的方式完成
- 查询插槽的值:
cluster keyslot <key>
查询插槽值
- 计算插槽中的键的数目:
(1)12706不属于6380
服务器管理,因此无法进行查询
故障恢复
- 若主机挂掉后,从机是能够自动升为主服务器:
2. 原主机再次启动后,会成为新主机(原从机)的从机
3. 若某一插槽段的主机和从机都挂掉了,此时分为两种情况:
(1)若cluster-require-full-converage
为yes,则整个集群都挂掉了
(2)若cluster-require-full-converage
为no,则该插槽数据全部不能使用