Redis 复制与集群

复制

为提高高可用性,排除单点故障,redis支持主从复制功能。
其整体结构是一个有向无环图。

同步方式

分为两种:

  • 全同步
    全同步是第一次从机连主机是进行的同步,主机会生成一个RDB文件给从机,然后从机加载该文件。
    并且如果从机掉线时间很长时也会触发这个同步,掉线时间短时使用另外的策略
  • 部分同步
    当主机收到修改命令之后会把命令发给从机进行部分同步。
    这里会有一个缓存区,主要是用来,如果有从机掉线,再次连接的时候会优先使用缓存区中的数据进行同步,是在不行才使用全同步
  • 同步过程
public void sync(String syncCommond){
    if(valid(masterid, offset)){
        // 表示能够通过部分同步找回
        sendCommandCache();
    }else{
        // 进行全同步
        generateRDB();
        transferRDB();
    }
}

问题

单主单从的情况下,读写分离很好,但是如果万一主挂了,这样就无法写了
或者单主多从时,如果主挂了,也无法进行同步了。这样就需要选举出一个新的主来作为主机。

主从切换

使用Sentinel,其包含如下功能:

  • 监控
    监控服务器节点
  • 提醒
    当监控的节点出现问题时,可以通过api通知其他应用等
  • 故障转移
    当主挂掉时会选举新的从服务器为主服务器,代替原来主服务器的地位

集群

主从为了提高可用性,防止单点故障。
集群则是为了伸缩性了

key映射到节点的算法

对于集群的情况,经常会涉及一个key存在哪个节点中去。
一般有hash/mod的方式,但是有着增删节点重算的致命问题。
另外还有一致性hash算法,memcache客户端的算法就是这种算法,分成一个2^31的槽圆环,对节点进行hash,对key进行hash,选择顺时针离key最近的节点保存key-value,这样可以最少的影响原数据,还可以具有hash的平衡性等好的优点。
Redis使用的是另外一种:
内置16384 个hash槽,把这些槽大致均匀的分到节点中,每个节点都记录哪些槽给了自己以及给了别人。然后对key算hash/16384, 放到对应的节点中,如果新的节点来了,那么重新分割他一些槽同时更新各个节点中的记录,并且把槽中的记录同时也发给新的节点。

握手

节点信息的结构

class Node{
    private long time; // 创建时间
    private String name; // 名称
    private int flag;   // 标示主从,或者在线状态
    private String ip;
    private int port;
    private ClusterState clusterState; // 集群信息
}

class ClusterState{
    private Node myself;
    private int state;
    private int size; // 知道包含一个槽的节点数量
    private Dictionary nodes;  // 集群节点名单
}

size为0, 则state为集群下线。
握手就是节点加入到已有集群的一种方式,主要是为了丰富nodeList。握手的过程如下:

  • B向A发送CLUSTER MEET
  • A为B创建Node结构,并且加到clusterState.nodes中
  • A向B发送MEET消息,B再未A创建Node,加入自己
  • 然后B向A发送PONG,A向B返回PING完成握手

集群行为

当集群接收到请求之后:

  • 一个节点接收到了请求,会检查是否自己的槽,不是则返回MOVED,告诉客户端去哪个槽
  • 重新分片是由客户端去做的, 把一个槽的所有键值转到另外的槽
  • 如果正在进行转移,客户请求没有命中,则会返回ask消息,让客户端去另外的节点去找
  • 集群中如果有主从,那么从节点复制主节点,主几点下线之后,从节点升级代替主节点
时间: 2024-10-03 01:29:47

Redis 复制与集群的相关文章

通过shell和redis来实现集群业务中日志的实时收集分析

