077:RedisCluster哨兵集群实现原理
- 1 回顾Redis主从复制与哨兵机制
- 2 传统Redis哨兵集群存在那些缺陷
- 3 RedisCluster分片集群实现原理
- 4 基于不同Redis配置文件启动多个不同的Redis
- 5 Linux环境上搭建RedisCluster
- 6 RedisClient连接Redis分片集群
1 回顾Redis主从复制与哨兵机制
课程内容:
- 传统集群方式存在那些缺点?
- 为什么需要使用RedisCluster集群
- RedisCluster高可用集群实现原理
- 搭伪集群RedisCluster高可用集群
2 传统Redis哨兵集群存在那些缺陷
传统Redis集群存在哪些问题?
Redis哨兵集群模式,每个节点都保存全量同步数据,冗余的数据比较多;其次只能允许有一个主的节点,属于中心化集群。
而在Redis Cluster模式中集群中采用分片集群模式(去中心集群方式、数据均摊到每个节点存放),可以减少冗余数据,缺点就是构建该集群模式成本非常高。
3 RedisCluster分片集群实现原理
Redis Cluster是Redis官方推出一种去中心化的集群方式。采用hash槽分片的将数据存放到多个不同的Redis中,从而可以去减少冗余的数据。
核心原理:采用hash槽,预先分配16384个卡槽,并且将卡槽分配到具体的Redis节点,通过key进行crc16(key)%16384=卡槽,可以根据卡槽存放到具体Redis节点,注意一个卡槽可以存放多个不同的key;只有主的节点才会分配卡槽,从节点没有卡槽。
卡槽作用:决定key存放具体的服务器位置,从而实现均摊存放数据。类似在数据库中具体的分表,一张表可能存放多条数据,表等同于卡槽位置。
优点:动态实现扩容和缩容
4 基于不同Redis配置文件启动多个不同的Redis
启动redis命令:./redis-server ./redis.conf
修改redis.conf中端口号配置再重新启动redis,可以实现伪集群(多个redis集群端口号不同)。
5 Linux环境上搭建RedisCluster
传统RedisCluster集群模式环境搭建
cd /usr
mkdir rediscluster
cd rediscluster/
mkdir redis7000
mkdir redis7001
mkdir redis7002
mkdir redis7003
mkdir redis7004
mkdir redis7005
每个配置文件内容redis.conf
daemonize yes #后台启动
protected-mode no ; ## 允许外部访问
port 7005 #修改端口号,从7000到7005
cluster-enabled yes #开启cluster,去掉注释
cluster-config-file 7000nodes.conf #自动生成,从7000到7005
cluster-node-timeout 15000 #节点通信时间
logfile /usr/rediscluster/redis7000/redis.log #从7000到7005
启动redis
/usr/redis/bin/redis-server /usr/rediscluster/redis7000/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7001/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7002/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7003/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7004/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7005/redis.conf
6 RedisClient连接Redis分片集群
连接一个redis
/usr/redis/bin/redis-cli -h 127.0.0.1 -p 7000
(error) CLUSTERDOWN Hash slot not served 说明没有分配hash槽
分配hash命令
/usr/redis/bin/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
表示主和从为1:1的关系,前3台为主节点,后3台为从节点,16384/3每个节点卡槽均摊(建议最好使用服务器的ip地址搭建,否则重定向也是定向到127.0.0.1)
/usr/redis/bin/redis-cli -h 127.0.0.1 -p 7000
单独连接redis,不支持转发,修改为集群连接:
/usr/redis/bin/redis-cli -h 127.0.0.1 -p 7000 -c
注意:创建redisCluster集群后不支持自动主从同步,要手动配置。