redis cluster官方集群的搭建笔记

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

参考文档:

https://www.zybuluo.com/phper/note/195558

http://www.cnblogs.com/shihaiming/p/5949772.html

http://redis.io/topics/cluster-tutorial

http://xiaorui.cc 


系统环境:

CentOS6.7 X86_64

双机6节点:

node1: 192.168.2.11

node2: 192.168.2.12

node3192.168.2.13

 

redis cluster必须用3.X版本的才能支持。我们实验中使用的是3.0.1版本的redis

 

安装redis

安装redis的过程略过。

安装ruby及相关redis依赖组件

#!/bin/bash

安装Ruby2.3.0,安装到/usr/local/ruby目录下

安装rubygems、安装redis-rb组件

 

先安装相关的devel

yum install zlib zlib-developenssl openssl-devel -y

wait

 

编译安装 ruby2.3.0

tar xf src/ruby-2.3.0.tar.gz -Csrc/

cd src/ruby-2.3.0

./configure --enable-shared--enable-pthread --prefix=/usr/local/ruby

make && make install

wait

 

echo 'exportPATH=/usr/local/ruby/bin:$PATH' > /etc/profile.d/ruby.sh

source /etc/profile.d/ruby.sh

 

安装 rubygems

/usr/local/ruby/bin/gem installrubygems-update

update_rubygems

 

wait

 

安装redis-rb

/usr/local/ruby/bin/gem installredis

 

wait


# 一些补充说明: 

# client.rb的存放路径:

#/usr/local/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.1/lib/redis/client.rb

# redis 3.X cluster 如果添加密码认证的话,需要修改client.rb里面的password

 

配置redis cluster的基本操作

node1node2上都运行3个节点

 

node1上如下操作:

cd /usr/local/

mkdir redis_cluster

cd redis_cluster

mkdir 7000 7001 7002

cp /usr/local/redis/etc/redis.conf7000/

 

vim 7000/redis.conf 修改的地方如下:

pidfile /var/run/redis7000.pid

port 7000

logfile "./redis.log"

dir /usr/local/redis_cluster/7000/

appendonly yes

cluster-enabled yes      # 注意一定要开启这个集群功能

 

同样的操作,将redis.conf 复制到7001 7002文件夹下,并修改下各自的配置文件

sed -i 's#7000#7001#'/usr/local/redis_cluster/7001/redis.conf

sed -i 's#7000#7002#' /usr/local/redis_cluster/7002/redis.conf

 

配置文件都修改好后,启动3redis实例。

redis-server/usr/local/redis_cluster/7000/redis.conf

redis-server/usr/local/redis_cluster/7001/redis.conf

redis-server/usr/local/redis_cluster/7002/redis.conf


ss -lnt

可以看到redis不仅监听在7000~7002端口上,还开启了700X+10000的端口号。

700X是用于客户端访问的

1700X是用于集群内部节点之间访问的


node2上如下操作:

cd /usr/local/

mkdir redis_cluster

cd redis_cluster

mkdir 7003 7004 7005

 

vim 7003/redis.conf 修改的地方如下:

pidfile /var/run/redis7003.pid

port 7003

logfile "./redis.log"

dir /usr/local/redis_cluster/7003/

appendonly yes

cluster-enabled yes      # 注意一定要开启这个集群功能

 

同样的操作,将redis.conf 复制到7004 7005文件夹下,并修改下各自的配置文件

 

 

redis-server/usr/local/redis_cluster/7003/redis.conf

redis-server/usr/local/redis_cluster/7004/redis.conf

redis-server /usr/local/redis_cluster/7005/redis.conf

 

ss -lnt|grep 700


node1node2都启动好了之后,我们可以执行下面的操作:

 

说明:

我编译安装的redis,不知为何在/usr/local/redis/下所有文件夹里都没有redis-trib.rb 这个文件。因此我是从原始的安装包把src/redis-trib.rb拷贝到/usr/local/redis/bin里面的。

