一、概述

在前面的文章中介绍过了redis的主从和哨兵两种集群方案,redis从3.0版本开始引入了redis-cluster(集群)。从主从-哨兵-集群可以看到redis的不断完善;主从复制是最简单的节点同步方案无法主从自动故障转移。哨兵可以同时管理多个主从同步方案同时也可以处理主从自动故障转移,通过配置多个哨兵节点可以解决单点网络故障问题,但是单个节点的性能压力问题无法解决。集群解决了前面两个方案的所有问题。

Redis-Cluster架构图:

1.Redis-Cluster采用无中心结构,每个节点都和其它节点通过互ping保持连接,每个节点保存整个集群的状态信息,可以通过连接任意节点读取或者写入数据(甚至是没有数据的空节点)。

2.只有当集群中的大多数节点同时fail整个集群才fail。

3.整个集群有16384个slot,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。读取一个key时也是相同的算法。

4.当主节点fail时从节点会升级为主节点,fail的主节点online之后自动变成了从节点。

二、集群安装

1.插件ruby

yum remove ruby
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.gz
yum -y install gcc gcc-c++ autoconf automake make zlib-devel
tar xvf ruby-2.5..tar.gz
cd ruby-2.5./
./configure -prefix=/usr/local/ruby
make
make install vim /etc/profile
export PATH=/usr/local/ruby/bin:$PATH
source /etc/profile

2.安装gem

wget http://rubygems.org/downloads/redis-3.2.2.gem
gem install redis-3.2.2.gem
gem list

注意:不要使用gem install redis来默认安装,默认安装可能会安装redis-4.0.0版本。之前因为安装默认的版本过高导致reshard的时候一直失败。可以参考:http://www.cnblogs.com/chenmh/p/9221672.html

安装redis-stat

gem install redis-stat

2.防火墙

除了端口本身,还有+10000的内部通讯端口需要加入到防火墙

7001,17001,7002,17002,7003,17003

3.安装redis

tar -xvf redis-3.0..tar.gz
cd redis-3.0.
make MALLOC=libc
cp src/redis-server redis-cli redis-trib.rb redis-benchmark redis-check-aof redis-check-rdb redis-sentinel /usr/local/bin

创建redis目录

mkdir -p /redis/redis-cluster/
cd /redis/redis-cluster/
mkdir -p /data /log /tmp
cp -rp
cp -rp 7003
cp -rp

创建配置文件

cd
vim redis.conf
port
daemonize yes
timeout
databases
save
save
save
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
lua-time-limit
bind 192.168.191.11 127.0.0.1
######################################limit#######################
maxclients
maxmemory 512mb
maxmemory-policy volatile-ttl
maxmemory-samples #######################################file#######################
pidfile "/redis/redis-cluster/7001/tmp/redis_7001.pid"
loglevel notice
logfile "/redis/redis-cluster/7001/log/redis_7001.log"
dbfilename "dump.rdb"
dir "/redis/redis-cluster/7001/data" appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size 64mb
######################################replication###########################
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay
repl-disable-tcp-nodelay no
slave-priority
requirepass ""
masterauth "" ######################################slowlog################################
slowlog-log-slower-than
slowlog-max-len
latency-monitor-threshold ####################################cluster####################################
cluster-enabled yes
cluster-config-file "/redis/redis-cluster/7001/nodes.conf"
cluster-node-timeout

将redis.conf配置文件拷贝到其它的几个节点并修改对应的端口、路径等相关信息。slowlog单位是微妙

注意:注意bind后面ip的先后顺序,如果配置127.0.0.1在前面的话,那么集群默认会启用127.0.0.1会造成远程无法访问。

4.启动redis集群

启动所有的redis集群

./redis-server redis.conf 

可以写在bash脚本文件中启动

三、集群管理

1.创建集群

redis-trib.rb create 192.168.191.11:7001 192.168.191.11:7002 192.168.191.11:7003

如果加上参数--replicas 1表示为每一个主节点创建一个从节点

备注:其实也不建议使用-replicas 1来自动创建主从关系,因为这种创建方法没办法指定哪个从节点对应哪个主节点,无法控制交叉主从。可以先创建好主节点,然后再通过创建从节点指定主节点。

2.集群配置密码处理

默认如果redis cluster节点配置了密码验证,redis-trib.rb操作会失败,则需要在需要执行redis-trib.rb操作的节点修改client.rb文件,操作如下:

find / -name 'client.rb'
vim /usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb

注意:由于每个人安装的版本不一样所以路径也可能有所差别,在passwd参数后面设置验证的密码,注意所有节点的密码必须是相同的。

3.检查集群

redis-trib.rb check 192.168.191.11:7001

4.增加节点

1.增加主节点

redis-trib.rb add-node 192.168.191.11:7004 192.168.191.11:7001

注意:最后后面的ip和端口是目前集群中已经存在的节点,前面的ip和端口是要增加的。

2.增加从节点

----增加从节点
redis-trib.rb add-node --slave 192.168.191.11:8001 192.168.191.11:7001
----增加从节点并指定主节点
redis-trib.rb add-node --slave --master-id 64ee652b75a78fc08253fddab5a920988a870f68 192.168.191.11:8001 192.168.191.11:7001

注意:最后面的ip和端口是现集群中已经存在的节点

