zoukankan      html  css  js  c++  java
  • Redis 集群

    所有的 Redis 节点在集群中互联,内部使用二进制协议优化速度和带宽

    节点的 fail,是通过集群中超过半数的节点检测失效时才生效。也就是说,集群中有半数以上的节点无法连接上某个节点,那么这个节点就被判定 fail

    客户端连接集群中的任意一台机器,都可以访问整个集群的数据,因为节点之间会跳转

    新的数据,怎么确定添加到集群中的哪台机器呢?

    答:Redis 内置了16384个哈希槽,当需要在集群中添加数据的时候,对 Key使用 CRC16算法计算出一个结果,然后将结果对16384取余。

    这样,每个 Key 都对应到了0~16383中的一个数字,Redis根据节点数量,大致均等的将哈希槽映射到节点上。

    可以理解成集群中的每台 Redis 服务器,都均匀分配了一些槽,Key 的计算结果属于哪个槽,那个槽属于哪台服务器,就将数据存储在哪台服务器上

    安装集群需要 ruby 支持

    需要 redis 第三方接口支持:Mac 下执行一遍 sudo gem install redis 

    下面通过一个实例演示Redis 集群的安装

    这里在同一台服务器用不同的端口表示不同的redis服务器,如下:

    主节点:

    192.168.101.3:7001 

    192.168.101.3:7002 

    192.168.101.3:7003

    从节点:

    192.168.101.3:7004 

    192.168.101.3:7005 

    192.168.101.3:7006

    我这里在一台机器上,通过端口,模拟不同的 Redis 服务器,实际环境中,一般是通过不同机器,也就是 ip 来确定的

    1、安装单机版 Redis

    2、创建一个文件夹 - redis-cluster

    这个文件夹保存所有通过端口区分的集群中的 Redis服务器

    创建redis-cluster目录,其下创建7001、7002。。7006目录,

    将redis安装目录bin下的文件拷贝到每个700X目录内,同时将redis源码目录src下的redis-trib.rb拷贝到redis-cluster目录下。

    修改每个700X目录下的redis.conf配置文件:

    port XXXX

    #bind 192.168.101.3

    cluster-enabled yes 

    3、如果是真实的集群环境,则不需要步骤二。直接启动每个节点

    分别进入7001、7002、...7006目录,执行:

    ./redis-server ./redis.conf

    查看redis进程:

    4、启动集群

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

    说明:

    redis集群至少需要3个主节点,每个主节点有一个从节点总共6个节点

    replicas指定为1表示每个主节点有一个从节点

    注意:

    如果执行时报如下错误:

    [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

    5、查询集群信息

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

    cluster nodes 查询集群结点信息

    cluster info 查询集群状态信息

    其他集群中的操作

    1、添加主节点

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

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

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

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

    cluster nodes

    2、Hash槽重新分配

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

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

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

    第一步:连接上集群

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

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

    输入 500表示要分配500个槽

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

    这里准备给7007分配槽,通过cluster nodes查看7007结点id为15b809eadae88955e36bcdbb8144f61bbbaf38fb

    输入:15b809eadae88955e36bcdbb8144f61bbbaf38fb

    第四步:输入源结点id

    这里输入all

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

    3、添加从节点

    集群创建成功后可以向集群中添加节点,下面是添加一个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指令

    查看集群中的结点,刚添加的7008为7007的从节点:

    4、删除节点

    ./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槽重新分配章节)。

  • 相关阅读:
    Windows SDK编程(Delphi版) 之 应用基础,楔子
    一个小问题引发的论证思考
    Delphi 组件开发教程指南(7)继续模拟动画显示控件
    用PyInstaller将python转成可执行文件exe笔记
    使用 .Net Memory Profiler 诊断 .NET 应用内存泄漏(方法与实践)
    Microsof Office SharePoint 2007 工作流开发环境搭建
    How to monitor Web server performance by using counter logs in System Monitor in IIS
    LINQ之Order By
    window 性能监视器
    内存泄露检测工具
  • 原文地址:https://www.cnblogs.com/sherrykid/p/5841750.html
Copyright © 2011-2022 走看看