Redis主从架构核心原理
Redis-Cluster工作原理:
redis集群内置了16384个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
例如三个节点:槽分布的值如下:
SERVER1: 0-5460
SERVER2: 5461-10922
SERVER3: 10923-16383
容错机制:
选举过程是所有的主节点(master)参与,如果过半数的master认为故障节点挂掉了,就会将它踢出集群就像狼人杀一样,故障节点所对应的从节点(slave)就会自动升级为主节点。因为每个节点只存储部分信息,所以当主节点挂掉之后,又没有从节点替补的情况下集群就会挂掉,因为它不是一个完整的集群了。
master slave通信原理
节点之间通信方式一般有两种,一种是集中式,还一种是gossip协议。
集中式的代表有springcloud config、zookeeper,它们是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间不断通信,保持整个集群所有节点的数据是完整的。这样做的好处在于元数据的更新和读取,时效性非常好,一旦元数据出现了变更,立即就更新到集中式的存储中,其他节点读取的时候立即就可以感知到; 不好在于,所有的元数据的更新压力全部集中在一个地方,可能会导致元数据的存储有压力。
gossip协议是redis cluster节点采取通信的方式。每个节点都有一个专门用于节点间通信的端口,每隔一段时间都会往另外几个节点发送ping消息,同时其他几点接收到ping之后返回pong。元数据更新时,请求会陆陆续续打到所有节点上去更新,有一定的延时,降低了压力; 缺点,元数据更新有延时,可能导致集群的一些操作会有一些滞后。
gossip协议
gossip协议包含多种消息,包括ping,pong,meet,fail,等等
meet: 某个节点发送meet给新加入的节点,让新节点加入集群中,然后新节点就会开始与其他节点进行通信。像redis-trib.rb add-node 其实内部就是发送了一个gossip meet消息,给新加入的节点,通知那个节点去加入我们的集群
ping: 每个节点都会频繁给其他节点发送ping,其中包含自己的状态还有自己维护的集群元数据,互相通过ping交换元数据。cluster_node_timeout是可以调节的,如果调节太长,那么会降低发送的频率可能元出现数据不一致的情况;如果太短,ping很频繁,所以可能会加重网络负担
pong: 返回ping和meet,包含自己的状态和其他信息,也可以用于信息广播和更新
fail: 某个节点判断另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了
主从复制的断点续传
从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。
master会在内存中产生一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制,但是如果没有找到对应的offset,那么就会执行一次resynchronization.
slave对过期key的处理
slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。
------------------------------------------------------------------------------------------------
1台以上的节点就能搭建一个redis集群,我们这里搭建3个节点来组建一个集群,为了防止节点死掉而导致集群崩溃,我们这里还需要搭建3台从节点保证高可用!所以一共是6个节点!
【搭建过程】
- Redis是C语言开发的,我们首先安装C的编译环境。 yum install gcc-c++
- 安装ruby命令,用它来实现脚本搭建。 yum install ruby yum install rubygems
- 创建文件夹 mkdir /usr/local/wulei/redis_cluster , 把redis-3.0.0.tar.gz传上来并解压 tar -zxvf redis-3.0.0.tar.gz
- make命令编译源码 cd /usr/local/wulei/redis_cluster/redis-3.0.0 在目录里面直接执行 make 。
5. 现在我们可以用编译好的文件安装6个服务。
cd /usr/local/wulei/redis_cluster/redis-3.0.0
make install PREFIX=/usr/local/wulei/redis_cluster/redis1
make install PREFIX=/usr/local/wulei/redis_cluster/redis2
make install PREFIX=/usr/local/wulei/redis_cluster/redis3
make install PREFIX=/usr/local/wulei/redis_cluster/redis4
make install PREFIX=/usr/local/wulei/redis_cluster/redis5
make install PREFIX=/usr/local/wulei/redis_cluster/redis6
6. 安装好之后它们还差配置文件, 我们这个时候需要去把redis-3.0.0/redis.conf配置文件复制到它们bin目录下。
cp redis.conf /usr/local/wulei/redis_cluster/redis1/bin
cp redis.conf /usr/local/wulei/redis_cluster/redis2/bin
cp redis.conf /usr/local/wulei/redis_cluster/redis3/bin
cp redis.conf /usr/local/wulei/redis_cluster/redis4/bin
cp redis.conf /usr/local/wulei/redis_cluster/redis5/bin
cp redis.conf /usr/local/wulei/redis_cluster/redis6/bin
【经过上面6步我们就搭建完成了,接下来我们要开始配置了】
- 修改6个redis的redis.conf文件 我们是伪集群所以要修改默认端口,并开启集群。
45行的6379分别改为7001 ~ 7006 632行前面的井号和空格删掉(打开集群开关)。
2. 分别启动6个服务 cd /usr/local/wulei/redis_cluster/redis1/bin ./redis-server redis.conf 前面是启动命令,后面是配置文件路径。
3. 上传脚本: 全部启动成功之后,我们用ruby脚本将集群连接起来
4. 安装脚本文件 gem install redis-3.0.0.gem
5. 进入redis源码包,使用redis-trib.rb来连接集群。
重新开一个窗口:
进入这个原生目录
cd /usr/local/wulei/redis_cluster/redis-3.0./src
执行下面语句
./redis-trib.rb create --replicas 192.168.25.100: 192.168.25.100: 192.168.25.100: 192.168.25.100: 192.168.25.100: 192.168.25.100:7006
create --replicas:创建集群 值表示slave节点比例, 1表示1主1备; 2表示1主2备。
这个时候我们可以看它的执行信息
1.先检测每个节点成功启动
...... >>> Performing hash slots allocation on nodes...
2.设置masters
Using masters:
192.168.25.100:
192.168.25.100:
192.168.25.100:7003
3.分配从节点
Adding replica 192.168.25.100: to 192.168.25.100:
Adding replica 192.168.25.100: to 192.168.25.100:
Adding replica 192.168.25.100: to 192.168.25.100:7003
4.可以看到16384个槽平均分给了3个主节点
M: 023c652a892d056ffe3b01ffba859ebfa4646acd 192.168.25.100:
slots:- ( slots) master
M: 5e5f5b031aa82d0c3235cc135d9f76f06867a08b 192.168.25.100:
slots:- ( slots) master
从节点是没有槽的, 但是它会把主节点的数据复制过来
M: 96a22d58016ae41229a12b84adf5a0e3dd91c1e9 192.168.25.100:
slots:- ( slots) master
S: 873e8f4d87b76bad2c2072a9936ac114d8adae49 192.168.25.100:
replicates 023c652a892d056ffe3b01ffba859ebfa4646acd
S: 79e0bc90b114fdbf31178eecb9f0b83a05897130 192.168.25.100:
replicates 5e5f5b031aa82d0c3235cc135d9f76f06867a08b
S: 80348137885573d23d523e0bb86a972721180937 192.168.25.100:
replicates 96a22d58016ae41229a12b84adf5a0e3dd91c1e9
是否确定配置规则: 直接输入yes
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 192.168.25.100:)
M: 023c652a892d056ffe3b01ffba859ebfa4646acd 192.168.25.100:
slots:- ( slots) master
M: 5e5f5b031aa82d0c3235cc135d9f76f06867a08b 192.168.25.100:
slots:- ( slots) master
M: 96a22d58016ae41229a12b84adf5a0e3dd91c1e9 192.168.25.100:
slots:- ( slots) master
M: 873e8f4d87b76bad2c2072a9936ac114d8adae49 192.168.25.100:
slots: ( slots) master
replicates 023c652a892d056ffe3b01ffba859ebfa4646acd
M: 79e0bc90b114fdbf31178eecb9f0b83a05897130 192.168.25.100:
slots: ( slots) master
replicates 5e5f5b031aa82d0c3235cc135d9f76f06867a08b
M: 80348137885573d23d523e0bb86a972721180937 192.168.25.100:
slots: ( slots) master
replicates 96a22d58016ae41229a12b84adf5a0e3dd91c1e9
[OK] All nodes agree about slots configuration.
设置ok
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
这个时候重新看redis服务器节点信息,发生了变化。并且我们可以用win来连接测试!
Redis主从架构核心原理的更多相关文章
- 10.Redis 主从架构
作者:中华石杉 Redis 主从架构 单机的 redis,能够承载的 QPS 大概就在上万到几万不等.对于缓存来说,一般都是用来支撑读高并发的.因此架构做成主从(master-slave)架构,一主多 ...
- Redis深度历险——核心原理与应用实践
高可用架构」的各位老铁们,你们好!你是否还记得上个月发布的文章中,有两篇深入讲解Redis的文章,分别是和,广大粉丝读者们对这两篇文章整体评价颇高.而我就是这两篇文章的原创作者「老钱」(钱文品),我是 ...
- redis主从架构,分片集群详解
写在前面:这篇笔记有点长,如果你认真看完,收获会不少,如果你只是忘记了相关命令,请翻到末尾. redis的简单介绍: 一个提供多种数据类类型储存,整个系统都在内存中运行的, 定期通过异步的方式把数据刷 ...
- 采用redis 主从架构的原因
如果系统的QPS超过10W+,甚至是百万以上的访问,则光是Redis是不够的,但是Redis是整个大型缓存架构中,支撑高并发的架构非常重要的环节. 首先,你的缓存中间件.缓存系统,必须能够支撑起10w ...
- Redis cluster的核心原理分析
一.节点间的内部通信机制 1.基础通信原理 (1)redis cluster节点间采取gossip协议进行通信 跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间 ...
- Redis主从架构搭建和哨兵模式(四)
一主一从,往主节点去写,在从节点去读,可以读到,主从架构就搭建成功了 1.启用复制,部署slave node wget http://downloads.sourceforge.net/tcl/tcl ...
- 那一天,我被Redis主从架构支配的恐惧
面试官:要不你来讲讲你最近在看的点呗?可以拉出来一起讨论下(今天我也不知道要问什么) 候选者:最近在看「Redis」相关的内容 面试官:嗯,我记得已经问过Redis的基础和持久化了 面试官:要不你来讲 ...
- redis主从架构的搭建
本项目采用主从架构,一主两从一个哨兵.在x.x.x.69上部署主节点,在70上部署从节点1和哨兵节点,在71上部署从节点2. 准备: 1.首先上传redis文件到三台linux上,目录/home/sy ...
- Redis 主从架构搭建
引言 准备搭建的是主从架构( Master/Slave )中的一主两从模式:其中 Master 为 Redis 的主服务器,主要负责写操作,两个 Slave 为 Redis 的从服务器,主要负责读操作 ...
随机推荐
- html abbr标签 语法
html abbr标签 语法 作用:标记一个缩写 大理石平台 说明:<abbr> 标签指示简称或缩写,比如 "WWW" 或 "NATO".通过对缩写 ...
- UVA 11988 Broken Keyboard (a.k.a. Beiju Text)(链表)
题目代号:UVA 11988 题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&pa ...
- Android中实现双击(多击)事件
要实现双击,你需要保存第一次点击时的时间,需要使用到变量,之后便是与第二次点击时的时间比较,看时间间隔是否在你设定的时间内(比如500ms). ? 1 2 3 4 5 6 7 8 9 10 11 12 ...
- (48)LINUX应用编程和网络编程之三Linux获取系统信息
3.3.1.关于时间的概念 3.3.1.1.GMT时间 (1)GMT是格林尼治时间,也就是格林尼治地区的当地之间. (2)GMT时间的意义?[用格林尼治的当地时间作为全球国际时间],用以描述全球性的事 ...
- springboot(四).配置FastJson自定义消息转化器
配置FastJson自定义消息转化器 一.fastJson简介 fastJson是阿里巴巴旗下的一个开源项目之一,顾名思义它专门用来做快速操作Json的序列化与反序列化的组件.它是目前json解析最快 ...
- linux 文本文件显示行数
一般的我们在使用linux编辑器编辑文本文件的时候是不会像其他编程软件一样显示行数 临时方法: 在命令模式下输入:set nu或者:set number都可以为vi设置行号,如果要取消的话,则输入:s ...
- less基本用法
在vue中使用less首先要下载依赖: npm install less less-loader --save-dev 下载好之后就可以.vue文件中使用lang="less"和@ ...
- SPFA算法的SLF优化 ——loj#10081. 「一本通 3.2 练习 7」道路和航线
今天做到一道最短路的题,原题https://loj.ac/problem/10081 题目大意为给一张有n个顶点的图,点与点之间有m1条道路,m2条航线,道路是双向的,且权值非负,而航线是单向的,权值 ...
- [CSP-S模拟测试]:军训队列(DP+乱搞)
题目描述 有$n$名学生参加军训,军训的一大重要内容就是走队列,而一个队列的不规整程度是该队中最高的学生的身高与最矮的学生的身高差值的平方.现在要将$n$名参加军训的学生重新分成$k$个队列,每个队列 ...
- 用命令行编译运行java文件的乱码问题
之前在写的时候没有遇到过这个问题,用惯了eclipse之后突然用Notepad++就出现乱码了 我在编写的时候 指定Noepad++的编码是 UTF-8编码,然后进入命令行,编译的时候就出现了乱码 然 ...