Redis集群

http://doc.redisfans.com/topic/cluster-tutorial.html

redis 集群是为了多个节点之间数据的共享和集群高可用的保证。

redis 集群不支持同时处理多个键的redis命令,由于集群需要在多个redis之间迁移数据,在高负载的情况下这些命令会降低redis的性能,并导致不可预知的问题。

redis集群的好处

  • 将数据自动切分到多个不同的节点的能力。
  • 当集群中的某一部分不可用时,仍然可以处理命令请求的能力。

Redis 集群数据共享

  • redis 集群采用分片(sharding)而非一致性哈希(consistency hashing)来实现
  • 一个redis集群包含了 16384 个哈希槽(hash slot)
  • 使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽
  • 添加或删除节点都不会导致阻塞,因此也不会导致集群的不可用

添加或删除节点数据迁移:

1、添加节点,根据 CRC16(key) % 16384来从新计算节点数据分配并迁移相应节点数据。

2、删除节点,在节点数据迁移完毕后下线即可。

Redis 集群中的主从复制

  • Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。
  • 如果某个节点的 master 下线,则其 replica 会接管 master 的工作,使得集群继续可用。
  • 如果某个节点的 master 和所有 replica 都下线了,则会导致整个集群不可用。

Redis 集群的一致性保证(guarantee)

  • Redis 集群不保证数据的强一致性(strong consistency)
  • 在特定条件下, Redis 集群可能会丢失已经被执行过的写命令。
客户端->master:发送写命令
master->master:执行写命令
master->客户端:发送写成功命令
master->slave:发送复制命令(如果此时不可用,则会导致数据的不一致性\n如果等待slave复制完成,则会导致整个集群性能极低。)
  • Redis 集群另外一种可能会丢失命令的情况是, 集群出现网络分裂(network partition), 并且一个客户端与至少包括一个主节点在内的少数(minority)实例被孤立。

创建Redis集群的实例

最少选项的集群配置文件

port 端口
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

cluster-enabled 用于开启集群, cluster-conf-file 用于设定节点配置文件。

需要几个节点的集群,则根据最小配置分别创建几个存放配置文件的目录和配置文件并修改端口即可。

启动集群的每个节点: ./redis-server 配置文件所在位置

创建集群 redis-trib

创建新集群检查集群或者对集群进行重新分片reshared):

通过使用 Redis 集群命令行工具 redis-trib

如创建集群:

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
  • 给定 redis-trib.rb 程序的命令是 create , 这表示我们希望创建一个新的集群。
  • 选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
  • 之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。

检测和确认完成后,如果一切正常的话, redis-trib 将输出以下信息:

>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

对集群进行重新分片

重新分片并不会对正在运行的集群程序产生任何影响

$ ./redis-trib.rb reshard 127.0.0.1:7000

只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点。接下来根据需要的提示和需要做相应的操作即可。

添加新节点到集群

  • 添加的新节点是一个主节点
  • 添加的新节点是一个从节点

1、第一步要做的总是添加一个空节点。

和上述创建节点实例一样:

port 端口
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

2、启动节点

../../redis-server redis.conf

3、将新节点添加到集群里

./redis-trib.rb addnode 新节点IP:新节点端口 原有集群节点IP:原有集群某个主节点端口
如:
./redis-trib.rb addnode 127.0.0.1:7006 127.0.0.1:7000

此时,新节点已经连上集群;成为了集群的一部分。但是和其他主节点相比, 新节点还有两点区别:

  • 新节点没有包含任何数据, 因为它没有包含任何哈希槽。
  • 尽管新节点没有包含任何哈希槽, 但它仍然是一个主节点;因此在集群将某个从节点升级为新的主节点前, 这个新节点不会被选中。

4、使用redis-trib转移哈希槽数据到新节点

具体转移方式见前文。

在数据转移完毕后,新节点就会成为真正的主节点了。

5、如果是想让新增的节点成为从节点

在新节点中执行如下命令

redis 新增节点IP:新增节点端口> cluster replicate 新增节点所在主节点的ID
如:
redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

移除一个节点

1:如果删除的节点是主节点

1) 要把节点中的哈希槽转移到其他节点中

./redis-trib.rb reshard 127.0.0.1:7000

2) 根据系统提示输入需要删除节点哈希槽的数量

3) 根据系统提示输入要接收这些哈希槽的节点的ID

4) 完成后,输入要移除的节点ID,并输入 done 命令

5) 最后删除节点

./redis-trib.rb del-node 需要删除节点的IP:端口 需要删除节点的IP:端口

如:
./redis-trib.rb del-node 127.0.0.1:7006 127.0.0.1:7006

