Redis Cluster的实现和管理

Redis Cluster在redis3.0版本以上开始支持,以ruby环境运行。他可以把多个redis实例整合在一起,形成一个集群,集群内分配slot(分片槽),实现数据的分片存放。客户端只要以集群的模式连接上集群内任意一个节点,就可以操作整个集群。

集群角色有Master和Slave。Master之间分配slots,一共16384个slot。Slave向它指定的Master同步数据,实现备份。当其中的一个Master无法提供服务时,该Master的Slave讲提升为Master,保证集群间slot的完整性。一旦其中的某一个Master和它的Slave都失效,导致了slot不完整,集群失效。

环境准备:

Redis节点:

192.168.189.144:9000

192.168.189.144:9001

192.168.189.145:8000

192.168.189.145:8001

192.168.189.146:7000

192.168.189.146:7001

在上述节点安装3.0以上的redis版本,安装完成后有redis-trib.rb文件,这个文件用于操作管理reids cluster。

选择192.168.189.144为Cluster操作机器,安装ruby环境,ruby环境要在1.8.5以上。

#rpm  -ivh  http://yum.puppetlabs.com/el/5/products/x86_64/puppetlabs-release-5-6.noarch.rpm
#yum install ruby.x86_64 ruby-devel.x86_64 rubygems.noarch 
#gem install redis    ---安装ruby的redis接口

集群配置:

开启每个redis的redis cluster功能,配置如下,根据实例分配端口:

#grep -v ^# redis.conf  | grep -v ^$
daemonize yes
pidfile /usr/local/redis_cluster/9000/var/redis.pid
port 9000
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/usr/local/redis_cluster/9000/redis.log"
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis_cluster/9000/data
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
cluster-enabled yes       -----开启cluster
cluster-config-file nodes.conf
cluster-node-timeout 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

启动所有的redis节点:

192.168.189.144:

#/usr/local/redis_cluster/9000/bin/redis-server /usr/local/redis_cluster/9000/etc/redis.conf 
#/usr/local/redis_cluster/9001/bin/redis-server /usr/local/redis_cluster/9001/etc/redis.conf

192.168.189.145:

#/usr/local/redis_cluster/8000/bin/redis-server /usr/local/redis_cluster/8000/etc/redis.conf 
#/usr/local/redis_cluster/8001/bin/redis-server /usr/local/redis_cluster/8001/etc/redis.conf

192.168.189.146:

#/usr/local/redis_cluster/7000/bin/redis-server /usr/local/redis_cluster/7000/etc/redis.conf 
#/usr/local/redis_cluster/7001/bin/redis-server /usr/local/redis_cluster/7001/etc/redis.conf

启动完所有节点后,查看日志,显示如下:

找不到集群配置,这是因为还没有初始化集群。

在192.168.189.144上使用redis-trib.rb工具,创建集群:

#bin/redis-trib.rb create --replicas 1 192.168.189.144:9000 192.168.189.145:8000 192.168.189.146:7000 192.168.189.144:9001 192.168.189.145:8001 192.168.189.146:7001

(--replicas 1为每个Master指定了1个Slave,Master和Slave的角色,由输入的顺序决定)

从以上创建信息可以看到,集群自动分配出了Master和各自的Slave,并在Master之间分配了slot。集群就创建成功了。

查看集群信息(随意指定集群中的一个节点):

#bin/redis-trib.rb check 192.168.189.144:9000

#bin/redis-cli  -c -h 192.168.189.144 -p 9000 cluster nodes

以上方法都可以看到集群的状态和各节点的信息。

Cluster测试:

以集群的模式,使用redis客户端连上一个Master节点,插入一些数据:

可以看到,插入数据时,数据会自动插入到不同Master节点上的slot。说明实现了分片的目的,形成了集群。

这时可以连接到集群中的另一个结点去查看之前插入的数据:

可以发现集群会自动定位到key值的位置,并跳到该redis实例去取到需要的数据。

节点的增减:

在192.168.189.144新增两个6000,6001的空实例。新增6000为集群的新的Master,6001为6000的slave。

启动新增实例:

#/usr/local/redis_cluster/6000/bin/redis-server /usr/local/redis_cluster/6000/etc/redis.conf 
#/usr/local/redis_cluster/6001/bin/redis-server /usr/local/redis_cluster/6001/etc/redis.conf

添加6000为Master节点:

#bin/redis-trib.rb add-node 192.168.189.144:6000 192.168.189.144:9000   (前面为新增的节点,后面为集群里已有的随意节点)

使用check命令查看集群状态,可以看到192.168.189.144:6000已经加入集群,角色为Master,没有分配slot,所以没有数据。

所以,需要给144:6000分配slot,使它能够存放数据。

#bin/redis-trib.rb reshard 192.168.189.144:6000

这里为新的节点分配了1000个slot。此命令可也可用于在线reshard。

在查看144:6000的信息,就可以看到它已有的slot了,因为试验中我选择了all当作source node,所以slot是从其他的各个Master分配过来的。一共分配了1000个。

为144:6000新增slave节点:

首先,先把144:6001节点加入集群:

#bin/redis-trib.rb add-node 192.168.189.144:6001 192.168.189.144:9000

看到新增的节点,默认的角色都是Master,若想改变它的角色,需连接到该实例,为它指定Master。

(后面加上的为144:6000的node ID)

可以看到144:6001已经变成144:6000的Slave。

删除Slave节点:

