zoukankan      html  css  js  c++  java
  • Redis单机多节点集群实验

    第一步:安装Redis

    前面已经安装过了 不解释,

    Reids安装包里有个集群工具,要复制到/usr/local/bin里去

    cp redis-3.2.9/src/redis-trib.rb /usr/local/bin

     

    第二步:修改配置,创建节点

    我们现在要搞六个节点,三主三从,

    端口规定分别是7001,7002,7003,7004,7005,7006

    我们先在root目录下新建一个redis_cluster目录,然后该目录下再创建6个目录,

    分别是7001,7002,7003,7004,7005,7006,用来存在redis配置文件;

    这里我们要使用redis集群,要先修改redis的配置文件redis.conf

    mkdir redis_cluster 新建目录

    [root@localhost ~]# cd redis_cluster/

    [root@localhost redis_cluster]# mkdir 7001 7002 7003 7004 7005 7006

    [root@localhost redis_cluster]# ll

    总用量 0

    drwxr-xr-x. 2 root root 6 7月  27 17:18 7001

    drwxr-xr-x. 2 root root 6 7月  27 17:18 7002

    drwxr-xr-x. 2 root root 6 7月  27 17:18 7003

    drwxr-xr-x. 2 root root 6 7月  27 17:18 7004

    drwxr-xr-x. 2 root root 6 7月  27 17:18 7005

    drwxr-xr-x. 2 root root 6 7月  27 17:18 7006

    [root@localhost redis_cluster]# 

     

    先复制一份配置文件到7001目录下

    [root@localhost redis_cluster]# cd

    [root@localhost ~]# cp redis-3.2.9/redis.conf redis_cluster/7001/

     

    我们修改下这个配置文件

    vi redis_cluster/7001/redis.conf

    修改一下几个

    port 7001  //六个节点配置文件分别是7001-7006

    daemonize yes        //redis后台运行

    pidfile /var/run/redis_7001.pid   //pidfile文件对应7001-7006

    cluster-enabled yes   //开启集群

    cluster-config-file nodes_7001.conf  //保存节点配置,自动创建,自动更新对应7001-7006

    cluster-node-timeout 5000    //集群超时时间,节点超过这个时间没反应就断定是宕机

    appendonly yes   //存储方式,aof,将写操作记录保存到日志中

     

    7001下的修改完后,我们把7001下的配置分别复制到7002-7006 然后对应的再修改下配置即可;

    [root@localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7002/

    [root@localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7003/

    [root@localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7004/

    [root@localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7005/

    [root@localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7006/

     

    [root@localhost ~]# vi redis_cluster/7002/redis.conf 

    [root@localhost ~]# vi redis_cluster/7003/redis.conf 

    [root@localhost ~]# vi redis_cluster/7004/redis.conf 

    [root@localhost ~]# vi redis_cluster/7005/redis.conf 

    [root@localhost ~]# vi redis_cluster/7006/redis.conf 

    编辑后面5个配置文件,把 port ,pidfile,cluster-config-file 分别修改下即可;

     

     

    第三步:启动六个节点的redis

    [root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7001/redis.conf 

    [root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7002/redis.conf 

    [root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7003/redis.conf 

    [root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7004/redis.conf 

    [root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7005/redis.conf 

    [root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7006/redis.conf 

    启动六个节点

    [root@localhost ~]# ps -ef | grep redis  

    查找下redis进程

    root       9501      1  0 17:38 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]

    root       9512      1  0 17:45 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7002 [cluster]

    root       9516      1  0 17:45 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]

    root       9520      1  0 17:45 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]

    root       9524      1  0 17:45 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7005 [cluster]

    root       9528      1  0 17:45 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]

    说明都启动成功了

     

    第四步:创建集群

    redis官方提供了redis-trib.rb工具,第一步里已经房到里bin下 ;

    但是在使用之前 需要安装ruby,以及redis和ruby连接

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

    gem install redis

     

    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

    创建集群

    [root@localhost ~]# 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

    >>> Creating cluster

    >>> Performing hash slots allocation on 6 nodes...

    Using 3 masters:

    127.0.0.1:7001

    127.0.0.1:7002

    127.0.0.1:7003

    Adding replica 127.0.0.1:7004 to 127.0.0.1:7001

    Adding replica 127.0.0.1:7005 to 127.0.0.1:7002

    Adding replica 127.0.0.1:7006 to 127.0.0.1:7003

    M: bfcfcdc304b011023fa568e044ea23ea6bc03c3c 127.0.0.1:7001

       slots:0-5460 (5461 slots) master

    M: d61e66e49e669b99d801f22f6461172696fdd1c9 127.0.0.1:7002

       slots:5461-10922 (5462 slots) master

    M: aa6bc3f1e1174c3a991c01882584707c2408ec18 127.0.0.1:7003

       slots:10923-16383 (5461 slots) master

    S: 7908a60306333c5d7c7c5e7ffef44bdf947ef0a4 127.0.0.1:7004

       replicates bfcfcdc304b011023fa568e044ea23ea6bc03c3c

    S: 1d2341fd3b79ef0fccb8e3a052bba141337c6cdd 127.0.0.1:7005

       replicates d61e66e49e669b99d801f22f6461172696fdd1c9

    S: f25b35f208dc96605ee4660994d2ac52f39ac870 127.0.0.1:7006

       replicates aa6bc3f1e1174c3a991c01882584707c2408ec18

    Can I set the above configuration? (type 'yes' to accept): 

     

    从运行结果看 主节点就是7001 7002 7003 从节点分别是7004 7005 7006 

    7001分配到的哈希槽是 0-5460

    7002分配到的哈希槽是 5461-10922

    7003分配到的哈希槽是 10923-16383

     

    最后问我们是否接受上面的设置,输入yes 就表示接受,我们输入yes

    然后显示:

    >>> Nodes configuration updated

    >>> Assign a different config epoch to each node

    >>> Sending CLUSTER MEET messages to join the cluster

    Waiting for the cluster to join......

    >>> Performing Cluster Check (using node 127.0.0.1:7001)

    M: bfcfcdc304b011023fa568e044ea23ea6bc03c3c 127.0.0.1:7001

       slots:0-5460 (5461 slots) master

       1 additional replica(s)

    S: f25b35f208dc96605ee4660994d2ac52f39ac870 127.0.0.1:7006

       slots: (0 slots) slave

       replicates aa6bc3f1e1174c3a991c01882584707c2408ec18

    M: d61e66e49e669b99d801f22f6461172696fdd1c9 127.0.0.1:7002

       slots:5461-10922 (5462 slots) master

       1 additional replica(s)

    S: 1d2341fd3b79ef0fccb8e3a052bba141337c6cdd 127.0.0.1:7005

       slots: (0 slots) slave

       replicates d61e66e49e669b99d801f22f6461172696fdd1c9

    M: aa6bc3f1e1174c3a991c01882584707c2408ec18 127.0.0.1:7003

       slots:10923-16383 (5461 slots) master

       1 additional replica(s)

    S: 7908a60306333c5d7c7c5e7ffef44bdf947ef0a4 127.0.0.1:7004

       slots: (0 slots) slave

       replicates bfcfcdc304b011023fa568e044ea23ea6bc03c3c

    [OK] All nodes agree about slots configuration.

    >>> Check for open slots...

    >>> Check slots coverage...

    [OK] All 16384 slots covered.

    显示配置哈希槽,以及集群创建成功,可以用了;

     

    第五步:集群数据测试

    我们先连接任意一个节点,然后添加一个key:

    redis-cli是redis默认的客户端工具,启动时加上`-c`参数,`-p`指定端口,就可以连接到集群。 

    连接任意一个节点端口:

    [root@localhost ~]# /usr/local/redis/bin/redis-cli -c -p 7002

    127.0.0.1:7002> 

    我们连接7002

    127.0.0.1:7002> set xxx  'fdafda'

    -> Redirected to slot [4038] located at 127.0.0.1:7001

    OK

    前面说过Redis Cluster值分配规则,所以分配key的时候,它会使用CRC16(‘my_name’)%16384算法,来计算,将这个key 放到哪个节点,这里分配到了4038slot 就分配到了7001(0-5460)这个节点上。所以有:

    Redirected to slot [4038] located at 127.0.0.1:7001

     

    我们从其他集群节点 ,都可以获取到数据

    127.0.0.1:7001> exit

    [root@localhost ~]# /usr/local/redis/bin/redis-cli -c -p 7005

    127.0.0.1:7005> get xxx

    -> Redirected to slot [4038] located at 127.0.0.1:7001

    "fdafda"

    127.0.0.1:7001> 

     

    第六步:集群宕机测试

    假如我们干掉一个节点,比如7002 这个主节点

    [root@localhost ~]#  ps -ef | grep redis

    root       9501      1  0 17:38 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]

    root       9512      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7002 [cluster]

    root       9516      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]

    root       9520      1  0 17:45 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]

    root       9524      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7005 [cluster]

    root       9528      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]

    root       9601   2186  0 18:12 pts/0    00:00:00 grep --color=auto redis

    [root@localhost ~]# kill -9 9512

    [root@localhost ~]#  ps -ef | grep redis

    root       9501      1  0 17:38 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]

    root       9516      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]

    root       9520      1  0 17:45 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]

    root       9524      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7005 [cluster]

    root       9528      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]

    root       9603   2186  0 18:12 pts/0    00:00:00 grep --color=auto redis

    [root@localhost ~]# 

     

    然后再来看下集群的情况

    redis-trib.rb check 127.0.0.1:7001

    >>> Performing Cluster Check (using node 127.0.0.1:7001)

    M: bfcfcdc304b011023fa568e044ea23ea6bc03c3c 127.0.0.1:7001

       slots:0-5460 (5461 slots) master

       1 additional replica(s)

    S: f25b35f208dc96605ee4660994d2ac52f39ac870 127.0.0.1:7006

       slots: (0 slots) slave

       replicates aa6bc3f1e1174c3a991c01882584707c2408ec18

    M: 1d2341fd3b79ef0fccb8e3a052bba141337c6cdd 127.0.0.1:7005

       slots:5461-10922 (5462 slots) master

       0 additional replica(s)

    M: aa6bc3f1e1174c3a991c01882584707c2408ec18 127.0.0.1:7003

       slots:10923-16383 (5461 slots) master

       1 additional replica(s)

    S: 7908a60306333c5d7c7c5e7ffef44bdf947ef0a4 127.0.0.1:7004

       slots: (0 slots) slave

       replicates bfcfcdc304b011023fa568e044ea23ea6bc03c3c

    [OK] All nodes agree about slots configuration.

    >>> Check for open slots...

    >>> Check slots coverage...

    [OK] All 16384 slots covered.

    我们发现 7005本来是从节点,由于他对应的主节点挂了,就自动变成主节点master,所有会有最后一个说明

     All 16384 slots covered. 所有哈希槽都可覆盖了; 集群可以正常使用;

     

    假如我们把7005也干掉,试试看

    [root@localhost ~]# kill -9 9524

    [root@localhost ~]#  ps -ef | grep redis

    root       9501      1  0 17:38 ?        00:00:03 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]

    root       9516      1  0 17:45 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]

    root       9520      1  0 17:45 ?        00:00:03 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]

    root       9528      1  0 17:45 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]

    root       9610   2186  0 18:16 pts/0    00:00:00 grep --color=auto redis

    [root@localhost ~]# 

     

    查看下集群情况

    redis-trib.rb check 127.0.0.1:7001

    QQ鎴�浘20170727181721.jpg

     

    这里我们发现 出事了,因为主从节点都挂了 所以有一部分哈希槽没得分配,最后一句

    [ERR] Not all 16384 slots are covered by nodes.  没有安全覆盖;

    所以不能正常使用集群;

  • 相关阅读:
    动态链接库DLL
    异常处理
    内存
    线程同步
    线程基础、线程调度
    笔记摘录:进程、作业
    工具DebugView、PCHunter、Procexp、Procmon
    使用Windbg和VMware来搭建调试内核的环境
    C++智能指针
    AndroidEventBus
  • 原文地址:https://www.cnblogs.com/wqsbk/p/8571851.html
Copyright © 2011-2022 走看看