Redis-Cluster集群搭建及配置
来源:互联网 发布:爱普生清零软件中文版 编辑:程序博客网 时间:2024/06/06 00:06
前言
在上一篇文章中队redis进行了简单的介绍和安装,在这一篇文章中进行一个redis-Cluster的集群搭建。
Redis-Cluster介绍
redis-cluster架构设计
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->key
(5)Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
集群搭建
Redis集群中要求奇数节点,所以至少要有三个节点,并且每个节点至少有一备份节点,所以需要6台服务器。这里我在一个服务器中使用了6个节点。
搭建
1.在user/local路径下新建文件夹redis-cluster,复制redis(简单的介绍和安装文章中安装的redis) 到这个路径下
#创建redis-clustermkdir redis-cluster#将redis复制到redis-cluster文件目录中,分别命名为1-6cp -r /usr/local/redis /usr/local/redis-cluster/redis01cp -r /usr/local/redis /usr/local/redis-cluster/redis02cp -r /usr/local/redis /usr/local/redis-cluster/redis03......
2.修改每一个下面的redis.conf文件
#编辑redis.confvim redis.conf#需要进行修改的内容port=7001#(剩下5个分别为7002,,7003,7004,7005,7006) cluster-enabled yes cluster-require-full-coverage no #默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no
3.需要一个ruby脚本redis-trib.rb 放到redis-cluster下(将redis的解压目录src目录下的该文件复制过去)
cp /usr/local/redis-3.2.9/src/redis-trib.rb /usr/local/redis-cluster/
4.执行ruby脚本
执行ruby脚本,需要安装ruby的环境
yum install ruby yum install rubygems
5.安装redis需要依赖的gem包
下载:https://rubygems.org/gems/redis/versions/3.2.2
将redis-3.2.2.gem拷贝到linux的/usr/local/redis-cluster/下,然后执行安装
gem install redis-3.2.2.gem
6.启动所有的redis实例,
启动上面创建的那6个redis节点,为了简便我们在/usr/local/redis-cluster/写一个脚本来启动所有的redis,内容如下
#redis集群启动脚本内容cd redis01/bin ./redis-server redis.conf cd ../../ cd redis02/bin ./redis-server redis.conf cd ../../ cd redis03/bin ./redis-server redis.conf cd ../../ cd redis04/bin ./redis-server redis.conf cd ../../ cd redis05/bin ./redis-server redis.conf cd ../../ cd redis06/bin ./redis-server redis.conf cd ../../ #给这个shell文件赋予执行权限chmod +x ./start-all.sh#开启所有的实例./start-all.sh
7.使用redis-trib.rb创建集群
因为是在服务器进行搭建测试,这里使用的ip是127.0.0.1,如果需要客户端访问,需要设置为服务器的ip,例192.168.251.129
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
然后输入yes 回车,如下图集群搭建成功:
注意:如果创建集群的时候报错:[ERR]Node XXXXXX is not empty. Either the node already knows other nodes (check withCLUSTER NODES) or contains some key in database 0
解决:删除生成的配置文件nodes.conf,如果不行则说明现在创建的结点包括了旧集群的结点信息,需要删除redis的持久化文件后再重启redis,比如:appendonly.aof、dump.rdb
8.连接集群
使用redis-cli -p 端口 -h ip地址 <-c>连接集群,连接任一节点都可以连接到集群中,但一定要带上 -c参数。如图说明成功。
#因为是本机,所以直接省略的ip直接写上了端口号redis01/bin/redis-cli -p 7001 -c
集群故障转移
测试故障转移
使用下面命令查看所有的主从节点信息
./redis-trib.rb check 127.0.0.1:7001
根据上图可以看到7001 7003 7005都是主节点,下面我们来模拟7005主节点宕机
使用ps -ef|grep redis命令查看7005主节点的pid,进行kill -9 pid杀掉,我再看一下集群信息:
#找到7005的pidps -ef|grep redis#杀掉7005的进程kill -9 2699#查看集群信息./redis-trib.rb check 127.0.0.1:7001
过几秒中我们在看一下
最后,再次启动7005的redis服务,再次查看集群信息,发现7005并没有变为主节点,而是成为了7002的从节点,证明集群可用了
添加节点
节点新增包括新增主节点、从节点两种情况。以下分别做一下测试:
添加主节点
1.继续复制redis命名为redis07、redis08、redis09
cp /usr/local/redis /usr/local/redis-clusr/redis07cp /usr/local/redis /usr/local/redis-clusr/redis08cp /usr/local/redis /usr/local/redis-clusr/redis09
2.依次修改redis7007/7008/7009,的配置文件,端口号分别为7007/7008/7009,其他配置修改同上。
vim redis07/bin/redis.conf....
3.启动redis07,并查看现在所有启动的redis
#启动7007[root@bogon bin]#./redis-server redis.conf#查看所有启动的redis[root@bogon bin]# ps -ef|grep redis
4.添加节点到集群中
上面可以看到,7007已经启动,现在加入集群中。添加使用redis-trib.rb的add-node命令
./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7002
说明:add-node是加入集群节点,127.0.0.1:7007为要加入的节点,127.0.0.1:7002 表示加入的集群的一个节点,用来辨识是哪个集群,理论上那个集群的节点都可以。
报错:Node 127.0.0.1:7007 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解决:删除redis07bin目录下的nodes.conf和dump.rdb。
继续执行命令,成功:
7.查看7007节点状态
./redis-trib.rb check 127.0.0.1:7007
从上图可以看出7007作为了主节点,但是他是没有slots需要我们给他进行分配。我们手动对集群进行重新分片迁移数据,需要重新分片命令 reshard
# 这个命令是用来迁移slot节点的,后面的127.0.0.1:7005是表示是哪个集群,端口填[7000-7007]都可以, redis-trib.rb reshard 127.0.0.1:7005
说明:How many slots do you want to move (from 1 to 16384)? 4096#输入4096表示要移动4096个哈希槽What is the receiving node ID? #把这4096个哈希槽给谁呢?输入7007节点对应的idSource node #1: all #输入all表示从所有的哈希槽拥有者中抽取4096个给7007节点也可以从固定的节点中拿4096个 Source node #1: 339a50df26f4722f14faba2a8fe3cad508059e88 #输入某个节点的id表示 从该节点上拿4096个 给7007这个节点 然后再执行done命令
我们选择all 摁回车会展示分配槽的信息,再输入yes 回车就开始从其他节点进行槽点移动,如图
8.现在我们查看集群的信息
./redis-trib.rb check 127.0.0.1:7007
这样主节点7007添加成功
添加从节点
1.新增从节点的命令为
./redis-trib.rb add-node --slave --master-id $[nodeid] 127.0.0.1:7008 127.0.0.1:7001
说明:$[nodeid]为要加到master主节点的node id;127.0.0.1:7000为集群的一个节点(集群的任意节点都行),用来辨识是哪个集群;如果没有给定那个主节点--master-id的话,redis-trib将会将新增的从节点随机到从节点较少的主节点上
2.现在我们添加一下7008,看是否会自动加到没有从节点的7007主节点上
./redis-trib.rb add-node --slave 127.0.0.1:7008 127.0.0.1:7001
3.查看7007的从节点信息
cd redis07/bin./redis-cli -c -p 7007 cluster nodes | grep d4d12a29ba5a491237cbd3b837fce52cf798979a
改变从节点的Master
比如我们要将刚才的将7008添加为7007的从节点,现在将他修改为7001的从节点
1.连接7008端口
./redis-cli -h 127.0.0.1 -p 7008 -c #连接要修改的从节点
2.移动到新的主节点
cluster replicate 002491fcd763e9d7ea9715a4b84f95321c534ff4 #002491fcd763e9d7ea9715a4b84f95321c534ff4为新的主节点node id
节点移除
和新增节点一样,节点的移除也分为主节点移除和从节点移除
移除主节点
1.移除命令
redis-trib del-node 127.0.0.1:7002 ${node-id}
说明:127.0.0.1:7002为集群节点,node-id为要删除的主节点。和添加节点不同,移除节点node-id是必需的,测试删除7001主节点:
2.移除过程
如果主节点有从节点,将从节点转移到其他主节点
如果主节点有slot,去掉分配的slot,然后在删除主节点
现在我们移除7007作为测试:
3.进行移除
#取消分配的solts./redis-trib.rb reshard 127.0.0.1:7007
说明:How many slots do you want to move (from 1 to 16384)?4096 #移除多少个哈希槽,7007有4096个 全部移走What is the receiving node ID? 002491fcd763e9d7ea9715a4b84f95321c534ff4//接收7007节点slot的master 我们用7001来接收Source node #1: d4d12a29ba5a491237cbd3b837fce52cf798979a//被删除master7007的node-id Source node #2:done Do you want to proceed with the proposed reshard plan (yes/no)? yes //取消slot后,reshard
此时7001的槽点
4.执行删除
./redis-trib.rb del-node 127.0.0.1:7007 d4d12a29ba5a491237cbd3b837fce52cf798979a
现在没有7007节点了,说明节点移除成功
移除从节点
移除从节点比较简单。可以直接进行移除
./redis-trib.rb del-node 127.0.0.1:7009 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5
参考资料
1.http://blog.csdn.net/qq_34021712/article/details/70244320
2.http://blog.csdn.net/fengshizty/article/details/51368004
- Redis-Cluster集群搭建及配置
- redis安装及cluster集群环境搭建
- redis配置与cluster集群的搭建
- redis cluster集群搭建
- redis-cluster 集群搭建
- redis cluster集群搭建
- redis-cluster集群搭建
- redis cluster 集群搭建
- 搭建Redis-Cluster集群
- redis-cluster集群搭建
- redis cluster集群搭建
- redis-cluster集群搭建
- redis cluster集群配置
- Redis Cluster集群配置
- linux +redis cluster 集群搭建
- Redis集群搭建之Redis Cluster实践
- redis 集群服务搭建及配置
- Redis 3.0 cluster 集群环境搭建
- pthread
- deeplearning 发展历程
- vs对文本的检测和读取
- python 按字典value排序以及按list中字典的某个key的value排序
- 正则表达式
- Redis-Cluster集群搭建及配置
- stl2xml.py 代码实现了stl格式转化为xml格式
- /bin/bash^M: bad interpreter: No such file or directory问题
- Leetcode: 698. Partition to K Equal Sum Subsets
- 懒惰、急躁和傲慢(Laziness, Impatience and hubris)
- memmove的实现
- darwin之sdp信息解读(SDPSourceInfo)
- MySQL 基础之了解基本操作和基本数据类型
- 课程4 项目二