目录
引言
单点问题
- 单点 ——> 某个服务器只有一个节点,即只搞一个物理服务器来部署这个服务器程序
问题:
- 可用性:如果该机器挂了,便意味着服务器中断
- 性能、支持的并发量:十分有限
解决方案:
- 引入分布式系统,主要也就是为了解决单点问题
分布式系统
- 在分布式系统中,往往有多个服务器来部署 Redis 服务,从而构成一个 Redis 集群
- 此时便可以让该集群给整个分布式系统服务,以便提供更稳定 和 更高效的数据存储功能
三种部署方式:
- 主从模式
- 主从 + 哨兵模式
- 集群模式
- 本文主要详解 Redis 部署方式中的 主从模式
主从模式
- 在若干个 Redis 节点中,有的是 主节点,有的是 从节点
实例理解
- 假设有三个物理服务器,即三个节
- 这三个节点分别部署 redis-server 进程
- 此时就可以将其中的一个节点,作为 主节点,另外两个节点作为 从节点
- 从节点上的数据跟随主节点变化,从节点的数据要和主节点保持一致
具体理解:
- 本来主节点上保存一堆数据,在引入从节点后,便需要将主节点上的数据复制出来,放到从节点中
- 后续主节点对数据如果有任何修改,都需将修改给同步到从节点
- 即 从节点就是主节点的副本
问题:
- 如果修改了 从节点 的数据,是否还需要将 从节点 所修改的数据往 主节点 上同步呢?
回答:
- 在 Redis 主从模式下,从节点上的数据,不允许修改!只能读取数据!
优势:
- Redis 主从结构可有效改善 可用性问题、性能、支持并发量有限 问题,即 单点问题
具体理解:(性能、并发量)
- 由于 从节点数据 时时刻刻与 主节点 保持一致
- 因此其他的客户端在 从节点读取的数据,和在 主节点读取的数据没有任何区别!
- 即 其他客户端如需读取数据,可随机挑选一个从节点,给该客户端提供读取数据的服务
- 引入了更多的计算资源,自然能够支持的并发量也便大幅提高了!
具体理解:(可用性)
- 相较于单个 Redis 服务器节点,如果该节点挂了,整个 服务也便中断了
- 而主从结构的 Redis 服务器节点是不太可能 同时挂了的!
问题一:
- 是否存在整个机房同时挂了的情况呢?
回答:
- 也是可能会存在的!
- 这个时候如果考虑到更高的可用性,便可以将这些机器分散到多个不同的机房中
- 即 异地多活
问题二:
- 如果是挂掉了某个从节点呢?
回答:
- 没啥影响
- 此时继续到 主节点或其他从节点 获取数据即可
- 因为得到的效果完全相同
问题三:
- 如果是挂掉了主节点呢?
回答:
- 还是有一定影响的
- 因为从节点只能读取数据,却无法写数据
- 即 可用性虽然是提高了,但是还没到非常理想的程度
问题四:
- 是否可以引入多个主节点呢?
回答:
- 一山不能容二虎
- 如果存在两个主节点,这两个主节点之间如何互相同步数据呢?
- 所以引入多个主节点,也并不能很好的解决上述问题
总结:
- 准确来说,主从模式主要是针对 "读操作" 来进行 并发量 和 可用性 的提高
- 而写操作,无论是可用性还是并发,均十分依赖主节点,而主节点又不能搞多个
注意点一:
- 实际业务场景中,读操作往往就是比写操作更频繁
注意点二:
- 主从结构是分布式系统中一种 比较典型的结构
- 不仅仅是 redis 支持,像 MySQL 等其他的常用组件 同样也是支持的
配置 Redis 主从结构
- 配置 Redis 主从结构,首先需要启动多个 Redis 服务器
注意:
- 正常来说,每个 Redis 服务器程序,都应该在一个单独的主机上
- 因为这才符合 分布式
问题一:
- 仅有一个云服务器,不能部署分布式系统吗?
回答:
- 一个云服务器上 是可以运行多个 redis-server 进程的
- 但是需要保证这多个 redis-server 端口需不同
- 本来 redis-server 默认的端口为 6379
- 此时便不能让新启动的 redis-server 再继续使用 6379 端口了
问题二:
- 如何指定 redis-server 的端口呢?
回答:
- 在启动程序时,通过命令行来指定端口号,即添加 --port 选项
- 直接在配置文件中设定端口(下文实例将通过该方式来完成)
实例理解
- 假设我要配置一个主节点和两个从节点
1、主节点配置不变,复制两份主节点配置文件,并修改这两份文件的端口和后台运行方式
- 此时我们便得到了两份 从节点 的配置文件,端口分别为 6380、6381
2、启动两个从节点的 Redis 服务器