文档库 最新最全的文档下载
当前位置:文档库 › Redis集群的脑裂现象

Redis集群的脑裂现象

Redis集群的脑裂现象
Redis集群的脑裂现象

1. 集群脑裂问题的原因 集群的脑裂通常是发生在集群中部分节点之间不可达而引起的(或者因为节点请求压力较大,导致其他节点与该节点的心跳检测不可用)。当上述情况发生时,不同分裂的小集群会自主的选择出master 节点,造成原本的集群会同时存在多个

master 节点。

2. Redis 脑裂情况分析

2.1 哨兵模式下的脑裂,如图2-1

如上图,1个master 与3个slave 组成的哨兵模式(哨兵独立部署于其它机器),刚开始时,2个应用服务器server1、server2都连接在master 上,如果master 与slave 及哨兵之间的网络发生故障,但是哨兵与slave 之间通讯正常,这时3个slave 其中1个经过哨兵投票后,提升为新master ,如果恰好此时server1仍然连接的是旧的master ,而server2连接到了新的master 上,导致数据出现丢失

2.2 集群模式下的脑裂,如图2-2。

图2-1

图2-2

custer模式下,这种情况要更复杂,见上面的示意图,集群中有6组分片,每给分片节点都有1主1从,如果出现网络分区时,各种节点之间的分区组合都有可能,假设master1与slave4落到同1个分区,这时slave4经过选举后,可能会被提升为新的master4,而另一个分区里的slave1,可能会提升为新的master1。cluster中key的定位是依赖slot

(槽道),经过这一翻折腾后,master1与master4上的slot,出现了重复,在二个分区里都有。会造成数据不一致的问题

3. 解决方案

redis配置文件中有以下两行:

min-slaves-to-write 3

min-slaves-max-lag 10

如果一个master出现了脑裂,跟其他slave丢了连接,那么上面两个配置可以确保说,如果不能继续给指定数量的slave发送数据,而且slave超过10秒没有给自己ack消息,那么就直接拒绝客户端的写请求,这样脑裂后的旧master就不会接受client的新数据,也就避免了数据丢失,上面的配置就确保了,如果跟三个slave丢了连接,在10秒后发现没有slave给自己ack,那么就拒绝新的写请求。

因此在脑裂场景下,最多就丢失10秒的数据

redis3.0.2 分布式集群安装详细步骤

redis3.0.2 分布式集群安装详细步骤 --(centos5.8 X64系统) 版本历史 一: redis cluster介绍篇 1:redis cluster的现状 目前redis支持的cluster特性(已亲测): 1):节点自动发现 2):slave->master 选举,集群容错 3):Hot resharding:在线分片 4):进群管理:cluster xxx 5):基于配置(nodes-port.conf)的集群管理 6):ASK 转向/MOVED 转向机制. 2:redis cluster 架构 1)redis-cluster架构图