#bin/redis-trib.rb del-node 192.168.189.144:6001 ‘39dba7707191d350dab2ef3c47e21e21d3eaf13c‘

slave节点,144:6001删除完成。

删除Master节点:

#bin/redis-trib.rb del-node 192.168.189.144:6000 ‘53f3ff88141bde0fcf1bb1d9cf044ea79b423f7d‘

删除144:6000节点时,发现删除失败,提示说该实例不是空的。因为144:6000上还分配有slot,若删除,会导致集群slot的不完整,所以需先移除该节点上的所有slot,才能进行删除。

用reshard命令移除slot到另一个Master节点。

这时再执行删除,删除成功。

集群冗余测试:

Redis Cluster的正常状态前提是slot的完整,换句话说,只要集群的slot是完整的16384,则集群就能正常工作。

关闭一个Master:

#bin/redis-cli -h 192.168.189.146 -p 7000 shutdown

查看集群状态:

可以看到146:7000节点已经下线,它的Slave145:8001提升为Master,集群正常工作,因为slot还保持完整。

关闭145:8001:

#bin/redis-cli -h 192.168.189.145 -p 8001 shutdown

可以看到145:8001已经无法连接,且它已经没有备份了。这时集群的slot发生了不完整的情况,集群失效。

这时再尝试往集群里写数据,提示说cluster is down,即集群失效了。

时间: 2024-10-18 05:00:30

Redis Cluster的实现和管理的相关文章

定制Dockerfile实现redis cluster的docker化部署及集群管理

我们知道redis cluster的部署是很麻烦的,如果在一台服务器启动多个redis实例的话,需要一个个的cp配置文件到指定的目录,然后一个个的修改端口及相关的信 息...以前经常这么干. 如果采用docker后,我们可以更加方便的启动redis, 我们只需要传递端口参数,在dockerfile里定制一个entrypoint脚本,脚本可以接收docker run的参数-. 但是也可以采用 dockerfile的env参数来定制改变端口... 这个是centos的 dockerfile配置,版本

redis演练(9) redis Cluster 集群管理&failover情况

<redis演练(8) redis Cluster 集群环境安装>,简单阐述了如何安装redis集群环境. 集群环境,主要包括2部分. 1.配置每个节点的配置信息(redis.conf),尤其开启cluster 2.创建集群redis-trib.rb创建集群. 过程非常简单,但非常繁琐,尤其配置各个集群节点的配置信息,如果有一定数量,工作量也不小. 没关系,redis提供了一款cluster工具,能快速构造集群环境.本章的主要内容是介绍redis提供的集群工具. 1.使用create-clus

全面剖析Redis Cluster原理和应用 (转)

1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在Cluster推出之前,可用性要靠Sentinel

redis cluster 集群重启关闭

找遍了redis cluster官方文档,没发现有关集群重启和关闭的方法.为啥会没有呢,猜测redis cluster至少要三个节点才能运行,三台同时挂掉的可能性比较小,只要不同时挂掉,挂掉的机器修复后在加入集群,集群都能良好的运作,万一同时挂掉,数据又没有备份的话,就有大麻烦了. redis cluster集群中的节点基本上都对等的,没有管理节点.如果要让所有节点都关闭,只能关闭进程了# pkill -9 redis 把所有集群都关闭,然后在重新启动,会报以下错误 # redis-trib.r

redis演练(8) redis Cluster 集群环境安装

redis是个分布式缓存,与传统数据库最大的优势,在于它的"分布式"上. 分布式的优势: 容易实现容量的扩展 数据的均等分布 很好的高可用性 redis 和memcached是分布式缓存的两款流行方案,他们之间的对比 redis memcached 主从功能 Replication 支持 主备自动切换 本身不支持,可以通过客户端自己实现 键值一致性 哈希槽 一致性哈希 集群 服务端支持(但是beta版) unstable 由客户端实现 工具支持 提供自带的工具(客户端redis-cli

全面剖析Redis Cluster原理和应用

全面剖析Redis Cluster原理和应用 1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在Cl

Redis Cluster架构和设计机制简单介绍

之前另一篇文章也介绍了 Redis Cluster (link,在文章的后半部分) 今天看到这一篇,简单说一下(http://hot66hot.iteye.com/blog/2050676) 作者的目标:Redis Cluster will support up to ~1000 nodes. 赞... 目前redis支持的cluster特性(已测试): 1):节点自动发现 2):slave->master 选举,集群容错 3):Hot resharding:在线分片 4):集群管理:clust

安全稳定实现redis cluster自动化迁移

背景 目前redis集群最火的是codis和redis cluster(官方),但官方自带工具并没有支持密码操作.那么需要密码认证使用redis cluster集群的同学要仔细看了哦. 相信大家很多人已经使用了redis cluster,而且也肯定会用到核心应用,你是否考虑过如下问题? redis cluster无密码,被改数据 redis cluster无密码,被flushall (你是否有要哭的冲动哈哈) redis cluster无密码,数据在光天化日(你对用户不负责) redis clu

Redis Cluster集群搭建

1.服务器 192.168.1.201 192.168.1.204 192.168.1.205 192.168.1.206 192.168.1.207 192.168.1.208 因为Redis Cluster如果数据冗余是1的话,至少要3个Master和3个Slave. 2.安装步骤 (1)准备工作 mkdir /usr/local/redis_cluster mkdir /usr/local/redis_cluster (安装所需的文件) cd /usr/local/redis_cluste