2.1 主从复制简介
2.1.1 高可用
首先我们要理解互联网应用因为其独有的特性我们演化出的三高架构
-
高并发
应用要提供某一业务要能支持很多客户端同时访问的能力,我们称为并发,高并发意思就很明确了
-
高性能
性能带给我们最直观的感受就是:速度快,时间短
-
高可用
可用性:一年中应用服务正常运行的时间占全年时间的百分比,如下图:表示了应用服务在全年宕机的时间
我们把这些时间加在一起就是全年应用服务不可用的时间,然后我们可以得到应用服务全年可用的时间
4小时27分15秒+11分36秒+2分16秒=4小时41分7秒=16867秒
1年=3652460*60=31536000秒
可用性=(31536000-16867)/31536000*100%=99.9465151%
业界可用性目标5个9,即99.999%,即服务器年宕机时长低于315秒,约5.25分钟
2.1.2 主从复制概念
知道了三高的概念之后,我们想:你的“Redis”是否高可用?那我们要来分析单机redis的风险与问题
问题1.机器故障
- 现象:硬盘故障、系统崩溃
- 本质:数据丢失,很可能对业务造成灾难性打击
- 结论:基本上会放弃使用redis.
问题2.容量瓶颈
- 现象:内存不足,从16G升级到64G,从64G升级到128G,无限升级内存
- 本质:穷,硬件条件跟不上
- 结论:放弃使用redis
结论:
为了避免单点Redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续提供服务,实现Redis的高可用,同时实现数据冗余备份。
多台服务器连接方案:
- 提供数据方:master
主服务器,主节点,主库主客户端
- 接收数据方:slave
从服务器,从节点,从库
从客户端
- 需要解决的问题:
数据同步(master的数据复制到slave中)
这里我们可以来解释主从复制的概念:
概念:主从复制即将master中的数据即时、有效的复制到slave中
特征:一个master可以拥有多个slave,一个slave只对应一个master
职责:master和slave各自的职责不一样
master:
写数据
执行写操作时,将出现变化的数据自动同步到slave
读数据(可忽略)
slave:
读数据
写数据(禁止)
2.1.3 主从复制的作用
- 读写分离:master写、slave读,提高服务器的读写负载能力
- 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数 量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
- 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
- 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
- 高可用基石:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案
2.2 主从复制工作流程
主从复制过程大体可以分为3个阶段
- 建立连接阶段(即准备阶段)
- 数据同步阶段
- 命令传播阶段(反复同步)
而命令的传播其实有4种,分别如下:
2.2.1 主从复制的工作流程(三个阶段)
2.2.1.1 阶段一:建立连接
建立slave到master的连接,使master能够识别slave,并保存slave端口号
流程如下:
- 步骤1:设置master的地址和端口,保存master信息
- 步骤2:建立socket连接
- 步骤3:发送ping命令(定时器任务)
- 步骤4:身份验证
- 步骤5:发送slave端口信息
至此,主从连接成功!
当前状态:
slave:保存master的地址与端口
master:保存slave的端口
总体:之间创建了连接的socket
master和slave互联
接下来就要通过某种方式将master和slave连接到一起
方式一:客户端发送命令
slaveof masterip masterport
方式二:启动服务器参数
redis-server --slaveof masterip masterport
方式三:服务器配置(主流方式)
slaveof masterip masterport
slave系统信息
master_link_down_since_seconds
masterhost & masterport
master系统信息
uslave_listening_port(多个)
主从断开连接
断开slave与master的连接,slave断开连接后,不会删除已有数据,只是不再接受master发送的数据
slaveof no one
授权访问
master客户端发送命令设置密码
requirepass password
master配置文件设置密码
config set requirepass password
config get requirepass
slave客户端发送命令设置密码
auth password
slave配置文件设置密码
masterauth password
slave启动服务器设置密码
redis-server –a password