架构细节: (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail是通过集群中超过半数的节点检测失效时才生效. (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value 2) redis-cluster选举:容错

(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master 节点通信超过(cluster-node-timeout),认为当前master节点挂掉. (2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的 操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态. b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态. 二.Redis集群安装篇(centos5.8 X64系统) (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下)

Redis-集群 - 三台服务器

Redis-集群安装详细步骤 一、Redis集群部署文档(centos6系统) 现有三台物理机10.18.154.2 10.18.154.3 10.18.154.4 (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) 10.18.154.2:7000 10.18.154.2:7001 10.18.154.3:7000 10.18.154.3:7001 10.18.154.4:7000 10.18.154.4:7001 二、安装Redis(10.18.154.2、10.18.154.3、10.18.154.4) 下载redis-3.2.1.tar.gz [root@localhost ~]# tar zxvf redis-3.2.1.tar.gz [root@localhost ~]# cd redis-3.2.1 [root@localhost redis-3.2.1]# make [root@localhost redis-3.2.1]# make install [root@localhost ~]# mv redis-3.2.1 /usr/local/redis [root@localhost ~]# cd /usr/local/redis/ [root@localhost ~]# mkdir /usr/local/cluster [root@localhost ~]# cp /usr/local/redis/redis.conf /usr/local/cluster/ [root@localhost ~]# vi /usr/local/cluster/redis.conf ##修改配置文件中的下面选项 port 7000 bind 10.18.154.2 127.0.0.1 daemonize yes#如果你想让它在后台运行,你就把它改成yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes [root@localhost ~]# mkdir /usr/local/cluster/7000 [root@localhost ~]# mkdir /usr/local/cluster/7001 [root@localhost ~]# cp /usr/local/cluster/redis.conf /usr/local/cluster/7000 [root@localhost ~]# cp /usr/local/cluster/redis.conf /usr/local/cluster/7001 [root@localhost ~]# cp /usr/local/cluster/redis.conf /usr/local/cluster/7002 [root@localhost 7000]# redis-server redis.conf ---启动redis服务##注意:拷贝完成之后要修改7001目录下面redis.conf文件中的port参数,分别改为对应的文件夹的名称 ##启动之后使用命令查看redis的启动情况ps -ef|grep redis

Redis集群研究

Redis Sentinel数据库M-S配置(Redis的分片与复制集技术) 1.Redis Sentinel介绍 Redis Sentinel是Redis官方提供的集群管理工具,主要有三大功能: 监控,能持续监控Redis的主从实例是否正常工作; 通知,当被监控的Redis实例出问题时,能通过API通知系统管理员或其他程序;自动故障恢复,如果主实例无法正常工作,Sentinel将启动故障恢复机制把一个从实例提升为主实例,其他的从实例将会被重新配置到新的主实例,且应用程序会得到一个更换新地址的通知。 Redis Sentinel是一个分布式系统,可以部署多个Sentinel实例来监控同一组Redis实例,它们通过Gossip协议来确定一个主实例宕机,通过 Agreement协议来执行故障恢复和配置变更,一般在生产环境中部署多个实例来提高系统可用性,只要有一个Sentinel实例运行正常,就能保证被监控的Redis实例运行正常(类似Zookeeper,通过多个Zookeeper来提高系统可用性); 2.Redis HA方案 HA的关键在于避免单点故障及故障恢复,在Redis Cluster未发布之前,Redis 一般以主/从方式部署(这里讨论的应用从实例主要用于备份,主实例提供读写,有不少应用是读写分离的,读写操作需要取不同的Redis实例,该方案也可用于此种应用,原理都是相通的,区别在于数据操作层如何封装),该方式要实现HA主要有如下几种方案: 1).keepalived:通过keepalived的虚拟IP,提供主从的统一访问,在主出现问题时,通过keepalived运行脚本将从提升为主,待主恢复后先同步后自动变为主,该方案的好处是主从切换后,应用程序不需要知道(因为访问的虚拟IP 不变),坏处是引入keepalived增加部署复杂性; 2).zookeeper:通过zookeeper来监控主从实例,维护最新有效的IP,应用通过zookeeper取得IP,对Redis进行访问; 3).sentinel:通过Sentinel监控主从实例,自动进行故障恢复,该方案有个缺陷:因为主从实例地址(IP&PORT)是不同的,当故障发生进行主从切换后,应用程序无法知道新地址,故在Jedis2.2.2中新增了对Sentinel的支持,应用通过 redis.clients.jedis.JedisSentinelPool.getResource()取得的Jedis 实例会及时更新到新的主实例地址。 笔者所在的公司先使用了方案1一段时间后,发现keepalived在有些情况下会导致数据丢失,keepalived通过shell脚本进行主从切换,配置复杂,而且keepalived成为新的单点,后来选用了方案3,使用Redis官方解决方案;(方

redis集群部署

redis 3.07的集群部署一:关于redis cluster 1:redis cluster的现状 1):节点自动发现 2):slave->master 选举,集群容错 3):Hot resharding:在线分片 4):进群管理:cluster xxx 5):基于配置(nodes-port.conf)的集群管理 6):ASK 转向/MOVED 转向机制. 2:redis cluster 架构 1) redis-cluster架构图 架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail是通过集群中超过半数的节点检测失效时才生效. (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护 node<->slot<->value 2) redis-cluster选举:容错 (1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉. (2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误 a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态. b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态. 二:redis cluster的使用 1:安装redis cluster所需软件

redis-cluster原理分析

Redis Cluster 原理分析 文章较长,如需转载可分段。转载请标明作者以及文章来源,谢谢! 作者介绍 姓名:李航 工作经历: 5年多互联网工作经验,先后在58同城,汽车之家,优酷土豆集团工作。目前主要在优酷土豆集团任职高级开发工程师,目前主要负责大数据基础平台Redis集群开发及运维等工作。主要关注领域Nginx,Redis,分布式系统,分布式存储。如果对nginx或者redis感兴趣的同学可以发简历到gaosong@https://www.wendangku.net/doc/aa10870102.html,。本文来源自“Redis技术交流群”线上分享。李航ID:Lucien_168。群主ID:gnuhpc。redis中国用户组qq群:374538650。后期的分享我们会同期进行。 这次主要是给大家分享的提纲如下: 1.简介 2.集群通信 3.数据分布及槽信息 4.数据迁移 5.通信故障 1.简介 继上次分享的优酷土豆的Redis服务平台化之路,这次着重来分享下Redis Cluster浅析,欢迎大家互相多交流学习。 Redis Cluster是一个高性能高可用的分布式系统。由多个Redis实例组成的整体,数据按照Slot存储分布在多个Redis实例上,通过Gossip协议来进行节点之间通信。

Redis Cluster功能特点如下: 1)所有的节点相互连接 2)集群消息通信通过集群总线通信,,集群总线端口大小为客户端服务端口+10000,这个 10000是固定值 3)节点与节点之间通过二进制协议进行通信 4)客户端和集群节点之间通信和通常一样,通过文本协议进行 5)集群节点不会代理查询 6)数据按照Slot存储分布在多个Redis实例上 7)集群节点挂掉会自动故障转移 8)可以相对平滑扩/缩容节点

