一、搭建流程

以下我们将构建这样一个redis集群:三个主节点,分别备有一个从节点,主节点之间相互通信,如果主节点挂掉,从节点将被提升为主节点。

redis集群至少需要3个redis实例

那么我们需要做以下几件事:

1)编译一个redis-server

2)创建6个redis.conf配置文件

3)启动6个redis实例

4)redis-trib.rb集群工具创建集群

其实redis的集群实现有难度,但是只是内部有难度,对于黑盒子操作的我们来说要实现redis集群只是需要创建多个单实例,然后通过集群工具创建各个单实例的集群关系,所以显得很简单。

二、创建集群

1)编译一个redis-server

  1. $ wget http://download.redis.io/releases/redis-4.0.10.tar.gz
  2. $ tar xzf redis-4.0.10.tar.gz
  3. $ cd redis-4.0.10
  4. $ make

这里不详细说明了,详细可以参考:https://www.cnblogs.com/lay2017/p/9248454.html

2)创建6个redis.conf配置文件

我们先创建以下文件夹目录:

  1. mkdir redis-cluster
  2. cd redis-cluster
  3. mkdir 7000 7001 7002 7003 7004 7005

然后我们将第一步编译出来的src/redis-server拷贝一份到redis-cluster下,然后把redis.conf拷贝6份分别放入到上面创建的6个文件夹内。

分别修改每个redis.conf的内容:

  1. port 7000 # 端口
  2. cluster-enabled yes # 开启集群
  3. cluster-config-file nodes.conf # 集群节点文件
  4. cluster-node-timeout 5000 # 超时时间
  5. appendonly yes # AOF日志开启
  6. daemonize yes # 守护进程方式运行

这里的port分别设置为:7000、7001、7002、7003、7004、7005

3)启动6个redis实例

  1. ./redis-server 7000/redis.conf

分别执行启动命令,加载redis.conf配置文件

查看一下启动进程:

  1. ps -ef | grep redis

显示如下:

  1. 501 37933 1 0 9:10PM ?? 0:03.85 ../redis-server 127.0.0.1:7000 [cluster]
  2. 501 37941 1 0 9:11PM ?? 0:03.82 ../redis-server 127.0.0.1:7001 [cluster]
  3. 501 37949 1 0 9:11PM ?? 0:03.82 ../redis-server 127.0.0.1:7002 [cluster]
  4. 501 37968 1 0 9:11PM ?? 0:03.75 ../redis-server 127.0.0.1:7003 [cluster]
  5. 501 37977 1 0 9:11PM ?? 0:03.76 ../redis-server 127.0.0.1:7004 [cluster]
  6. 501 37988 1 0 9:12PM ?? 0:03.76 ../redis-server 127.0.0.1:7005 [cluster]

则表示每个实例已经启动成功

4)redis-trib.rb创建集群

在src目录下自带了redis-trib.rb可以用于创建集群

但是在使用之前需要安装ruby(redis-trib.rb是用ruby写的),以及redis和ruby连接

  1. yum -y install ruby ruby-devel rubygems rpm-build
  2. gem install redis

然后采用redis-trib.rb创建集群(这里的 --replicas 1 表示每个主节点分配一个从节点)

  1. redis-trib.rb create --replicas 1 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 127.0.0.1:7006

如果你最终看到:

  1. [OK] All 16384 slots covered

说明集群创建完成,节点覆盖了所有的哈希槽

我们可以用命令检查一下目前的集群情况

  1. ./redis-trib.rb check 127.0.0.1:7000

输出内容如下:

  1. >>> Performing Cluster Check (using node 127.0.0.1:7000)
  2. M: ca34d6741d5b3f5bfc7941c652a09961fddb6d0a 127.0.0.1:7000
  3. slots:0-5460 (5461 slots) master
  4. 1 additional replica(s)
  5. S: e04be0db2d11fb98133c163bd97426e0f3f2f540 127.0.0.1:7003
  6. slots: (0 slots) slave
  7. replicates ca34d6741d5b3f5bfc7941c652a09961fddb6d0a
  8. M: 048c96b56c043aab8d297b147cfe7068c74498c9 127.0.0.1:7002
  9. slots:10923-16383 (5461 slots) master
  10. 1 additional replica(s)
  11. M: b711233443a7a097511fc1681403f2d83b5c8773 127.0.0.1:7001
  12. slots:5461-10922 (5462 slots) master
  13. 1 additional replica(s)
  14. S: cb6ee10ec8a45f68efddc84b4acaf01fbd244627 127.0.0.1:7005
  15. slots: (0 slots) slave
  16. replicates 048c96b56c043aab8d297b147cfe7068c74498c9
  17. S: b630796514a48438d177fbe8f89610f1afe9b41f 127.0.0.1:7004
  18. slots: (0 slots) slave
  19. replicates b711233443a7a097511fc1681403f2d83b5c8773
  20. [OK] All nodes agree about slots configuration.
  21. >>> Check for open slots...
  22. >>> Check slots coverage...
  23. [OK] All 16384 slots covered.

