zoukankan      html  css  js  c++  java
  • CentOS搭建redis集群

    如果安装好了单机版的redis那么就可以开始搭建集群了

    单机版的redis传送门http://www.cnblogs.com/zuge/p/5748100.html

    redis-cluster架构图

    redis-cluster把所有的物理节点映射到[0-16383]slot,cluster 负责维护node<->slot<->value

    Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

     

    Key:a

    计算ahash值,例如值为100100这个槽在server1上,所以a应该放到server1.

    Key:hello

    Hash值:10032,此槽在server2上。Hell可以应该存在server2.

    redis-cluster投票:容错

    (1)领着投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.

    (2):什么时候整个集群不可用(cluster_state:fail)? 

        a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

        b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

      ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

     

    (3)集群中有三个节点的集群,每个节点有一主一备。需要6台虚拟机。

     

    搭建一个伪分布式的集群,使用6redis实例来模拟。

     

    1.安装ruby

    1.1yum install ruby

    1.2yum install rubygems

    redis集群管理工具redis-trib.rb

    [root@bogon ~]# cd redis-3.0.0

    [root@bogon redis-3.0.0]# cd src

    [root@bogon src]# ll *.rb

    -rwxrwxr-x. 1 root root 48141 Apr  1 07:01 redis-trib.rb

    脚本需要的ruby包:

    需要上传到linux服务。

    安装ruby的包:

    1.3gem install redis-3.0.0.gem

    1.4.1把创建集群的ruby脚本复制到redis-cluster目录下。

    如果local下面没有redis-cluster目录那就先去建一个咯

    1.4.2复制六份redis

    1.4创建6个redis实例,端口号从7001~7006(最少6个)

    1.4.3每个的修改端口号

     

    1.4.4打开cluster-enable前面的注释

     找不见可以用/xxx命令来搜索

    1.4.4设置集群

    可以自己定义个批量启动的

    创建好了直接可以直接运行

    接着看看开启成功没有.

    批量全部关闭的话是这样的

    1.4.5创建集群

    ./redis-trib.rb create --replicas 1 192.168.206.143:7001 192.168.206.143:7002 192.168.206.143:7003 192.168.206.143:7004  192.168.206.143:7005  192.168.206.143:7006 

    这就ok了。

    注意:

    如果执行时报如下错误:

    [ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

    解决方法是删除生成的配置文件nodes.conf,如果不行则说明现在创建的结点包括了旧集群的结点信息,需要删除redis的持久化文件后再重启redis,比如:appendonly.aof、dump.rdb

     

    删除这两个就行了

    测试集群。

    ./redis-cli -c -h 192.168.101.3 -p 7001 其中-c表示以集群方式连接redis-h指定ip地址,-p指定端口号

    cluster nodes 查询集群结点信息

    cluster info 查询集群状态信息

     

    关闭方法:

    也可以写个脚本:

     1.5添加主节点

    集群创建成功后可以向集群中添加节点,下面是添加一个master主节点 

    添加7007结点,参考集群结点规划章节添加一个“7007”目录作为新节点。

    执行下边命令:

    ./redis-trib.rb add-node  192.168.101.3:7007 192.168.101.3:7001

     

    查看集群结点发现7007已添加到集群中:

     

    1.5.1. hash槽重新分配

    添加完主节点需要对主节点进行hash槽分配这样该主节才可以存储数据。

    redis集群有16384个槽,集群中的每个结点分配自已槽,通过查看集群结点可以看到槽占用情况。

     

    给刚添加的7007结点分配槽:

    第一步:连接上集群

    ./redis-trib.rb reshard 192.168.101.3:7001(连接集群中任意一个可用结点都行)

    第二步:输入要分配的槽数量

     

    输入 500表示要分配500个槽

    第三步:输入接收槽的结点id

     

    这里准备给7007分配槽,通过cluster nodes查看7007结点id15b809eadae88955e36bcdbb8144f61bbbaf38fb

    输入:15b809eadae88955e36bcdbb8144f61bbbaf38fb 

    第四步:输入源结点id

     

    这里输入all 

    第五步:输入yes开始移动槽到目标结点id

     

    1.6. 添加从节点

    集群创建成功后可以向集群中添加节点,下面是添加一个slave从节点。

    添加7008从结点,将7008作为7007的从结点。

    ./redis-trib.rb add-node --slave --master-id 主节点id 添加节点的ip和端口 集群中已存在节点ip和端口

    执行如下命令:

    ./redis-trib.rb add-node --slave --master-id cad9f7413ec6842c971dbcc2c48b4ca959eb5db4  192.168.101.3:7008 192.168.101.3:7001

    cad9f7413ec6842c971dbcc2c48b4ca959eb5db4  是7007结点的id,可通过cluster nodes查看。

     

    注意:如果原来该结点在集群中的配置信息已经生成cluster-config-file指定的配置文件中(如果cluster-config-file没有指定则默认为nodes.conf),这时可能会报错:

    [ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

    解决方法是删除生成的配置文件nodes.conf,删除后再执行./redis-trib.rb add-node指令

    查看集群中的结点,刚添加的70087007的从节点:

     

    1.7 删除结点:

    ./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017

    删除已经占有hash槽的结点会失败,报错如下:

    [ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.

    需要将该结点占用的hash槽分配出去(参考hash槽重新分配章节)。

  • 相关阅读:
    Read-Copy Update Implementation For Non-Cache-Coherent Systems
    10 华电内部文档搜索系统 search04
    10 华电内部文档搜索系统 search05
    lucene4
    10 华电内部文档搜索系统 search01
    01 lucene基础 北风网项目培训 Lucene实践课程 索引
    01 lucene基础 北风网项目培训 Lucene实践课程 系统架构
    01 lucene基础 北风网项目培训 Lucene实践课程 Lucene概述
    第五章 大数据平台与技术 第13讲 NoSQL数据库
    第五章 大数据平台与技术 第12讲 大数据处理平台Spark
  • 原文地址:https://www.cnblogs.com/zuge/p/5750653.html
Copyright © 2011-2022 走看看