redis twemproxy集群安装手册

一、概述 1、Redis集群安装有两种方式,第一种为编译源码安装,第二种为二进制安 装,具体选择哪一种方式根据实际情况决定。 2、本文档所使用版本如下: redis:redis-3.0.0-rc5 Twemproxy:nutcracker-0.4.0 autoconfig:2.69 3、常用Linux命令不清楚可以查看相关网站 4、本文档所述redis集群架构如下: 5、本文档使用120和121搭建redis集群,每台机器各启动两个redis实例 和一个twemproxy实例。Redis端口分别为6379 6380 6、采用源码编译方式安装需服务器具有访问外网权限,二进制安装不需求。 7、所有安装包均已上传至文件服务器 二、源码编译方式安装 1、安装automake 执行:yum install automake,出现如下输入Y完成安装:

2、libtool安装 执行:yum install libtool 出现如下输入yes完成安装 3、autoconfig安装 ①上传autoconf-2.69.tar.gz至/usr/local/src目录下 ②执行tar -xzvf autoconf-2.69.tar.gz ③cd autoconf-2.69 ④执行./configure ⑤执行make ⑥执行make install 至此,autoconfig安装完毕 4、redis安装 ①上传redis-3.0.0-rc5.zip至/usr/local/src目录下 ②执行unzip redis-3.0.0-rc5.zip ③执行cd redis-3.0.0-rc5 ④执行make&&make install ⑤执行mkdir /usr/local/redis ⑥执行cp src/redis-server src/redis-cli /usr/local/redis ⑦执行cd /usr/local/redis ⑧执行chmod 777 redis-server redis-cli ⑨执行./redis-server --port 6379 --save "" & 出现如下 ⑩执行./redis-cli -p 6379出现如下

Redis 集群部署手册

Redis集群部署手册 一.部署环境 OS:Red Hat Enterprise Linux Server release 6.7 Redis Version: 3.0.0 IP-01: 10.32.60.138 Port:6380,6381 IP-02:10.32.60.139 Port:6382,6383 IP-03:10.32.60.140 Port:6383,6384 主节点01:10.32.60.138:6380 主节点02:10.32.60.139:6382 主节点03:10.32.60.140:6384 从节点01:10.32.60.138:6381 从节点02:10.32.60.138:6383 从节点03:10.32.60.138:6385 二.安装路径 redis主目录:/opt/software/redis-server redis 配置文件目录:/etc/redis 日志存放目录:/opt/software/redis 三.Redis 安装配置 1.安装 #tar –xzvf redis-3.0.0.tar.gz 解压 #cd /opt/software/redis3.0.0 #make && make PREFIX=/opt/software/redis-server install 编译安装 #cp redis.conf /etc/redis/redis-6380.conf 配置文件 #cp redis.conf /etc/redis/redis-6381.conf 配置文件 2.配置 以10.32.60.138 6380 节点为例 redis 配置文件放在 /etc/redis 目录下,根据端口来配置节点 设置后台运行:改为daemonize yes 修改默认端口:port 6380其他节点根据端口号修改 使用默认的日志级别:loglevel notice 修改日志路径:改为logfile /opt/software/redis/redis-6380.log 其他节点根据端口号修改日志文件名称 注释rdb保存条件(这样在运行过程中将不触发rdb模式):改为 #save 900 1

