redis集群篇
redis集群的搭建
1.为什么要搭建集群(解决单点问题)
通过对redis的简单了解,我们知道redis已经有两种持久化方案rdb和aof。在redis出现宕机后,可能会出现部分的数据损失,但是数据还是可以恢复的。但是如果服务器的硬盘出现故障,由于所有的数据都在这一台机器上,就可能会造成很大的损失。
2.redis的主从复制(单点问题解决方案)
复制的目的就是将redis数据库复制多个副本部署在多个机器上,防止其中一台机器硬盘出现损坏而造成的数据损失。复制功能可以实现当其中一台服务器中的数据出现更新后,能够同步到其它的服务器,实现数据的一致性。主从复制就是我们常见的master/slave模式,在这种模式下,一般slave节点只对外提供读服务,而写服务会落到master节点。master节点可以有多个slave节点,master节点会定期同步数据到slave节点。
3.redis中如何搭建master/slave
在redis中搭建master/slave模式很简单,只需要修改slave节点的redis.conf配置文件,而master节点的配置不需要做修改。在每个slave节点的redis.conf配置文件中添加slaveof masterip masterport,并且注释掉bindip(允许所有节点访问),其中masterip就是master的ip,msterport就是master对外提供的端口号。修改配置完成后,依次启动master和slave节点,通过redis-cli连接,使用命令info replication可以查看连接信息。
4.主从复制的原理
4.1全量复制
全量复制发生在slave节点的初始化阶段。首先是连接进来的slave节点发送SYNG的命令到master节点,master收到请求,执行bgsave命令,生成快照发送到slave节点,同时master节点也会在缓存记录在此期间的写命令,并在快照发送完成后,将缓存也发送过去。而slave节点在收到快照和缓存后,会载入数据。完成上述的操作后,slave节点便可以对外部提供服务了。
master/slave的复制采用的是乐观复制,也就是说可以容忍在一段时间内master/slave节点的数据是不同的,但是数据最终会实现同步。具体的说,就是master接收客户端的写操作,在操作完成之后,然后将数据同步给slave节点。这一特定保证了在master/slave模式下,master的性能不受到影响。
由于master节点写完之后才会将数据同步给slave节点,在这期间如果slave节点和master节点之间出现网络问题,会导致数据同步失败。所以为了保证数据实现同步,必须保证在master将数据同步成功给了多少个slave节点之后,才能对外提供写服务。而这个可以在redis.conf中配置,min-slaves-to-write 3 表示只有当3个或以上的节点连接到master节点之后,master节点才是可写的,min-slaves-max-lag 10 表示master允许slave失去的最长连接时间,如果在10秒内没收到slave的响应,则表示该slave已经断开了连接。
4.2增量复制(redis的断点续传)
增量复制的功能是从redis2.8开始的,也就是说在同步数据的过程中,如果网络断开了,重连后下次同步数据会从上一次的位置接着同步,不会重新开始。这个在redis中的实现就是会在mster节点的内存中创建一个backlog,master和slave都会保存一个replica offset还有一个master id,如果网络断掉了,会从上一次的replica接着同步。如果没有找到replica,则会执行全量同步。
4.3无硬盘复制
前面说过,redis复制的工作原理是基于rdb快照的持久化实现的。也就是说master节点在后台保存rdb快照,并将快照传输到slave,slave通过rdb快照载入数据。但是这种方式会存在两个问题。
5.redis的哨兵机制
5.1 哨兵概述:前面已经明确了reids的master/slave模式,这种模式可以实现redis的读写分离和主从复制,但是当master节点挂掉后,就需要一种机制去实现master的选举,这时哨兵机制就出现了。
5.2 什么是哨兵:哨兵的存在有两个作用,第一是监控master和slave节点是否正常运行,第二是当master节点出现故障之后,重新从slave节点中选举出一个master节点。
6.redis-cluster
即使使用哨兵模式,redis集群中的每个节点还是会保存全量的数据,这个就会导致整个集群的数据总存储量受限于其中内存量最小的节点,形成木桶效应。
在redis3.0之前,我们是通过在客户端来做分片,通过hash环的方式对key进行分片存储。分片虽然能够解决各个节点的存储压力,但是导致维护成本高,增加和删除节点比较繁琐。因此在redis3.0之后的版本最大的一个好处就是支持集群功能,集群的特点在于拥有和单机实例一样的性能,同时在网络分区以后能够提供一定的可访问性以及对主数据库故障恢复的支持。哨兵和集群是两个独立的功能,当不需要对数据进行分片使用哨兵就够了,如果要进行水平扩容,集群是一个比较好的方式。
一个Redis Cluster由多个Redis节点构成。不同节点组服务的数据没有交集,也就是每个一节点组对应数据 sharding的一个分片。节点组内部分为主备两类节点,对应master和slave节点。两者数据准实时一致,通过异步 化的主备复制机制来保证。一个节点组有且只有一个master节点,同时可以有0到多个slave节点,在这个节点组中 只有master节点对用户提供些服务,读服务可以由master或者slave提供 。
redis-cluster是基于gossip协议实现的无中心化节点的集群,因为去中心化的架构不存在统一的配置中心,各个节 点对整个集群状态的认知来自于节点之间的信息交互。在Redis Cluster,这个信息交互是通过Redis Cluster Bus来完成的 。
redis的数据分区:分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集, Redis Cluster采用哈希分区规则,采用虚拟槽分区。虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合, 整数定义为槽(slot)。比如Redis Cluster槽的范围是0 ~ 16383。槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,每个节点负责一定数量的槽。计算公式:slot = CRC16(key)%16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。
hashtages:通过分片手段,可以将数据合理的划分到不同的节点上,这本来是一件好事。但是有的时候,我们希望对相关联的 业务以原子方式进行操作。举个简单的例子我们在单节点上执行MSET , 它是一个原子性的操作,所有给定的key会在同一时间内被设置,不可能出现某些指定 的key被更新另一些指定的key没有改变的情况。但是在集群环境下,我们仍然可以执行MSET命令,但它的操作不 在是原子操作,会存在某些指定的key被更新,而另外一些指定的key没有改变,原因是多个key可能会被分配到不同的机器上。所以,这里就会存在一个矛盾点,及要求key尽可能的分散在不同机器,又要求某些相关联的key分配到相同机器。 这个也是在面试的时候会容易被问到的内容。怎么解决呢?从前面的分析中我们了解到,分片其实就是一个hash的过程,对key做hash取模然后划分到不同的机器上。所以为了解决这个问题,我们需要考虑如何让相关联的key得到的hash值都相同呢?如果key全部相同是不现实的,所以怎么解决呢?在redis中引入了HashTag的概念,可以使得数据分布算法可以根据key的某一个部分进行计算,然后 让相关的key落到同一个数据分片举个简单的例子,加入对于用户的信息进行存储user:user1:id、user:user1:name/ 那么通过hashtag的方式, user:{user1}:id、user:{user1}.name; 表示 当一个key包含 {} 的时候,就不对整个key做hash,而仅对 {} 包括的字符串做hash。
redis集群篇的更多相关文章
- [redis] -- 集群篇
三种集群方式 主从同步:主从复制模式中包含一个主数据库实例(master)与一个或多个从数据库实例(slave) 优点: master能自动将数据同步到slave,可以进行读写分离,分担master的 ...
- 高性能网站架构设计之缓存篇(6)- Redis 集群(中)
昨天晚上钓鱼回来,大发神经,写了篇概括程序员生活现状的文章,没想到招来众多人的口诛笔伐,大有上升到政治层面的趋势. 我也许不会再发表任何冲击心灵的文章,我希望给大家带来更多的正能量,所以那篇文章已被我 ...
- 高性能网站架构设计之缓存篇(5)- Redis 集群(上)
集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节 ...
- (转)高性能网站架构之缓存篇—Redis集群搭建
看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的 ...
- (转)高性能网站架构之缓存篇—Redis集群增删节点
标签: 高性能架构集群缓存redis 上一篇文章,我们搭建了Redis-cluster集群,这篇博客跟大家讲一下如何在一个运行的集群上增加节点或者删除节点. Redis集群添加节点 首先我们要新建立一 ...
- 支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)
Redis作为一款性能优异的内存数据库,支撑着微博亿级社交平台,也成为很多互联网公司的标配.这里将以Redis Cluster集群为核心,基于最新的Redis5版本,从原理再到实战,玩转Redis集群 ...
- 支撑微博亿级社交平台,小白也能玩转Redis集群(实战篇)
上篇文章<支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)>介绍了Redis集群相关原理,这篇文章将介绍Redis Cluster集群的搭建.配置,运维.扩容等具体操作 集群搭建 ...
- 【Redis篇】Redis集群安装与初始
一.前述 本文将单台节点不同端口模拟集群方式. 二.具体搭建 前提是安装好redis具体可参考http://www.cnblogs.com/LHWorldBlog/p/8463269.html 1 ...
- redis集群在线迁移第二篇(redis迁移后调整主从关系,停掉14机器上的所有从节点)-实战二
变更需求为: 1.调整主从关系,所有节点都调整到10.129.51.30机器上 2.停掉10.128.51.14上的所有redis,14机器关机 14机器下线迁移至新机房,这段时间将不能提供服务. 当 ...
随机推荐
- arts打卡 从排序数组中删除重复项
Algorithm 从排序数组中删除重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组 ...
- MyBatis学习日记(三):戏说MyBatis配置文件
properties标签 properties标签可以用来加载别的配置文件,比如可以加载数据库的配置文件,jdbc.properties. 下面是jdbc.properties jdbc.driver ...
- 移动开发的捷径:3种方式轻松创建webapp
移动开发行业发展迅速,为迎合用户的需求,大多数传统互联网公司在主导web网站的同时还需兼顾移动开发方向.在已有PC端网站的基础上,考虑到人力.成本和技术.开发周期等因素,许多公司会选择开发快速.维护便 ...
- Hive JDBC:java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: root is not allowed to impersonate anonymous
今天使用JDBC来操作Hive时,首先启动了hive远程服务模式:hiveserver2 &(表示后台运行),然后到eclipse中运行程序时出现错误: java.sql.SQLExcepti ...
- FineUIPro/Mvc/Core v5.4.0即将发布(Core基础版,新功能列表)!
FineUIPro/Mvc/Core v5.4.0 即将于 2019-03-04 发布,目前官网示例已更新,先睹为快:http://pro.fineui.com/http://mvc.fineui.c ...
- html简单的知识
分布式版本控制git pwd查询当前目录 ls ls -la git config --global user.name xxx git config --global user. ...
- openstack基础框架
openstack组件: Computer--代码名Nova,管理VM的整个生命周期,主要职责包括启动,调度VMs,计算节点上需要至少两块网卡 Networking--代码名Neutr ...
- 什么是Vagrant
相信大家对VMware和VirsualBox不会太陌生,虚拟化的好处在这里我就不多说了.那么我们就一起来学习用Vagrant 为自己来打造一个神奇的跨平台开发环境吧!! 开发过程中,我们经常碰到一个问 ...
- 电脑突然使用不了复制粘贴快捷键,Ctrl+C和Ctrl+V没用
今天不知道怎么回事,在复制代码的时候突然用不了Ctrl+C和Ctrl+V了 刚开始我还以为是eclipse出问题,然后我在idea中是可以复制 和 粘贴的,然后我又打开文本编辑器notepad++,发 ...
- mysql-笔记-默认值
1 指定列的默认值 columnName int default '-1' 2 integer 列-设置自增列 也是指定默认值的方式 3 默认值必须是常量 不能使用函数.表达式---特例:timest ...