一、回顾Redis主从复制与哨兵机制
Redis主从复制
基本概念:
单个Redis如果因为某种原因宕机的话,可能会导致Redis服务不可用,可以使用主从复制实现一主多从,主节点负责写的操作,从节点负责读的操作,主节点会定期将数据同步到从节点中,保证数据一致性的问题。
Redis哨兵机制
Redis的哨兵机制就是解决我们以上主从复制存在缺陷(选举问题),解决问题保证我们的Redis高可用,实现自动化故障发现与故障转移。
二、传统Redis哨兵集群存在那些缺陷
传统
的哨兵集群方式存在那些缺陷?
1.Redis的哨兵集群方式,每个节点都保存相同的同步的数据
,可能会存在冗余的数据;其次只
能允许有一个主的节点
,属于中心化集群
。
去中心集群
方式、数据均摊到每个节点
存放。
三、RedisCluster分片集群实现原理
2.Redis Cluster 从3.0
开始是Redis官方
推出一种去中心的集群方式
。采用hash槽分片
的将数据存放到多个不同的Redis
中,从而可以去减少冗余的数据。
核心原理:采用hash槽,预先分配16384个卡槽
,并且将卡槽分配到具体Redis的节点,通过key进行crc16(key)%16384=卡槽,可以根据卡槽存到具体Redis节点,注意一个卡槽可以存放多个不同的key
;只有主的节点
才会分配卡槽
,从节点没有卡槽
。
7000重定向到7002节点
卡槽作用:
决定key存放
具体的服务器位置
,从而实现均摊存放数
据。 类似
我们在数据库
中具体的分表
优点:动态
实现扩容和缩容
四、基于不同Redis配置文件启动多个不同的Redis.
6台服务器
搭伪集群:ip相同,port不同
五、Linux环境上搭建RedisCluster
mkdir rediscluster
cd rediscluster/
mkdir redis7000
mkdir redis7001
mkdir redis7002
mkdir redis7003
mkdir redis7004
mkdir redis7005
每个配置文件内容
daemonize yes
#后台启动
protected-mode no ; ## 允许外部访问
port 7005 #修改端口号,从7000到7005
cluster-enabled yes
#开启cluster,去掉注释
cluster-config-file 7000nodes.conf
#自动生成
cluster-node-timeout 15000 #节点通信时间
logfile /usr/rediscluster/redis7005/redis.log
启动
我们的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
连接一个redis
/usr/redis/bin/redis-cli -h 127.0.0.1 -p 7000
(error) CLUSTERDOWN Hash slot not served
说明没有分配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
(建议最好使用服务器的ip地址搭建)
1表示:主节点:从节点=1:1
2表示:2主2从
前面3台是主,后面3台是从
分配我们hash操作
/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
/usr/redis/bin/redis-cli --cluster help
六、RedisClient连接Redis分片集群
没有分配卡槽