redis集群配置参数及优化

Redis集群配置参数及优化 Redis的主要参数配置在redis.conf文件中。 1.conf 内存值 2.bind ip 默认情况下,如果没有指定“bind”配置指令,Redis将侦听服务器上可用的所有网络接口的连接。 默认情况:bind 127.0.0.1 实际配置:bind 本机ip 3.protected-mode yes 启用默认保护模式。只有当您确定您希望其他主机的客户端连接到Redis 时,您才应该禁用它,即使没有配置身份验证,也没有使用“bind”指令显式列出特定的接口集。 4.tcp-keepalive 300 如果非零,请使用SO_KEEPALIVE向没有通信的客户发送TCP协议。 这很有用,有两个原因: a)检测死同伴 b)从中间的网络设备的角度进行连接 在Linux上,指定的值(以秒为单位)是用于发送ack的周期。 注意,要关闭连接,需要双倍的时间。这个选项的合理值是300秒,这 是新的Redis默认值,从Redis 3.2.1开始。 5.timeout 0 在客户机空闲N秒后关闭连接(0到禁用) 6.port 6379 在指定端口上接受连接,默认值是6379 7.daemonize yes redis后台运行 8.pidfile /var/run/redis_6379.pid 如果指定了一个pid文件,Redis会在启动时指定,并在退出时删除它。 当服务器运行非守护进程时,如果配置中没有指定pid文件,则不会创建pid文件。当服务器被守护时,即使没有指定,也会使用pid文件,默认为“/var/run/redis.pid”。 创建一个pid文件是最好的工作:如果Redis不能创建它,那么服务器就会正常启动和运行。

redis集群搭建及配置

redis主从服务器搭建 修改记录 目录 redis主从服务器搭建 (1) 一.redis主从服务器搭建 (2) 第一步:下载redis (2) 第二步:解压redis tar包 (2) 第三步:进入reidis目录 (2) 第四步:make (2) 第五步:make install (3) 第六步:修改redis.conf 操作 (3) 第七步:redis从服务器配置 (4) 第八步:修改从服务redis.conf (4) 二.redis测试 (4) 第一步:编写redis客户端启动shell (4) 第二步:启动客户端 (5) 第三步:操作 (5) 第四步:set name test (5) 第五步:get name (5) 第六步:从服务器端启动客户端 (5) 第七步:从服务器端(10.105.76.100) get name (5) 三.sentinel配置及启动 (5) 第一步:修改sentinel.conf (6) 第二步启动sentinel (6)

第三步:启动sentinel (6) 一.redis主从服务器搭建 第一步:下载redis 在redis官网下载redis2.8.17版本 第二步:解压redis tar包 将下载的redis-2.8.17.tar.gz放在10.105.76.99(主服务器)上/usr/local下然后解压tar包命令:tar -zxvf redis-2.8.17.tar.gz 第三步:进入reidis目录 进入redis-2.8.17目录命令: cd redis-2.8.17 第四步:make make 或者make MALLOC=libc 如果使用make时报错(zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory)此时可使用make MALLOC=libc 出现下图说明make完成

redis集群搭建

redis集群搭建 现在项目上用redis的话,很少说不用集群的情况,毕竟如果生产上只有一台redis会有极大的风险,比如机器挂掉,或者内存爆掉,就比如我们生产环境曾今也遭遇到这种情况,导致redis内存不够挂掉的情况,当然这些都是我们及其不能容忍的,第一个必须要做到高可靠,其次才是高性能,好了,下面我来逐一搭建一下。 一:Redis集群搭建 1. 下载 首先去官网下载较新的3.2.0版本,下载方式还是非常简单的,比如官网介绍的这样。 $ wget http://download.redis.io/releases/redis-3.2.0.tar.gz $ tar xzf redis-3.2.0.tar.gz $ cd redis-3.2.0 $ make 2. redis配置 由于我们要做集群,而且还要redis自带的redis-trib.rb 能正常运行,我们需要在集群中开启三台master,三台slave,所以这里我需要建立6个文件 夹,而且文件夹的名称就使用端口地址的名字,比如:6389. 6380....6384。