我们看到:

  master主节点是:7000、7001、7002,7003是7000的从节点、7004是7001的从节点、7005是7002的从节点;

  7000分配的哈希槽[0,5460],7001分配的哈希槽[5461,10922],7002分配的哈希槽[10923,16383]

5)测试

5-1、测试数据共享

我们使用redis-cli命令连接7000,并设置一个值:

  1. lay-macdeAir:redis-cluster lay$ ./redis-cli -c -p 7000
  2. 127.0.0.1:7000> set name lay
  3. -> Redirected to slot [5798] located at 127.0.0.1:7001
  4. OK

这里redirected to slot [5798] ... 7001,表示name 这个key计算出的哈希槽,落在[5461, 10922] 范围内,所以重定向到了7001这个节点。

我们连接7001,执行获取这个值:

  1. lay-macdeAir:redis-cluster lay$ ./redis-cli -c -p 7001
  2. 127.0.0.1:7001> get name
  3. "lay"

我们发现我们从7001中获取7000设置的值,集群的数据共享成功。

5-2、测试主从切换

当前有6个实例

  1. 501 37933 1 0 9:10PM ?? 0:03.85 ../redis-server 127.0.0.1:7000 [cluster]
  2. 501 37941 1 0 9:11PM ?? 0:03.82 ../redis-server 127.0.0.1:7001 [cluster]
  3. 501 37949 1 0 9:11PM ?? 0:03.82 ../redis-server 127.0.0.1:7002 [cluster]
  4. 501 37968 1 0 9:11PM ?? 0:03.75 ../redis-server 127.0.0.1:7003 [cluster]
  5. 501 37977 1 0 9:11PM ?? 0:03.76 ../redis-server 127.0.0.1:7004 [cluster]
  6. 501 37988 1 0 9:12PM ?? 0:03.76 ../redis-server 127.0.0.1:7005 [cluster]

我们先杀死7000

  1. lay-macdeAir:redis-cluster lay$ kill -9 37933
  2. lay-macdeAir:redis-cluster lay$ ps -ef|grep redis
  3. 501 37941 1 0 9:11PM ?? 0:05.08 ../redis-server 127.0.0.1:7001 [cluster]
  4. 501 37949 1 0 9:11PM ?? 0:05.08 ../redis-server 127.0.0.1:7002 [cluster]
  5. 501 37968 1 0 9:11PM ?? 0:05.02 ../redis-server 127.0.0.1:7003 [cluster]
  6. 501 37977 1 0 9:11PM ?? 0:05.00 ../redis-server 127.0.0.1:7004 [cluster]
  7. 501 37988 1 0 9:12PM ?? 0:05.01 ../redis-server 127.0.0.1:7005 [cluster]

检查现在集群情况

  1. lay-macdeAir:redis-cluster lay$ ./redis-trib.rb check 127.0.0.1:7001
  2. >>> Performing Cluster Check (using node 127.0.0.1:7001)
  3. M: b711233443a7a097511fc1681403f2d83b5c8773 127.0.0.1:7001
  4. slots:5461-10922 (5462 slots) master
  5. 1 additional replica(s)
  6. S: cb6ee10ec8a45f68efddc84b4acaf01fbd244627 127.0.0.1:7005
  7. slots: (0 slots) slave
  8. replicates 048c96b56c043aab8d297b147cfe7068c74498c9
  9. M: 048c96b56c043aab8d297b147cfe7068c74498c9 127.0.0.1:7002
  10. slots:10923-16383 (5461 slots) master
  11. 1 additional replica(s)
  12. M: e04be0db2d11fb98133c163bd97426e0f3f2f540 127.0.0.1:7003
  13. slots:0-5460 (5461 slots) master
  14. 0 additional replica(s)
  15. S: b630796514a48438d177fbe8f89610f1afe9b41f 127.0.0.1:7004
  16. slots: (0 slots) slave
  17. replicates b711233443a7a097511fc1681403f2d83b5c8773
  18. [OK] All nodes agree about slots configuration.
  19. >>> Check for open slots...
  20. >>> Check slots coverage...
  21. [OK] All 16384 slots covered.

我们看到7000挂掉以后它的从节点7003提升为了主节点,并且所有16384个哈希槽都覆盖了

如果要恢复7000,我们只需要把7000这个实例重新启动即可,redis的从节点会自动重新连接,并复制主节点数据。关于redis主从复制可以参考:https://redis.io/topics/replication

注意:redis不是强一致性,主从节点之间的数据可能会不一致

