转:

 版权声明:本文为博主原创文章,转载请看官大人注明出处: https://blog.csdn.net/localhost01/article/details/71436801
一.搭建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单机:
  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>2.7.0</version>
  5. </dependency>
  1. 连接池整合spring:
  2. <!-- redis连接池(单例) -->
  3. <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
  4. <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
  5. <constructor-arg name="host" value="${redis.host}"/>
  6. <constructor-arg name="port" value="${redis.port}"/>
  7. <constructor-arg name="timeout" value="${redis.timeout}"/>
  8. <constructor-arg name="password" value="${redis.pass}"/>
  9. </bean>
  1. <!-- 连接池配置 -->
  2. <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
  3. <!-- 最大连接数 -->
  4. <property name="maxTotal" value="150" />
  5. <!-- 最大空闲连接数 -->
  6. <property name="maxIdle" value="30" />
  7. <!-- 最小空闲连接数 -->
  8. <property name="minIdle" value="10" />
  9. <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
  10. <property name="maxWaitMillis" value="3000" />
  11. <!-- 每次释放连接的最大数目 -->
  12. <property name="numTestsPerEvictionRun" value="100" />
  13. <!-- 释放连接的扫描间隔(毫秒) -->
  14. <property name="timeBetweenEvictionRunsMillis" value="3000" />
  15. <!-- 连接最小空闲时间 -->
  16. <property name="minEvictableIdleTimeMillis" value="1800000" />
  17. <!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
  18. <property name="softMinEvictableIdleTimeMillis" value="10000" />
  19. <!-- 在获取连接的时候检查有效性, 默认false -->
  20. <property name="testOnBorrow" value="true" />
  21. <!-- 在空闲时检查有效性, 默认false -->
  22. <property name="testWhileIdle" value="true" />
  23. <!-- 在归还给pool时,是否提前进行validate操作 -->
  24. <property name="testOnReturn" value="true" />
  25. <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
  26. <property name="blockWhenExhausted" value="false" />
  27. </bean>
  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集群
  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>2.9.0</version> //2.9.0才支持cluster密码认证,之前版本的jedisCluster.auth("密码")方法里面什么都没有实现,仅仅抛一个JedisClusterException("No way to dispatch this command to Redis Cluster.")
  5. </dependency>
  1. 整合spring:
  2. <!-- redis集群 -->
  3. <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
  4. <constructor-arg index="0">
  5. <set>
  6. <bean class="redis.clients.jedis.HostAndPort">
  7. <constructor-arg index="0" value="${redis.host}"></constructor-arg>
  8. <constructor-arg index="1" value="${redis.port1}"></constructor-arg>
  9. </bean>
  10. <bean class="redis.clients.jedis.HostAndPort">
  11. <constructor-arg index="0" value="${redis.host}"></constructor-arg>
  12. <constructor-arg index="1" value="${redis.port2}"></constructor-arg>
  13. </bean>
  14. <bean class="redis.clients.jedis.HostAndPort">
  15. <constructor-arg index="0" value="${redis.host}"></constructor-arg>
  16. <constructor-arg index="1" value="${redis.port3}"></constructor-arg>
  17. </bean>
  18. <bean class="redis.clients.jedis.HostAndPort">
  19. <constructor-arg index="0" value="${redis.host}"></constructor-arg>
  20. <constructor-arg index="1" value="${redis.port4}"></constructor-arg>
  21. </bean>
  22. <bean class="redis.clients.jedis.HostAndPort">
  23. <constructor-arg index="0" value="${redis.host}"></constructor-arg>
  24. <constructor-arg index="1" value="${redis.port5}"></constructor-arg>
  25. </bean>
  26. <bean class="redis.clients.jedis.HostAndPort">
  27. <constructor-arg index="0" value="${redis.host}"></constructor-arg>
  28. <constructor-arg index="1" value="${redis.port6}"></constructor-arg>
  29. </bean>
  30. </set>
  31. </constructor-arg>
  32. <constructor-arg index="1" value="${redis.timeout}"></constructor-arg>
  33. <constructor-arg index="2" value="${redis.sockettimeout}"></constructor-arg>
  34. <constructor-arg index="3" value="${redis.maxAttempts}"></constructor-arg>
  35. <constructor-arg index="4" value="${redis.pass}"></constructor-arg>
  36. <constructor-arg index="5" ref="jedisPoolConfig"></constructor-arg>
  37. </bean>
  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);
  11. }
 