3. config配置。 现在directory的分布情况大致如上图,接下来要做的事情就是配置redis.conf了,在这里需要配置四个选项。。。 <1> port 端口地址,比如6380文件夹下面的port就是6380, # Accept connections on the specified port, default is6379 (IANA #815344). # If port 0is specified Redis will not listen on a TCP socket. port 6379 <2> cluster-enabled 和cluster-config-file 这个顾名思义,首先需要开启redis的cluster模式,然后配置一个cluster-config-file文件,这个文件用于存放redis 的实时信息,redis会动态追加和修改这个conf下面的内容信息,不过要记住,这个nodes-6379.conf 可以根据端口文件夹依次配置,比如6380文件夹可以改成nodes-6380.conf这样。。。 # Normal Redis instances can't be part of a Redis Cluster; only nodes that are # started as cluster nodes can. In order to start a Redis instance as a

Windows下Redis集群搭建

Windows下搭建Redis集群 Redis 集群简介 Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。 Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。 Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。 集群搭建 要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时,强烈建议使用六个节点:其中三个为主节点,而其余三个则是各个主节点的从节点。 主节点崩溃,从节点的Redis就会提升为主节点,代替原来的主节点工作,崩溃的主Redis回复工作后,会成为从节点 1). 创建Redis集群目录 在redis安装的根目录下通过命令行创建6个以端口命名的文件夹 mkdir 7000 7001 7002 7003 7004 7005

将安装的redis文件夹中的redis.windows.conf以及redis-server,分别拷贝到新建的六个文件夹中 2). 更改配置 将六个文件夹下的redis.windows.conf文件中以下属性进行修改: port 7001(对应文件夹的端口号) cluster-enabled yes(开启实例的集群模式)去掉注释

redis4.0.x集群创建及验证

redis4.0.x集群搭建 一.集群搭建前提环境-ruby 因为redis集群环境基于ruby,所以需要先安装ruby运行环境。 采用rvm来安装或者升级ruby,因为有些服务器已经有了ruby,比如我买的阿里云好几台都是ruby2.0,你在安装redis集群时,执行gem install redis 安装接口命令就会报错: redis需要Ruby版本> = 2.2.2 告诉你最起码需要2.2.2的版本,因为现在redis4.0.x比较多,2.0版本低了,redis3.0貌似不会有这个问题。 --------------------------------------------------- 1.安装RVM:(以下每一行都是一条命令) gpg2 --keyserver hkp://https://www.wendangku.net/doc/aa10870102.html, --recv-keys D39DC0E3 curl -L get.rvm.io | bash -s stable 网速低的话装起来稍微慢点,装完后执行find进行查找,找到标红的rvm。 find / -name rvm -print / usr / local / rvm / usr / local / rvm / src / rvm /usr/local/rvm/src/rvm/bin/rvm /usr/local/rvm/src/rvm/lib/rvm /usr/local/rvm / src / rvm / scripts / rvm / usr / local / rvm / bin / rvm / usr / local / rvm / lib / rvm / usr / local / rvm / scripts / rvm 然后执行source命令: source /usr/local/rvm/scripts/rvm 2.查看RVM库中已知的ruby版本 rvm list known [ruby-] 1.8.6 [-p420] [ruby-] 1.8.7 [-head]#在头上发布的安全性 [ruby-] 1.9.1 [-p431] [ruby-] 1.9.2 [-p330 ]

Redis集群安装

Redis集群配置1.集群节点配置

