数据库
首页 > 数据库> > Redis 集群

Redis 集群

作者:互联网

一、redis 集群形式

1.1、数据分区方案

1.1.1、客户端分区

客户端分区方案的代表为 Redis Sharding,Redis Sharding 是 Redis Cluster 出来之前,业界普遍使用的 Redis 多实例集群 方法。Java 的 Redis 客户端驱动库 Jedis,支持 RedisSharding 功能,即 ShardedJedis 以及 结合缓存池 的 ShardedJedisPool。

优点
不使用 第三方中间件,分区逻辑 可控,配置 简单,节点之间无关联,容易 线性扩展,灵
活性强。

缺点
客户端 无法 动态增删 服务节点,客户端需要自行维护 分发逻辑,客户端之间 无连接共享,
会造成 连接浪费。

1.1.2、代理分区(类型于sharding-proxy)

 

 

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

1.1.3、redis-cluster

1.2、高可用方式

1.2.1、Sentinel( 哨兵机制)支持高可用

前面介绍了主从机制,但是从运维角度来看,主节点出现了问题我们还需要通过人工干预的
方式把从节点设为主节点,还要通知应用程序更新主节点地址,这种方式非常繁琐笨重, 而
且主节点的读写能力都十分有限,有没有较好的办法解决这两个问题,哨兵机制就是针对第
一个问题的有效解决方案,第二个问题则有赖于集群!哨兵的作用就是监控 Redis 系统的运
行状况,其功能主要是包括以下三个:

 

 

 哨兵的原理

Redis 哨兵的三个定时任务,Redis 哨兵判定一个 Redis 节点故障不可达主要就是通过三个定
时监控任务来完成的:

        

 

 

 

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

故障转移和 Leader 选举
如果主节点被判定为客观下线之后,就要选取一个哨兵节点来完成后面的故障转移工作,选
举出一个 leader,这里面采用的选举算法为 Raft。选举出来的哨兵 leader 就要来完成故障转
移工作,也就是在从节点中选出一个节点来当新的主节点,这部分的具体流程可参考引用.

二、Redis-Cluster

官网介绍:https://redis.io/topics/cluster-tutorial/

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

Redis 集群的功能限制;Redis 集群相对 单机 在功能上存在一些限制,需要 开发人员 提前
了解,在使用时做好规避。

     类似 mset、mget 操作,目前只支持对具有相同 slot 值的 key 执行 批量操作。
      对于 映射为不同 slot 值的 key 由于执行 mget、mget 等操作可能存在于多个节
      点上,因此不被支持。

     只支持 多 key 在 同一节点上 的 事务操作,当多个 key 分布在 不同 的节点上
    时 无法 使用事务功能。

     单机 下的 Redis 可以支持 16 个数据库(db0 ~ db15),集群模式 下只能使用 一
    个 数据库空间,即 db0。

     从节点 只能复制 主节点,不支持 嵌套树状复制 结构。

 

 

三、部署 Cluster

3.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 192.168.56.10
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
appendonly yes
EOF
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

3.2、使用 redis 建立集群

docker exec -it redis-7001 bash

redis-cli --cluster create 192.168.56.10:7001 192.168.56.10:7002 192.168.56.10:7003 192.168.56.10:7004 192.168.56.10:7005 192.168.56.10:7006 --cluster-replicas 1

 

 

3.3、测试集群效果

使用 redis-cli 的 cluster 方式进行连接
redis-cli -c -h 192.168.56.10 -p 7006

cluster info; 获取集群信息
cluster nodes;获取集群节点

Get/Set 命令测试,将会重定向

节点宕机,slave 会自动提升为 master,master 开启后变为 slave

3.4、k8s 部署 redis

参照有状态部署即可

标签:Redis,redis,port,cluster,集群,哨兵,节点
来源: https://www.cnblogs.com/jiutang001/p/16285000.html