在统计项目中,最难实施的就是日志数据的收集.日志分布在全国各个机房,而且数据量比较大,像rsync+inotify这种方式显然不能满足快速日志同步的要求. 当然大家也可以用fluentd和flume采集日志数据,除了这个我们也可以自己写一套简单的. 我写的这个日志分析系统 流程是: 在客户端收集数据,然后通过redis pub方式把数据发给服务端 2   服务器端是redis的sub    他会把数据统一存放在一个文件,或者当前就过滤出来 客户端收集日志的更新数据 #!/bin/bash DAT

redis 什么时候集群,什么时候单点

问题描述 redis 什么时候集群,什么时候单点 redis 什么时候集群,什么时候单点?具体的应用场景,能描述一下么 解决方案 1.并发访问量大的时候肯定要集群才能满足需求,如果用户量不大,访问不是特频繁,单点基本可以. 2.考虑到高可用的时候肯定是要使用集群的,因为存在单点故障问题. 3.对数据延时要求高肯定是要使用集群的,单点毕竟存储和计算能力有限. 4.对数据可靠性,稳定性,以及系统整体容灾,数据容错,数据一致性等高性能要求高,集群是肯定的. 解决方案二: 主要是数据量,访问量,然后就是

redis之(十七)自己实现redis的cluster集群环境的搭建

[一]创建不同节点的配置文件和目录.并将配置文件中的port,cluster-enable,daemonize项做修改. --->port:修改成redis实例对应的端口号 --->cluster-config-file:都写"yes"值,说明当前节点支持cluster机群. --->daemonize:都写"yes"值,是否以后台daemon方式运行 ,为了查看输出,不让后台模式运行,修改成"no" --->append

redis发布了集群版3.0.0 beta

   Redis集群版3.0.0beta版的功能介绍如下:       This is the first beta of Redis 3.0.0. Redis 3.0 features support for Redis Cluster and important speed improvements under certain workloads. This is a developers preview and is not suitable for production environm

redis 3.0集群-redis 3.0后的集群如何搭建session共享

问题描述 redis 3.0后的集群如何搭建session共享 就是采用redis-trib.rb搭建的redis集群,如何在tomcat集群中配置起session共享? redis单点的:redis sentinel主从模式的这两种都已经找到相对应的session共享解决方案,在无比强大的网上冲浪获取. 但现在唯独3.0后的集群如何设置呢? 还未找到对应方案 解决方案 redis3.0搭建集群redis集群实现session共享tomcat集群基于redis共享session解决方案 解决方案

基于redis的cas集群配置(转)

1.cas ticket统一存储 做cas集群首先需要将ticket拿出来,做统一存储,以便每个节点访问到的数据一致.官方提供基于memcached的方案,由于项目需要,需要做计入redis,根据官方例子改了一个基于redis版本的. public class RedisTicketRegistry extends AbstractDistributedTicketRegistry{ @NotNull private final RedisTemplate<String,Object> rei

分布式业务Redis安装与集群配置

       Redis在百度百科里的解释:Redis是一个开源的使用ANSI  C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,包括C#.Java.PHP等等,甚至连Javascript都做了很好的封装.        可见Redis的数据是持久化的,可以分担一个项目中的部分业务,Redis的数据是存储在服务器内存当中的,这样可以极大的加快访问速度,因为内存的读取速度远远超过磁盘和数据库,这在很大程序的上解决了大并发的困惑:同时Redis和

redis之(十六)redis的cluster集群环境的搭建,转载

最近redis已经比较火了,有关redis的详细介绍,网上有一大堆,我这里只作简单的介绍,然后跟大家一起学习Redis Cluster 3.0的搭建与使用.Redis是一款开源的.网络化的.基于内存的.可进行数据持久化的Key-Value存储系统.它的数据模型建立在外层,类似于其 它结构化存储系统,是通过Key映射Value的方式来建立字典以保存数据,有别于其它结构化存储系统的是,它支持多类型存储,包括String. List.Set.Sort set和Hash等,你可以在这些数据类型上做很多原

Redis主从复制和集群配置

1.Redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库.2.通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力.主数据库主要进行写操作,而从数据库负责读操作.