Redis集群快速搭建

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

        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,如需转载请自行联系原作者






相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
存储 缓存 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多路复用模型
|
8天前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
20 5
|
4月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
146 0
|
6月前
|
存储 运维 NoSQL
Redis Cluster集群模式部署
Redis Cluster集群模式部署
127 4
|
6月前
|
监控 NoSQL 算法
手把手教你如何搭建redis集群(二)
手把手教你如何搭建redis集群(二)
430 1
|
6月前
|
存储 NoSQL 容灾
手把手教你如何搭建redis集群(一)
手把手教你如何搭建redis集群(一)
222 1
|
5月前
|
存储 NoSQL 算法
Redis 集群模式搭建
Redis 集群模式搭建
97 5
|
5月前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
102 1
|
5月前
|
缓存 NoSQL Java
Redis Spring配置集群
【7月更文挑战第5天】
79 10