Redis5.x搭建集群

仅在同一台服务器测试

1、安装redis

安装redis完成之后复制六份

# 创建集群存放redis的文件夹
mkdir redis-clustercd ../cp -r redis/ redis-cluster/redis-9301
cp -r redis/ redis-cluster/redis-9302
cp -r redis/ redis-cluster/redis-9303
cp -r redis/ redis-cluster/redis-9304
cp -r redis/ redis-cluster/redis-9305
cp -r redis/ redis-cluster/redis-9306cd redis-cluster

2、编写redis.conf配置文件

# 编写公共redis.conf文件
vim redis.conf# 注释该行使其他电脑可以访问
# bind 127.0.0.1  # 改为yes,使实例后台运行
daemonize yes # 开启集群支持
cluster-enabled yes # 集群节点不可用的最长时间,超过该时间进行从库故障转移
cluster-node-timeout 15000# 指定为外网IP
cluster-announce-ip 59.110.xx.xxx# 设置密码
requirepass 123456

进入复制的每个redis文件夹中修改master 的 redis.conf文件为:

# 拼接公共redis.conf文件
include /usr/local/redis/redis-cluster/redis.conf
pidfile "/var/run/redis_9301.pid"
port 9301
dbfilename "dump9301.rdb"# 指定节点文件名称
cluster-config-file nodes-9301.conf

再修改slave redis中修改redis.conf文件为:

# 拼接公共redis.conf文件
include /usr/local/redis/redis-cluster/redis.conf
pidfile "/var/run/redis_9304.pid"
port 9304
dbfilename "dump9304.rdb"# 指定节点文件名称
cluster-config-file nodes-9304.conf# 设置密码
masterauth 123456

9301、9302、9303为master

9304、9305、9306为slave

3、编写启动脚本、创建集群

启动脚本

#!/bin/bash
redis_path="/usr/local/redis/redis-cluster/"
cd ${redis_path}
ps aux | grep redis | grep cluster | grep -v grep | awk '{print $2}' | xargs kill -9
# ps -ef | grep -v grep | grep redis |  awk -F' ' '{print $2}' | xargs kill -9
cluster_num=`ps aux | grep redis | grep cluster | wc -l`
if [ "${cluster_num}" -le 0 ]
thenecho -e "===== Success: Has killed all cluster progress."
elseecho -e "===== Fail: There still are ${cluster_num} is alive.\n"exit 1
firm -rf ${redis_path}redis*/dump*
rm -rf ${redis_path}redis*/nodes*
data_num=`find ${redis_path} -type f | grep -E "dump*|nodes*" | wc -l`
if [ "${data_num}" -le 0 ]
thenecho -e "===== Success: Has remove all dump.rdb and nodes configure file."
elseecho -e "===== Fail: There still are files is exist,Use command: \n\tfind ${redis_path} -type f | grep -E \"dump.rbd|nodes*\" \nto search, and then remove them manually.\n"exit 1
ficd redis-9301/
./redis-server redis.conf
cd ../redis-9302/
./redis-server redis.conf
cd ../redis-9303/
./redis-server redis.conf
cd ../redis-9304/
./redis-server redis.conf
cd ../redis-9305/
./redis-server redis.conf
cd ../redis-9306/
./redis-server redis.conf

创建集群脚本

#!/bin/bash
# 创建集群
cd /usr/local/redis/redis-5.0.14/src
./redis-cli --cluster create --cluster-replicas 1 59.110.xx.xxx:9301 59.110.xx.xxx:9302 59.110.xx.xxx:9303 59.110.xx.xxx:9304 59.110.xx.xxx:9305 59.110.xx.xxx:9306 -a 123456

–cluster create: 创建集群

–cluster-relicas: 集群副本数。 这里是1,是1主机1从机的模式,如果设置为2(即:2台从机)会失败。因为集群中至少要有3个主机,所以设置2台从机时,至少需要9个节点才可以。

最后的参数中列出全部的redis主机IP地址和端口号。

-a: 后边跟的是redis的密码

4、启动

