搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!

一.搭建redis单机
本文搭建redis3.0版本,3.0主要增加了redis cluster集群功能。

1.下载地址:http://download.redis.io/releases/redis-3.0.0.tar.gz,将下载文件拷贝到/usr/local

2.解压源码:tar -zxvf redis-3.0.0.tar.gz

3.编译源码:cd /usr/local/redis-3.0.0
make

4.安装到指定目录: cd /usr/local/redis-3.0.0 
make PREFIX=/usr/local/redis install

5.进入源码目录,将redis.conf拷贝到安装路径:cd /usr/local/redis
mkdir conf
cp /usr/local/redis-3.0.0/redis.conf  /usr/local/redis/bin

6.修改redis.conf配置文件,以后端模式启动:daemonize yes

7.启动redis:cd /usr/local/redis ./bin/redis-server ./redis.conf  //在何处启动的server,一些配置文件就默认在该处生成(如果配置的相对路径)

8.redis.conf配置文件主要配置:
port 7001  //监听的端口
# bind 127.0.0.1  //绑定ip,只允许该ip访问,不填默认为*,表示允许所有ip访问
requirepass "你的密码"  //开启密码
loglevel debug   //日志级别,开发模式尽量选用debug
logfile "redis.log"   //日志文件路径,此处使用相对路径,将生成到/usr/local/redis下
maxmemory 100000000  //允许最大内存占用100m
appendonly yes  //启用aof
auto-aof-rewrite-percentage 80  //部署在同一机器的多个redis实例,建议把auto-aof-rewrite错开(可分别写80-100不等),防止瞬间fork,所有redis进程做rewrite,占用大量内存

9.jedis连接redis单机:
[java] view plain copy
  1.    
  2. redis.clients   
  3. jedis   
  4. 2.7.0  
  5.   
[java] view plain copy
  1. 连接池整合spring:          
  2.   
  3. "jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">  
  4. "poolConfig" ref="jedisPoolConfig"/>          
  5. "host" value="${redis.host}"/>  
  6. "port" value="${redis.port}"/>  
  7. "timeout" value="${redis.timeout}"/>  
  8. "password" value="${redis.pass}"/>  
  9.           
[java] view plain copy
  1.   
  2. "jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">  
  3.   
  4. "maxTotal" value="150" />  
  5.   
  6. "maxIdle" value="30" />  
  7.   
  8. "minIdle" value="10" />  
  9.   
  10. "maxWaitMillis" value="3000" />  
  11.   
  12. "numTestsPerEvictionRun" value="100" />  
  13.   
  14. "timeBetweenEvictionRunsMillis" value="3000" />  
  15.   
  16. "minEvictableIdleTimeMillis" value="1800000" />  
  17.   
  18. "softMinEvictableIdleTimeMillis" value="10000" />  
  19.   
  20. "testOnBorrow" value="true" />  
  21.   
  22. "testWhileIdle" value="true" />  
  23.   
  24. "testOnReturn" value="true" />  
  25.   
  26. "blockWhenExhausted" value="false" />  
  27.   
