<正则吃饺子> :关于redis集群的搭建、集群测试、搭建中遇到的问题总结
项目中使用了redis ,对于其基本的使用,相对简单些,根据项目中已经提供的工具就可以实现基本的功能,但是只是这样的话,对于redis还是太肤浅,甚至刚开始时候,集群、多节点、主从是什么,他们之间是什么关系都很模糊。利用瓜弟的服务器,自己学习搭建了一个,现在将其中的主要流程、集群测试、搭建中遇到的问题,记录下来,以备后用和帮助后来者。
一、主要的搭建过程
分为两部分:
1、利用小王子提供的简要命令安装redis;
redis安装 1.安装redis依赖 # yum install gcc tcl gcc-c++ 2.下载redis二进制包 # wget http://download.redis.io/releases/redis-3.2.9.tar.gz 3.解压并安装redis # tar -zxvf redis-3.2.9.tar.gz # cd redis-3.2.9 # make # make install 4.redis config文件目录 mkdir /home/redis //创建conf目录 cp redis.conf /home/redis/redis.conf //复制conf到redis目录 vim /home/redis/redis.conf //修改配置 daemonize no 改成 daemonize yes prot 6379 //默认端口6379 5.简单使用redis which redis-server //查看server路径 which redis-cli //查看cli路径 redis-cli /home/redis/redis.conf //启动redis ps aux|grep redis-server //确认redis服务启动
2、根据网上博客的集群搭建过程具体搭建(博文地址:http://blog.csdn.net/xu470438000/article/details/42971091);
注意:按照这篇博文中的方式能够搭建成功,使用桌面工具也能正常的访问,但是(问题在后面的问题中说....往后看..)
Redis集群部署文档(centos6系统)
(要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下)
127.0.0.1:7000
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
1:下载redis。官网下载3.0.0版本,之前2.几的版本不支持集群模式
下载地址:https://github.com/antirez/redis/archive/3.0.0-rc2.tar.gz
2:上传服务器,解压,编译
tar -zxvf redis-3.0.0-rc2.tar.gz
mv redis-3.0.0-rc2.tar.gz redis3.0
cd /usr/local/redis3.0
make
make install
3:创建集群需要的目录
mkdir -p /usr.local/cluster
cd /usr.local/cluster
mkdir 7000
mkdir 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
4:修改配置文件redis.conf
cp /usr/local/redis3.0/redis.conf /usr.local/cluster
vi redis.conf
##修改配置文件中的下面选项
port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
##修改完redis.conf配置文件中的这些配置项之后把这个配置文件分别拷贝到7000/7001/7002/7003/7004/7005目录下面
cp /usr/local/cluster/redis.conf /usr/local/cluster/7000
cp /usr/local/cluster/redis.conf /usr/local/cluster/7001
cp /usr/local/cluster/redis.conf /usr/local/cluster/7002
cp /usr/local/cluster/redis.conf /usr/local/cluster/7003
cp /usr/local/cluster/redis.conf /usr/local/cluster/7004
cp /usr/local/cluster/redis.conf /usr/local/cluster/7005
##注意:拷贝完成之后要修改7001/7002/7003/7004/7005目录下面redis.conf文件中的port参数,分别改为对应的文件夹的名称
5:分别启动这6个redis实例
cd /usr/local/cluster/7000
redis-server redis.conf
cd /usr/local/cluster/7001
redis-server redis.conf
cd /usr/local/cluster/7002
redis-server redis.conf
cd /usr/local/cluster/7003
redis-server redis.conf
cd /usr/local/cluster/7004
redis-server redis.conf
cd /usr/local/cluster/7005
redis-server redis.conf
##启动之后使用命令查看redis的启动情况ps -ef|grep redis
如下图显示则说明启动成功
6:执行redis的创建集群命令创建集群
cd /usr/local/redis3.0/src
./redis-trib.rb create --replicas 1 127.0.0.1:7000 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
6.1执行上面的命令的时候会报错,因为是执行的ruby的脚本,需要ruby的环境
错误内容:/usr/bin/env: ruby: No such file or directory
所以需要安装ruby的环境,这里推荐使用yum install ruby安装
yum install ruby
6.2然后再执行第6步的创建集群命令,还会报错,提示缺少rubygems组件,使用yum安装
错误内容:
./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:24
yum install rubygems
6.3再次执行第6步的命令,还会报错,提示不能加载redis,是因为缺少redis和ruby的接口,使用gem 安装
错误内容:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25
gem install redis --version 3.0.0
注意:gem install redis --version 3.0.0 失败的话,需要修改一下gem的源
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
6.4 再次执行第6步的命令,正常执行
输入yes,然后配置完成。
至此redis集群即搭建成功!
7:使用redis-cli命令进入集群环境
redis-cli -c -p 7000
再次注意:按照这篇博文中的方式能够搭建成功,使用桌面工具也能正常的访问,但是(问题在后面的问题中说....往后看..)
我在自己的集群中使用的端口是 6661 -- 6666 ,这个你在具体的搭建中可以按照自己的需要来处理,不比拘泥于博客中写的。对于我的端口,默认情况下,集群搭建后,会有三个主,三个从。具体可以利用命令查看这个集群时,能够详细看到。
二、集群测试、遇到的问题及解决方案
利用网上博主的搭建方式,当我满怀欣喜的进行测试时,出错了。
错误(1):桌面工具(redis desktop manager)不能正常访问;
查看资料,需要修改 redis.conf 中的配置。
在redis.conf中 ,默认的 bind 127.0.0.1 (如果你看这个配置文件的话,就知道了),我是把 bind 项的全部注释掉了。
具体需要了解下bind项的说明,bind IP 监听指定的网络接口。这样的话,现在看来有两种操作方式:1、全部注释(看了下项目上的配置也是全部注释了);2、指定某个网络ip进行访问。
至此,在启动redis单个实例时候,能保证外部工具能正常的访问。
错误(2):Too many cluster redirections redis (参考博文);
具体博文,如下:
今天在虚拟机上安装了Redis,并配置了redis cluster。
启动redis cluster使用的命令为:
./redis-trib.rb create --replicas 1 127.0.0.1:7000 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
然后在eclipse上集成了springmvc和redisc cluster,配置文件中配置的ip为虚拟机实际IP:192.168.23.129,结果启动时总是报:Too many cluster redirections?
最后debug发现cluster中nodes中,既包含了127.0.0.1的节点,又包含192.168.23.129的节点。
所以猜测程序启动时会将服务器上实际存在的节点和配置的节点都加载到内存中,然后程序使用的192.168.23.129:端口,去访问节点,而服务器上并没有该节点。
之后就将虚拟机上的cluster节点全部删除,重新创建节点,创建时使用实际ip192.168.23.129,即:
./redis-trib.rb create --replicas 1 192.168.23.129:7000 192.168.23.129:7001 192.168.23.129:7002 192.168.23.129:7003 192.168.23.129:7004 192.168.23.129:7005
再次启动程序,可以正常启动,并从redis中存入和读取数据
但是,并没有解决我的问题。查看了多个资料,改为 创建集群时候,采用 “服务器ip:端口”形式,而不是 “127.0.0.1:端口”。
错误(3):Waiting for the cluster to join...(参考博文:http://blog.csdn.net/truong/article/details/52531103)
Redis集群创建执行
./redis-trib.rb create --replicas 1 XXXX:PORT1 XXXX:PORT2 ....
的时候
一直等待 Waiting for the cluster to join 很久都没有反应
原因:
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口
集群总线端口为redis客户端连接的端口 + 10000
如redis端口为6379
则集群总线端口为16379
故,所有服务器的点需要开通redis的客户端连接端口和集群总线端口
注意:iptables 放开,如果有安全组,也要放开这两个端口
根据这个介绍,在阿里服务器上,开放端口 16661 -- 16666 ,因为我的redis端口是 6661 -- 6666,这样,集群顺利搭建成功。
问题(4):节点的重新分配;
最开始集群搭建时候,使用的是 9个节点(四主五从),后来又增加一个,然后,考虑新增的节点设为主节点,将先前的某个从节点 设为 新增的主节点的从节点,这样能保证五主五从。按照博文中操作,新增主节点成功,分配哈希成功,然后在改变某个从节点的主节点时候,出现了问题。我先把先前的操作贴出来
***************** 方式1
redis-cli -c -p 6387 cluster replicate 32272a219f112c7fa4d5e52ae209b0e423c05f1d // 将新节点6387 添加到 id为xxxx的主节点下面
32272a219f112c7fa4d5e52ae209b0e423c05f1d 127.0.0.1:6388 master - 0 1502087249399 10 connected 0-749 4096-4845 8192-8941 12288-13037
d5630ab94d6e16d223dfd531a00090d51d7c5ee8 127.0.0.1:6386 slave a7b1f53d6db875cfef4bc74b841c3c609470e21d 0 1502087248898 8 connected
fa7f023aea260776b60f2e05f899c712753a2e66 127.0.0.1:6387 slave 32272a219f112c7fa4d5e52ae209b0e423c05f1d 0 1502087249399 10 connected
bb2b284449a61ecc597db035b9b5aa884f1e5f8b 127.0.0.1:6381 master - 0 1502087248497 3 connected 8942-12287
4bdfde82873f49de95e0eafe882fd7243a916ce9 127.0.0.1:6379 myself,master - 0 0 1 connected 750-4095
a7b1f53d6db875cfef4bc74b841c3c609470e21d 127.0.0.1:6382 master - 0 1502087249900 4 connected 13038-16383
577eb5f573e4e1e360445df5492609dfb5923bb4 127.0.0.1:6384 slave dd43d06ca57da06beb4efa503def231523c00285 0 1502087248898 6 connected
6484325ac3c6e432ce556866055dacbcb7b9dc3d 127.0.0.1:6383 slave 32272a219f112c7fa4d5e52ae209b0e423c05f1d 0 1502087249399 10 connected
4c61578e2b3817d1b4709aa78dca4602abe40808 127.0.0.1:6385 slave bb2b284449a61ecc597db035b9b5aa884f1e5f8b 0 1502087248397 7 connected
dd43d06ca57da06beb4efa503def231523c00285 127.0.0.1:6380 master - 0 1502087248898 2 connected 4846-8191
主 -- 从
6388 -- 6387 6383
6379
6381 -- 6385
6380 -- 6384
6382 -- 6386
但是,按照这种方式来处理的时候,没有成功,如上所示,这样就将 原先6379 的两个从节点都转移到 新增节点 6388下面了。没有达到预期效果。
(也可能我的操作不对造成的,有需要的可以自己测试下这种方式)。
然后,换了另一种方式,如下
****************** 方式2
[root@iZwz9h69m8hhqu3855nbhkZ src]# redis-cli -c -p 6383
127.0.0.1:6383> cluster replicate 4bdfde82873f49de95e0eafe882fd7243a916ce9
OK
127.0.0.1:6383> quit
32272a219f112c7fa4d5e52ae209b0e423c05f1d 127.0.0.1:6388 master - 0 1502089485248 10 connected 0-749 4096-4845 8192-8941 12288-13037
d5630ab94d6e16d223dfd531a00090d51d7c5ee8 127.0.0.1:6386 slave a7b1f53d6db875cfef4bc74b841c3c609470e21d 0 1502089483245 8 connected
fa7f023aea260776b60f2e05f899c712753a2e66 127.0.0.1:6387 slave 32272a219f112c7fa4d5e52ae209b0e423c05f1d 0 1502089484747 10 connected
bb2b284449a61ecc597db035b9b5aa884f1e5f8b 127.0.0.1:6381 master - 0 1502089483745 3 connected 8942-12287
4bdfde82873f49de95e0eafe882fd7243a916ce9 127.0.0.1:6379 myself,master - 0 0 1 connected 750-4095
a7b1f53d6db875cfef4bc74b841c3c609470e21d 127.0.0.1:6382 master - 0 1502089483745 4 connected 13038-16383
577eb5f573e4e1e360445df5492609dfb5923bb4 127.0.0.1:6384 slave dd43d06ca57da06beb4efa503def231523c00285 0 1502089484245 6 connected
6484325ac3c6e432ce556866055dacbcb7b9dc3d 127.0.0.1:6383 slave 4bdfde82873f49de95e0eafe882fd7243a916ce9 0 1502089484747 10 connected
4c61578e2b3817d1b4709aa78dca4602abe40808 127.0.0.1:6385 slave bb2b284449a61ecc597db035b9b5aa884f1e5f8b 0 1502089484747 7 connected
dd43d06ca57da06beb4efa503def231523c00285 127.0.0.1:6380 master - 0 1502089484245 2 connected 4846-8191
主 --- 从
6379 -- 6383
6380 -- 6384
6381 -- 6385
6382 -- 6386
6388 -- 6387
ps: redis-cli -c -p 6379 cluster nodes --------查看节点情况
这样就okay了。
三、集群搭建中用到的redis常用命令等
主要涉及:
redis包的下载、安装;
环境包的下载、安装、调试;
redis实例配置修改、启动、关闭;
redis集群的创建、节点新增、删除、新增节点分配哈希槽、指定主从、修改主从等;
redis服务的关闭;
文件的复制、修改、删除、创建等;
下面是我在服务器上操作的主要命令的记录,不一定对其他人适用,只给自己留作记忆:
我敏!I love you!
mkdir -p /tmp/dir1/dir2 创建一个目录树
redis-server /home/redis/redis/redis-3.2.9/redis.conf 根据这个conf 启动redis服务
linux vi编辑的 相关操作:编辑,保存,退出等
ps -ef|grep redis 查看redis使用情况
cd /usr/local/redis3.0/src
cd /home/redis/redis/redis-3.2.9/src //我的服务器上的redis 目录 ,方便下次查找
./redis-trib.rb create --replicas 1 127.0.0.1:7000 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
./redis-trib.rb create --replicas 1 127.0.0.1:6379 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 127.0.0.1:6386 127.0.0.1:6387
./redis-trib.rb create --replicas 1 服务器ip:6661 服务器ip:6662 服务器ip:6663 服务器ip:6664 服务器ip:6665 服务器ip:6666
./redis-trib.rb create --replicas 1 127.0.0.1:6661 127.0.0.1:6662 127.0.0.1:6663 127.0.0.1:6664 127.0.0.1:6665 127.0.0.1:6666
netstat -tunpl //查看所有的进程
cp /usr/local/cluster/redis.conf /usr/local/cluster/7006/ 复制文件到7006文件夹
redis-cli -c -p 6379 cluster nodes 查看redis集群节点情况,能够标识出主从和连接数等
./redis-trib.rb add-node 127.0.0.1:6388 127.0.0.1:6379 //cd到redis目录下 src 下,执行,增加 6388节点,6379是已存在的
redis-cli -c -p 6387 cluster replicate 32272a219f112c7fa4d5e52ae209b0e423c05f1d // 将新节点6387 添加到 id为xxxx的主节点下面
redis-cli -p 6387 cluster nodes | grep slave | grep 32272a219f112c7fa4d5e52ae209b0e423c05f1d //查看主节点 6387的从节点
//将某个从节点6383,改变其主节点为 id = 4bdfde82873f49de95e0eafe882fd7243a916ce9 的主节点
[root@iZwz9h69m8hhqu3855nbhkZ src]# redis-cli -c -p 6383
127.0.0.1:6383> cluster replicate 4bdfde82873f49de95e0eafe882fd7243a916ce9
OK
127.0.0.1:6383> quit
pkill -9 redis // 干掉redis,终极必杀
redis-trib.rb del-node 192.168.10.220:6385 '9c240333476469e8e2c8e80b089c48f389827265' //删除从节点 by节点id
32272a219f112c7fa4d5e52ae209b0e423c05f1d 127.0.0.1:6388 master - 0 1502096124913 10 connected 0-749 4096-4845 8192-8941 12288-13037
d5630ab94d6e16d223dfd531a00090d51d7c5ee8 127.0.0.1:6386 slave a7b1f53d6db875cfef4bc74b841c3c609470e21d 0 1502096126414 8 connected
fa7f023aea260776b60f2e05f899c712753a2e66 127.0.0.1:6387 slave 32272a219f112c7fa4d5e52ae209b0e423c05f1d 0 1502096126414 10 connected
bb2b284449a61ecc597db035b9b5aa884f1e5f8b 127.0.0.1:6381 master - 0 1502096124413 3 connected 8942-12287
4bdfde82873f49de95e0eafe882fd7243a916ce9 127.0.0.1:6379 myself,master - 0 0 1 connected 750-4095
a7b1f53d6db875cfef4bc74b841c3c609470e21d 127.0.0.1:6382 master - 0 1502096125413 4 connected 13038-16383
577eb5f573e4e1e360445df5492609dfb5923bb4 127.0.0.1:6384 slave dd43d06ca57da06beb4efa503def231523c00285 0 1502096125413 6 connected
6484325ac3c6e432ce556866055dacbcb7b9dc3d 127.0.0.1:6383 slave 4bdfde82873f49de95e0eafe882fd7243a916ce9 0 1502096125914 10 connected
4c61578e2b3817d1b4709aa78dca4602abe40808 127.0.0.1:6385 slave bb2b284449a61ecc597db035b9b5aa884f1e5f8b 0 1502096125413 7 connected
dd43d06ca57da06beb4efa503def231523c00285 127.0.0.1:6380 master - 0 1502096124413 2 connected 4846-8191
redis-trib.rb reshard 127.0.0.1:6388
cp /home/redis/redis/redis-3.2.9/redis.conf /usr/local/cluster/6661/
cd /usr/local/cluster/6661
//********************* 相关英语
replica -- 复制品,从
四、主要参考和学习的博文
redis集群 Waiting for the cluster to join 一直等待
Too many cluster redirections redis
redis集群同步迁移方法(一):通过redis replication实现
redis cluster 添加 删除 重分配 节点(这人总结的挺全面,可以看看)
还有几篇挺好的,不一一贴出来了。
五、其他
集群搭建完成时,测试okay,感谢瓜弟和小王子的服务器,感谢伞、胖哥等。
下篇,我把测试demo发出来。
深深的体会:动手才是程序员学习的正确姿势!