zoukankan      html  css  js  c++  java
  • redis(9)集群搭建

    一、搭建流程

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

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

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

    1)编译一个redis-server

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

    3)启动6个redis实例

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

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

    二、创建集群

    1)编译一个redis-server

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

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

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

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

    mkdir redis-cluster
    cd redis-cluster
    mkdir 7000 7001 7002 7003 7004 7005

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

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

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

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

    3)启动6个redis实例

    ./redis-server 7000/redis.conf

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

    查看一下启动进程:

    ps -ef | grep redis

    显示如下:

      501 37933     1   0  9:10PM ??         0:03.85 ../redis-server 127.0.0.1:7000 [cluster] 
      501 37941     1   0  9:11PM ??         0:03.82 ../redis-server 127.0.0.1:7001 [cluster] 
      501 37949     1   0  9:11PM ??         0:03.82 ../redis-server 127.0.0.1:7002 [cluster] 
      501 37968     1   0  9:11PM ??         0:03.75 ../redis-server 127.0.0.1:7003 [cluster] 
      501 37977     1   0  9:11PM ??         0:03.76 ../redis-server 127.0.0.1:7004 [cluster] 
      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连接

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

    然后采用redis-trib.rb创建集群(这里的 --replicas 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

    如果你最终看到:

    [OK] All 16384 slots covered

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

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

    ./redis-trib.rb check 127.0.0.1:7000

    输出内容如下:

    >>> Performing Cluster Check (using node 127.0.0.1:7000)
    M: ca34d6741d5b3f5bfc7941c652a09961fddb6d0a 127.0.0.1:7000
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    S: e04be0db2d11fb98133c163bd97426e0f3f2f540 127.0.0.1:7003
       slots: (0 slots) slave
       replicates ca34d6741d5b3f5bfc7941c652a09961fddb6d0a
    M: 048c96b56c043aab8d297b147cfe7068c74498c9 127.0.0.1:7002
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    M: b711233443a7a097511fc1681403f2d83b5c8773 127.0.0.1:7001
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: cb6ee10ec8a45f68efddc84b4acaf01fbd244627 127.0.0.1:7005
       slots: (0 slots) slave
       replicates 048c96b56c043aab8d297b147cfe7068c74498c9
    S: b630796514a48438d177fbe8f89610f1afe9b41f 127.0.0.1:7004
       slots: (0 slots) slave
       replicates b711233443a7a097511fc1681403f2d83b5c8773
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [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,并设置一个值:

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

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

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

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

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

    5-2、测试主从切换

    当前有6个实例

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

    我们先杀死7000

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

    检查现在集群情况

    lay-macdeAir:redis-cluster lay$ ./redis-trib.rb check 127.0.0.1:7001
    >>> Performing Cluster Check (using node 127.0.0.1:7001)
    M: b711233443a7a097511fc1681403f2d83b5c8773 127.0.0.1:7001
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: cb6ee10ec8a45f68efddc84b4acaf01fbd244627 127.0.0.1:7005
       slots: (0 slots) slave
       replicates 048c96b56c043aab8d297b147cfe7068c74498c9
    M: 048c96b56c043aab8d297b147cfe7068c74498c9 127.0.0.1:7002
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    M: e04be0db2d11fb98133c163bd97426e0f3f2f540 127.0.0.1:7003
       slots:0-5460 (5461 slots) master
       0 additional replica(s)
    S: b630796514a48438d177fbe8f89610f1afe9b41f 127.0.0.1:7004
       slots: (0 slots) slave
       replicates b711233443a7a097511fc1681403f2d83b5c8773
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [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

  • 相关阅读:
    自主学习1
    动手动脑10.28
    《程序员修炼之道》阅读笔记三
    《程序员修炼之道》阅读笔记
    11月20,21,22训练赛
    Rabbits(跳兔子)
    01背包变式(并查集+dp01背包)
    问题 I: 约会序列(两边枚举)
    问题 J: 直角三角形
    Cow Exhibition (01背包的负数处理)
  • 原文地址:https://www.cnblogs.com/lay2017/p/9275677.html
Copyright © 2011-2022 走看看