1、主从复制介绍
1.1 主从同步介绍
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
通过主从配置可以实现读写分离
master和slave都是一个redis实例(redis服务)
1.2 概述
在现有企业中80%公司大部分使用的是redis单机服务,在实际的场景当中单一节点的redis容易面临风险。
面临问题:
1. 机器故障。我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的。
2. 容量瓶颈。当我们有需求需要扩容 Redis 内存时,从 16G 的内存升到 64G,单机肯定是满足不了。当然,你可以重新买个 128G 的新机器。
1.3 解决办法
要实现分布式数据库的更大的存储容量和承受高并发访问量,我们会将原来集中式数据库的数据分别存储到其他多个网络节点上。
注意:
Redis 为了解决这个单一节点的问题,也会把数据复制多个副本部署到其他节点上进行复制,实现Redis的高可用,实现对数据的冗余备份从而保证数据和服务的高可用。
1.4 作用
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
- 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
- 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
- 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
2、主从配置环境搭建
2.1 操作方式一
查看当前主机的ip地址
ifconfig
修改/etc/redis/redis.conf
文件
sudo vi redis.conf
bind 192.168.1.XX
重启redis服务
sudo service redis stop
sudo redis-server redis.conf
复制/etc/redis/redis.conf
文件
sudo cp redis.conf ./slave.conf
修改redis/slave.conf
文件
sudo vi slave.conf
编辑内容
bind 192.168.1.XX
slaveof 192.168.1.XX 6379 【添加此行,在指定的位置进行添加此行,大约在213行附近】
port 6378
redis服务
sudo redis-server slave.conf
查看主从关系
redis-cli -h 192.168.1.XX info Replication
【从服务器可以从主服务器读取数据了】【不能在从服务器写数据】
2.2 操作方式二
切换到redis的安装目录:
编辑配置文件:
新建redis6379.conf
include /usr/local/redis/bin/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
新建redis6380.conf
include /usr/local/redis/bin/redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
新建redis6381.conf
include /usr/local/redis/bin/redis.conf
pidfile /var/run/redis_6381.pid
port 6381
dbfilename dump6381.rdb
启动三台redis服务器
在启动当前服务的路径下生成rdb文件:
查看系统进程
查看三台主机运行情况
#打印主从复制的相关信息
./redis-cli -p 6379
./redis-cli -p 6380
./redis-cli -p 6381
127.0.0.1:6379> info replication
127.0.0.1:6380> info replication
127.0.0.1:6381> info replication
配置从库不配置主库:
slaveof <ip> <port>
分别在在6380和6381上执行
3、主从数据操作
3.1 操作方式一(同2.1)
在master和slave分别执⾏info命令,查看输出信息 进入主客户端
redis-cli -h 192.168.26.128 -p 6379
进入从的客户端
redis-cli -h 192.168.26.128 -p 6378
在master上写数据
set aa aa
在slave上读数据
get aa
3.2 操作方式二(同2.2)
查看三台主机运行情况
尝试在从的客户端写数据:错误提示
在master上写数据
分别在slave上读数据
4、主从复制原理剖析
4.1 主从复制三个阶段
- 连接建立阶段(即准备阶段)
- 数据同步阶段
- 命令传播阶段
4.2 复制六个过程
1、保存主节点(master)信息。
执行 slaveof 后 查看状态信息
2、从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接
3、从节点与主节点建立网络连接
从节点会建立一个 socket 套接字,从节点建立了一个端口为51234的套接字,专门用于接受主节点发送的复制命令。
4、发送ping命令
连接建立成功后从节点发送 ping 请求进行首次通信。
作用:
- 检测主从之间网络套接字是否可用。
- 检测主节点当前是否可以接受命令 。
4、权限验证。
如果主节点设置了 requirepass 参数,则需要密码验证,从节点必须配置 masterauth 参数保证与主节点相同的密码才能通过验证;如果验证失败复制将终止,从节点重新发起复制流程。
5、同步数据集。
主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有的数据全部发送给从节点,这部分操作是耗时最长的步骤。
主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
例如:保存一个缓存
set name baizhan
记录命令为
$3 \r \n
set \r \n
$4 \r \n
name \r \n
$5 \r \n
baizhan \r \n
6、命令持续复制。
当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给从节点,保证主从数据一致性。