Redis集群
Posted 宫商角羽徵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis集群相关的知识,希望对你有一定的参考价值。
Redis集群
1. 关于Redis分片哨兵总结
Redis分片: 实现内存数据的扩容, 没有高可用的实现。
Redis哨兵: 主要实现Redis高可用技术,没有实现内存扩容,并且Redis哨兵本身没有实现高可用的效果。
2. Redis集群概述
Redis集群设计时主机实现分片的功能,每台主机之后都有对应的从机,并且在内部实现高可用(不需要依赖第三方监控)。
通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。
Redis是一个很好的Cache工具。大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿。
由于内存大小的限制,使用一台 Redis 实例显然无法满足需求,这时就需要使用多台 Redis作为缓存数据库。但是如何保证数据存储的一致性呢,这时就需要搭建Redis集群。采用合理的机制,保证用户的正常的访问需求。
采用Redis集群,可以保证数据分散存储,同时保证数据存储的一致性,并且在内部实现高可用的机制,实现了服务故障的自动迁移。
3. 集群搭建计划
主从划分:
3台主机 3台从机共6台 端口划分7000-7005
通用的概念(不适用Redis集群)
通常情况下,集群的数量都是奇数台(包含主从)
集群正常工作的条件 存活的服务器数量 > 总数N/2
1台 不能搭建集群
2台 不能搭建集群
3台 (3-1) > 1.5 搭建集群最小单位3台 最多宕机1台
4台 (4-1) > 2 也可以搭建集群 最多宕机1台
所以集群的数量一般都是奇数台
4. 集群搭建
1. 准备集群文件夹
mkdir cluster
2. 在cluster文件夹中分别创建7000-7005文件夹
3. 将redis根目录中的redis.conf文件复制到cluster/7000/ 并以原名保存。
cp redis.conf cluster/7000/
4. 编辑配置文件:
1) 注释IP地址
2) 关闭保护模式
3) 修改端口号
4) 开启后台模式
5) 修改pid文件(绝对路径)
6) 修改持久化文件路径(绝对路径)
7) 设定内存优化策略
8) 关闭AOF模式
9) 开启集群配置
10) 开启集群节点信息配置文件
11) 修改集群节点超时时间
5. 复制修改后的配置文件
将7000文件夹下的redis.conf文件分别复制到7001-7005中:
[tsvv@192 cluster]$ cp 7000/redis.conf 7001/ [tsvv@192 cluster]$ cp 7000/redis.conf 7002/ [tsvv@192 cluster]$ cp 7000/redis.conf 7003/ [tsvv@192 cluster]$ cp 7000/redis.conf 7004/ [tsvv@192 cluster]$ cp 7000/redis.conf 7005/
6. 批量修改配置文件
分别将7001-7005文件中的7000改为对应的端口号的名称(%s/7000/7001/g),修改时注意方向键的使用:
7. 通过脚本编辑启动/关闭指令
1) 创建启动脚本 vim cluster-start.sh
2) 编辑关闭的脚本 vim cluster-shutdown.sh
3) 启动redis节点(注意:要以root权限启动,不然Ctrl+C会直接退出程序)
sh cluster-start.sh
4) 检查redis节点启动是否正常
8. 创建redis集群
#5.0版本执行 使用C语言内部管理集群
redis-cli --cluster create --cluster-replicas 1 192.168.6.128:7000 192.168.6.128:7001 192.168.6.128:7002 192.168.6.128:7003 192.168.6.128:7004 192.168.6.128:7005
9. 查看节点信息
10. Redis集群高可用测试
关闭Redis主机,检查是否自动实现故障迁移。
再次启动关闭的主机,检查是否能够实现自动的挂载,一般情况下能够实现主从挂载;个别情况: 宕机后的节点重启,可能挂载到其他主节点中(7001-7002) 正确的
11. Redis集群高可用推选原理
图- 24
原理说明:
Redis的所有节点都会保存当前Redis集群中的全部主从状态信息,并且每个节点都能够相互通信。当一个节点发生宕机现象,则集群中的其他节点通过PING-PONG检测机制检查Redis节点是否宕机,当有半数以上的节点认为宕机,则认为主节点宕机,同时由Redis剩余的主节点进入选举机制,投票选举链接宕机的主节点的从机,实现故障迁移。
12. Redis集群宕机条件
特点:集群中如果主机宕机,那么从机可以继续提供服务,当主机中没有从机时,则向其它主机借用多余的从机,继续提供服务,如果主机宕机时没有从机可用,则集群崩溃。
答案:9个redis节点,节点宕机5-7次时集群才崩溃:
13. Redis hash槽存储数据原理
说明: RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]&16383)映射到0-16384槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据.根据主节点的个数,均衡划分区间.
算法:哈希函数: Hash()=CRC16[key]&16384按位与
当向Redis集群中插入数据时,首先将key进行计算,之后将计算结果匹配到具体的某一个槽的区间内,之后再将数据set到管理该槽的节点中:
分片效率高: 发生在服务器中 Redis只负责存取
Redis集群: 发生在Redis内部 效率低
Java测试:
/** * 利用spring整合Redis集群 * 和分片几乎相同!!! */ @Test public void testCluster() { Set<HostAndPort> node = new HashSet<HostAndPort>(); node.add(new HostAndPort("192.168.8.128",7000)); node.add(new HostAndPort("192.168.8.128",7001)); node.add(new HostAndPort("192.168.8.128",7002)); node.add(new HostAndPort("192.168.8.128",7003)); node.add(new HostAndPort("192.168.8.128",7004)); node.add(new HostAndPort("192.168.8.128",7005)); JedisCluster cluster = new JedisCluster(node); cluster.set("tsvv", "Redis集群测试成功!!!!"); System.out.println(cluster.get("tsvv")); }
以上是关于Redis集群的主要内容,如果未能解决你的问题,请参考以下文章