108.如何使⽤ Redis Sentinel 实现⾼可⽤?
Redis 的 Sentinel 系统⽤于管理多个 Redis 服务器(instance),
该系统执⾏以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应⽤程序发送通
知。
⾃动故障迁移(Automatic failover): 当⼀个主服务器不能正常⼯作时, Sentinel 会开始⼀次⾃动故障迁移操作, 它会将失效
主服务器的其中⼀个从服务器升级为新的主服务器,
并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服
务器的地址, 使得集群可以使⽤新主服务器代替失效服务器。
Redis Sentinel 是⼀个分布式系统, 你可以在⼀个架构中运⾏多个 Sentinel 进程(progress),
这些进程使⽤流⾔协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使⽤投票协议(agreement protocols)来决定是
否执⾏⾃动故障迁移,
以及选择哪个从服务器作为新的主服务器。虽然 Redis Sentinel 释出为⼀个单独的可执⾏⽂件 redis-sentinel,但实际上它只是⼀个运
⾏在特殊模式下的 Redis 服务器, 你可以在启动⼀个普通 Redis 服务器时通过给定 –sentinel 选项来启动 Redis Sentinel。
109.如果使⽤ Redis Cluster 实现⾼可⽤?
Redis Cluster 是社区版推出的 Redis 分布式集群解决⽅案,主要解决 Redis 分布式⽅⾯的需求,
⽐如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好的负载均衡的⽬的。
Redis Cluster 集群节点最⼩配置 6 个节点以上(3 主 3 从),其中主节点提供读写操作,从节点作为备⽤节点,
不提供请求,只作为故障转移使⽤。Redis Cluster 采⽤虚拟槽分区,所有的键根据哈希函数映射到 0~16383 个整数槽内,
每个节点负责维护⼀部分槽以及槽所印映射的键值数据。优点⽆中⼼架构;数据按照 slot 存储分布在多个节点,节点间数据共享,可
动态调整数据分布;
可扩展性:可线性扩展到 1000 多个节点,节点可动态添加或删除;⾼可⽤性:部分节点不可⽤时,集群仍可⽤。
通过增加 Slave 做 standby 数据副本,能够实现故障⾃动 failover,节点之间通过 gossip 协议交换状态信息,⽤投票机制完成 Slave
到 Master 的⻆⾊提升;
降低运维成本,提⾼系统的扩展性和可⽤性。缺点Client 实现复杂,驱动要求实现 Smart Client,缓存 slots mapping 信息并及时更
新,提⾼了开发难度,客户端的不成熟影响业务的稳定性。
⽬前仅 JedisCluster 相对成熟,异常处理部分还不完善,⽐如常⻅的“max redirect exception”。节点会因为某些原因发⽣阻塞(阻塞
时间⼤于 clutser-node-timeout),被判断下线,这种 failover 是没有必要的。
数据通过异步复制,不保证数据的强⼀致性。多个业务使⽤同⼀套集群时,⽆法根据统计区分冷热数据,资源隔离性较差,容易出现
相互影响的情况。Slave 在集群中充当“冷备”,不能缓解读压⼒,当然可以通过 SDK 的合理设计来提⾼ Slave 资源的利⽤率。
110.说说 Redis 哈希槽的概念?
Redis Cluster 没有使⽤⼀致性 hash,⽽是引⼊了哈希槽的概念。Redis 集群有 16384 个哈希槽,
每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责⼀部分 hash 槽。
因为最⼤是 16384 个哈希槽,所以考虑 Redis 集群中的每个节点都能分配到⼀个哈希槽,所以最多⽀持 16384 个 Redis 节点。
为什么是 16384 呢?
主要考虑集群内的⽹络带宽,⽽ 16384 刚好是 2K 字节⼤⼩。
111.Redis Cluster 的主从复制模型是怎样的?
为了使在部分节点失败或者⼤部分节点⽆法通信的情况下集群仍然可⽤,所以集群使⽤了主从复制模型,
每个节点都会有 N-1 个复制节点。所以,Redis Cluster 可以说是 Redis Sentinel 带分⽚的加强版。
也可以说:Redis Sentinel 着眼于⾼可⽤,在 master 宕机时会⾃动将 slave 提升为 master,继续提供服务。
Redis Cluster 着眼于扩展性,在单个 Redis 内存不⾜时,使⽤ Cluster 进⾏分⽚存储。
112.假如 Redis ⾥⾯有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?
使⽤ keys 指令可以扫出指定模式的 key 列表。
对⽅接着追问:如果这个 Redis 正在给线上的业务提供服务,那使⽤ keys 指令会有什么问题?
这个时候你要回答 Redis 关键的⼀个特性:Redis 的单线程的。keys 指令会导致线程阻塞⼀段时间,线上服务会停顿,直到指令执⾏
完毕,服务才能恢复。
这个时候可以使⽤ scan 指令,scan 指令可以⽆阻塞的提取出指定模式的 key 列表,但是会有⼀定的重复概率,在客户端做⼀次去重
就可以了,
但是整体所花费的时间会⽐直接⽤ keys 指令⻓。
113.Spring事务传播机制有哪些?
PROPAGATION_REQUIRED:如果当前没有事务,就创建⼀个新事务,如果当前存在事务,就加⼊该事务,这也是通常我们的默认选
择。
PROPAGATION_REQUIRES_NEW:创建新事务,⽆论当前存不存在事务,都创建新事务。
评论0
最新资源