5.移动slot

redis-trib.rb reshard 192.168.191.11:7001

iphe端口随便指定集群中的某一个,然后输入要移动的slot个数和源节点目标节点id,最后输入done即可。

6.移动节点

可以指定当前节点的master,或者改变当前节点所属的master,登入到当前节点执行如下命令:

cluster replicate 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052  ###新master的nodeid

7.删除节点

注意: 删除主节点之前需要先将主节点上的所有slot移动到别的主节点,并且保证没有从节点,否则需要先将从节点移走或者删除

删除节点时需要指定节点的id

redis-trib.rb del-node 192.168.191.11:7001 af0f17b501b9f9f5e71ff6be1cf8114c9e11a80b 

后面的id即为需要删除的节点id,删除节点和增加节点语法节点的循序正好相反

四、集群相关命令

CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
CLUSTER SLAVES node-id 返回一个master节点的slaves 列表

错误处理:

如果操作系统是7.0以上版本,可能会因为yum方式安装的ruby的版本太低,报“redis requires Ruby version >= 2.2.2”错误,这时可以这样处理:

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
\curl -sSL https://get.rvm.io | bash -s stable
source  /etc/profile.d/rvm.sh

查看可以安装的版本:

rvm list known

安装其中的一个版本,大于2.2.2的版本即可

rvm install 2.4.1

查看已安装的gem,ruby版本

ruby -v
gem -v

执行gem安装

gem install redis

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

Redis Cluster(集群)的更多相关文章

  1. Redis Cluster集群搭建与配置

    Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...

  2. jedis处理redis cluster集群的密码问题

    环境介绍:jedis:2.8.0 redis版本:3.2 首先说一下redis集群的方式,一种是cluster的 一种是sentinel的,cluster的是redis 3.0之后出来新的集群方式 本 ...

  3. 深入分析redis cluster 集群

    深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://rub ...

  4. Redis Cluster集群搭建与应用

    1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...

  5. Redis Cluster集群主从方案

    本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制). 附:Redis Cluster集群主 ...

  6. CentOS7 安装Redis Cluster集群

    上一篇中已经讲到了如何安装单击版Redis,这一篇我们来说下如何安装Cluster,关于哨兵模式这里我就不写文章安装了,有兴趣的同学可以自己去研究,哨兵模式可以在主从模式下在创建三台机器的哨兵集群监控 ...

  7. Redis Cluster集群架构实现(四)--技术流ken

    Redis集群简介 通过前面三篇博客的介绍<Redis基础认识及常用命令使用(一)--技术流ken>,<Redis基础知识补充及持久化.备份介绍(二)--技术流ken>,< ...

  8. 【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!

    转: [精]搭建redis cluster集群,JedisCluster带密码访问[解决当中各种坑]! 2017年05月09日 00:13:18 冉椿林博客 阅读数:18208  版权声明:本文为博主 ...

  9. redis cluster集群web管理工具 relumin

    redis cluster集群web管理工具 relumin 下载地址 https://github.com/be-hase/relumin 只支持redis cluster模式 java环境 tar ...

  10. Redis Cluster集群知识学习总结

    Redis集群解决方案有两个: 1)  Twemproxy: 这是Twitter推出的解决方案,简单的说就是上层加个代理负责分发,属于client端集群方案,目前很多应用者都在采用的解决方案.Twem ...

随机推荐

  1. SpringBoot相关错误

    1.org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Object;)V 搭建spr ...

  2. C语言中return 0和return 1和return -1

    转载声明:本文系转载文章 原文作者:十一月zz 原文地址:https://blog.csdn.net/baidu_35679960/article/details/77542787 1.返回值int  ...

  3. bzoj 2599

    还是点对之间的问题,果断上点分治 同样,把一条路径拆分成经过根节点的两条路径,对不经过根节点的路径递归处理 然后,我们逐个枚举根节点的子树,计算出子树中某一点到根节点的距离,然后在之前已经处理过的点中 ...

  4. java中文和unicode编码相互转换(转)

    工具类代码如下: package aa.com; import java.io.UnsupportedEncodingException; public class UnicodeUtil { pub ...

  5. 2018-2019-2 网络对抗技术 20165323 Exp1 PC平台逆向破解

    实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...

  6. hackerrank杂记

    https://www.hackerrank.com/challenges/py-set-discard-remove-pop/forum 知识点: *list:将list中的值取出,取出的数据大小是 ...

  7. golang http.client 遇到了 Connection reset by peer 问题

    最近一个 golang 写的 http.client 的,获取远程服务器数据,有时候会报错,尤其在数量很大的时候,老是收到 Connection reset by peer 这样的 提醒,都有点想用重 ...

  8. SQL 将变量定义为Table类型

    ),a2 ,),a4 DATETIME,a5 UNIQUEIDENTIFIER) ,11.22,GETDATE(),NEWID()) ,11.22,GETDATE(),NEWID()) ,11.22, ...

  9. C语言--第五次作业--指针

    1.本章学习总结 1.1 思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 没想到都已经学习完C语言的灵魂-指针的内容了(当然也是C里面最难学习的内容了).虽然在之前就有听学习进度比较 ...

  10. Invitation Cards POJ - 1511 (双向单源最短路)

    In the age of television, not many people attend theater performances. Antique Comedians of Malidine ...