`
zsxxsz
  • 浏览: 451217 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个 C++ redis 集群管理工具

阅读更多

    集群版 redis3.0 发布以来,官方仅提供了一个使用 ruby 写的集群管理工具,在创建 redis 集群时需要使用该工具。因为 ruby 中的一些包依赖问题,导致一些生手在建立 redis 集群时吃尽了苦头。于是 acl 库作者基于 acl 中的 redis 模块库,用 C++ 语言写了一个 redis 集群管理工具: redis_builder,没有过多的包依赖,可以方便 redis 使用者快速地建立 redis 集群,此外,该工具还可以进行一些集群的其它管理工作。

    下面是 redis_builder 的一些功能:

./redis_build -h
usage: redis_builder.exe -h[help]
-s redis_addr[ip:port]
-a cmd[nodes|slots|create|add_node|del_node|node_id|reshard]

-p passwd
-N new_node[ip:port]
-S [add node as slave]
-f configure_file

for samples:
./redis_builder -s 127.0.0.1:6379 -a create -f cluster.xml
./redis_builder -s 127.0.0.1:6379 -a nodes
./redis_builder -s 127.0.0.1:6379 -a slots
./redis_builder -s 127.0.0.1:6379 -a del_node -I node_id
./redis_builder -s 127.0.0.1:6379 -a node_id

./redis_builder -s 127.0.0.1:6379 -a reshard
./redis_builder -s 127.0.0.1:6379 -a add_node -N 127.0.0.1:6380 -S

 

注:如果集群中的每个 redis 节点设置了密码验证,则使用该工具需要增加参数: -p [passwod]

 

一、建立 redis 集群

1.1、方法一:

在启动所有的 redis 进程后,可以使用 redis_builder 将这些 redis 结点组成一个 redis 集群,redis_builder 使用 xml 格式的配置文件管理 redis 各个结点的关系,如该 cluster.xml 文件的内容例如:

<?xml version="1.0"?>
<xml>
    <node addr = "192.168.136.172:16380">
        <node addr = "192.168.136.172:16381" />
        <node addr = "192.168.136.172:16382" />
    </node>
    <node addr = "192.168.136.172:16383">
        <node addr = "192.168.136.172:16384" />
        <node addr = "192.168.136.172:16385" />
    </node>
    <node addr = "192.168.136.172:16386">
        <node addr = "192.168.136.172:16387" />
        <node addr = "192.168.136.172:16388" />
    </node>
</xml>

这样就可以运行:./redis_builder -a create -f cluster.xml,则redis 集群便会自动建立起来,集群中主从结点的分布情况如下:

master: 192.168.136.172:16380
        slave: 192.168.136.172:16381
        slave: 192.168.136.172:16382
master: 192.168.136.172:16383
        slave: 192.168.136.172:16384
        slave: 192.168.136.172:16385
master: 192.168.136.172:16386
        slave: 192.168.136.172:16387
        slave: 192.168.136.172:16388

这种方式的好处是由配置文件直接指定集群中各个结点的主从关系,缺点是:当 redis 结点非常多时配置管理起来也非常麻烦,因此该工具提供了另外一种 redis 集群创建模式,如方法二:

 

1.2、方法二

运行方式:./redis_builder -a create -f cluster.xml -r 2,其中的 -r 参数指定每个从结点的从结点个数,当指定了 -r 参数后,配置文件中指定的主从关系便不再生效,由工具根据以下三个原则进行主从结点的自动分配:

1)主从节点在不同的服务器上

2)主节点尽量均分在各个服务器上

3)从节点尽量均匀的分在不同的机器上

如配置文件中的内容为:

<?xml version="1.0"?>
<xml>
    <node addr = "192.168.136.171:16380" />
    <node addr = "192.168.136.171:16381" />
    <node addr = "192.168.136.171:16382" />
    <node addr = "192.168.136.172:16380" />
    <node addr = "192.168.136.172:16381" />
    <node addr = "192.168.136.172:16382" />
    <node addr = "192.168.136.173:16380" />
    <node addr = "192.168.136.173:16381" />
    <node addr = "192.168.136.173:16382" />
</xml>

则主从结点的分布情况可能如下:

 

master: 192.168.136.171:16380
        slave: 192.168.136.172:16380
        slave: 192.168.136.173:16380
master: 192.168.136.172:16381
        slave: 192.168.136.173:16382
        slave: 192.168.136.171:16382
master: 192.168.136.173:16381
        slave: 192.168.136.172:16382
        slave: 192.168.136.171:16381

 

可以看出,主从结点的分配基本满足以上三个原则,这样的好处就是当一台服务出现问题,整个集群中的其它机器的从结点可以顺利接管主结点服务。

 

二、显示当前 redis 集群中的结点信息:

运行:./redis_builder -s 192.168.136.171:16380 -a nodes 显示如下信息:

master, id: 4dcf8df124888e614cf08bd4df7987986124dd23, addr: 192.168.136.171:16380
slots range: 5462-10922
slave, id: 2b02cda1384336956d22c6c84fbe339210959bcb, addr: 192.168.136.172:16380, master_id: 4dcf8df124888e614cf08bd4df7987986124dd23
slave, id: a041490f734ca7478330acf5b609c542936214c2, addr: 192.168.136.173:16380, master_id: 4dcf8df124888e614cf08bd4df7987986124dd23
---------------------------------------
master, id: bfa250d0f6cae39623515dbce084b904f070fd96, addr: 192.168.136.172:16381
slots range: 10923-16383
slave, id: 4dfd12785d85b8c195c899511ac470aa9a2a4181, addr: 192.168.136.173:16382, master_id: bfa250d0f6cae39623515dbce084b904f070fd96
slave, id: fff7ecf70418300e1d41c6bb572c5ba995cc44c3, addr: 192.168.136.171:16382, master_id: bfa250d0f6cae39623515dbce084b904f070fd96
---------------------------------------
master, id: ebecfb9cc3548b17b37f2de94346473baa59721c, addr: 192.168.136.173:16381
slots range: 0-5461
slave, id: 842db09336dee58bbcd13e4a93ee680d96fa9915, addr: 192.168.136.172:16382, master_id: ebecfb9cc3548b17b37f2de94346473baa59721c
slave, id: 025f58e174f8cd156d1c9621d32956bac2a90032, addr: 192.168.136.171:16381, master_id: ebecfb9cc3548b17b37f2de94346473baa59721c

 

三、添加新的 redis 结点

随着数据规模的扩大,如果当前 redis 集群需要添加新的 redis 结点,则可以动态扩充 redis 结点,下面提供了使用 redis_builder 增加新结点的步骤:

3.1、确定新结点的主结点并给新结点的主结点添加从结点

./redis_builder -s 192.168.136.171:16383 -N 192.168.136.172:16383 -S -a add_node

./redis_builder -s 192.168.136.171:16383 -N 192.168.136.173:16383 -S -a add_node

该命令确定新增结点的主结点为 192.168.136.171:16383,两个从结点为:192.168.136.172:16383 和 192.168.136.173:16383

3.2、将新增结点并入已有集群中

./redis_builder -s 192.168.136.171:16380 -N 192.168.136.171:15383 -a add_node

这样,便给已有的 redis 集群添加了新的结点,注意步骤 3.2 与 3.1 中参数的不同,在步骤 3.2 中将新结点添加进集群时,只需指定集群中的一个主结点即可,且不能添加 -S 参数。

在添加完新结点后, 还需要将集群中的其它结点的哈希槽及数据移至新结点上,以便达到数据均衡性。下面给出了数据迁移的过程:

 

四、将数据重新分区

运行:./redis_builder -s 192.168.136.171:16383 -a reshard

addr: 192.168.136.171:16380

id: 10280b2f2d4938c7f3dffd6a56369f470b34f11adfd
slots: 2500 - 8191
-----------------------------------------------
addr:
192.168.136.172:16381

id: 24664d58862274c8a600dae3be5c6b38998d6824
slots: 10692 - 16383
-----------------------------------------------
addr: 192.168.136.173:16381

id: 5a422ace11d20ed7b3735661bd82d7ff0343164df
slots: 0 - 2499
slots: 8192 - 10691

-----------------------------------------------
addr: 192.168.136.171:16383

id: 5a422ace11fsdfd23sdfsfsdfsfsfsfsfsfstdgdgdgf

 

How many slots do you want to move (from 1 to 16384) ? 2000       ------  此处指定需要迁移的哈希槽数量

What is the receiving node ID?  5a422ace11fsdfd23sdfsfsdfsfsfsfsfsfstdgdgdgf   ----- 此处指定目标 redis 结点

Please input all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots
  Type 'done' once you entered all the source node IDs.
Source node #1:

 

输入 all 后 redis_builder 工具会自动将数据从所有已存在结点中将哈希槽及存储于哈希槽中的数据迁移至目标结点中。

 

五、编译 redis_builder

因为该工具依赖于 lib_acl/lib_protocol/lib_acl_cpp 三个 acl 基础库,所以需要首先编译这三个库:

$cd lib_acl; make

$cd lib_protocol; make

$cd lib_acl_cpp; make

然后再进入 app/redis_tools/redis_builder 编译:$cd app/redis_tools/redis_builder; make

 

六、参考

redis_builder 的工具下载:https://github.com/acl-dev/acl/tree/master/app/redis_tools/redis_builder

acl 中的 redis 模块例子:https://github.com/acl-dev/acl/tree/master/lib_acl_cpp/samples/redis

acl on github:https://github.com/acl-dev/acl

acl on sourceforge:https://sourceforge.net/projects/acl/
acl on oschina:http://git.oschina.net/acl-dev/acl

使用 redis_builder 管理 redis 集群 : http://zsxxsz.iteye.com/blog/2293332

微博:http://weibo.com/zsxxsz/

QQ 群:242722074

3
2
分享到:
评论
2 楼 dragon9098 2015-04-21  
顶一个,老大辛苦了!
1 楼 islandhn 2015-04-20  

相关推荐

    Redis集群安装部署

    总结以上知识点,要成功安装和部署一个运行稳定的Redis集群,不仅需要对Redis的配置和运行原理有深入理解,还需要对操作系统和网络配置有足够的了解,以确保集群的各节点可以安全、高效地通信和协同工作。...

    Linux 下Redis集群部署

    3. **使用 `redis-trib.rb` 工具**:在 Redis 源码的 `src` 目录下找到 `redis-trib.rb` 文件,该文件提供了多种命令用于管理 Redis 集群,如创建、检查、修复集群等。 ```bash $ cd /path/to/redis-3.2.1/src $...

    redis集群部署方式

    本文档详细介绍如何在单台机器上搭建一个包含六个节点的Redis集群。 ##### 准备环境 1. **安装环境准备**: - 系统:假设使用的是Linux系统。 - IP地址:示例中使用的IP地址为172.16.8.130。 - 软件:Redis ...

    非常详细的redis集群搭建教程

    在一个典型的Redis集群中,通常包含多个主节点(master)和若干个从节点(slave)。主节点负责处理读写操作,而从节点则主要用于读取数据,并作为主节点的备份,以便在主节点发生故障时能够快速切换,保证服务的连续性。...

    Redis-5.0.0集群配置

    为了构建一个健壮的Redis集群,至少需要三个主节点(master)和三个从节点(slave),共计六个节点。在测试环境中,可以在同一台物理机上启动六个Redis实例来模拟集群环境;而在生产环境中,则推荐使用至少三台不同的...

    redis集群文档

    【Redis集群文档】 Redis 是一个高性能的键值存储系统,常用于数据库、缓存和消息中间件等场景。集群是Redis提供的一种扩展解决方案,旨在提高可用性和数据容错性,同时支持更大规模的数据处理。 ## 1. Redis集群...

    redis集群与灾备-干货

    Redis 集群与灾备-干货 Redis 集群搭建是指在多台服务器上部署 Redis 实例,以提高数据存储和读取的性能和可靠...本文提供了一个基本的 Redis 集群搭建方案,但是在实际应用中,可能需要根据具体情况进行调整和优化。

    Redis3.0集群代理系统源码

    Redis3.0集群代理系统, 并发接收客户端请求,计算Key的哈希槽值,转发到对应的缓存服务器,并将缓存服务器的返回值回传给客户端, 这样客户端只要访问集群代理系统,实现一次性定位访问,效率与单台缓存服务器...

    详解centos下搭建redis集群

    通过以上步骤,你可以在CentOS系统中成功搭建起一个基本的Redis集群。集群的扩展和维护则需要持续监控和管理,确保数据的一致性和可用性。在实际操作过程中,遇到问题可以查阅Redis官方文档或社区资源,以便获得更...

    Redis集群详解

    为了搭建一个简单的Redis集群环境,我们需要先安装Redis。假设您已经在Linux环境下准备好了服务器,并且拥有root权限,下面是一个基于CentOS 7的操作步骤: ```bash # 安装必要的依赖包 yum -y install cpp ...

    redis搭建集群111

    首先,需要创建一个目录来存放Redis集群的文件,通常命名为`redis-cluster`,然后进入该目录。 2. 下载Redis 4.0.1源码包 使用`wget`命令下载Redis 4.0.1版本的源码压缩包,这个压缩包是从Redis官方网站的发布页...

    redis集群环境搭建

    ### Redis集群环境搭建详解 #### 一、Redis简介与应用场景 **Redis**(REmote DIctionary Server)是一款由 Salvatore Sanfilippo 开发的开源内存数据结构存储系统,使用 C 语言编写,支持多种数据结构,如字符串、...

    redis安装和redis集群搭建1

    Redis 是一个高性能的键值数据库,通常用于缓存和数据持久化。安装 Redis 包括以下几个步骤: 1. **安装编译环境**: 在 Linux 系统中,首先确保系统已经安装了 GCC 和 GCC-C++,这些是编译 Redis 源代码所必需的...

    redis使用c++ API 的hiredis连接详解

    此代码实现了redis使用hiredis c接口开发,具体实现了string和list类型的存取,具体信息请看 https://blog.csdn.net/bwangk/article/details/83060374

    redis集群安装.docx

    至此,你已经成功地在本地环境中搭建了一个包含6个节点的Redis集群。注意,这只是一个基础的集群配置,实际生产环境中可能还需要考虑网络隔离、监控、备份恢复、故障转移等更复杂的问题。了解和掌握Redis集群的原理...

    redis集群搭建手册

    ### Redis集群搭建手册 ...通过以上步骤,我们可以成功搭建一个包含主从复制和哨兵机制的Redis集群。这种集群不仅可以有效提升系统的稳定性和性能,还能够自动处理节点故障,大大减少了人工干预的需求。

    Redis-Cluster集群模式部署

    Redis Cluster 是 Redis 的一个高可用解决方案,通过将多个 Redis 节点组合成集群,提高 Redis 的可用性和性能。 环境准备 在开始部署 Redis Cluster 之前,需要准备 3 台服务器,每台服务器上需要安装 Redis ...

    Redis集群搭建1

    本篇文章将详细讲解如何搭建一个Redis集群,以及Redis的基础知识和应用场景。 首先,让我们深入了解Redis的基本概念。Redis是用C语言编写的,支持多种键值数据类型,包括字符串、散列、列表、集合和有序集合,这些...

    redis 3.0 集群指南

    ### Redis 3.0 集群指南 #### 一、Redis 3.0 的安装与配置 **安装步骤:** 在安装 Redis 3.0 之前,首先确保已安装了必要的依赖包,如 cpp、binutils、glibc 等。通过 `yum` 命令安装这些依赖: ```bash yum -y ...

Global site tag (gtag.js) - Google Analytics