077:RedisCluster哨兵集群实现原理

  • 1 回顾Redis主从复制与哨兵机制
  • 2 传统Redis哨兵集群存在那些缺陷
  • 3 RedisCluster分片集群实现原理
  • 4 基于不同Redis配置文件启动多个不同的Redis
  • 5 Linux环境上搭建RedisCluster
  • 6 RedisClient连接Redis分片集群


1 回顾Redis主从复制与哨兵机制

课程内容:

  1. 传统集群方式存在那些缺点?
  2. 为什么需要使用RedisCluster集群
  3. RedisCluster高可用集群实现原理
  4. 搭伪集群RedisCluster高可用集群

2 传统Redis哨兵集群存在那些缺陷

传统Redis集群存在哪些问题?
Redis哨兵集群模式,每个节点都保存全量同步数据,冗余的数据比较多;其次只能允许有一个主的节点,属于中心化集群。
而在Redis Cluster模式中集群中采用分片集群模式(去中心集群方式、数据均摊到每个节点存放),可以减少冗余数据,缺点就是构建该集群模式成本非常高。

3 RedisCluster分片集群实现原理

Redis Cluster是Redis官方推出一种去中心化的集群方式。采用hash槽分片的将数据存放到多个不同的Redis中,从而可以去减少冗余的数据。
核心原理:采用hash槽,预先分配16384个卡槽,并且将卡槽分配到具体的Redis节点,通过key进行crc16(key)%16384=卡槽,可以根据卡槽存放到具体Redis节点,注意一个卡槽可以存放多个不同的key;只有主的节点才会分配卡槽,从节点没有卡槽。

redis集群的作用 redis集群的原理_redis


卡槽作用:决定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槽

redis集群的作用 redis集群的原理_redis_02


分配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)

redis集群的作用 redis集群的原理_redis_03


/usr/redis/bin/redis-cli -h 127.0.0.1 -p 7000

redis集群的作用 redis集群的原理_Redis_04


单独连接redis,不支持转发,修改为集群连接:

/usr/redis/bin/redis-cli -h 127.0.0.1 -p 7000 -c

redis集群的作用 redis集群的原理_redis_05


注意:创建redisCluster集群后不支持自动主从同步,要手动配置。