cp /root/redis-3.0.1/src/redis-trib.rb  /usr/local/redis/bin

 

然后在node1上执行:

redis-trib.rb create --replicas 1192.168.2.11:7000 192.168.2.11:7001 192.168.2.11:7002 192.168.2.12:7003192.168.2.12:7004 192.168.2.12:7005

上面的命令含义:replicas 是给master分配slave个数的参数,我们给的参数是,那每个master就有一个从节点

wKiom1gGV47j1xC5AADVgUcUjaY606.png

wKioL1gGV5Djfr6MAACw9nWbyO8259.png

运行后,还可以运行redis-trib.rb check192.168.2.11:7000 检查下集群的状态,如下图:

wKiom1gGV63A9ydWAADMQ3PIMTw901.png


现在,我们加入一台主机node3node3上跑了1redis,端口是7006redis.conf的配置文件和上面的基本相同。

node3上启动7006端口的redis

redis-server/usr/local/redis_cluster/7006/redis.conf

 

然后,我们到node1上,添加一个节点node37006端口,在node1上操作如下:

redis-trib.rb add-node 192.168.2.13:7006192.168.2.11:7000

格式:redis-trib.rb add-node 你想要的增加的ip:port  现在已经存在的IP:port

 

如果这一步添加失败了,原因可能如下:[摘录自xiaorui.cc]

[ERR]Node xx.xx.xx.xx:7006 is not empty. Either the node already knows other nodes(check with CLUSTER NODES) or contains some key in database 0.

上面的问题比较常见,尤其大家在测试的环境下,需要删除你redis.conf里面cluster-config-file 所在的文件。如果是你线上的环境一般很难遇到这样的问题,如果是小范围测试的时候,不注意把redis.conf都复制成一样,或者端口不一样,cluster的配置文件是一样… 所以redis启动不了,但势必会造成这个问题….    如果删除文件不好用,那么就直接redis-cli -p port进去,然后删掉所有的数据……   这两件事情都做OK了后,就可以正常启动了,不会提示你 not empty了。

 

 

添加成功后,再检查下,如下图:

redis-trib.rb check 192.168.2.11:7000

wKiom1gGV8ziR7w2AACcg_ddeLo386.png

上图中可以看出:master4个,slave3个。

 

 

然后我们可以尝试使用redis-cli来连接redis实例。

 

# redis-cli -p 7003 -h 192.168.2.12 -c

注意这个-c参数,不加-c则客户端不自动切换。而加上-c如果set存数据发现不在本机上则会自动切换到7001客户端保存。

 

然后可以随意set写入些内容,如下图。

wKioL1gGV_ORyhV8AAAjrqCvo_M930.png

可以看到我们set 第一条数据的时候,直接给我们转到了192.168.2.12 7005端口的redis上去。

然后再次set数据的时候,又跳到了192.168.2.12 7003端口的redis了。

 

补充说明:这些key是经过CRC16('my_name')%16384计算后,自动分配存放到其他的master上了

 

 

集群中一个master宕机

6台(33从)试验中,可以看到当某一个master宕机后,其对应的slave会自动提升为master提供服务,对集群不会造成影响。

但是如果之后这个slave也挂了,则整个集群都会受到影响。



集群中再加入一个节点(分为主节点、从节点)

当前环境3master3slave

如果我们在加入一台redis的话,默认是添加成为master节点的。

 

> cluster nodes   可以看到集群中有哪些节点,下图可以看到新加入的节点还是myself状态。

wKiom1gGWCGRTdDeAACAiVmjLTM930.png


redis-trib.rb check 192.168.2.13:7006  

wKioL1gGWCHyDkaHAAAV9BKzahA717.png

可以看到新加入的这个节点没有分配数据,因此我们需要迁移下数据。见下面的数据的reshard操作:

数据的reshard

我们可以在线进行reshard,目的是让slot重新按照我们的规则分配,这样能一定程度。的解决数据分配不均匀的情况。如果你先增加了一个节点,也可以用reshard的方式让一定数目的slot迁移过去….   这样解决了新节点的slot分配…. 

 

