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 的从服务器,主要负责读操作 ...
随机推荐
- jquery gt选择器 语法
jquery gt选择器 语法 作用::gt 选择器选取 index 值高于指定数的元素.index 值从 0 开始.经常与其他元素/选择器一起使用,来选择指定的组中特定序号之后的元素(如上面的例子) ...
- 由于数据库 'XXX' 离线,无法打开该数据库。
大家使用sql server 进行还原的时候可能会遇到: system.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权 这个错误 下面是有一个解决 ...
- Maven手动命令行导入ojdbc6
Maven项目中导入Oracle的驱动包时,可能会出现像我一样下载资源不成功的情况,如下图所示: 出现这种情况的原因其实是因为Oracle的授权问题,这样的话,我们在需要使用Oracle的驱动包时, ...
- Prim算法和Kruskal算法的正确性证明
今天学习了Prim算法和Kruskal算法,因为书中只给出了算法的实现,而没有给出关于算法正确性的证明,所以尝试着给出了自己的证明.刚才看了一下<算法>一书中的相关章节,使用了切分定理来证 ...
- [CSP-S模拟测试]:取石子(博弈论+DP)
题目描述 有三堆石子,它们的石子个数分别为$x,y,z$.$A$和$B$正在博弈,由$A$先手,双方轮流操作.每次操作是指,选择若干堆($1-3$堆)石子,从中各取出相同数量的石子(不能$1$个都不取 ...
- linux系统PS命令,按CPU、内存使用率对进程排序
https://blog.csdn.net/weixin_42123737/article/details/90081318
- linux 系统环境变量配置
使用Ubuntu 进行开发绕不开的就是环境变量的配置,由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,如果不了解其调用顺序,很有可能遇到配置了环境变量,而没有其作用的问题 ...
- NAACL 2019 字词表示学习分析
NAACL 2019 表示学习分析 为要找出字.词.文档等实体表示学习相关的文章. word embedding 搜索关键词 word embedding Vector of Locally-Aggr ...
- Jackson 数据类型转换
转载自:http://www.cnblogs.com/quanyongan/archive/2013/04/16/3024993.html Jackson处理一般的JavaBean和Json之间的转换 ...
- robotframework之使用cookies登陆
有的系统是使用cookies保持登陆的,而RF的Request库里面没有像Selenium2Library里面一样操作cookies的关键字,若接口需要登录则只能用UI自动化先登录,然后再将cooki ...