一个主节点,一到多个从节点,主节点执行写操作,从节点进行数据备份。也可以让从节点提供写读操作,减轻主节点的压力。
Redis主从架构搭建
1. 从src/redis.conf重新复制一份配置文件
cp redis.conf redis.conf_1
2. 修改新建的文件redis.conf_1,配置如下信息
port 6380 #修改端口号,代表本机另外一台机器
pidfile /var/run/redis_6380.pid #把pid写入到该文件中
logfile "6380.log" #log的地址和文件
dir /home/allen/packages/redis-5.0.3/6380 #知道数据存放的目录
3. 修改新建的文件redis.conf_1,配置主从复制信息
replicaof 127.0.0.1 6380 #本机从6371那台机器上获取数据 5.0之后改成slaveof
replica-read-only yes #配置从节点只读
4. 启动从节点,并查看
[allen@localhost redis-5.0.3]$ src/redis-server conf/redis.conf_1
[allen@localhost redis-5.0.3]$ ps -ef|grep redis
allen 27587 1 0 04:25 ? 00:00:09 src/redis-server 127.0.0.1:6379
allen 89254 29143 0 05:31 pts/5 00:00:00 src/redis-server 127.0.0.1:6380
5. 链接从节点-src/redis-cli -p 6380,并从从节点获取主节点设置的值
#从主节点设置值节点:
127.0.0.1:6379> set Allen "you are the best"
OK
127.0.0.1:6379>
#从从节点获取值:
[allen@localhost redis-5.0.3]$ src/redis-cli -p 6380
127.0.0.1:6380> get Allen
"you are the best"
127.0.0.1:6380>
主从架构的复制原理
这些逻辑都是redis内部server端的用C语言实现的。
1. 从节点与主节点建立socket长连接,并向主节点发一条psync命令
2.1 执行bgsave生成最新的rdb快照文件。(服务器端自己做的,和你本地是否开启rdb文件无关)
2.2 把2.1执行期间的的新增数据放到缓存中Repl buffer。
3. 将rdb文件发送给slave节点。
4. 从节点清空本机中的rdb文件,并加载主节点的新rdb文件。
5.将2.2中的命令再发送给从节点。
6. replay5中收到的命令。
7. 主节点通过socket长连接持续发送同步命令。
从节点slave挂了后重新上线-断点续传
1. 发现断开链接
2. master会把最近数据,最近执行的命令缓存再一个repl backlog buffer中。如下配置文件会可以配置其大小,默认1m。
repl-backlog-size 1m
3. 重新链接主节点
4. 从节点将上次断开时的offset偏移量勇敢psync命令发送给主节点
5. 通过偏移量再2中的缓存去里面去找偏移量,将偏移量后面的命令发送给重节点。如果从节点挂的时间比较长,丢失数据比较多大于1m则直接全量复制。
一个主节点下面又太多的从节点,当多个从节点同时都从主节点复制数据时,可能导致主节点压力太大,出现主从复制风暴。所以一般采用下面的架构。
主从架构,如果主节点挂了,需要运维人员手动处理,重写配置主节点。