文档章节

Redis集群快速搭建

 董松
发布于 2015/05/21 22:14
字数 1401
阅读 158
收藏 7

        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

本文出自 “松松” 博客,请务必保留此出处http://dongsong.blog.51cto.com/916653/1649680

本文转载自:http://dongsong.blog.51cto.com/916653/1649680

粉丝 9
博文 42
码字总数 22010
作品 0
朝阳
运维
私信 提问
Redis Cluster集群快速搭建

想在3分钟以内搭建一个Redis Cluster集群吗?说3分钟可能有点久,实际上好像不到一分钟就完成了Redis Cluster集群的搭建。 介绍 redis cluster是官方提供的一种集群方案,Redis-Cluster采用无...

艾贺521
2018/08/13
0
0
redis演练聚集

redis演练(1) 搭建redis服务 redis演练(2) 最全redis命令列表 redis演练(3) redis事务管理 redis演练(4) redis基准测试 redis演练(5) redis持久化 redis演练(6) redis主从模式搭建 redis运维...

randy_shandong
2016/09/11
0
0
Redis Cluster 运维总结

集群总结: 1、Redis Cluster数据分区规则采用虚拟槽方式(16384个槽),每个节点负责一个部分槽和相关数据,实现数据和请求的负载均衡。 2、搭建集群划分四个步骤:准备节点、节点握手、分配...

moon888
2018/03/12
437
0
通用Redis架构+实用辅助工具,逐一攻破DBA痛难点!

今天将和大家介绍常见的Redis架构、以往我在陌陌、去哪儿网做Redis时的一些经验,主要包括DBA日常维护MySQL或Redis时需要做的工作、如何根据日常工作和业务的需求来制定Redis架构,最后是分享...

DBAplus社群
2018/04/18
0
0
RedisCluter集群(一):Redis高可用集群Redis Cluster搭建

原文地址:https://my.oschina.net/lyyjason/blog/1842002 前言: Redis3.0版本之前,可以通过Redis Sentinel(哨兵)来实现高可用 ( HA ),从3.0版本之后,官方推出了Redis Cluster,它的主...

lyyjason
2018/07/07
4.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

移动开发中的 Web:WebView、WebKit、JSCore、Web 优化、热修复、跨平台、Native、Hybrid……

移动开发领域近年来已经逐渐告别了野蛮生长的时期,进入了相对成熟的时代。而一直以来 Native 和 Web 的争论从未停止,通过开发者孜孜不倦的努力,Web 的效率和 Native 的体验也一直在寻求着...

编辑部的故事
3分钟前
0
0
MySQL8.0.17 - Multi-Valued Indexes 简述

本文主要简单介绍下8.0.17新引入的功能multi-valued index, 顾名思义,索引上对于同一个Primary key, 可以建立多个二级索引项,实际上已经对array类型的基础功能做了支持 (感觉官方未来一定...

阿里云官方博客
49分钟前
5
0
make4.1降级 make-3.81、2错误

在编译 make-3.82 的时候出现如下错误提示 glob/glob.c:xxx: undefined reference to `__alloca'` 修改 /glob/glob.c // #if !defined __alloca && !defined __GNU_LIBRARY__ # ifdef __GNUC......

Domineering
50分钟前
11
0
Rainbond集群的安装和运维的原理

本文将解读Rainbond集群的安装和运维的原理,使用户基本了解Rainbond的安装机制和运维重点,便于用户搭建大型Rainbond集群。 1.Rainbond集群节点概述 1.1 节点分类 属性 类型 说明 manage 管...

好雨云帮
今天
9
0
好程序员大数据学习路线分享UDF函数

1.为什么需要UDF? 1)、因为内部函数没法满足需求。 2)、hive它本身就是一个灵活框架,允许用自定义模块功能,如可以自定义UDF、serde、输入输出等。 2.UDF是什么? UDF:user difine fun...

好程序员官方
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部