<正则吃饺子> :关于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发出来。
深深的体会:动手才是程序员学习的正确姿势!
<正则吃饺子> :关于redis集群的搭建、集群测试、搭建中遇到的问题总结的更多相关文章
- <正则吃饺子>:关于java中垃圾回收技术的简单学习总结
知识介绍来自网络,后面会根据继续学习进行补充和适当的修改,谢谢!原文地址:http://www.importnew.com/26821.html#comment-578355 java中的垃圾回收机制 ...
- <正则吃饺子> :关于redis集群的测试demo
redis集群的测试demo,来自网络,具体不详. 1.下载地址,如下:http://download.csdn.net/detail/u012543819/9729291 2.项目是java项目,结 ...
- <正则吃饺子> :关于redis配置文件参数详解
来源于网络博文,感谢作者的分享,转载只为学习,方便查找,原文地址:http://blog.csdn.net/ljl890705/article/details/51540427 Redis是一个应用非 ...
- <正则吃饺子> :关于gson使用的一点总结
一.场景 在群里看到的信息:在使用 gson时候,报了个错 :java.lang.IllegalArgumentException: declares multiple JSON fields n ...
- <正则吃饺子>:关于java中对内存部分的简单总结整理
在项目和一些群讨论中,经常看到对内存的处理,但是,自己确是一知半解的,基于此,就把这部分的知识简单的整理了下,知识点来源于网络博文,也一一标明出处,谢谢. package com.love.malin ...
- <正则吃饺子> :关于 Matcher 的 replaceAll 的简单使用
在线文档地址:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh replaceAll public String replaceAll(String ...
- <正则吃饺子> :关于oracle 中 exists 、not exists 的简单使用
话不多说,简单的总结而已.网络上很多很详细介绍. 例如,博文:http://blog.csdn.net/zhiweianran/article/details/7868894 当然这篇也是转载的,原 ...
- <正则吃饺子> :关于前端往后端传递布尔值参数的问题
问题是在一个群里看到的,通过自己查找和实验,参考网上的博文,将问题列出来.以帮助后来者和共同交流学习. 博文地址:http://blog.sina.com.cn/s/blog_13c30757a0 ...
- <正则吃饺子>:关于集合的简单整理总结
项目中用到的集合不可谓不多,对于自己的一次面试,要求说下自己用过的集合,自己开始说的并不系统也不完整,一直耿耿于怀,特整理一下,以备后期之用和帮助后来者. package com.love.malin ...
随机推荐
- CSS样式:覆盖规则
规则一:由于继承而发生样式冲突时,最近祖先获胜. CSS的继承机制使得元素可以从包含它的祖先元素中继承样式,考虑下面这种情况: <html> <head> <title& ...
- 【机器学习基石笔记】七、vc Dimension
vc demension定义: breakPoint - 1 N > vc dimension, 任意的N个,就不能任意划分 N <= vc dimension,存在N个,可以任意划分 只 ...
- lzugis——Arcgis Server for JavaScript API之自定义InfoWindow(续)
同样的标题后面加了一个括弧,不是为了增减博文数量,而确实是上个功能的完善,标注为续,意思是继续上次的内容,来说说如何自定义InfoWindow. 在上一讲中,实现了InfoWindow的显示,但是并没 ...
- will-change 提高页面滚动、动画等渲染性能
一.先来看一个例子 视差滚动现在不是挺流行的嘛,然后Chris Ruppel当其使用background-attachment: fixed实现背景图片不随滚动条滚动而滚动效果的时候,发现,页面的绘制 ...
- (效果五)js获取客户端ip地址及浏览器信息
在前端开发的时候,有时候为了测试需要得到访问客户的ip地址.虽说是后端来做的,但是我们前端也可以完成. 先说下获取用户ip地址,包括像ipv4,ipv6,掩码等内容,但是大部分都要根据浏览器的支持情况 ...
- 20165222 实验一java开发环境的熟悉
实验内容及步骤 实验一 Java开发环境的熟悉-1 1 建立“自己学号exp1”的目录 2 在“自己学号exp1”目录下建立src,bin等目录 3 javac,java的执行在“自己学号exp1”目 ...
- linux centos6.5 安装gcc-c++时出现 yum install gcc-c++ cannot find a valid baseurl for repo...
1.输入命令:cd /etc/sysconfig/network-scripts/ 2.ls查看该文件夹下 3.vi ifcfg-eth0 按i进行编辑,添加如下两行后,esc →shift+:→wq ...
- python操作rabbitmq、redis
1.启动rabbimq.mysql 在“”运行“”里输入services.msc,找到rabbimq.mysql启动即可 2.启动redis 管理员进入cmd,进入redis所在目录,执行redis- ...
- [原]zeromq框架测试报告
一.环境: 服务器:linux 4核 16G 虚拟机 1台 客户端:linux 4核 16G 2000台(模拟) 数据包大小:1036字节 二.参数设置: ulimit -n 65536 服务端处理线 ...
- bzoj 3295 (洛谷3157、3193) [Cqoi2011]动态逆序对——树套树 / CDQ分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 题目--洛谷3157:https://www.luogu.org/problemnew ...