一、Redis集群搭建说明

基于三台虚拟机部署9个节点,一台虚拟机三个节点,创建出4个master、4个slave的Redis集群。

Redis 集群搭建规划,由于集群至少需要6个节点(3主3从模式),因为我这里有三台虚拟机,因此每台虚拟机部署了3个节点。

1、下载地址:

  1. https://redis.io/download

2、解压(三个节点,这里仅以master节点为例)

  1. [root@master mnt]# tar -zxvf redis-4.0.2.tar.gz
  1. [root@master mnt]# mv redis-4.0.2 redis

3、由于我下载的是最新版未编译版本,所以安装之前需要安装c的依赖包(三个节点,这里仅以master节点为例)

  1. [root@master mnt]# yum install -y gcc-c++

4、执行make操作(三个节点,这里仅以master节点为例)

  1. [root@master mnt]# cd redis
  1. [root@master mnt]# make
    等待执行完成

5、将 redis-trib.rb 复制到 /usr/local/bin 目录下(三个节点,这里仅以master节点为例)

  1. [root@master redis]# cd src/c
  2. [root@master src] cp redis-trib.rb /usr/local/bin/ 

6、创建Redis节点(三个节点,这里仅以master节点为例)

  1. master节点:进入redis目录,创建redis_cluster 目录;

[root@master redis]# pwd
/mnt/redis
[root@master redis]# mkdir redis_cluster

在redis_cluster目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这两个目录中

  1. [root@master redis]# cd redis_cluster/
  2. [root@master redis_cluster]# mkdir 7000
  3. [root@master redis_cluster]# mkdir 7001
    [root@master redis_cluster]# mkdir 7002
  1. [root@master redis_cluster]# ll
    总用量 0
    drwxr-xr-x 2 root root 6 4 26 11:39 7000
    drwxr-xr-x 2 root root 6 4 26 11:39 7001
    drwxr-xr-x 2 root root 6 4 26 11:39 7002

