1、 高可用Sentinel(单主 Redis 足以支撑业务,保证数据安全,业务前期数据少可用,目)ps:主从只是备份,不支持HA
2、 Redis cluster(体量大10G+,分散读写压力到不同集群,分片用更多内存:)
一次RDB 时间,内存越大越久。 fork 时间也变久。重启通过RDB文件,AOF 日志,恢复时间变长。
3、代理分片(Twemproxy,redis集群没有时,使用最多)
4、 Codis集群(豌豆荚15年开源解决方案,用了2年之多,同期官网推出redis cluster)
5、 客户端分片(少,典型代表:Jedis。自主写分片算法,可控性强,技术和维护成本高)
概要:1、Redis Sentinel 2、Redis Cluster3.0 3、Twemproxy
4、Codis 5、客户端分片(Redis Cluster出现前用较多,目前很少用)
一、Sentinel(哨兵)
主从机制,可能单点故障,主宕机麻烦,Redis-Sentinel实现主从切换,类似zookeeper。监控多个master-slave集群宕机自动切换
监控(Monitoring):不断检查主、从服务器是否运作正常。
提醒(Notification):如发现通过 API 向管理员或者其程序发通知。
自动故障迁移(Automatic failover):自动切换。 客户端连接失效主, 集群返回新主。
缺点:一个主(写),不能缓解写压力
配置文件sentinel.conf,不指定将无法启动sentinel
不用配置slave,能够被自动检测到(master有slave消息)。运行期间是会被动态修改,如主备切时,如重启,根据配置恢复其之前监控redis集群的状态。
(1)sentinel monitor mymaster 127.0.0.1 6379 2
指示 Sentinel 监视mymaster主服务器, IP 127.0.0.1 , 端口号 6300, 失效至少2 个 Sentinel 同意,不达标自动故障迁移不执行。
获得多数(majority) Sentinel 支持, 才能发起自动故障迁移.集群gossip协议通信。
除了第一行剩下统一格式: sentinel
(2)down-after-milliseconds 服务器已断线所需毫秒。
(3)parallel-syncs 执行故障转移时, 最多多少个从服务器同时对新主同步, 越小时间越长。
(4)redis-sentinel sentinel.conf 启动 Sentinel 系统
(5)redis-server sentinel.conf --sentinel 运行 Redis 服务器
4、5两种方式,指定sentinel.conf, 不指定无法启动。默认监听26379端口
开启两个Sentinel,关闭主,切换了
6300端口重启,会变成6301端口服务的slave。
二、Redis 3.0集群
P2P的模式,完全去中心化。多节点数据集自动分片,分区可用性。Hash Slot方案,不是一致性哈希。所有的Key分成16384个slot,每个Redis实例负责一部分slot。信息(节点、端口、slot等)节点之间定期交换更新。
所需数据不在实例中,重定向命令引导客户端访问所需实例。特性:
节点自动发现
slave->master 选举,集群容错
Hot resharding:在线分片
集群管理:cluster xxx
基于配置(nodes-port.conf)的集群管理
ASK /MOVED 转向机制
互联(PING-PONG机制),二进制协议优化传输速度和带宽。fail超半数才生效。与redis直连。客户端连任何节点。物理节点映射到[0-16383]slot上cluster负责维护node<->slot<->value
当前master没有slave 宕,集群进入fail状态
环境搭建:至少3个主节点。测试3主3从,修改配置文件,其它默认
创建集群:命令行工具redis-trib.rb完成。
1)下载 https://raw.githubusercontent.com/antirez/redis/unstable/src/redis-trib.rb。
2)搭建Redis 的 Ruby 支持环境
3)运行命令创建集群, –replicas 1:希望为集群中每个主节点创建一个从节点。
redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
http://blog.720ui.com/2016/redis_action_04_cluster/#%E5%88%9B%E5%BB%BA%E9%9B%86%E7%BE%A4
五、客户端分片实现方式:
代码层实现,对 Key 进行 hash 计算,对应Redis 实例操作数据。
对 hash 层代码要求高,考虑节点失效后的替代算法,数据震荡后的自动脚本恢复,实例监控等。