2.启动集群 2.1 节点启动 redis-server **/redis.conf(节点配置文件) 2.2 建立集群 建立集群需要使用redis源码中src/redis-trib.rb脚本,因此要先安装ruby运行环境。 利用脚本建立集群后,节点中会记录集群的信息,再次启动时不需要重新建立集群。 因此ruby的运行环境不需要安装到redis节点主机上。 2.3.1 使用脚本建立集群 redis-trib.rb create --replicas 1 192.168.31.245:7000 192.168.31.245:7001 192.168.31.245:7002 192.168.31.210:7003 192.168.31.210:7004 192.168.31.210:7005 --replicas 1 每个master的备份节点数 2.3.2 安装ruby运行环境 ●安装rvm 参考https://rvm.io/ 非root用户运行 ◆gpg --keyserver hkp://https://www.wendangku.net/doc/aa10870102.html, --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB ◆\curl -sSL https://get.rvm.io | bash -s stable ●安装ruby rvm install ruby-2.4 ●安装ruby与redis的接口 gem install redis 3.Redis集群与单节点的不同 ●不支持多数据库,不支持切换数据库的select命令 ●集群节点使用redis端口号+10000的端口进行集群节点间的通信

redis集群部署

redis 3.07 的集群部署 一:关于redis cluster 1:redis cluster 的现状 1) : 节点自动发现 2) :slave->master 选举,集群容错 3) :Hot resharding: 在线分片 4) :进群管理:cluster xxx 5) : 基于配置(nodes-port.conf) 的集群管理 6) :ASK 转向/MOVED 转向机制. 2:redis cluster 架构 1) redis-cluster 架构图 架构细节: (1) 所有的redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽.

(2) 节点的fail 是通过集群中超过半数的节点检测失效时才生效. (3) 客户端与redis 节点直连,不需要中间proxy 层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 (4) redis-cluster 把所有的物理节点映射到[0-16383]slot 上,cluster 负责维护node<->slot<->value 2) redis-cluster 选举: 容错 (1) 领着选举过程是集群中所有master 参与,如果半数以上master 节点与master 节点通信超过(cluster-node-timeout), 认为当前master 节点挂掉. (2) : 什么时候整个集群不可用(cluster_state:fail), 当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down) 错误 a: 如果集群任意master 挂掉,且当前master 没有slave. 集群进入fail 状态,也可以理解成进群的slot 映射[0-16383] 不完成时进入fail 状态. b:如果进群超过半数以上master 挂掉,无论是否有slave 集群进入fail 状态.

Redis 集群应用学习

集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节点,来降低单节点服务器的压力。 上一篇我们讲到了Redis 的主从复制技术,当实现了多节点的master-slave 后,我们 也可以把它叫做集群,但我们今天要讲的集群主要是利用切片技术来组建的集群。 集群要实现的目的是要将不同的key 分散放置到不同的redis 节点,这里我们需要一个 规则或者算法,通常的做法是获取key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的key 无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。 一致性哈希有四个重要特征: 均衡性:也有人把它定义为平衡性,是指哈希的结果能够尽可能分布到所有的节点中去,这样可以有效的利用每个节点上的资源。 单调性:对于单调性有很多翻译让我非常的不解,而我想要的是当节点数量变化时哈希的结果应尽可能的保护已分配的内容不会被重新分派到新的节点。 分散性和负载:这两个其实是差不多的意思,就是要求一致性哈希算法对key 哈希应尽可能的避免重复。 但一致性哈希不是我们今天要介绍的重点,因为Redis 引入另一种哈希槽(hash slot) 的概念。 Redis 集群中内置了16384 个哈希槽,当需要在Redis 集群中放置一个key-value 时,redis 先对key 使用crc16 算法算出一个结果,然后把结果对16384 求余数,这样每个key 都会对应一个编号在0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。 使用哈希槽的好处就在于可以方便的添加或移除节点。 当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了; 当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了; 内部机制,与我何干,对于我们来说,在新增或移除节点的时候不要让我们先停掉所有的redis 服务我就谢天谢地了,这点它做到了。 下面我们就开始动手搭建一个redis 集群来体验一下。 因为我们要启动多个redis 实例,虽然我们可以直接通过命令行来启动,但始终是不怎么方便的,所以我们先来新建三个实例目录,分别是9001,9002,9003,目录名就是redis 实例的端口号。

redis集群教程

