Redis集群

目录

一、redis集群方案

1.1 客户端分区

1.2 代理分区  

1.3 Sentinel(哨兵机制) 

1.3.1 哨兵原理(三个定时任务)

1.3.2 故障转移&Leader选举

1.4 Redis-Cluster(Redis官方推荐) 

1.4.1 槽 

1.4.2 一致性hash 

二、搭建Redis-Cluster集群 

2.1 创建6个redis节点 

2.2 使用redis建立集群


一、redis集群方案

1.1 客户端分区

  • 客户端分区方案的代表为 Redis Sharding,Redis Sharding 是 Redis Cluster 出来之前,业界普遍使用的 Redis 多实例集群方法。Java 的 Redis 客户端驱动 Jedis,支持 Redis Sharding 功能,即 ShardingJedis 以及集合缓存池的 ShardingJedisPool。
  • 优点:不使用第三方中间件,分区逻辑可控,配置简单,节点之间无联系,容易线性扩展,灵活性强。 
  • 缺点:客户端无法动态增删服务节点,客户端需要自行维护分发逻辑,客户端之间无法连接共享,会造成连接浪费。

1.2 代理分区  

 

  • 代理分区常用方案 Twemproxy 和 Codis。 

1.3 Sentinel(哨兵机制) 

  • 主从机制从运维角度来看,主节点出现了问题我们还需要通过人工干预的方式把从节点设为主节点,还要通知应用程序更新主节点地址,这种方式非常繁琐笨重,而且主节点的读写能力都十分有限。哨兵机制就是针对第一个问题的有效解决方案,第二个问题则有赖于集群。哨兵的作用就是监控 Redis 系统的运行状况,其功能主要包括以下三个:
  1. 监控(Monitoring):哨兵会不断地检查Master和Slave是否运行正常
  2. 提醒(Notification):当被监控的某个Redis出现问题时,哨兵可以通过API向管理员或者其它应用程序发送通知。
  3. 自动故障迁移(Automatic Failover):当主数据库出现故障时自动将从数据库换为主数据库。

1.3.1 哨兵原理(三个定时任务)

  • 每隔10s每个哨兵节点会向主节点和从节点发送 info replication 命令来获取最新的拓扑结构。

  • 每隔2s每个哨兵节点会向 Redis 节点的 _sentinel_:hello 频道发送自己对主节点是否故障的判断以及自身的节点信息,并且其它的哨兵节点也会订阅这个频道来了解其它哨兵节点的信息以及对主节点的判断。

  • 每隔1s每个哨兵会向主节点、从节点、其它的哨兵节点发送一个“ping”命令来做心跳检测。

 

如果检测不到节点心跳,会判断为“主观下线”。如果该节点还是主节点,那么还会通知其它哨兵对该节点进行心跳检测,这时“主观下线”的票数超过了<quornum>数量时,那么这个节点确实可能故障不可达了,这时就由原来的“主观下线”变为“客观下线”。

1.3.2 故障转移&Leader选举

  • 如果主节点被判定为客观下线后,就要选取一个哨兵节点来完成后面的故障转移工作,选举出一个Leader,这里面采用的选举算法为 Raft。选举出来的哨兵 Leader 就要完成故障转移工作,也就是在从节点中选出一个节点来当新的主节点。 

1.4 Redis-Cluster(Redis官方推荐) 

  • Redis官方多机部署方案,Redis-Cluster。一组 Redis-Cluster 是由多个 Redis 实例组成,官方推荐我们使用6实例,其中3个为主节点,3个为从节点,一旦有主节点发生故障的时候,Redis Cluster 可以选举出对应的从节点成为新的主节点,继续对外服务,从而保证服务的高可用。那么对于客户端来说,知道对应的 key 是要路由到哪个节点?Redis Cluster 把所有的数据划分为 16384 个不同的槽位,可以根据机器的性能把不同的槽位分配给不同的 Redis 实例,对于 Redis 实例来说,它们只会存储部分的 Redis 数据。当然,槽的数据是可以迁移的,不同的实例之间,可以通过一定的协议,进行数据迁移。

1.4.1 槽 

Redis 集群功能限制,Redis 集群相对单机在功能上存在一些限制,需要开发人员提前了解,在使用时做好规避。【JAVA CRC16 校验算法】

  • key 批量操作支持有限
  1. 类似 mset、mget 操作,目前只支持对有相同 slot 值的 key 执行批量操作。对于映射为不同 slot 值的 key 由于执行 mget、mset 等操作可能存在于多个节点上,因此不被支持。
  • key 事务操作支持有限
  1. 只支持多 key 在同一节点上的事务操作,当多个 key 分布在不同的节点上时,无法使用事务功能。
  • key 作为数据分区的最小粒度。
  • 不能将一个大的键值对象,如 hash、list 等映射到不同的节点。
  • 不支持多数据库空间
  1. 单机下 Redis 可以支持 16 个数据库(db0~db15),集群模式下只能使用一个数据库空间,即db0。
  • 复制结构,只支持一层
  1. 从节点只能复制主节点,不支持嵌套树状复制结构。
  • 命令大多会重定向,耗时多。

1.4.2 一致性hash 

  • 一致性hash可以很好的解决稳定性问题,可以将所有的存储节点排列在首尾相接的Hash环上,每个key在计算Hash后会顺时针找到临接的存储节点存放,而当有节点加入或者退出时,仅影响该节点在Hash环上顺时针相邻的后续节点。 
  • 解决hash倾斜问题。Hash倾斜:如果节点很少,容易出现倾斜,负载不均衡问题。一致性哈希算法,引入虚拟节点,在整个环上,均匀增加若干个节点。比如:a1、a2、b1、b2、c1、c2,a1和a2都是属于A节点的。  

二、搭建Redis-Cluster集群 

2.1 创建6个redis节点 

  • 3主3从,从为了同步备份,主进行slot数据分片。 

  

for port in $(seq 7001 7006);\
do\
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat <<EOF>/mydata/redis/node-{port}/conf/redis.conf
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip localhost
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
appendonly yes
docker run -p ${port}:${port} -p 1${port}:1${port} --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d redis:5.0.7 redis-server /etc/redis/redis.conf \
done

2.2 使用redis建立集群

  • --cluster-replicas 1 :随机选取主节点和从节点,每个主节点一个从节点。 
docker exec -it redis-7001 bash
redis-cli --cluster create localhost:7001 localhost:7002 localhost:7003 localhost:7004 localhost:7005 localhost:7006 --cluster-replicas 1
  • cluster info:查看集群信息 
  • cluster nodes:查看集群节点
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值