Swift51.com
麦子学院 头像
麦子学院  2017-03-29 15:34

Redis的的集群如何搭建?

回复:0  查看:2342  
Redis  集群是一个提供在 多个Redis 间节点间共享数据   的程序集,本文和大家分享的主要是redis 集群搭建相关内容,一起来看看吧,希望对大家 学习redis有所帮助
  Redis 集群并不支持处理多个 keys 的命令 , 因为这需要在不同的节点间移动数据 , 从而达不到像 Redis 那样的性能 , 在高负载的情况下可能会导致不可预料的错误。
  Redis  集群通过分区来提供  一定程度的可用性 , 在实际环境中当某个节点宕机或者不可达的情况下继续处理命令 . Redis  集群的优势 :
  ·  自动分割数据到不同的节点上。
  ·  整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
   Redis 集群的主从复制模型
  为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型, 每个节点都会有 N-1 个复制品 .
  在我们例子中具有A B C 三个节点的集群 , 在没有复制模型的情况下 , 如果节点 B 失败了,那么整个集群就会以为缺少 5501-11000 这个范围的槽而不可用 .
  然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1 B1 C1, 那么整个集群便有三个 master 节点和三个 slave 节点组成,这样在节点 B 失败后,集群便会选举 B1 为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了
  不过当B B1  都失败后,集群是不可用的 .
   搭建并使用Redis集群
  搭建集群的第一件事情我们需要一些运行在  集群模式的Redis 实例 这意味这集群并不是由一些普通的 Redis 实例组成的,集群模式需要通过配置启用,开启集群模式后的 Redis 实例便可以使用集群特有的命令和特性了 .
  下面是一个最少选项的集群的配置文件:
   port 7000
  cluster-enabled yes
  cluster-config-file nodes.conf
  cluster-node-timeout 5000
  appendonly yes
  文件中的 cluster-enabled  选项用于开实例的集群模式, 而  cluster-conf-file  选项则设定了保存节点配置文件的路径, 默认值为 nodes.conf. 节点配置文件无须人为修改, 它由  Redis  集群在启动时创建, 并在有需要时自动进行更新。
  要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时,  强烈建议使用六个节点:  其中三个为主节点,  而其余三个则是各个主节点的从节点。
  首先,  让我们进入一个新目录,  并创建六个以端口号为名字的子目录,  稍后我们在将每个目录中运行一个 Redis  实例: 命令如下 :
  mkdir cluster-test cd cluster-testmkdir 7000 7001 7002 7003 7004 7005
  在文件夹 7000  至  7005  中, 各创建一个  redis.conf  文件, 文件的内容可以使用上面的示例配置文件, 但记得将配置中的端口号从  7000  改为与文件夹名字相同的号码。
  从 Redis Github  页面 的  unstable  分支中取出最新的  Redis  源码, 编译出可执行文件  redis-server  , 并将文件复制到  cluster-test 文件夹, 然后使用类似以下命令, 在每个标签页中打开一个实例:
   cd 7000
  ../redis-server ./redis. conf
  实例打印的日志显示,  因为 nodes.conf  文件不存在, 所以每个节点都为它自身指定了一个新的  ID 
  [ 82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1
  实例会一直使用同一个 ID  , 从而在集群中保持一个独一无二( unique )的名字。
   搭建集群
  现在我们已经有了六个正在运行中的 Redis  实例, 接下来我们需要使用这些实例来创建集群, 并为每个节点编写配置文件。
  通过使用 Redis  集群命令行工具  redis-trib  , 编写节点配置文件的工作可以非常容易地完成:  redis-trib  位于  Redis  源码的  src  文件夹中, 它是一个  Ruby  程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片( reshared )等工作。
  ./ 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
  这个命令在这里用于创建一个新的集群选项 –replicas 1  表示我们希望为集群中的每个主节点创建一个从节点。
  之后跟着的其他参数则是这个集群实例的地址列表,3 master3 slave redis-trib  会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入  yes  ,  redis-trib  就会将这份配置应用到集群当中 , 让各个节点开始互相通讯 , 最后可以得到如下信息:
  [OK]  All  16384  slots  covered
  这表示集群中的 16384  个槽都有至少一个主节点在处理, 集群运作正常。
  集群
   cluster info  :打印集群的信息
  cluster nodes  :列出集群当前已知的所有节点(  node ),以及这些节点的相关信息。
   节点
  cluster meet < ip> < port:将  ip  和  port  所指定的节点添加到集群当中,让它成为集群的一份子。
  cluster forget < node_id:从集群中移除  node_id  指定的节点。
  cluster replicate < node_id:将当前节点设置为  node_id  指定的节点的从节点。
  cluster saveconfig  :将节点的配置文件保存到硬盘里面。
   (slot)
  cluster addslots < slot> [slot ...]  :将一个或多个槽(  slot )指派(  assign )给当前节点。
  cluster delslots < slot> [slot ...]  :移除一个或多个槽对当前节点的指派。
  cluster flushslots  :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
  cluster setslot < slot> node < node_id:将槽  slot  指派给  node_id  指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽 > ,然后再进行指派。
  cluster setslot < slot> migrating < node_id:将本节点的槽  slot  迁移到  node_id  指定的节点中。
  cluster setslot < slot> importing < node_id:从  node_id  指定的节点中导入槽  slot  到本节点。
  cluster setslot < slot> stable  :取消对槽  slot  的导入(  import )或者迁移(  migrate )。
  
  cluster keyslot :计算键  key  应该被放置在哪个槽上。
  cluster countkeysinslot :返回槽  slot  目前包含的键值对数量。
  cluster getkeysinslot :返回  count  个  slot  槽中的键
   使用集群
  测试 Redis  集群比较简单的办法就是使用  redis-rb-cluster  或者  redis-cli  , 接下来我们将使用  redis-cli  为例来进行演示:
  $ redis-cli -c -p 7000
  redis 127.0.0.1:7000>  set foo bar
  -> Redirected  to slot [12182] located at 127.0.0.1:7002
  OK
  redis 127.0.0.1:7002>  set hello world
  -> Redirected  to slot [866] located at 127.0.0.1:7000
  OK
  redis 127.0.0.1:7000>  get foo
  -> Redirected  to slot [12182] located at 127.0.0.1:7002"bar"
  redis 127.0.0.1:7000>  get hello
  -> Redirected  to slot [866] located at 127.0.0.1:7000"world"
   添加一个从节点
  有两种方法添加从节点,可以像添加主节点一样使用redis-trib  命令,也可以像下面的例子一样使用  –slave 选项 :
  ./ redis-trib.rb  add-node  --slave  127.0.0.1:7006  127.0.0.1:7000
  此处的命令和添加一个主节点命令类似,此处并没有指定添加的这个从节点的主节点,这种情况下系统会在其他的复制集中的主节点中随机选取一个作为这个从节点的主节点。
  你可以通过下面的命令指定主节点:
  ./ redis-trib.rb  add-node  --slave  --master-id  3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e  127.0.0.1:7006 127.0.0.1:7000
  也可以使用CLUSTER REPLICATE  命令添加 . 这个命令也可以改变一个从节点的主节点。
  例如,要给主节点 127.0.0.1:7005 添加一个从节点,该节点哈希槽的范围 1423-16383,  节点  ID 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e, 我们需要链接新的节点(已经是空的主节点)并执行命令 :
   redis 127.0.0.1:7006>  cluster  replicate 3 c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
  我们新的从节点有了一些哈希槽,其他的节点也知道(过几秒后会更新他们自己的配置),可以使用如下命令确认:
  $ redis-cli -p 7000 cluster nodes | grep slave | grep 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
  f093c80dde814da99c5cf72a7dd01590792b783b 127.0.0.1:7006 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617702 3 connected2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617198 3 connected
  节点 3c3a0c…  有两个从节点,  7002 ( 已经存在的 和  7006 ( 新添加的 ).
   移除一个节点
  只要使用  del-node  命令即可:
  ./redis-trib del-node 127.0.0.1:7000 ``
  第一个参数是任意一个节点的地址, 第二个节点是你想要移除的节点地址。
  使用同样的方法移除主节点, 不过在移除主节点前,需要  确保这个主节点是空的 .  如果不是空的 , 需要将这个节点的数据重新分片到其他主节点上 .
  替代移除主节点的方法是手动执行故障恢复,被移除的主节点会作为一个从节点存在,不过这种情况下不会减少集群节点的数量,也需要重新分片数据。
来源: Linux 公社