[root@master redis]# pwd
/mnt/redis
[root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7000

[root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7001

[root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7002

分别修改这两个配置文件,修改内容如下:

  1. [root@master redis_cluster]# cd 7000
    [root@master 7000]# ls
  2. redis.conf

    文件配置:
    port 7000 //端口7000
    bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
    daemonize yes //redis后台运行
    pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
    cluster-enabled yes //开启集群 把注释#去掉
    cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
    cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
    appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
  1. [root@master 7001]# ls
  2. redis.conf
    文件配置:
    port 7001 //端口7001
    bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
    daemonize yes //redis后台运行
    pidfile /var/run/redis_7001.pid //pidfile文件对应7000,7001,7002
    cluster-enabled yes //开启集群 把注释#去掉
    cluster-config-file nodes_7001.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
    cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
    appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志

  1. [root@master 7002]# ls
  2. redis.conf
    文件配置:
    port 7002 //端口7001
    bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
    daemonize yes //redis后台运行
    pidfile /var/run/redis_7002.pid //pidfile文件对应7000,7001,7002
    cluster-enabled yes //开启集群 把注释#去掉
    cluster-config-file nodes_7002.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
    cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
    appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志

然后在节点slave01、slave02下重复第6步操作,把目录改为7003、7004、7005、7006、7007、7008,相应的配置文件也是如此。

7、第6步配置完成之后,启动各个节点

  1. master节点:
    [root@master mnt]# cd /mnt/redis/src/
  2. [root@master src]# redis-server /mnt/redis/redis_cluster/7000/redis.conf
    [root@master src]# redis-server /mnt/redis/redis_cluster/7001/redis.conf
    [root@master src]# redis-server /mnt/redis/redis_cluster/7002/redis.conf

  1. 报错:
    [root@master src]# redis-server redis_cluster/7000/redis.conf
    -bash: redis-server: 未找到命令
    解决:
    [root@master src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
  1. [root@slav01 src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
  1. [root@slave02 src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
  1. slava01节点:
  1. [root@slave01 src]# redis-server /mnt/redis/redis_cluster/7003/redis.conf
    [root@slave01 src]# redis-server /mnt/redis/redis_cluster/7004/redis.conf
    [root@slave01 src]# redis-server /mnt/redis/redis_cluster/7005/redis.conf
  1. slave02节点:
  1. [root@slave02 src]# redis-server /mnt/redis/redis_cluster/7006/redis.conf
    [root@slave02 src]# redis-server /mnt/redis/redis_cluster/7007/redis.conf
    [root@slave02 src]# redis-server /mnt/redis/redis_cluster/7008/redis.conf
  1.  

8、检查Redis的启动情况

  1. master节点:
  1. slave01节点:

  1. slave02节点:

9、创建集群

创建集群之前先安装ruby和gem

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

说明:在master、slave01、slave02节点执行gem install redis 报错:

  1. redis requires Ruby version >= 2.2.2的报错,查了资料发现是Centos默认支持ruby2.0.0,可gem 安装redis需要最低是2.2.2
  1. 解决办法是 先安装rvm,再把ruby版本提升至2.3.3
  2. 1.安装curl
  3. sudo yum install curl
  4. 2. 安装RVM
  5. curl -L get.rvm.io | bash -s stable
    报错:

解决:分别执行:

curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
 curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -

  1. 再次执行:
  1. curl -L get.rvm.io | bash -s stable
    出现如下情况,说明成功


    3source /usr/local/rvm/scripts/rvm
    4. 查看rvm库中已知的ruby版本
    rvm list known
    5. 安装一个ruby版本
    rvm install 2.3.3
    6. 使用一个ruby版本
    rvm use 2.3.3
    7. 删除默认版本
    rvm remove 2.0.0
    8. 查看一个已知版本
    ruby --version
    9. 再安装redis就可以了
    gem install redis
    10、如下说明安装成功

[root@slave01 7002]# gem install redis
 Fetching: redis-4.1.0.gem (100%)
 Successfully installed redis-4.1.0
 Parsing documentation for redis-4.1.0
 Installing ri documentation for redis-4.1.0
 Done installing documentation for redis after 2 seconds
 1 gem installed

然后再创建集群(因为如下这个是通过ruby工具实现的,所以执行这个之前先安装了ruby):

Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第5步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。

  1. redis-trib.rb  create  --replicas  1 192.168.200.100:7000 192.168.200.100:7001 192.168.200.100:7002 192.168.200.101:7003  192.168.200.101:7004 192.168.200.101:7005 192.168.200.102:7006  192.168.200.102:7007 192.168.200.102:7008

结果:

  1. [root@master ~]# redis-trib.rb create --replicas 1 192.168.200.100:7000 192.168.200.100:7001 192.168.200.100:7002 192.168.200.101:7003 192.168.200.101:7004 192.168.200.101:7005 192.168.200.102:7006 192.168.200.102:7007 192.168.200.102:7008
  2. >>> Creating cluster
  3. >>> Performing hash slots allocation on 8 nodes...
  4. Using 4 masters:
  5. 192.168.200.100:7001
  6. 192.168.200.101:7003
  7. 192.168.200.102:7006
  8. 192.168.200.100:7002
  9. Adding replica 192.168.200.101:7004 to 192.168.200.100:7001
  10. Adding replica 192.168.200.102:7007 to 192.168.200.101:7003
  11. Adding replica 192.168.200.101:7005 to 192.168.200.102:7006
  12. Adding replica 192.168.200.102:7008 to 192.168.200.100:7002
  13. M: 39a9030929f691a63a4960e5f7fba90b15bdf477 192.168.200.100:7001
  14. slots:0-4095 (4096 slots) master
  15. M: e5bc3280725eeb017f6b99894738e96d039a1cf8 192.168.200.100:7002
  16. slots:12288-16383 (4096 slots) master
  17. M: dbab7ff79b07a7506f7b34da18fb242545476181 192.168.200.101:7003
  18. slots:4096-8191 (4096 slots) master
  19. S: 3629e37c0cc43b89dbce2492a5cc6850f505f86b 192.168.200.101:7004
  20. replicates 39a9030929f691a63a4960e5f7fba90b15bdf477
  21. S: d4e021e5fc98719f177aa65cbceaeb0148bed269 192.168.200.101:7005
  22. replicates db55b7bfc09b45a5b6beaed32709ce004e0f210e
  23. M: db55b7bfc09b45a5b6beaed32709ce004e0f210e 192.168.200.102:7006
  24. slots:8192-12287 (4096 slots) master
  25. S: 43dd4ba558794561e1445a7cf03dec26d94fc880 192.168.200.102:7007
  26. replicates dbab7ff79b07a7506f7b34da18fb242545476181
  27. S: a7eabb7752d507b558c43d3323fbdae2ad93c6a7 192.168.200.102:7008
  28. replicates e5bc3280725eeb017f6b99894738e96d039a1cf8
  29. Can I set the above configuration? (type 'yes' to accept): yes
  30. >>> Nodes configuration updated
  31. >>> Assign a different config epoch to each node
  32. >>> Sending CLUSTER MEET messages to join the cluster
  33. Waiting for the cluster to join.......
  34. >>> Performing Cluster Check (using node 192.168.200.100:7001)
  35. M: 39a9030929f691a63a4960e5f7fba90b15bdf477 192.168.200.100:7001
  36. slots:0-4095 (4096 slots) master
  37. 1 additional replica(s)
  38. M: e5bc3280725eeb017f6b99894738e96d039a1cf8 192.168.200.100:7002
  39. slots:12288-16383 (4096 slots) master
  40. 1 additional replica(s)
  41. S: a7eabb7752d507b558c43d3323fbdae2ad93c6a7 192.168.200.102:7008
  42. slots: (0 slots) slave
  43. replicates e5bc3280725eeb017f6b99894738e96d039a1cf8
  44. S: 3629e37c0cc43b89dbce2492a5cc6850f505f86b 192.168.200.101:7004
  45. slots: (0 slots) slave
  46. replicates 39a9030929f691a63a4960e5f7fba90b15bdf477
  47. M: db55b7bfc09b45a5b6beaed32709ce004e0f210e 192.168.200.102:7006
  48. slots:8192-12287 (4096 slots) master
  49. 1 additional replica(s)
  50. M: dbab7ff79b07a7506f7b34da18fb242545476181 192.168.200.101:7003
  51. slots:4096-8191 (4096 slots) master
  52. 1 additional replica(s)
  53. S: 43dd4ba558794561e1445a7cf03dec26d94fc880 192.168.200.102:7007
  54. slots: (0 slots) slave
  55. replicates dbab7ff79b07a7506f7b34da18fb242545476181
  56. S: d4e021e5fc98719f177aa65cbceaeb0148bed269 192.168.200.101:7005
  57. slots: (0 slots) slave
  58. replicates db55b7bfc09b45a5b6beaed32709ce004e0f210e
  59. [OK] All nodes agree about slots configuration.
  60. >>> Check for open slots...
  61. >>> Check slots coverage...
  62. [OK] All 16384 slots covered.

测试一下,进行集群验证:

  在192.168.200.100节点上连接192.168.200.102节点的7008端口:

  1. [root@master src]# ./redis-cli -h 192.168.200.102 -c -p 7008
  2. 192.168.200.102:7008> set hello world
  3. -> Redirected to slot [866] located at 192.168.200.100:7001
  4. OK

    创建了一个keyhello,值为world
    查看:
  1. 然后在通过192.168.200.101节点访问该数据:

    说明:上面可以看到进行getset的时候节点跳转到了7000端口所在的节点(192.168.200.100)。详细请查阅原理如下:

以上说明:Redis集群已经搭建好啦!!!!!!!!!!!!!!!!!!!!!!

查看集群状态:

二、简单说一下原理

1、Redis clutser在设计的时候,就考虑到了去中心话,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取其他节点的数据。

2、Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽(hash slot)的方式来分配的。redis cluster默认分配了16384个槽(slot),当我们set一个key时,会采用CRC16算法来取模得到所属的slot,然后将这个key分配到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16834.所以我们在测试的时候可以看到set和get的时候,直接跳转到了7000端口的节点。

3、Redis集群会把数据存在一个master的主节点,然后在这个master和其对应的slave之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的master节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

Redis学习之路(二)Redis集群搭建的更多相关文章

  1. Redis——学习之路二(初识redis服务器命令)

    上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息   s ...

  2. Redis学习笔记(九)——集群

     一.概述 Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代. Redis Cluster是去中心化,去中间件,也就是说,集群中的每个节点都是平等的关 ...

  3. redis 5.0.3 讲解、集群搭建

    REDIS 一 .redis 介绍 不管你是从事Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业务代码的程序员,实际工作中或许只用到了 ...

  4. redhat6.5 redis单节点多实例3A集群搭建

    在进行搭建redis3M 集群之前,首先要明白如何在单节点上完成redis的搭建. 单节点单实例搭建可以参看这个网:https://www.cnblogs.com/butterflies/p/9628 ...

  5. kafka学习(二)-zookeeper集群搭建

    zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是h ...

  6. Zookeeper(二) zookeeper集群搭建 与使用

    一.zookeeper集群搭建 鉴于 zookeeper 本身的特点,服务器集群的节点数推荐设置为奇数台.我这里我规划为三台, 为别为 hadoop01,hadoop02,hadoop03    1. ...

  7. Redis学习笔记(十七) 集群(上)

    Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移操作. 一个Redis集群通常由多个节点组成,在刚开始的时候每个节点都是相互独立的,他们处于一个只包含 ...

  8. Zookeeper学习之路 (二)集群搭建

    ZooKeeper 软件安装须知 鉴于 ZooKeeper 本身的特点,服务器集群的节点数推荐设置为奇数台.我这里我规划为三台, 为别为 hadoop1,hadoop2,hadoop3 ZooKeep ...

  9. Redis 学习之路 (010) - redis命令手册

    Redis 键(key) 命令 命令 描述 Redis DEL 命令 该命令用于在 key 存在是删除 key. Redis Dump 命令 序列化给定 key ,并返回被序列化的值. Redis E ...

  10. Etcd学习(二)集群搭建Clustering

    1.单个etcd节点(测试开发用) 之前我一直开发测试一直是用的一个Etcd节点,然后启动命令一直都是直接打一个etcd(我已经将etcd安装目录的bin目录加入到PATH环 境变量中),然后启动信息 ...

随机推荐

  1. Python爬虫学习遇到的问题

    老猿在学习Python中爬虫知识时遇到了如下问题: 爬取网页内容后写入文件报错UnicodeEncodeError: 'gbk' codec can't encode的问题解决方案 urllib.re ...

  2. MDX非常规百分比算法-过滤数据后的百分比

    网上有很多关于占比的帖子,基本上都是按照层次结构来做的,比如某个子项占总体的百分比(\all).某个子项占父项的百分比(\parent).某个子项占其祖先的百分比(\ancestor)....等等,如 ...

  3. SQL Injection (Blind) Low

    SQL盲注分析 盲注较普通注入难度会有所增加,根据页面响应不同大概分为以下几种:布尔型盲注:时间盲注:报错注入 普通注入与盲注的对比: 普通注入:                            ...

  4. 百度前端技术学院-基础-day25-27

    倒数开始 滴答滴 滴答滴 task1 题目: 我们现在来做一个最简单的时钟,通过小练习来学习 Date,复习定时,然后再练习一下函数的封装具体需求如下: 在页面中显示当前日期及时间,按秒更新 格式为 ...

  5. bootstrap table 控制checkbox在某些状态不显示

    首先columns:[{field:'column',checkbox:true}];然后设置$("#tableName").bootstrapTable('hideColumn' ...

  6. redis学习之——主从复制(replication)

    准备:拥有linux环境,并安装redis mater:主机,进行写操作 slave:从机,进行读操作 一.配置 继续前边的学习.我们是拷贝redis.conf,文件到了/root /redis 下. ...

  7. rsync 参数说明及使用参数笔记好文摘抄

    一.前言 最近发现rsync挺好用的--不过参数有点多,所以这儿写一篇给自己以后要用的时候做个参考. 二.参数说明 这儿全是我翻资料连蒙带猜(有些实在是不好解释)翻译出来的,请各位转载的留个名啊,虽然 ...

  8. 手动实现Promise.all()

    Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例. Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每 ...

  9. 圆周率PI

    import math import time scale=30 s,m,=1,2 total,s,n,t=0.0,1,1.0,1.0 print("执行开始".center(sc ...

  10. Springboot mini - Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...