【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!的更多相关文章

  1. Docker Compose 搭建 Redis Cluster 集群环境

    在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...

  2. Docker 搭建 Redis Cluster 集群环境

    使用 Docker 搭建 Redis Cluster,最重要的环节就是容器通信的问题,这一块我们在之前的文章中已经给大家解决了<Docker 网络模式详解及容器间网络通信>,本篇文章主要练 ...

  3. 搭建redis cluster集群服务

    redis 5.0以下为ruby编写,运行命令时需要安装ruby,而5.0以上则为c编写,可直接安装后运行.因此本文使用redis5.0.5 1.编写配置文件 在 /home 下新建 redis-cl ...

  4. centos6下redis cluster集群部署过程

    一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...

  5. Redis Cluster集群搭建与配置

    Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...

  6. Redis Cluster集群搭建与应用

    1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...

  7. Redis cluster集群:原理及搭建

    Redis cluster集群:原理及搭建 2018年03月19日 16:00:55 阅读数:6120 1.为什么使用redis? redis是一种典型的no-sql 即非关系数据库 像python的 ...

  8. Redis Cluster集群搭建<原>

    一.环境配置 一台window 7上安装虚拟机,虚拟机中安装的是centos系统. 二.目标     Redis集群搭建的方式有多种,根据集群逻辑的位置,大致可以分为三大类:基于客户端分片的Redis ...

  9. redis集群与分片(2)-Redis Cluster集群的搭建与实践

    Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...

随机推荐

  1. ssh 登陆服务器原理

    这里分两种情况,这两种情况都涉及到公钥加密的概念. 由于公钥加密概念作为基础就不在本文进行讨论了. 使用ssh对远程服务器进行密码登录发生了什么: 客户端通过ssh连接服务器 1. 首先服务器把自己的 ...

  2. 二进制安装MongoDB

    1.下载mongodb cd /usr/local/src/ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.5.tgz ...

  3. HTTP协议 - 基础认识

    在http协议使用场景上我们最熟悉的可能就是浏览器了,作为本系列第一篇,就讲一个问题  ”浏览器怎么连接上服务器并获取网页内容的“ : 首先 浏览器怎么连接上服务器的? 如果对OSI七层模型或者TCP ...

  4. linux按时间查询日志

    在系统应用集中部署的时候,很多日志因为太多难以定位,获取某段时间的日志是对运维人员非常关键的事情. 一.sed查看某时间段到现在的系统日志: sed  -n  '/May 20 17/,$p'   / ...

  5. 当页面是动态时 如果后台存储id可以通过查询后台方式获取对象;当后台没有存储时候 只有通过前端标记了 例如标记数量为10 我们根据传递过来的10循环取值

    当页面是动态时 如果后台存储id可以通过查询后台方式获取对象;当后台没有存储时候 只有通过前端标记了 例如标记数量为10 我们根据传递过来的10循环取值

  6. 趣味网站5个,小鸡词典/中国配色/名著地图/海洋之音/LOGO设计

    一.小鸡词典 很多流行的词语还没有收录到各大词典,却可以在小鸡词典搜索到,小鸡词典是最全的网络流行词语词典. 不少词条搞笑无厘头,撰写词条还会获得红包. 访问地址:https://jikipedia. ...

  7. P1427 小鱼念数字

    P1427 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字不超过2^32-1),记住了然后反着念出来(表示结束的数字0就不要念出来了) ...

  8. 洛谷3703 [SDOI2017] 树点染色 【LCT】【线段树】

    题目分析: 操作一很明显等价于LCT上的access操作,操作二是常识,操作三转化到dfs序上求最大值也是常识.access的时候顺便在线段树中把对应部分-1,把右子树的子树+1即可. 代码: #in ...

  9. [洛谷P1273] 有线电视网

    类型:树形背包 传送门:>Here< 题意:给出一棵树,根节点在转播足球赛,每个叶子节点是一个观众在收看.每个叶子结点到根节点的路径权值之和是该点转播的费用,每个叶子节点的观众都会付val ...

  10. MT【269】含参函数绝对值最大

    设函数$f(x)=ax^2+(2b+1)x-a-2$($a,b\in\mathcal R$,$a\neq 0$). (1) 若$a=-2$,求函数$y=|f(x)|$在$[0,1]$上的最大值$M(b ...