一个网站怎么做后台,淮南市重点工程建设管理局网站,做网站有几种语言,三鼎网络网站建设Redis主从复制搭建
Redis虽然拥有非常高的性能#xff0c;但是在实际的生产环境中#xff0c;使用单机模式还是会产生不少问题的#xff0c;比如说容易出现
单机故障#xff0c;容量瓶颈#xff0c;以及QPS瓶颈等问题。通常环境下#xff0c;主从复制、哨兵模式、Redis…Redis主从复制搭建
Redis虽然拥有非常高的性能但是在实际的生产环境中使用单机模式还是会产生不少问题的比如说容易出现
单机故障容量瓶颈以及QPS瓶颈等问题。通常环境下主从复制、哨兵模式、Redis Cluster是3种比较常见
的解决方案本文将通过实例演示如何搭建Redis主从复制环境并对其原理进行分析。
1、搭建主从复制
1、创建3个目录redis8000redis8001redis8002目录下。
将默认配置文件redis.conf拷贝到redis8000下将redis8000指定为主机修改以下参数
bind 0.0.0.0
port 8000
pidfile /var/run/redis_8000.pid
logfile redis8000.log
dbfilename dump8000.rdb
dir /home/hydra/files/redis/slave/redis8000/
requirepass 123456
daemonize yes
masterauth 1234562、将修改后的redis.conf文件拷贝到redis8001和redis8002目录下然后进行修改
bind 0.0.0.0
port 8001
pidfile /var/run/redis_8001.pid
logfile redis8001.log
dbfilename dump8001.rdb
dir /home/hydra/files/redis/slave/redis8001/
# replicaof 127.0.0.1 8000
slaveof 127.0.0.1 8000
requirepass 123456
masterauth 123456
# 从机开启aof持久化
appendonly yes
daemonize yesbind 0.0.0.0
port 8002
pidfile /var/run/redis_8002.pid
logfile redis8002.log
dbfilename dump8002.rdb
dir /home/hydra/files/redis/slave/redis8002/
# replicaof 127.0.0.1 8000
slaveof 127.0.0.1 8000
requirepass 123456
masterauth 123456
# 从机开启aof持久化
appendonly yes
daemonize yes3、分别启动3个redis实例
./redis-5.0.4/src/redis-server ./slave/redis8000/redis.conf
./redis-5.0.4/src/redis-server ./slave/redis8001/redis.conf
./redis-5.0.4/src/redis-server ./slave/redis8002/redis.conf查看进程启动成功 4、通过redis客户端连接主机redis8000
./redis-5.0.4/src/redis-cli -p 8000 -a 123456登录成功后使用指令查看主从架构
info replication可以看出主机8000拥有两台从机从机8001和8002连接成功。
5、通过redis客户端连接从机redis80001同样通过指令查看主从状态 可以看出8001的角色为slave从机并且可以查看主机8001的相关信息。
6、此外还可以通过指令的模式动态分配主从。复制一个redis8000的配置文件至redis8003下修改端口为
8003其他配置不做改动。
bind 0.0.0.0
port 8003
pidfile /var/run/redis_8003.pid
logfile redis8003.log
dbfilename dump8003.rdb
dir /home/hydra/files/redis/slave/redis8003/
requirepass 123456
daemonize yes使用redis客户端登录8003后输入指令指定主机
slaveof 127.0.0.1 8000动态指定主机后如果主机设置了密码还需要通过指令配置主机密码
config set masterauth 123456配置完成后查看8003从机状态 查看8000主机状态 新添加的从机8003已经被添加到8000的从机当中。
需要注意的是使用命令动态指定的主从状态在从机重启后会失效。
首先使用kill命令杀死8003进程然后查看主从状态 可以发现现在从机只剩下两台为8001和8002。
然后重启8003并再次查看状态
仍然为8001和8002两台从机证明了指令指定主从在重启后会失效。
7、进行读写测试首先测试主机读写均能正常
测试从机发现可以正常读数据但是写数据失败 这是因为在主从复制的架构下只有主机能够写数据从机为只读模式这是在配置文件中指定的。在Redis2.6版
本以后默认从机为只读模式
replica-read-only yes需要注意这里不能将这个配置改为no因为主机不会监听到从机的写数据事件因而造成主从数据的不一致。
二、全量复制
用于初次复制或其它无法进行部分复制的情况将主节点中的所有数据都发送给从节点。
当数据量过大的时候会造成很大的网络开销流程如下
1、从机发送
psync ? -1这里的 “?” 是因为从机暂时不知道主机的runId -1代表全量复制
2、主机发送指令把自己的runid和offset传给从机
fullresync{runidoffset}可以通过命令查看这两个参数
#可以查看runid
info server
#可以查看offset
info replication从机之后会上报自己的偏移量offset给主机当主机的offset和从机的offset不一样时说明数据不一致。
3、从机保存主机数据
save master info4、主机执行bgsave全量复制会触发rdb持久化。
bgsave主机在生成rdb文件时可能会有新的数据写入。这时redis把新写入的数据写入一个缓冲区repl_back_buffer默
认大小1M。可以通过repl-backlog-size设置缓冲区大小
5、主机发送rdb给从机
send rdb6、主机发送缓冲区数据给从机
send buffer7、从机把从机本身上的数据清空
flush old data8、从机加载主机发送过来的rdb和buffer数据
load rdbbuffer在全量复制中消耗的时间包括 执行bgsave进行持久化的时间 rdb文件网络传输时间 从节点请求请求数据时间 从机加载rdb的时间 如果从节点开启了aof持久化可能进行aof重写的时间
三、部分复制
部分复制主要是Redis针对全量复制过高的开销进行的一种优化措施。Redis 希望能够在主机出现抖动或连接断开
的时候可以通过部分复制机制将损失降低到最低。 具体流程如下
1、出现网络抖动连接断开 connection lost
2、主机继续写复制缓冲区repl_back_buffer
3、从机继续尝试连接主机
4、从机slave 会把自己当前 runid 和偏移量传输给主机 master并且执行 pysnc 命令同步
5、如果 master 发现偏移量是在缓冲区的范围内就会返回 continue 命令
6、同步了 offset 的部分数据所以部分复制的基础就是偏移量 offset。
那么在正常的情况下Redis是如何决定全量复制还是部分复制的呢从机将自己的offset发送给主机后主机
根据offset和缓冲区大小决定能否执行部分复制 如果offset偏移量之后的数据仍然都在复制积压缓冲区里则执行部分复制 如果offset偏移量之后的数据已不在复制积压缓冲区中则执行全量复制
四、主从复制架构缺点
1、由于所有的写操作都是先在主机上操作然后同步更新到从机上所以同步过程有一定的延迟当系统很繁忙
的时候延迟问题会更加严重。从机数量增加时会使这个问题更加严重。
2、当主机宕机之后将不能进行写操作需要手动将从机升级为主机从机需要重新指定主机。
手动在一台从机上执行下面命令将它升级为主机
slave of no one再在其他从机上执行slave of指令将自身变成新主机的从机
slave of 192.168.0.1 port可以看出这种情况下当主机宕机后后续的修复流程由人工操作非常麻烦因此在这种情况下Redis引入了哨
兵模式来完成主机宕机后的自动故障转移。