迁移的方法:redis-trib.rb reshard 192.168.2.12:7005

说明:redis-trib.rb reshard 要迁移的集群中的任意节点IP:PORT

输入上面的命令后,自动出现“How many slots do you want tomove (from 1 to 16384)”  这个是问我们要迁移多少个slot7006这个新节点。

可以算一下,16384/4=4096,也就是说,为了平衡分配起见,我们需要移动4096个槽点到7006上。

 

输入4096后,系统自动提示我们输入要接收这些slot数据的主机的ID是多少? id就是我们check时候看到的那个一长串字符串。

 

接着, redis-trib 会向你询问重新分片的源节点(source node),也即是,要从哪个节点中取出4096个哈希槽,并将这些槽移动到7006节点上面。

如果我们不打算从特定的节点上取出指定数量的哈希槽,那么可以向redis-trib输入all,这样的话,集群中的所有主节点都会成为源节点,redis-trib将从各个源节点中各取出一部分哈希槽,凑够 4096个,然后移动到7006节点上:

 

Source node #1:all

接下来就开始迁移了,并且会询问你是否确认:

 

输入 yes 并使用按下回车之后, redis-trib 就会正式开始执行重新分片操作,将指定的哈希槽从源节点一个个地移动到7006节点上面。

 

迁移完成后,可以执行redis-trib.rb check192.168.2.12:7005 查看下7006slot数量是多少。

 

 

reids cluster中删除一个redis节点….

root@ubuntu:~/redis-3.0.1/src#./redis-trib.rb del-node 127.0.0.1:7007

 

给指定的redis master节点添加从节点… 

默认add-node是添加主master节点…..

./redis-trib.rb add-node –slave–master-id ’ee05942ee38a56421a07eea01bc6072fe5e23bfd’ 127.0.0.1:7008  127.0.0.1:7000

 










本文转自 lirulei90 51CTO博客,原文链接:http://blog.51cto.com/lee90/1863242,如需转载请自行联系原作者
相关实践学习
基于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
目录
相关文章
|
12天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
22 0
|
21天前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
22 2
|
2月前
|
存储 缓存 NoSQL
蚂蚁金服P7私藏的Redis原理与实践内部笔记
Redis 是完全开源免费的,是一个高性能的key-value类型的内存数据库。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
59 1
|
26天前
|
NoSQL Redis
Redis集群(六):集群常用命令及说明
Redis集群(六):集群常用命令及说明
17 0
|
2月前
|
运维 NoSQL 算法
Redis-Cluster 与 Redis 集群的技术大比拼
Redis-Cluster 与 Redis 集群的技术大比拼
46 0
|
12天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0
|
21天前
|
NoSQL Java 测试技术
面试官:如何搭建Redis集群?
**Redis Cluster** 是从 Redis 3.0 开始引入的集群解决方案,它分散数据以减少对单个主节点的依赖,提升读写性能。16384 个槽位分配给节点,客户端通过槽位信息直接路由请求。集群是无代理、去中心化的,多数命令直接由节点处理,保持高性能。通过 `create-cluster` 工具快速搭建集群,但适用于测试环境。在生产环境,需手动配置文件,启动节点,然后使用 `redis-cli --cluster create` 分配槽位和从节点。集群动态添加删除节点、数据重新分片及故障转移涉及复杂操作,包括主从切换和槽位迁移。
31 0
面试官:如何搭建Redis集群?
|
25天前
|
存储 缓存 NoSQL
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)(一)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)
45 0
|
1月前
|
NoSQL Redis Docker
使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
61 0
|
1月前
|
存储 监控 NoSQL
Redis 架构深入:主从复制、哨兵到集群
大家好,我是小康,今天我们来聊下 Redis 的几种架构模式,包括主从复制、哨兵和集群模式。
Redis 架构深入:主从复制、哨兵到集群

热门文章

最新文章