zoukankan      html  css  js  c++  java
  • Redis集群搭建&访问

    集群搭建步骤

    1、创建多个节点;

    2、为每个节点指派槽,并将多个节点连接起来,组成一个集群;

    3、当集群数据库的16384个槽都有节点在处理时,集群进入上线状态;

    要求:搭建一个包含6个节点的Redis集群,其中三个主节点,三个从节点,每个主节点都有一个从节点

    注:在极端情况下,如果将16384个槽都指派给一个主节点,那么只有一个主节点也可以让集群进入上线状态,但是要让集群的故障转移特性生效,最起码要有3个主节点,而要让故障转移真正有意义,至少要为三个主节点分别设置一个从节点,这也是本例子中使用6个节点的原因。

    1、创建节点

    集群中的节点就是运行在集群模式下的Redis服务器,为了构建一个集群,我们需要一一创建集群中的每个节点;

    为了让Redis服务器以集群模式运行,我们需要在启动服务器时,打开服务器的集群模式选项:

    cluster-enabled yes

    另外,如果有多个节点运行在同一台集群上,那么我们还需要为每个节点指定一个不同的端口号

    port 7000

    将如上的两个配置值写入redis.conf文件中,然后执行如下命令来启动一个Redis节点

    redis-server redis.conf

    为了能在同一台机器上构建一个包含6个节点的集群,其中三个主节点分别运行在机器的7000、7001和7002端口上,而三个从节点分别运行在7003、7004和7003端口上;

    我们可以先创建一个redis-cluster文件夹,然后分别创建7000到7005共6个文件夹,每个文件夹都包含一个redis.conf文件,文件内容如下:

    port <number>
    cluster-enabled yes

    目录结构如下:

    [ochadoop@och165 redis-cluster]$ ll
    drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:39 7000
    drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:30 7001
    drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:30 7002
    drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:30 7003
    drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:30 7004
    drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:30 7005
    drwxrwxr-x 2 ochadoop ochadoop    4096 Sep  1 10:33 7006
    drwxrwxr-x 6 ochadoop ochadoop    4096 Aug 30 14:02 redis-3.0.0-beta8
    -rwxrwxr-x 1 ochadoop ochadoop 6395711 Aug 30 14:02 redis-server
    [ochadoop@och165 redis-cluster]$ cd 7000
    [ochadoop@och165 7000]$ ll-rw-rw-r-- 1 ochadoop ochadoop 102 Aug 30 13:34 redis.conf

    然后分别执行:

    cd 7000
    ../redis-server ./redis.conf & 
    
    cd 7001
    ../redis-server ./redis.conf &
    
    cd 7002
    ../redis-server ./redis.conf &
    
    cd 7003
    ../redis-server ./redis.conf &
    
    cd 7004
    ../redis-server ./redis.conf &
    
    cd 7005
    ../redis-server ./redis.conf &

    判断各个节点的Redis服务是否启动成功:

    [ochadoop@och165 redis-cluster]$ ps -ef|grep redis
    ochadoop 26369 23992  0 14:41 pts/0    00:00:00 ../redis-server *:7000 [cluster]
    ochadoop 26391 23992  0 14:42 pts/0    00:00:00 ../redis-server *:7001 [cluster]
    ochadoop 26401 23992  0 14:42 pts/0    00:00:00 ../redis-server *:7002 [cluster]
    ochadoop 26417 23992  0 14:42 pts/0    00:00:00 ../redis-server *:7003 [cluster]
    ochadoop 26431 23992  0 14:43 pts/0    00:00:00 ../redis-server *:7004 [cluster]
    ochadoop 26436 23992  0 14:43 pts/0    00:00:00 ../redis-server *:7005 [cluster]
    ochadoop 26518 23992  0 14:44 pts/0    00:00:00 grep redis

    经过如上操作,创建了6个节点。

    2、创建集群

    在第一步中已经创建了6个节点,此时我们需要将这6个节点互相连接以后吃一个集群,然后为三个主节点指派槽,并为这三个主节点分别设置一个从节点;

    创建集群的操作可以通过使用位于Redis安装文件夹内的redis-trib.rb来完成,redis-trib.rb是使用ruby开发的Redis集群管理程序,具有创建集群,检查集群的上线情况和槽指派情况、对集群进行重新分片、向集群添加新节点或者从集群中移除节点等功能;

    redis-trib.rb的用户

    [ochadoop@och165 src]$ ./redis-trib.rb
    Usage: redis-trib <command> <options> <arguments ...>
    
      create          host1:port1 ... hostN:portN
                      --replicas <arg>
      check           host:port
      fix             host:port
      reshard         host:port
                      --from <arg>
                      --to <arg>
                      --slots <arg>
                      --yes
      add-node        new_host:new_port existing_host:existing_port
                      --slave
                      --master-id <arg>
      del-node        host:port node_id
      set-timeout     host:port milliseconds
      call            host:port command arg arg .. arg
      import          host:port
                      --from <arg>
      help            (show this help)

    为创建一个包含三个主节点和三个从节点的集群,我们需要执行如下命令:

    ./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

    其中:

    create:表示我们要创建一个集群;

    replicas:表示让redis-trib.rb为集群中的每个主节点设置一个从节点;

    输入该命令后,redis-trib会为每个节点指派槽以及角色,并询问用户是否接受这种节点配置;

    [ochadoop@och165 src]$ ./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
    >>> Creating cluster  
    Connecting to node 127.0.0.1:7000: OK
    Connecting to node 127.0.0.1:7001: OK
    Connecting to node 127.0.0.1:7002: OK
    Connecting to node 127.0.0.1:7003: OK
    Connecting to node 127.0.0.1:7004: OK
    Connecting to node 127.0.0.1:7005: OK      ###首先尝试连接给定的六个节点,检查它们是否存在
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    127.0.0.1:7000
    127.0.0.1:7001
    127.0.0.1:7002
    Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
    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  ###在确定这些节点都是可连接之后,redistrib.rb 再将7000、7001和7002设置为主节点,
                                    而7003、7004和7005则分别被设置为三个主节点的从节点
    M: 86377351db5e39c8ac78ae57d1c9ed747fc6287e 127.0.0.1:7000
       slots:0-5460 (5461 slots) master
    M: 41da4216d8011ba56e491fe3a938eaf5d4b30449 127.0.0.1:7001
       slots:5461-10922 (5462 slots) master
    M: c98b085a68d26d6e779eaf7802bdd309ac263b8f 127.0.0.1:7002
       slots:10923-16383 (5461 slots) master    ###对于三个主节点,redis-trib.rb 会分别为它们指派5461、5462和5461个槽(默认情况下使用平均分配)

    S: a1591907f9a6e8398d6ca76875a4b9d2ae488d4b
    127.0.0.1:7003 replicates 86377351db5e39c8ac78ae57d1c9ed747fc6287e S: 23ee21f3992eeea33137f086aaed70e4b0d1926d 127.0.0.1:7004 replicates 41da4216d8011ba56e491fe3a938eaf5d4b30449 S: 36daa7806f59775f09ef4df339737b0973136679 127.0.0.1:7005 replicates c98b085a68d26d6e779eaf7802bdd309ac263b8f Can I set the above configuration? (type 'yes' to accept): yes ###这个配置没问题的话,就可以键入 yes 并按下回车
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    3495:M 13 Oct 17:56:13.768 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
    3498:M 13 Oct 17:56:13.768 # configEpoch set to 2 via CLUSTER SET-CONFIG-EPOCH
    3509:M 13 Oct 17:56:13.769 # configEpoch set to 3 via CLUSTER SET-CONFIG-EPOCH
    3514:M 13 Oct 17:56:13.769 # configEpoch set to 4 via CLUSTER SET-CONFIG-EPOCH
    3517:M 13 Oct 17:56:13.770 # configEpoch set to 5 via CLUSTER SET-CONFIG-EPOCH
    3527:M 13 Oct 17:56:13.770 # configEpoch set to 6 via CLUSTER SET-CONFIG-EPOCH
    >>> Sending CLUSTER MEET messages to join the cluster
    3495:M 13 Oct 17:56:13.787 # IP address for this node updated to 127.0.0.1
    3527:M 13 Oct 17:56:13.956 # IP address for this node updated to 127.0.0.1
    3509:M 13 Oct 17:56:13.958 # IP address for this node updated to 127.0.0.1
    3498:M 13 Oct 17:56:13.988 # Cluster state changed: ok
    3517:M 13 Oct 17:56:14.156 # IP address for this node updated to 127.0.0.1
    3498:M 13 Oct 17:56:14.375 # IP address for this node updated to 127.0.0.1
    3517:M 13 Oct 17:56:14.463 # Cluster state changed: ok
    3514:M 13 Oct 17:56:14.563 # IP address for this node updated to 127.0.0.1
    Waiting for the cluster to join.3495:M 13 Oct 17:56:15.465 # Cluster state changed: ok
    .3509:M 13 Oct 17:56:16.468 # Cluster state changed: ok
    3527:M 13 Oct 17:56:16.592 # Cluster state changed: ok
    .3514:M 13 Oct 17:56:17.060 # Cluster state changed: ok ###在键入yes之后,redis-trib.rb 就会向各个节点发送指令,首先将它们连接为一个集群,然后再为它们指派槽和设置角色
    >>> Performing Cluster Check (using node 127.0.0.1:7000) 
    M: 86377351db5e39c8ac78ae57d1c9ed747fc6287e
    127.0.0.1:7000 slots:0-5460 (5461 slots) master
    M: 41da4216d8011ba56e491fe3a938eaf5d4b30449
    127.0.0.1:7001 slots:5461-10922 (5462 slots) master
    M: c98b085a68d26d6e779eaf7802bdd309ac263b8f
    127.0.0.1:7002 slots:10923-16383 (5461 slots) master
    M: a1591907f9a6e8398d6ca76875a4b9d2ae488d4b
    127.0.0.1:7003 slots: (0 slots) master replicates 86377351db5e39c8ac78ae57d1c9ed747fc6287e
    M: 23ee21f3992eeea33137f086aaed70e4b0d1926d
    127.0.0.1:7004 slots: (0 slots) master replicates 41da4216d8011ba56e491fe3a938eaf5d4b30449
    M: 36daa7806f59775f09ef4df339737b0973136679
    127.0.0.1:7005 slots: (0 slots) master replicates c98b085a68d26d6e779eaf7802bdd309ac263b8f
    ###redis-trib.rb 会对集群进行测试,检查是否每个节点都按照原先展示的配置设置好了
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.

      ###如果整个集群数据库的16384个槽都有节点在处理,那么集群就会进入上线状态,之后用户就可以开始向集群发送命令请求了

    集群访问

    使用集群客户端向集群发送命令请求

    目前主要的 Redis 集群客户端(或者说,支持集群功能的 Redis 客户端)有以下这些:

    1、redis-rb-cluster:antirez 使用 Ruby 编写的 Redis 集群客户端,集群客户端的官方实现;

    2、predis:Redis 的 PHP 客户端,支持集群功能;

    3、jedis:Redis 的 JAVA 客户端,支持集群功能;

    4、StackExchange.Redis:Redis 的 C# 客户端,支持集群功能;

    5、内置的 redis-cli :在启动时给定 -c 参数即可进入集群模式,支持部分集群功能;


    为了让示例保持简单,我们这里使用集群模式的 redis-cli 来进行演示。

    [ochadoop@och165 src]$ ./redis-cli -p 7000 -c  #连接节点并执行命令
    127.0.0.1:7000> SET date 2014-10-10  #键date所在的槽位于节点7000 ,节点直接执行命令
    OK
    127.0.0.1:7000> SET msg "hello world"  #键msg所在的槽位于节点7001
    -> Redirected to slot [6257] located at 127.0.0.1:7001  #客户端从7000转向至7001
    OK
    127.0.0.1:7001> SADD fruits "apple" "banana" "cherry"  #键fruits所在的槽位于节点7002
    -> Redirected to slot [14943] located at 127.0.0.1:7002  #客户端从7001转向至7002
    (integer) 3
    127.0.0.1:7002>  #转向是自动完成的,无需任何用户操作

    集群和twemproxy的区别

    结论:

    如果需要完整的分片、复制和高可用性,并且要避免使用代理带来的性能瓶颈和资源消耗,那么可以选择使用Redis集群;

    如果只需要一部分特性(比如只需要分片,不需要复制和高可用等),那么可以单独选择twemproxy、Redis复制和Redis sentinel中的一个或者多个;

    Redis集群服务器总结

    Redis集群是一个由多个节点组成的分布式服务器群,它具有复制、高可用和分片特性;

    Redis集群没有中心节点,并且带有复制和故障转移特性,这可以避免单个节点成为性能瓶颈,或者因为某个节点下线而导致整个集群下线;

    集群中的主节点负责处理槽(存储数据),从节点则是主节点的复制品;

    Redis集群将整个数据库分成16384个槽,数据库中的每个键都属于16384个槽中的其中一个;

    集群中的每个主节点都可以负责0到16384个槽,当16384个槽都有节点在负责时,集群进入上线状态,可以执行客户端发送的数据命令;

    主节点只会执行和自己负责的槽相关的命令,当节点接收到不属于自己处理的槽的命令时,它会将处理指定槽的节点的地址返回给客户端,而客户端会向正确的节点重新发送命令,这个过程称为“转向”;

  • 相关阅读:
    .net程序控制post数据 需登陆后保持session的方法
    简单分页查询SQL语句
    通过文本编辑器提交报从客户端中检测到有潜在危险的 Request.Form 值的错误
    Visual Studio 很卡、重置初始状态
    Jquery获取url中的参数
    Centos 6 安装桌面环境
    Jquery使用ajax实例
    一般处理程序使用session
    如何简单的发布一个react组件npm包
    BFC、IFC、GFC 和 FFC的概念
  • 原文地址:https://www.cnblogs.com/luogankun/p/4022771.html
Copyright © 2011-2022 走看看