# 启动各redis节点
./restart_redis.sh
# 创建集群
[root@hcg redis-cluster]# ./create_cluster.sh
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 59.110.xx.xxx:9305 to 59.110.xx.xxx:9301
Adding replica 59.110.xx.xxx:9306 to 59.110.xx.xxx:9302
Adding replica 59.110.xx.xxx:9304 to 59.110.xx.xxx:9303
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: b78b59b8cadb3e1f77d520a164597777e2bc18f8 59.110.xx.xxx:9301slots:[0-5460] (5461 slots) master
M: dc1cdaa729ebe03c7b9702025426c2b86df70da2 59.110.xx.xxx:9302slots:[5461-10922] (5462 slots) master
M: 651576fcd8fb66e83212351331bfb110b3a3a524 59.110.xx.xxx:9303slots:[10923-16383] (5461 slots) master
S: e7cf094e16c520f2d1faf9ae65f68e97c1fba562 59.110.xx.xxx:9304replicates dc1cdaa729ebe03c7b9702025426c2b86df70da2
S: 8a61f7e96b7160127921c9f0a9e4e9f65963d71f 59.110.xx.xxx:9305replicates 651576fcd8fb66e83212351331bfb110b3a3a524
S: 52eed0573d4b9f20f0b61434bebfec05ce8dcac5 59.110.xx.xxx:9306replicates b78b59b8cadb3e1f77d520a164597777e2bc18f8
Can I set the above configuration? (type 'yes' to accept):

输入yes

Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 59.110.xx.xxx:9301)
M: b78b59b8cadb3e1f77d520a164597777e2bc18f8 59.110.xx.xxx:9301slots:[0-5460] (5461 slots) master1 additional replica(s)
S: 52eed0573d4b9f20f0b61434bebfec05ce8dcac5 59.110.xx.xxx:9306slots: (0 slots) slavereplicates b78b59b8cadb3e1f77d520a164597777e2bc18f8
S: 8a61f7e96b7160127921c9f0a9e4e9f65963d71f 59.110.xx.xxx:9305slots: (0 slots) slavereplicates 651576fcd8fb66e83212351331bfb110b3a3a524
M: 651576fcd8fb66e83212351331bfb110b3a3a524 59.110.xx.xxx:9303slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: e7cf094e16c520f2d1faf9ae65f68e97c1fba562 59.110.xx.xxx:9304slots: (0 slots) slavereplicates dc1cdaa729ebe03c7b9702025426c2b86df70da2
M: dc1cdaa729ebe03c7b9702025426c2b86df70da2 59.110.xx.xxx:9302slots:[5461-10922] (5462 slots) master1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@hcg redis-cluster]#

5、访问客户端

./redis-cli -p 9301 -a 123456 -c
59.110.xx.xx:9302>

1、-p:集群中任意一个redis服务的端口号

2、-a:redis的密码

3、-c:集群模式

可使用:cluster nodes 命令查看集群状态,查询结果如下:

59.110.xx.xxx:9302> cluster nodes
b78b59b8cadb3e1f77d520a164597777e2bc18f8 59.110.xx.xxx:9301@19301 master - 0 1659782936979 1 connected 0-5460
e7cf094e16c520f2d1faf9ae65f68e97c1fba562 59.110.xx.xxx:9304@19304 slave dc1cdaa729ebe03c7b9702025426c2b86df70da2 0 1659782935977 4 connected
8a61f7e96b7160127921c9f0a9e4e9f65963d71f 59.110.xx.xxx:9305@19305 slave 651576fcd8fb66e83212351331bfb110b3a3a524 0 1659782934976 5 connected
dc1cdaa729ebe03c7b9702025426c2b86df70da2 59.110.xx.xxx:9302@19302 myself,master - 0 1659782935000 2 connected 5461-10922
651576fcd8fb66e83212351331bfb110b3a3a524 59.110.xx.xxx:9303@19303 master - 0 1659782934000 3 connected 10923-16383
52eed0573d4b9f20f0b61434bebfec05ce8dcac5 59.110.xx.xxx:9306@19306 slave b78b59b8cadb3e1f77d520a164597777e2bc18f8 0 1659782936000 6 connected
59.110.xx.xxx:9302>

