Redis系列(三)-Redis replication 实现主从复制(读写分离)
Redis replication 是一种 master-slave 模式的复制机制,这种机制使得 slave 节点可以成为与 master 节点完全相同的副本。数据流是单向的,master到slave
replication 主要用于解决两个问题:
1. 读扩展
一个 master 用于写,多个 slave 用于分摊读的压力。
2. 高可用
如果 master 挂掉了,可以提升(promote)一个 slave 为新的 master,进而实现故障转移(failover)。
redis replication完整流程
(1)slave node启动,仅仅保存master node的信息,包括master node的host和ip,但是复制流程没开始(master host和ip在redis.conf里面的slaveof配置)。
(2)slave node内部有个定时任务,每秒检查是否有新的master node要连接和复制,如果发现,就跟master node建立socket网络连接
(3)slave node发送ping命令给master node
(4)口令认证,如果master设置了requirepass,那么salve node必须发送masterauth的口令过去进行认证
(5)master node第一次执行全量复制,将所有数据发给slave node
(6)master node后续持续将写命令,异步复制给slave node
核心机制
第一次slave连接msater的时候,执行的全量复制。
(1)offset
master会在自身不断累加offset,slave也会在自身不断累加offset。
slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset。
(2)backlog
master node有一个backlog,默认是1MB大小。
master node给slave node复制数据时,也会将数据在backlog中同步写一份。
backlog主要是用来做全量复制中断候的增量复制的。
(3)master run id
info server,可以看到master run id。
如果根据host+ip定位master node,是不靠谱的,如果master node重启或者数据出现了变化,那么slave node应该根据不同的run id区分,run id不同就做全量复制。
如果需要不更改run id重启redis,可以使用redis-cli debug reload命令。
(4)psync
从节点使用psync从master node进行复制,psync runid offset。
master node会根据自身的情况返回响应信息,可能是FULLRESYNC runid offset触发全量复制,可能是CONTINUE触发增量复制。
实操
参考Redis系列(一)-CentOS7下Redis单机安装+自启动 在两台器安装redis。
服务器列表
- Master node1(192.168.2.221)
- Slave node2(192.168.2.230)
1. 配置Master的redis配置文件
开启安全认证
requirepass 123456
2.配置Slave的redis配置文件
slaveof node1 6379
slave-read-only yes 默认开启
启用安全认证
masterauth redis
3.验证
在Master添加数据
在Slave节点查询
主从部署成功。
说明:
若失败请检查:
1.关闭防火墙
2.redis配置远程访问
3.开发redis端口
开发工作着,生活快乐着,留下总结,相互交流,共同进步
原文地址:https://www.cnblogs.com/lovechengyu/p/15128840.html
- [go语言]利用缓冲信道来实现网游帐号验证消息的分发和等待
- 转--Golang语言版 ssh口令破解工具
- cubieboard(树莓派)安装Ubuntu+Apache+PHP+Mysql
- Oracle 12c里的几点补充(一)(r11笔记第7天)
- Oracle备库的PDB无法连接的问题(r11笔记第6天)
- Golang语言社区--模板的使用
- Golang语言写Web 应用程序
- 强制wordpress后台HTTPS
- Golang语言 Cookie的使用
- Golang 语言调用动态库实现OpenGL及windows的API编程
- MySQL中的Online DDL(第一篇)(r11笔记第3天)
- 转--quick-cocos做客户端,golang做服务端,实现HTTP通信
- Nginx配置SSL证书
- Golang语言RPC Authorization进行简单ip安全验证的方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 基础(四):字符串
- 使用Faster-RCNN进行指定GPU训练(续)
- SAP CDS view自学教程之十:SAP CDS view扩展性(Extensibility)实现原理
- 使用Faster-RCNN进行指定GPU训练
- Faster RCNN 环境配置
- SAP cross distribution chain status在Fiori应用中的draft handling
- 构建复杂应用的神器,FBroadcast
- Python 基础(三):我是一个数字
- 【译】Flutter架构综述
- 【tcl学习】vivado write_project_tcl
- 你不知道的LinkedList(一):基于jdk1.8的LinkdeList源码分析
- SAP CRM Application Extension Tool(AET)扩展字段的渲染原理
- 使用nodejs将SAP Fiori应用置于本地Launchpad运行
- 使用nodejs运行SAP Fiori应用
- JUnit 注解@Category的工作原理