[java] view plain copy
  1. @RunWith(SpringJUnit4ClassRunner.class// 指定测试用例的运行器 这里是指定了Junit4  
  2. @ContextConfiguration("classpath:spring/application*.xml")  
  3. public class RedisTest {  
  4. @Autowired  
  5. private JedisPool pool;  
  6. @Test  
  7. public void testJedisPool() {  
  8. Jedis jedis = null;  
  9. String name = null;  
  10. try {  
  11. jedis = pool.getResource();  
  12. jedis.set("testName""RCL");  
  13. name = jedis.get("testName");  
  14. catch (Exception ex) {  
  15. ex.printStackTrace();  
  16. finally {  
  17. if (jedis != null) {  
  18. // 返回给池  
  19. jedis.close();  
  20. }  
  21. Assert.assertEquals("RCL", name);  
  22. }  
  23. }  

10.如果连接不上,可查看是否防火墙没有将redis端口开放:/etc/sysconfig/iptables添加:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 7001 -j ACCEPT //7001即redis端口
重启防火墙


二、搭建redis集群
1.安装ruby环境
集群管理工具redis-trib.rb依赖ruby环境
(1)安装ruby:
yum install ruby yum install rubygems
(2)安装ruby和redis的接口程序:
拷贝redis-3.0.0.gem至/usr/local。执行:gem install /usr/local/redis-3.0.0.gem

2.建立redis实例
(1)建立存放redis群的文件夹及子文件夹(用于存放每个redis实例):
cd /usr/local    
mkdir redis-cluster 
mkdir redis-cluster/7001
mkdir redis-cluster/7002
……
(2)将刚刚安装的单机redis的/usr/local/redis文件夹拷贝到每个700X文件夹下,(这里我们建立六个实例,三主三从)
(3)修改每个700X目录下的redis.conf配置文件:
port 700X   //各自监听的端口
#bind 127.0.0.1  //这里不绑定,默认允许所有ip访问,或者bind 0.0.0.0
cluster-enabled yes   //开启集群
cluster-node-timeout 15000   //15时间内没有收到对方的回复,则单方面认为端节点挂掉
另外,由于下面我们需要配置集群密码,故之前配置的 requirepass 先删掉,集群成功后再进行配置。

3.启动各个redis:分别进入7001、7002、...7006目录,执行./redis-server ./redis.conf

4.创建集群:/usr/local/redis-cluster/redis-trib.rb create --replicas 1 123.123.123.123:7001 123.123.123.123:7002 123.123.123.123:7003 123.123.123.123:7004 123.123.123.123:7005 123.123.123.123:7006
注意:
(1)为保证远程可访问,这里的ip尽量使用公网ip,且创建集群时可先关闭防火墙,否则可以出现一直join……的现象。
(2)redis集群至少需要3个主节点,每个主节点有一个从节点总共6个节点
(3)replicas指定为1表示每个主节点有一个从节点
(4)如果出现[ERR] Sorry, can't connect to node错误:
1.ruby 和rubygem 版本太低,安装新版本。查看gem版本和redis版本(redis-cli -v可查看redis版本)
2.查看reids配置文件,bind绑定的允许连接的ip是否正确。
3.是否redis配置文件还是使用了密码,使用了密码也可能导致这个错误。
(5)如果出现[ERR] Node 127.0.0.1:7005 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0:
表示集群时,之前的redis已有数据,那么登录到7005的redis中,执行FLUSHALL即可
(6)如果出现ERR Slot 0 is already busy (Redis::CommandError):
用redis-cli登录到每个节点执行flushall和cluster reset即可2.6进入集群:./redis-cli -c  -p 7001 -h 123.123.123.123(-c即-cluster 表示进入集群模式,不加表示进入单机redis)

5.检查集群是否成功:进入集群后,键入cluster info,显示cluster_state:ok,表示成功

6.设置密码:
(1)登录到每个节点,执行 config set masterauth 你的密码 config set requirepass 你的密码
(2)随后登入 7001/bin/redis-cli -c -h 112.74.55.239 -p 7004 -a 你的密码,执行: config rewrite
(3)防火墙开放7001到7006端口,以及redis总线:17001到17006:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 7001:7006 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 17001:17006 -j ACCEPT

7.JedisCluster连接redis集群
[java] view plain copy
  1.   
  2. redis.clients  
  3. jedis  
  4. 2.9.0  //2.9.0才支持cluster密码认证,之前版本的jedisCluster.auth("密码")方法里面什么都没有实现,仅仅抛一个JedisClusterException("No way to dispatch this command to Redis Cluster.")  
  5.   
[java] view plain copy
  1. 整合spring:          
  2.   
  3. "jedisCluster" class="redis.clients.jedis.JedisCluster">  
  4. "0">  
  5.   
  6. class="redis.clients.jedis.HostAndPort">  
  7. "0" value="${redis.host}">  
  8. "1" value="${redis.port1}">  
  9.   
  10. class="redis.clients.jedis.HostAndPort">  
  11. "0" value="${redis.host}">  
  12. "1" value="${redis.port2}">  
  13.   
  14. class="redis.clients.jedis.HostAndPort">  
  15. "0" value="${redis.host}">  
  16. "1" value="${redis.port3}">  
  17.   
  18. class="redis.clients.jedis.HostAndPort">  
  19. "0" value="${redis.host}">  
  20. "1" value="${redis.port4}">  
  21.   
  22. class="redis.clients.jedis.HostAndPort">  
  23. "0" value="${redis.host}">  
  24. "1" value="${redis.port5}">  
  25.   
  26. class="redis.clients.jedis.HostAndPort">  
  27. "0" value="${redis.host}">  
  28. "1" value="${redis.port6}">  
  29.   
  30.   
  31.   
  32. "1" value="${redis.timeout}">  
  33. "2" value="${redis.sockettimeout}">  
  34. "3" value="${redis.maxAttempts}">  
  35. "4" value="${redis.pass}">  
  36. "5" ref="jedisPoolConfig">  
  37.   
[java] view plain copy
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration("classpath:spring/application*.xml")  
  3. public class RedisTest {  
  4. @Autowired  
  5. private JedisCluster jCluster;  
  6. @Test  
  7. public void testJCluster() {  
  8. jCluster.set("name""RCL");  
  9. String name = jCluster.get("testName");  
  10. Assert.assertEquals("RCL", name);  

你可能感兴趣的:(redis)