以上我们简单实现了redis-cluster模块的集群效果,更多功能如:添加、删除节点、移动哈希槽等参考入门文档:https://redis.io/topics/cluster-tutorial

以及官方给了一份明细文档详细讲解一些集群的内部实现:https://redis.io/topics/cluster-spec

redis(9)集群搭建的更多相关文章

  1. Redis本地集群搭建(5版本以上)

    Redis本地集群搭建(5版本以上) 2019年11月3日10:05:48 步骤 1.下载安装Redis的安装包 2.复制5份,一共6份Redis的解压安装版,修改每个Redis节点的端口并开启节点 ...

  2. redis的集群搭建(很详细很详细)

    说在前面的话 之前有一节说了redis单机版的搭建和使用jedis管理redis单机版和集群版, 本节主要讲一下redis的集群搭建. 跳转到jedis管理redis的使用 认识redis集群 首先我 ...

  3. linux环境下redis安装(redis伪集群搭建)

    redis在linux环境下搭建 1.创建目录 [root@192 local]# mkdir /usr/local/redis 2.下载redis,并解压 [root@192 local]# wge ...

  4. Redis Cluster集群搭建与配置

    Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...

  5. Redis Cluster集群搭建与应用

    1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...

  6. Redis笔记-集群搭建

    Redis单机版搭建上一篇已经基本介绍了,下面讨论Redis集群搭建方案和示例. 1.关于Redis常用的集群方案(三种): a.一主多从,如一个Master.两个Slave b.薪火相传,即集群中的 ...

  7. Redis的搭建和Redis的集群搭建

    1.Redis的官网:https://redis.io/      Redis的测试网站:http://try.redis.io/ 2.参考博客:https://www.cnblogs.com/maf ...

  8. 【Redis】Redis cluster集群搭建

    Redis集群基本介绍 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation. Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行 ...

  9. redis主从集群搭建及容灾部署(哨兵sentinel)

    Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 Redis安装 整体架构 Redis主从结构搭建 Redis容灾部署(哨兵sentinel) Redis常见问题 ...

  10. Redis Cluster集群搭建<原>

    一.环境配置 一台window 7上安装虚拟机,虚拟机中安装的是centos系统. 二.目标     Redis集群搭建的方式有多种,根据集群逻辑的位置,大致可以分为三大类:基于客户端分片的Redis ...

随机推荐

  1. Django-03视图层

    5.1 视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片 ...

  2. Python 中当前位置以及目录文件遍历操作

    Python 中当前位置以及目录文件遍历操作 当前位置 print(os.path.dirname(__file__)) 其中 dirname 会选择目录(文件夹),"__file__&qu ...

  3. [bzoj4445] [SCOI2015]小凸想跑步 (半平面交)

    题意:凸包上一个点\(p\),使得\(p\)和点\(0,1\)组成的三角形面积最小 用叉积来求: \(p,i,i+1\)组成的三角形面积为: (\(\times\)为叉积) \((p_p-i)\tim ...

  4. JAVA 集合随笔

    JAVA中提供了现成操纵数据的集合,使得我们在开发中基本不用自己动手实现复杂的数据结构,来保存和操纵数据. 所以当我们有了基本的数据结构知识,会合理利用JAVA提供的集合就好啦. JDK1.8;(仅列 ...

  5. 标准结构篇:4)EMC电磁兼容

    本章目的:电磁兼容EMC概念,及预防控制手段. 1.前言:电磁兼容EMC概述 电磁兼容是一门新兴的综合性学科.电磁兼容学科主要研究的是如何使在同一电磁环境下工作的各种电气电子设备和元器件都能正常工作, ...

  6. scikit-learn中predict_proba用法 (与predict的区别)

    predict_proba返回的是一个 n 行 k 列的数组, 第 i 行 第 j 列上的数值是模型预测 第 i 个预测样本为某个标签的概率,并且每一行的概率和为1. # conding :utf-8 ...

  7. CentOS&.NET Core初试-1-CentOS的安装和网卡的配置

    系列目录 CentOS的安装和网卡的配置 安装.NET Core SDK和发布网站 Nginx的安装和配置 安装守护服务(Supervisor) 软件环境 系统版本:CentOS Linux rele ...

  8. cookie session token详解

    cookie session token详解 转自:http://www.cnblogs.com/moyand/ 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, ...

  9. openerp学习笔记 对象继承,对象初始化数据

    1.对象继承     _inherit = "product.product" 继承产品对象,给产品对象添加字段或方法,不需要设置 _name._table 等属性     注意: ...

  10. 浅谈Cordova优缺点与环境部署(转载)

    浅谈Cordova优缺点与环境部署 作者:苏华杰 简介 Cordova是一个用基于HTML.CSS和JavaScript的,用于创建跨平台移动应用程序的快速开发平台.它使开发者能够利用iPhone.A ...