客户端分区方案的代表为Redis Sharding, Redis Sharding是Redis Cluster出来之前,业界普遍使用的Redis多实例集群方法。Java的Redis客户端驱动库Jedis,支持RedisSharding功能,即Shardedledis以及结合缓存池的ShardedJedisPool.
代理分区常用方案有Twemproxy和Codis。
Sentinel哨兵机制支持高可用。
哨兵的作用就是监控Redis系统的运行情况。主要功能包括以下三个:
Redis的官方多机部署方案,Redis Cluster。一组Redis Cluster是由多个Redis.实例组成,官方推荐我们使用6实例,其中3个为主节点,3个为从结点。一旦有主节点发生故障的时候,Redis Cluster可以选举出对应的从结点成为新的主节点,继续对外服务,从而保证服务的高可用性。那么对于客户端来说,知道知道对应的key是要路由到哪一个节点呢?Redis Cluster把所有的数据划分为16384个不同的槽位,可以根据机器的性能把不同的槽位分配给不同的Redis.实例,对于Redis.实例来说,他们只会存储部分的Redis数据,当然,槽的数据是可以迁移的,不同的实例之间,可以通过一定的协议,进行数据迁移。
redis cluster缺点:
一致性hash:
一致性哈希可以很好的解决稳定性问题,可以将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash后会顺时针找到临接的存储节点存放。而当有节点加入或退出时,仅影响该节点在Hash环上顺时针相邻的后续节点。
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
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
redis-cli -c -h 192.168.1.48 -p 7001
set a1 a
set hello h
get a1
get hello
查看集群信息
cluster info
模拟主节点宕机
docker stop redis-7001
docker exec -it redis-7002 /bin/bash
redis-cli -c -h 192.168.1.48 -p 7002
cluster nodes
观察到:7001宕机了,但是7006主动变成master了。
现在主动恢复7001节点:
docker start redis-7001
观察节点:
cluster nodes
7001变成7006的slave了。
通过redis cluster可以做到节点的故障切换。
原文:https://www.cnblogs.com/wwjj4811/p/14605344.html