6、整合spring boot

1、application.yml配置文件:

spring:# redis集群redis:password: 123456cluster:nodes:- 59.110.xx.xxx:9301- 59.110.xx.xxx:9302- 59.110.xx.xxx:9303- 59.110.xx.xxx:9304- 59.110.xx.xxx:9305- 59.110.xx.xxx:9306max-redirects: 3# 连接超时时间timeout: 60slettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 8# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1mcluster:refresh:period: 60sadaptive: true

2、配置类:

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport
{@Bean@SuppressWarnings(value = { "unchecked", "rawtypes" })public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();template.setConnectionFactory(connectionFactory);FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);ObjectMapper mapper = new ObjectMapper();mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);serializer.setObjectMapper(mapper);// 使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(serializer);// Hash的key也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;}@Beanpublic DefaultRedisScript<Long> limitScript(){DefaultRedisScript<Long> redisScript = new DefaultRedisScript<Long>();redisScript.setScriptText(limitScriptText());redisScript.setResultType(Long.class);return redisScript;}@Beanpublic LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);}/*** 限流脚本* @return*/private String limitScriptText(){return "local key = KEYS[1]\n" +"local count = tonumber(ARGV[1])\n" +"local time = tonumber(ARGV[2])\n" +"local current = redis.call('get', key);\n" +"if current and tonumber(current) > count then\n" +"    return tonumber(current);\n" +"end\n" +"current = redis.call('incr', key)\n" +"if tonumber(current) == 1 then\n" +"    redis.call('expire', key, time)\n" +"end\n" +"return tonumber(current);";}@Beanpublic DefaultClientResources lettuceClientResources() {return DefaultClientResources.create();}@Bean@SuppressWarnings("all")public LettuceConnectionFactory lettuceConnectionFactory(RedisProperties redisProperties, ClientResources clientResources) {ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder().enablePeriodicRefresh(Duration.ofSeconds(30)) //按照周期刷新拓扑.enableAllAdaptiveRefreshTriggers() //根据事件刷新拓扑.build();ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder()//redis命令超时时间,超时后才会使用新的拓扑信息重新建立连接.timeoutOptions(TimeoutOptions.enabled(Duration.ofSeconds(10))).topologyRefreshOptions(topologyRefreshOptions).build();LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder().clientResources(clientResources).clientOptions(clusterClientOptions).build();RedisClusterConfiguration clusterConfig = new RedisClusterConfiguration(redisProperties.getCluster().getNodes());clusterConfig.setMaxRedirects(redisProperties.getCluster().getMaxRedirects());clusterConfig.setPassword(RedisPassword.of(redisProperties.getPassword()));return new LettuceConnectionFactory(clusterConfig, clientConfiguration);}}

7、安装过程中的问题:

springboot2.3.0后支持通过配置文件和配置LettuceConnectionFactory中设置自动刷新和周期性刷新,采用三主三从的cluster模式

Q: springboot 启动连接报错,Unable to connect to 127.0.0.1;但是项目配置文件写的是外网ip,是正确的
A:客户端lettuce在初始化集群会loadProperties,读到的远端redis集群信息是127.0.0.1的;
解决方法:创建集群,指定ip

./redis-cli --cluster create --cluster-replicas 1 59.110.xx.xxx:9301 59.110.xx.xxx:9302 59.110.xx.xxx:9303 59.110.xx.xxx:9304 59.110.xx.xxx:9305 59.110.xx.xxx:9306 -a 123456

Q:指定为外网ip创建遇到一个新问题,创建集群,使用外网ip无法创建,Waiting for the cluster to join…
A:暂时先检查一下安全组的出入方向、服务器防火墙,搜索发现,还需要开放集群总线的端口,“Redis端口+10000”,即19301-19306。

Q:本机使用java客户端连接,报Unable to connect to:172.xx.xx.xx ,发现连接的内网ip。
A:redis的配置文件应该指定cluster-announce-ip 为外网ip:59.110.xx.xxx

