Redis集群快速搭建

简介:

        Redis 3.0版之前未支持集群功能,一般通过结合Twemproxy(Twitter出品)或者Codis(豌豆荚使用)基于代理方式来实现分布式集群,性能和稳定性都还不错,只是配置和管理方面仍显复杂,性能相比官方自带的集群还是会有些许损失。新发布的3.0版现已默认内置支持集群功能,并完全去除中心化。Redis通过分区来保障集群的可用性,确保即使部分节点失效或者无法连接,集群仍然能够继续处理客户请求。

        Redis使用数据分片而不是一致性哈希的方法来实现集群。集群总共包含16384个哈希槽,每个节点分配一部分哈希槽,每个键存放在其中的一个槽里。这也意味着如果集群未开启主从复制,其中的任何一个节点宕机或断网,这些槽中存放的键将无法访问到。所以开启Redis集群时,最好开启复制,确保当主节点失效或者连接失败时,该主节点对应的从节点能够顶替主节点继续运作。当然,如果是某个主节点发生故障以及该主节点对应的所有从节点也同时出现故障,那么此时集群仍然还是有问题的,也就意味着保存在已发生故障节点的那部分数据无法访问了。

        下面介绍下Redis集群的搭建步骤,暂不涉及到太多的Redis集群理论知识,留待下次讲解。




一.    安装Redis

Redis常用安装管理脚本地址:http://dongsong.blog.51cto.com/916653/1649590

mkdir -p /App/src
cd /App/src
wget http://download.redis.io/releases/redis-3.0.1.tar.gz
sh redis install




二.    搭建Redis集群

测试环境使用一台主机运行6个实例来构建集群,每个Redis实例通过启动时指定不同的配置文件,配置文件存放在6个目录下,区别在于端口号不同,未写明的参数将使用Redis默认的配置。端口号从6380至6385。由于默认配置的缘故,Redis将自动保存快照RDB文件至./目录下,为了避免各个Redis实例自动备份路径冲突,所以应该cd进入每个目录后再启动。或者修改每个配置文件的dir参数也可避免备份冲突。

(1).    新建集群测试基目录:

mkdir -p /App/redis/cluster
cd /App/redis/cluster

(2).    新建Redis集群精简模板配置文件/App/redis/cluster/redis.conf,配置中文件nodes.conf为启动时自动创建,用于保存集群状态信息:

# redis.conf
port 6380
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
logfile redis.log

(3).    添加一集群管理脚本/App/redis/cluster/cluster,该程序只需修改好模板/App/redis/cluster/redis.conf,执行init即可初始化每个实例的配置参数,并启动或停止Redis集群所有实例,(注意事项:Redis集群节点会额外开启一个新端口用于各节点交互通信,额外端口为redis.conf监听端口参数port指定的数值+10000):

#!/bin/sh
# Redis集群实例管理
RedisSrv=/App/redis/bin/redis-server
RedisCli=/App/redis/bin/redis-cli
Dir=$(cd $(dirname $0); pwd)
Script=$(basename $0)
Conf=redis.conf
# 最小端口
SPort=6380
# 最大端口
EPort=6385

# 初始化
fInit() {
    for Port in $(seq $SPort $EPort)
    do
        mkdir -p $Dir/$Port
        cp -f $Dir/$Conf $Dir/$Port
        sed -i "s#^port $SPort#port $Port#" $Dir/$Port/redis.conf
    done
}

# 启动
fStart() {
    for Port in $(seq $SPort $EPort)
    do
        cd $Dir/$Port
        $RedisSrv redis.conf
    done
}

# 停止
fStop() {
    for Port in $(seq $SPort $EPort)
    do
        cd $Dir/$Port
        $RedisCli -p $Port shutdown
    done
}

Arg=$1
case $Arg in
    "init"  )
        fInit
        ;;
    "start" )
        fStart
        ;;
    "stop"  )
        fStop
        ;;
    * )
        echo "$Script init|start|stop"
        ;;
esac

(4).    初始化,为每个实例都新建一个和端口号一致的目录并修改监听端口:

sh cluster init

(5).    启动集群所有Redis实例:

sh cluster start

(6).    创建Redis集群,需要用到源码包中src下的Ruby程序redis-trib.rb文件:

cp /App/src/redis-3.0.1/src/redis-trib.rb /App/redis/cluster/
cd /App/redis/cluster/
./redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385

        1.    create,表示创建一个新的集群。

        2.    选项 --replicas 1 表示为集群中的每个主节点创建一个从节点。

        3.    其余参数则是新建集群中实例的地址列表。

wKioL1VM3i2jJJqpAAUuedaKmPw286.jpg

(7).    看到上图类似输出表示:监听6380端口Redis分配了0-5460共5461个槽,6383为6380的从;6381分配了5461-10922共5462个槽,6384为6381的从;6382分配了10923-16383共5461个槽,6385为6382的从。输入yes并回车确认。

wKiom1VM3WLxwM2nAAS4gY9Od3I487.jpg

(8).    看到上图表示集群已新建成功,3主3从节点,每个节点都有不同的ID。总共使用了16384个Hash槽。




三.    测试集群

1.    redis-cli程序必须添加 -c 参数选项,才可实现基本的集群支持操作。

wKioL1VM5L6jr1ZWAARHz0p_dzs093.jpg

2.    停掉一个主库后

wKioL1VM6cOhW2yrAAQenp_BTjA349.jpg

3.    检查集群状况

wKiom1VM6Riyi1V9AATFM5DGMXc280.jpg

从以上可以看出,6383从节点成功代替了6380主节点并修改为主节点,集群服务未受影响。




四.    支持Redis集群客户端

Redis从刚发布的3.0版才正式开始支持集群功能,目前支持集群功能的客户端还比较缺乏,稳定性也尚需时间检验,下面列举一些已开始部分支持Redis集群的编程语言客户端:

1.    Shell:新版自带redis-cli实用程序,加上 -c 参数已提供基本的集群支持。

2.    PHP:Predis

3.    Java:Jedis

4.    Ruby:redis-rb-cluster

5.    Python:redis-py-cluster

6.    C#:StackExchange.Redis

7.    Node.js:thunk-redis






      本文转自dongsong1117 51CTO博客,原文链接:http://blog.51cto.com/dongsong/1649680,如需转载请自行联系原作者






相关文章
|
10月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
731 2
|
存储 NoSQL 数据库
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
1143 5
|
8月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
894 6
|
9月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
11月前
|
负载均衡 NoSQL Redis
【赵渝强老师】Redis的主从复制集群
Redis主从复制是指将一台Redis服务器的数据复制到其他Redis服务器,实现数据热备份、故障恢复、负载均衡及高可用架构的基础。主节点负责写操作,从节点同步数据并可提供读服务,提升并发处理能力。
361 5
|
10月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
876 0
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构