2:如果删除的节点是从节点

./redis-trib.rb del-node 127.0.0.1:7006 127.0.0.1:7006

Redis集群简记的更多相关文章

  1. Redis集群案例与场景分析

    1.背景 Redis的出现确实大大地提高系统大并发能力支撑的可能性,转眼间Redis的最新版本已经是3.X版本了,但我们的系统依然继续跑着2.8,并很好地支撑着我们当前每天5亿访问量的应用系统.想当年 ...

  2. Java Spring mvc 操作 Redis 及 Redis 集群

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...

  3. Redis集群搭建与简单使用

    介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. 两台虚拟机都是 CentOS ,一台 ...

  4. window下使用Redis Cluster部署Redis集群

    日常的项目很多时候都需要用到缓存.redis算是一个比较好的选择.一般情况下做一个主从就可以满足一些比较小的项目需要.在一些并发量比较大的项目可能就需要用到集群了,redis在Windows下做集群可 ...

  5. Redis集群~windows下搭建Sentinel环境及它对主从模式的实际意义

    回到目录 关于redis-sentinel出现的原因 Redis集群的主从模式有个最大的弊端,就是当主master挂了之前,它的slave从服务器无法提升为主,而在redis-sentinel出现之后 ...

  6. [个人翻译]Redis 集群教程(中)

    上一篇:http://www.cnblogs.com/li-peng/p/6143709.html 官方原文地址:https://redis.io/topics/cluster-tutorial  水 ...

  7. [个人翻译]Redis 集群教程(上)

    官方原文地址:https://redis.io/topics/cluster-tutorial  水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢.        这是 ...

  8. Redis集群(九):Redis Sharding集群Redis节点主从切换后客户端自动重新连接

    上文介绍了Redis Sharding集群的使用,点击阅读 本文介绍当某个Redis节点的Master节点发生问题,发生主从切换时,Jedis怎样自动重连新的Master节点 ​一.步骤如下: 1.配 ...

  9. Redis集群(八):Redis Sharding集群

    一.Redis目前的集群方案主要有两种:Redis Sharding和Redis Cluster 1.Redis Sharding:3.0以前基本上使用分片实现集群,目前主流方案,客户端实现 2.Re ...

随机推荐

  1. Java基础98 gson插件的使用

    1.要用到的包 2.实例 实体类 people package com.shore.entity; /** * @author DSHORE/2019-4-21 * */ public class P ...

  2. 测试开发之Django——No6.Django模板中的标签语言

    模板中的标签语言 1.if/else {% if  %} 标签检查(evaluate)一个变量,如果这个变量为真(即:变量存在,非空,不是布尔值假),系统会显示在{% if  %} 和 {% endi ...

  3. python接口自动化测试十一:传参数:data与json

    # 传json参数 import requests url = 'xxxxxxxx' body = {     'xxx': 'xxx',     'xxx': 'xxx' } # body是json ...

  4. Paget Object 设计模式编写selenium测试用例

    示例常规代码 baidu.py # _*_ coding:utf-8 _*_ import csv,unittest,time #导入csv模块 from time import sleep from ...

  5. 字符串反转,例如"abc"反转"cba"

    package stringyiwen; /* * 字符串反转,例如"abc"反转"cba" */public class StringTestChar { p ...

  6. linux下如何使用gdb调试

    gdb是linux下非常好用的一个调试工具,虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,这里简单介绍下gdb下常用的命令. 首先编译生成可执行文件(这里的test.c是一个简单的求前n ...

  7. hdu 1548 升降梯

    题目大意:有一个升降机,它有两个按钮UP和DOWN,给你一些数i表示层数,并且每层对应的Ki,如果按UP按钮,会从第i层升到第i+Ki层:如果按了DOWN则会从第i层降到第i-Ki层:并规定能到的层数 ...

  8. LICEcap方便快捷制作gif图片的工具

    总是看见别人的博客里面动态的小图片,是不是有种冲动自己也想搞,但是就是不知道咋搞,这里简单介绍一款很实用的制作gif的软件. LICEcap的网址:http://www.cockos.com/lice ...

  9. python函数式编程——匿名函数(lambda)

    匿名函数lambda lambda x:x*x x就是参数 相当于函数 def f(x): return x*x 匿名函数可以作为函数对象赋值给变量: >>> f = lambda ...

  10. Codeforces Round #447 (Div. 2)

    我感觉这场CF还是比较毒的,虽然我上分了... Problem A  QAQ 题目大意:给你一个由小写字母构成的字符串,问你里面有多少个QAQ. 思路:找字符串中的A然后找两边的Q即可,可以枚举找Q, ...