Redis5搭建集群相关推荐

  1. 25000linux集群源码,一文看懂 Redis5 搭建集群

    1.简要说明 2018年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的 redis-cli的方式,是集群的构建方式复杂 ...

  2. linux redis5.0 集群搭建

    一.下载 wget http://download.redis.io/releases/redis-5.0.0.tar.gz 二.解压.编译 #解押到 /usr/local/ 文件夹 tar -zxv ...

  3. redis5.0.5版本搭建集群

                                         redis5.0.5版本搭建集群 安装redis5.0.5版本 将redis5.0.5解压 sudo tar -zxcf re ...

  4. redis5.0集群搭建(两台服务器)

    redis5.0集群搭建(两台服务器) 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-5.0.2 版本. 两台虚拟机都是 C ...

  5. redis 5.0.2 搭建集群

    前言 我们日常在对于redis的使用中,经常会遇到一些问题 高可用问题,如何保证redis的持续高可用性. 容量问题,单实例redis内存无法无限扩充,达到32G后就进入了64位世界,性能下降. 并发 ...

  6. Redis数据库搭建集群(集群概念、redis集群、搭建集群(配置机器1、2、创建集群、数据操作验证)、Python与redis集群交互)

    1. 集群的概念 集群是一组相互独立的.通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理.一个客户与集群相互作用时,集群像是一个独立的服务器.集群配置是用于提高可用性和可缩放性. ...

  7. 使用LVS+TUN搭建集群实现负载均衡

    使用LVS+TUN搭建集群实现负载均衡 TUN模式的概述与工作原理 TUN模式服务概述:      IP Tunneling(IP隧道) --可以在不同地域,不同网段      Director分配请 ...

  8. 通过VMware vsphere搭建集群

    一.物理机上: 1.开机按Ctrl+R,配置阵列卡 : 硬盘类型 别名 raid级别 读取策略 写入策略 大小 规格 系统盘 SAS system raid 0 Adaptive Read Ahead ...

  9. Tomcat集群快速入门:Nginx+Tomcat搭建集群

    参数的一些扩展点,那刚刚讲的一些负载均衡策略,都是实际企业当中常用的,负载均衡策略,领着大家分析了优缺点,希望大家好好体会,百分之一百的吸收,那我们现在把这些参数和扩展的点呢,放到一个配置里,一起来给 ...

最新文章

  1. java html中引入视频的格式_怎么在HTML网页中插入视频
  2. 申请美国计算机科学,美国计算机科学的申请特点
  3. 金山云肖江:5G+AIoT为智慧社区建设插上翅膀
  4. css中的段落控制 【 text-indent】
  5. Go语言中的单元测试及反向代理
  6. MyEclipse常用插件使用教程
  7. 多个条码标签如何在一张纸上打印
  8. mysql复制一行sql语句_MySQL复制表数据操作sql语句
  9. python教你画一棵树
  10. AI---人工智能学习
  11. alt+tab突然不能切换窗口(樱桃机械键盘)
  12. ARP和RARP协议工作原理
  13. APP运营如何实现流量变现,获取更高收益?
  14. Java 判断当前日期是否 是这个月的最后七天且是否为工作日(星期一到星期五)
  15. 数学之美系列二十四 -- 谈谈动态规划与如何设计动态规划算法
  16. 保姆级使用PyTorch训练与评估自己的MobileNetV2网络教程
  17. 光子 量子 DNA计算机的发展情况,量子计算机、生物计算机、光子计算机.doc
  18. 图片文件中隐藏一个rar压缩包的秘密
  19. Android制作的一个通讯录
  20. windows环境下svn安装操作说明

热门文章

  1. 运行老是跳转谷歌然后又加载不出来
  2. elasticsearch-java客户端测试
  3. MyEclipse个性设置 .
  4. 计算机和学生的关系的英语作文,学生和老师的关系的英文作文
  5. python开发学习-day01 (python安装与版本、字符串、字典、运算符、文件)
  6. linux 限速工具 netem bridge
  7. 第一次上计算机课心得,第一次上微机课作文4篇
  8. Gradle-Eclipse插件安装
  9. 【我的开源】蜗牛闹钟
  10. mysql 花生壳 2003_基于HTTP协议实现的小型web服务器的方法