石景山周边网站建设,做的网站太大,北京电商营销中心,建设银行官网站预约四、Redis主从
1.搭建主从架构 不像是负载均衡#xff0c;这里是主从#xff0c;是因为redis大多数是读少的是写 步骤 搭建实例#xff08;建设有三个实例#xff0c;同一个ip不同端口号#xff09; 1#xff09;创建目录 我们创建三个文件夹#xff0c;名字分别叫700…四、Redis主从
1.搭建主从架构 不像是负载均衡这里是主从是因为redis大多数是读少的是写 步骤 搭建实例建设有三个实例同一个ip不同端口号 1创建目录 我们创建三个文件夹名字分别叫7001、7002、7003 # 进入/tmp目录
cd /tmp
# 创建目录
mkdir 7001 7002 70032恢复原始配置 修改redis-6.2.4/redis.conf文件将其中的持久化模式改为默认的RDB模式AOF保持关闭状态。 # 开启RDB
# save
save 3600 1
save 300 100
save 60 10000# 关闭AOF
appendonly no3拷贝配置文件到每个实例目录 然后将redis-6.2.4/redis.conf文件拷贝到三个目录中在/tmp目录执行下列命令 # 方式一逐个拷贝
cp redis-6.2.4/redis.conf 7001
cp redis-6.2.4/redis.conf 7002
cp redis-6.2.4/redis.conf 7003# 方式二管道组合命令一键拷贝
echo 7001 7002 7003 | xargs -t -n 1 cp redis-6.2.4/redis.conf4修改每个实例的端口、工作目录 修改每个文件夹内的配置文件将端口分别修改为7001、7002、7003将rdb文件保存位置都修改为自己所在目录在/tmp目录执行下列命令 sed -i -e s/6379/7001/g -e s/dir .\//dir \/tmp\/7001\//g 7001/redis.conf
sed -i -e s/6379/7002/g -e s/dir .\//dir \/tmp\/7002\//g 7002/redis.conf
sed -i -e s/6379/7003/g -e s/dir .\//dir \/tmp\/7003\//g 7003/redis.conf5修改每个实例的声明IP 虚拟机本身有多个IP为了避免将来混乱我们需要在redis.conf文件中指定每一个实例的绑定ip信息格式如下 # redis实例的声明 IP
replica-announce-ip 192.168.202.1326每个目录都要改我们一键完成修改在/tmp目录执行下列命令 # 逐一执行
sed -i 1a replica-announce-ip 192.168.150.101 7001/redis.conf
sed -i 1a replica-announce-ip 192.168.150.101 7002/redis.conf
sed -i 1a replica-announce-ip 192.168.150.101 7003/redis.conf# 或者一键修改
printf %s\n 7001 7002 7003 | xargs -I{} -t sed -i 1a replica-announce-ip 192.168.150.101 {}/redis.conf启动 # 第1个
redis-server 7001/redis.conf
# 第2个
redis-server 7002/redis.conf
# 第3个
redis-server 7003/redis.conf停止 printf %s\n 7001 7002 7003 | xargs -I{} -t redis-cli -p {} shutdown开启主从 slaveof masterip masterport# 查看状态
info replication2.数据同步原理 主从第一次同步是全量同步 通过rdb文件传输 通过内存产生快照并在子进程生成RDB的时候主进程把新的指令写入repl_baklog中后续发送给slave方便同步最新数据。 因为是一次全部同步数据量会很大速度会慢 replication buffer是直接传输给slave的缓存是只有多个的详情可以在增量同步中理解这里和黑马的不一样比黑马的详细 master如何知道slave是第一次同步 通过Replication 简称replid是数据集的标记id一致则说明是同一数据集。每一个master都有唯一的replid offset:偏移量随着记录在repl baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。 如果slave的offset小正master的offset说明slave数据落后于master需要更新。 因此slave做数据同步必须向master声明自己的replicationid和offsetmaster才可以判断到底需要同步哪些数据 总结
3.增量同步 流程 repl_baklog是一个数组环形数组记录对应子节点的传输进度所以所有多个的 replication buffer是直接传输给slave的缓存是有多个的。 slave和matser相差太大就无法同步了 快记满把尚未备份的数据给覆盖了就无法增量同步了只能去做全量同步 优化Redis主从同步 在master中配置repl-diskless-sync yes启用无磁盘复制避免全量同步时的磁盘IO 在redis.conf中操作正常是在磁盘IO流中写rdb文件然后再发到网络的IO流中。无磁盘复制就算不在磁盘中写直接在网络IO流里写然后发。 传统复制方式: 内存数据 - 写入磁盘(RDB文件) - 读取磁盘 - 网络发送无磁盘复制方式: 内存数据 - 直接写入网络流(RDB格式)传统方式中: RDB文件在磁盘上是完整的读取时可以用较大的块进行读取网络发送时可以更好地控制发送速度和缓冲 无磁盘复制时: Redis需要一边生成RDB格式数据一边往网络写如果网络写入速度跟不上RDB生成速度数据会在内存中积压网络传输如果出现波动或延迟没有磁盘作为缓冲整个过程就会变得不稳定 打个比方: 传统方式就像是先把货物打包好放在仓库(磁盘)需要时直接整车发送无磁盘方式则像是生产线直接往车上装货如果道路堵车货物就会在生产线上积压 Redis单节点上的内存占用不要太大减少RDB导致的过多磁盘IO 适当提高repl baklog的大小发现slave宕机时尽快实现故障恢复尽可能避免全量同步 限制一个master上的slave节点数量如果实在是太多slave则可以采用主-从-从链式结构减少master压力 总结
4.replication buffer 和 repl backlog buffer 的区别 replication buffer 因为不同的从节点同步速度不一样主节点会为每个从节点都创建一个replication buffer它用于实时传输写命令且大小是动态的因为对于同步速度较慢的从服务器需要更多的内存来缓存数据。 虽说 replication buffer 没有明确的大小限制但是可以通过 client-output-buffer-1imit 间接控制该参数可以设置不同类型客户端(普通、从服务器、发布订阅)的输出缓冲区限制。当缓)中区大小超过限制时Redis 会断开与客户端(从节点其实就是一个客户端)的连接。 client-output-buffer-limit slave 256mb 64mb 60 上述配置表示如果从服务器的输出缓,中区大小超过 256 MB 或超过 64 MB 的时间达到 60sRedis 将断开与从服务器的连接 repl backlog buffer repl_backlog_buffer 在主节点上只有一个存储最近的写命令用于从服务器重新连接时进行部分重同步