Redis Cluster搭建(基于Docker)

redis集群形式

数据分区方案

客户端分区

image-20210401091518520

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

代理分区

image-20210401091838866

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

高可用方式

Sentinel哨兵

Sentinel哨兵机制支持高可用。

哨兵的作用就是监控Redis系统的运行情况。主要功能包括以下三个:

  • 监控(Monitoring):.哨兵(sentinel)会不断地检查你的Master和Slave是否运作正常。
  • 提醒(Notification):当被监控的某个Redis出现问题时,哨兵(sentinel)可以通过API向管理员或者其他应用程序发送通知
  • 自动故障迁移(Automatic failover):当主数据库出现故障时自动将从数据库转换为主数据库。

image-20210401092253974

Redis-cluster

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

image-20210401092629508

redis cluster缺点:

  • key批量操作支持有限
  • key事务操作支持有限
  • key作为数据分区的最小粒度
  • 不能将一个大的键值对象如hash、list等映射到不同的节点
  • 不支持多数据空间
  • 复制结构只支持一层
  • 命令大多会重定向

一致性hash:

一致性哈希可以很好的解决稳定性问题,可以将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash后会顺时针找到临接的存储节点存放。而当有节点加入或退出时,仅影响该节点在Hash环上顺时针相邻的后续节点。

image-20210401095821109

部署Cluster集群

image-20210401101523967

创建6个redis节点

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.1.48
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

image-20210401102728055

建立集群

docker exec -it redis-7001 /bin/bash
redis-cli  --cluster create 192.168.1.48:7001 192.168.1.48:7002 192.168.1.48:7003 192.168.1.48:7004 192.168.1.48:7005 192.168.1.48:7006 --cluster-replicas 1

image-20210401102939304

测试

redis-cli -c -h 192.168.1.48 -p 7001
set a1 a
set hello  h
get  a1
get hello

image-20210401103508739

查看集群信息

cluster info

image-20210401103536948

模拟主节点宕机

docker stop redis-7001
docker exec -it redis-7002 /bin/bash
redis-cli -c -h 192.168.1.48 -p 7002
cluster nodes

image-20210401103843654

观察到:7001宕机了,但是7006主动变成master了。

现在主动恢复7001节点:

docker start redis-7001

观察节点:

cluster nodes

image-20210401104041536

7001变成7006的slave了。

通过redis cluster可以做到节点的故障切换。

原文地址:https://www.cnblogs.com/wwjj4811/p/14605344.html