Redis 入门到精通(九)-- 主从复制(1)
一、redis 主从复制 – 主从复制简介
1、互联网“三高”架构
- 高并发
- 高性能
- 高可用
2、你的“Redis”是否高可用?
1)单机 redis 的风险与问题
-
问题1.机器故障
现象:硬盘故障、系统崩溃
本质:数据丢失,很可能对业务造成灾难性打击
结论:基本上会放弃使用redis. -
问题2.容量瓶颈
现象:内存不足,从16G升级到64G,从64G升级到128G,无限升级内存
本质:穷,硬件条件跟不上
结论:放弃使用 redis
2)为了避免单点 Redis 服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服
务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续
提供服务,实现 Redis 的高可用,同时实现数据冗余备份。
3、多台服务器连接方案
1)提供数据方:master
- 主服务器,主节点,主库。
- 主客户端。
2)接收数据方:slave
- 从服务器,从节点,从库。
- 从客户端。
3)需要解决的问题:数据同步。
4)核心工作:master 的数据复制到 slave 中。
4、redis 主从复制
1)主从复制即将master中的数据即时、有效的复制到 slave 中。
2)特征:一个master可以拥有多个slave,一个slave只对应一个master
3)职责:
- master:
写数据
执行写操作时,将出现变化的数据自动同步到slave
读数据(可忽略) - slave:
读数据
写数据(禁止)。
二、redis 主从复制 – 主从复制的作用
1、高可用集群
2、主从复制的作用
1)读写分离:master写、slave读,提高服务器的读写负载能力。 2)负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量。
3)故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复。
4)数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式。
5)高可用基石:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案。
三、redis 主从复制 – 主从复制的三个阶段
1、主从复制过程大体可以分为3个阶段
1)建立连接阶段(即准备阶段)。
2)数据同步阶段。
3)命令传播阶段。
2、主从复制的三个阶段示例图:
四、redis 主从复制 – 工作流程(1)建立连接阶段
1、阶段一:建立连接阶段
建立 slave 到 master 的连接,使 master 能够识别 slave,并保存 slave 端口号。
2、建立连接阶段工作流程
步骤1:设置 master 的地址和端口,保存 master 信息。
步骤2:建立 socket 连接。
步骤3:发送 ping 命令(定时器任务)。
步骤4:身份验证。
步骤5:发送 slave 端口信息。
至此,主从连接成功!
3、建立连接后的状态:
1)slave:保存 master 的地址与端口。
2)master:保存 slave 的端口。
3)总体:之间创建了连接的 socket。
五、redis 主从复制 – 搭建主从结构
1、主从连接(slave 连接 master):
1)方式一:客户端发送命令
slaveof <masterip> <masterport>
2)方式二:启动服务器参数
redis-server -slaveof <masterip> <masterport>
3)方式三:服务器配置
slaveof <masterip> <masterport>
4)slave 系统信息
- master_link_down_since_seconds
- masterhost
- masterport
5)master 系统信息
- slave_listening_port(多个)
2、主从断开连接:客户端发送命令
slaveof no one
3、说明:
slave 断开连接后,不会删除已有数据,只是不再接受 master 发送的数据。
4、redis 实际操作演示–redis 搭建主从结构(打开2个服务端连接 6379-server 和 6380-server)
# 切换到 redis 安装目录 (6379-server 服务端)
cd /usr/local/redis/redis-4.0.0/
# 查看 redis 服务是否后台启动成功:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
# 杀死 redis 服务进程(如果已经启动 redis 服务,可以先停止服务,如:PID 1742)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# kill -s 9 1742
# 修改 conf/redis-6379.conf 配置文件,改为前台启动(关闭守护进程),注释日志记录。
vim conf/redis-6379.conf
# 保存以下内容即可:
port 6379
daemonize no
# logfile "6379.log"
# redis 持久化 -- RDB 相关配置
# data 目录为新建目录(设置存储.rdb文件的路径)
dir /usr/local/redis/redis-4.0.0/data
# 设置本地数据库文件名:
dbfilename dump-6379.rdb
# 设置存储至本地数据库时是否压缩数据
rdbcompression yes
# 设置是否进行 RDB 文件格式校验
rdbchecksum yes
# save配置(每10秒有2次数据变化就自动保存)
save 10 2
# 添加如下配置(AOF存储功能)
# 开启AOF持久化功能
appendonly yes
# AOF写数据策略(每次)
appendfsync always
# 设置文件名
appendfilename appendonly-6379.aof
# 绑定主机地址:
bind 127.0.0.1
# 设置数据库数量:
databases 16
# 修改 conf/redis-6380.conf 配置文件,改为前台启动(关闭守护进程),注释日志记录。
vim conf/redis-6380.conf
# 保底以下内容即可:
port 6380
daemonize no
# logfile "6380.log"
# data 目录为新建目录
dir /usr/local/redis/redis-4.0.0/data
# 指定配置文件,启动 redis 服务 (6379-server 服务端)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6379.conf
# 指定配置文件,启动 redis 服务 (6380-server 服务端)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6380.conf
# 方式二:启动服务器参数:先关闭 6380-server 服务端
redis-server conf/redis-6380.conf --slaveof 127.0.0.1 6379
# 方式三:服务器配置
# 修改 conf/redis-6380.conf 配置文件,添加 服务器配置。
vim conf/redis-6380.conf
# 保底以下内容即可:
port 6380
daemonize no
# logfile "6380.log"
# data 目录为新建目录
dir /usr/local/redis/redis-4.0.0/data
# 添加 服务器配置
slaveof 127.0.0.1 6379
# 指定配置文件,重新 启动 redis 服务 (6380-server 服务端)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6380.conf
5、redis 实际操作演示–打开2个客户端连接(slave 客户端 和 master 客户端)
# 切换到 redis 安装目录
root@WIN-20240529BJA:/home/djh# cd /usr/local/redis/redis-4.0.0/
# 指定端口号,启动 redis 客户端(slave 客户端)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-cli -p 6380
127.0.0.1:6380>
# 方式一:客户端发送命令:用 6380 客户端 连接 6379 客户端,
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
# 指定端口号(默认连接6379,可不写端口号),启动 redis 客户端(master 客户端)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-cli
127.0.0.1:6379>
# 创建数据(在 master 客户端)
127.0.0.1:6379> set name redis-master
OK
# 获取数据(slave 客户端),获取成功,说明同步成功。
127.0.0.1:6380> get name
"redis-master"
# 方式二:启动服务器参数:先关闭 6380-server 服务端,再带参数启动 6380-server 服务端,然后在客户端测试。
# 创建数据(在 master 客户端)
127.0.0.1:6379> set age 33
OK
# 获取数据(slave 客户端),获取成功,说明同步成功。
127.0.0.1:6380> get age
"33"
# 方式三:服务器配置:先关闭 6380-server 服务端,修改 配置文件 redis-6380.conf 重启服务 测试。
# 创建数据(在 master 客户端)
127.0.0.1:6379> set addr xian
OK
# 获取数据(slave 客户端),获取成功,说明同步成功。
127.0.0.1:6380> get addr
"xian"
# 查看 info 客户端 信息 (在 master 客户端)
127.0.0.1:6379> info
# 查看 info 客户端 信息 (在 slave 客户端)
127.0.0.1:6380> info
# 主从断开连接:客户端发送命令 slaveof no one
# 断开连接(在 slave 客户端)
127.0.0.1:6380> slaveof no one
ok
127.0.0.1:6380>
# 创建新数据 (在 master 客户端)
127.0.0.1:6379> set name2 aaa666
ok
127.0.0.1:6379>
# 获取新数据 (在 slave 客户端)
127.0.0.1:6380> get name2
(nil)
127.0.0.1:6380>
6、授权访问
1) master 客户端发送命令设置密码
requirepass <password>
2) master 配置文件设置密码
config set requirepass <password>
config get requirepass
3)slave 客户端发送命令设置密码
auth <password>
4)slave 配置文件设置密码
masterauth <password>
5) slave 启动服务器设置密码
redis-server –a <password>
六、redis 主从复制 – 工作流程(2)数据同步阶段(简)
1、阶段二:数据同步阶段工作流程
- 在 slave 初次连接 master 后,复制 master 中的所有数据到 slave。
- 将 slave 的数据库状态更新成 master 当前的数据库状态。
2、数据同步阶段工作流程
步骤1:请求同步数据
步骤2:创建 RDB 同步数据
步骤3:恢复 RDB 同步数据
步骤4:请求部分同步数据
步骤5:恢复部分同步数据
至此,数据同步工作完成!
3、状态:
1)slave:具有 master 端全部数据,包含 RDB 过程接收的数据。
2)master:保存 slave 当前数据同步的位置。
3)总体:之间完成了数据克隆。
上一节关联链接请点击:
# Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型