Redis 集群教程 本文档是Redis集群的一般介绍,没有涉及复杂难懂的分布式概念的赘述,只是提供了从用户角度来如何搭建测试以及使用的方法,如果你打算使用并深入了解Redis集群,推荐阅读完本章节后,仔细阅读Redis 集群规范一章. Redis 集群目前处于Alpha测试阶段, 如果使用过程中发现了问题,请到Redis 邮件列表发帖或者将错误提交到Redis的Github 页面上. Redis集群介绍 Redis 集群是一个提供在多个Redis间节点间共享数据的程序集. Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误. Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势: ?自动分割数据到不同的节点上. ?整个集群的部分节点失败或者不可达的情况下能够继续处理命令. Redis 集群的数据分片 Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念. Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么: ?节点A 包含0 到5500号哈希槽. ?节点B 包含5501 到11000 号哈希槽. ?节点C 包含11001 到16384号哈希槽. 这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点A, B, C中得部分槽到D上. 如果我像移除节点A,需要将A中得槽移到B和C节点上,然后将没有任何槽的A 节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态. Redis 集群的主从复制模型 为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品. 在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.

Redis Cluster介绍

Redis集群介绍 Redis集群实现的功能 Redis 集群是分布式(distributed)的Redis 实现,具有一定的容错性(fault-tolerant)和线性可扩展性(linear scalability)。 功能: 可线性扩展到上千个节点 可使数据自动路由到多个节点 实现了多个节点间的数据共享 可支持动态增加或删除节点 可保证某些节点无法提供服务时不影响整个集群的操作 不保证数据的强一致性 命令: 支持Redis所有处理单个数据库键的命令 不支持对多个数据库键的操作,比如MSET、SUNION 不能使用SELECT 命令,集群只使用默认的0号数据库 Redis集群的数据分布 Hash Slot Redis集群没有使用一致性hash,而是引入了哈希槽(Hash Slot)的概念。 Redis集群一共有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定对应哪个槽。 HASH_SLOT = CRC16(key) mod 16384 Node 每个主节点都负责处理16384 个哈希槽的其中一部分,由于Redis 集群的key被分割为16384 个slot,所以集群的最大节点数量也是16384 个。推荐的最大节点数量为1000个左右。 比如当前集群有3个节点A,B,C那么: 节点A 包含0 到5500号哈希槽 节点B 包含5501 到11000 号哈希槽 节点C 包含11001 到16383号哈希草槽 说明: 所有的哈希槽必须配置在集群中的某一个节点上。 节点和哈希槽之间的对应关系在搭建集群时配置,集群使用中也支持动态迁移

Redis集群的主从复制 节点分为主节点和从节点,为了保证集群的高可用性,每个主节点可配置多个从节点。主从节点数据不能保证强一致性,使用中有如下两种场景可能会发生写丢失的情况: 场景一:数据的异步复制 对集群中某一节点执行写操作过程: Step1 客户端向主节点B写入一条命令 Step2 主节点B向客户端回复命令状态 Step3 主节点将写操作复制给从节点B1, B2和B3 这里主节点对命令的复制工作发生在返回命令回复之后,如果Step3之前主节点B宕机,其中一个从节点升级为主节点后就出现了数据不一致的情况。 不过,如果每次处理命令请求都需要等待复制操作完成的话,那么主节点处理命令请求的速度将极大地降低,所以需要在性能和一致性之间做出权衡。Redis 集群可能会在将来提供同步写的方法。 场景二:节点间网络分区 假设集群包含A、B、C、A1、B1、C1六个节点,其中A、B、C为主节点,A1、B1、C1为A,B,C的从节点,还有一个客户端Z1。 假设集群中发生网络分区,那么集群可能会分为两方,大部分的一方包含节点A、C、A1、B1和C1,小部分的一方则包含节点B和客户端Z1 。 Z1仍然能够向主节点B中写入,如果网络分区发生时间较短,那么集群将会继续正常运作。如果分区的时间足够让大部分的一方将B1选举为新的master,那么Z1写入B中的数据便丢失了。 在网络分裂出现期间,客户端Z1 可以向主节点B 发送写命令的最大时间是有限制的,这一时间限制称为节点超时时间(node timeout),是Redis 集群的一个重要的配置选项:对于大多数一方来说,如果一个主节点未能在节点超时时间内重新联系上集群,那么集群会将这个主节点视为failing,并使用从节点来代替这个主节点继续工作。 对于少数一方,如果一个主节点未能在节点超时时间内重新联系上集群,那么它将停止处理写命令,并向客户端报告错误。 A1 A B B1 C1 C Z1 A1 A B1 C1 C B Z1 network partition

相关文档