Windows系统下搭建RedisCluster集群

编程侠 2021-04-16 15:49:23

在之前文章《干货!带你了解为什么那么多开源项目都是用Redis》已经介绍了redis的一些基本知识。

Redis的三种集群模式主要是:主从模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)和redis cluster集群模式(redis3.0版本之后)。今天主要讲解在windows系统下搭建redis cluster集群环境(集群正常运作至少需要三个主节点,我们测试集群功能采用三主三从,一共六个节点),以及在代码中集成使用redis cluster。

Redis Cluster集群搭建后的目录大致如下:

一、环境搭建‍

1、下载window系统redis安装包(版本必需要3.0以上,redis3.0版本之后才支持redis cluster集群模式)

我下载的版本是3.0.501。解压之后的目录内容:

2、下载ruby安装包,按照指引安装

下载地址:https://rubyinstaller.org/downloads/

安装完成系统自动弹出弹框,输入命令对Ruby进行配置:

gem install redis

3、搭建redis三主三从环境

(1)在第1步解压后的redis目录下建立6个文件夹,分别以端口命名:7000,7001,7002,7003,7004,7005。再将第1步解压后的所有内容分别拷贝到每个文件夹下。

(2)在每个文件夹下分别建立一个批处理启动文件start.bat,启动时直接运行该批处理文件。start.bat内容如下(对应各自的端口号):

title redis-7000

redis-server.exe redis.windows.conf

(3)修改文件redis.windows.conf

修改6个节点文件目录下的redis.windows.conf,修改节点的端口号。比如

port 7000

(4)修改其他配置支持集群

cluster-enabled yes

cluster-config-file nodes-7000.conf

cluster-node-timeout 15000

appendonly yes

cluster-config-file nodes-7000.conf: 是该节点的配置信息,比如当前节点端口号是7000,配置为cluster-config-file nodes-7000.conf,start.bat服务启动后会在目录生成文件nodes-7000.conf;

cluster-enabled 设置为yes;

cluster-node-timeout 调整为15000,在创建集群的时候,不会超时;

4、下载ruby语言集群脚本redis-trib.rb,复制到redis目录下

二、服务启动‍

1、进入6个端口号命名的文件夹下,启动start.bat文件

2、切换到redis目录下执行命令

ruby 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个redis 节点,因此也可以看出7000,7001,7002三个是主节点,7003,7004,7005是三个从节点,对应关系是:主7000从7003,主7001从7004,主7002从7005。

出现Can I set the above configuration? (type 'yes' to accept): 输入yes

执行完成之后,在原来每个redis节点下面可以看出主从信息。

3、启动异常处理

若执行第3步命令时提示:

[ERR] Node 127.0.0.1:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

问题原因:关闭redis集群时,直接关闭的命令行,应该按ctrl+c,然后系统会提示:终止批处理操作吗(Y/N)? 输入Y退出。

解决办法:每个redis子节点都要删除三个文件:appendonly.aof、dump.rdb、nodes-port.conf(比如nodes-7000.conf),然后再重新启动start.bat。

4、使用redis可视化工具连接查看

开始db0没有数据:

点击db0之外的db1等均提示:

ReplyError: ERR SELECT is not allowed in cluster mode

这是因为redis集群版不支持多数据库空间。单机下的Redis可以支持16个数据库,集群模式下只能使用一个数据库空间,即db0。其他的db都会返回错误。

5、测试redis数据写入与数据读取

在redis目录下执行命令redis-cli –c –h ”地址” –p “端口号”; c 表示集群。

redis-cli -c -h 127.0.0.1 -p 7000

写入数据:set name bianchengxia

根据redis-cluster的key值分配(Redis集群没有使用一致性hash, 而是引入了哈希槽的概念,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,每个key通过CRC16校验后对16384取模来决定放置哪个槽(Slot),每一个节点负责维护一部分槽以及槽所映射的键值数据),name应该分配到节点7001上,上面显示redis cluster自动从7000跳转到了7001节点。

我们可以测试一下7001从节点获取name值(实际每个节点都可以取到值,redis自动切换到对应key所在的节点)

三、项目集成测试‍

1、项目配置

以Springboot项目为例,在application.properties中配置redis

spring.redis.cluster.nodes=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

若是application.yml配置方式,则按照如下方式配置:

2、SpringBootTest单元测试

@RunWith(SpringRunner.class)

@SpringBootTest

public RedisTest {

@Autowired

StringRedisTemplate redisTemplate;

ValueOperationsstringRedis;

@PostConstruct

public void init(){

stringRedis=redisTemplate.opsForValue();

}

@Test

public void testString (){

stringRedis.set("name2", "编程侠");

System.out.println(stringRedis.get("name2"));

}

}

执行结果:

通过可视化工具查看:

通过命令查看,中文乱码:

中文存在编码问题,解决办法,redis-cli 后面加上--raw

执行命令:redis-cli -c -h 127.0.0.1 -p 7000 --raw

我用的windows cmd,设置--raw之后还是乱码,因为要设置窗口的编码,回到redis目录下,输入:chcp 65001,这句命令就是换成UTF-8代码页,会提示Active code page: 65001。

0 阅读:45

编程侠

简介:一个爱好厨艺的程序员