redis 集群搭建笔记

52 阅读7分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

前言

之前由于各种原因,一直都是使用redis单机环境在给应用提供服务。这次甲方的环境中是使用的redis集群。甲方财大气粗是直接购买的阿里云redis集群服务。那我只能自己动手在服务器上手动搭建一个redis集群了。哈哈哈,那就开始动手吧。

环境条件

首先我的服务器上的redis是使用yum 安装的单机版。为了要安装集群环境。我们首先创建一个目录来存放我们的集群环境,自己选择一个目录

mkdir redis-cluster

然后根据官方文档的说明,最小的集群架构需要我们提供三个redis实例,但是官方推荐是使用六个redis实例,构成3主3从的集群架构。所以我们在redis-cluster目录下创建6个文件夹redis01-redis06。

构建集群

由于我们之前是yum安装的redis,所以默认的redis.conf是在etc/redis/下的,我们先把这个文件复制到之前的redis01文件夹中。接着我们按照文档来修改redis.conf,首先打开文件,找到端口号,一般单机环境我们之前是默认的6379,现在我们把它修改成7000。

1649678670(1).png

然后激活我们的redis-cluster模式,

1649678761(1).png

集群中每个运行的实例都是一个节点,而每个节点都需要有个nodes.conf。这个是集群节点的配置文件,是由节点创建的,我们只是指定它的名称,需要注意在一个集群中各个节点的配置文件名需要各不相同。

1649678849(1).png

然后激活

appendonly yes

这个相信大家在单机模式下应该也都开启了。另外,我觉得大家集群环境下各个节点的密码可以使用统一个,这样也比较方便。修改完之后,我们把redis01下面的redis.conf依次复制到其他几个集群节点文件夹中,并且修改端口号依次为7002-7005,节点配置文件名称cluster-config-file 依次改为nodes-端口号.conf。然后保存我们的修改。 然后我们可以编写一个sh脚本来启动我们的6个节点。我这边是在redis-cluster目录下写了一个简单的脚本,写的不好大家见谅

cd redis01
/bin/redis-server ./redis.conf
cd ..
cd redis02
/bin/redis-server ./redis.conf
cd ..
cd redis03
/bin/redis-server ./redis.conf
cd ..
cd redis04
/bin/redis-server ./redis.conf
cd ..
cd redis05
/bin/redis-server ./redis.conf
cd ..
cd redis06
/bin/redis-server ./redis.conf
cd ..

然后就是启动脚本?这里会有个问题,之前查询网上资料的时候,有看到,redis从单机模式转为集群模式需要把之前的rdb快照文件删除,以及删除apendonly.aof文件,因为如果这里两个文件不清空的话,启动时会提示redis运行实例节点的文件非空。

所以我们先清空这两个文件。如果和我一样是yum安装的,那么可以在redis.conf找到如下的配置

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /var/lib/redis

因为默认这两个文件是在工作目录下生成的。 进入这个文件夹,将这两个文件删除。然后执行我们之前的脚本文件,将这6个redis实例运行起来

root      597500       1  0 Apr11 ?        00:01:01 redis-server 0.0.0.0:7000 [cluster]
root      597505       1  0 Apr11 ?        00:01:01 redis-server 0.0.0.0:7001 [cluster]
root      597510       1  0 Apr11 ?        00:01:02 redis-server 0.0.0.0:7002 [cluster]
root      597515       1  0 Apr11 ?        00:01:10 redis-server 0.0.0.0:7003 [cluster]
root      597520       1  0 Apr11 ?        00:01:10 redis-server 0.0.0.0:7004 [cluster]
root      597525       1  0 Apr11 ?        00:01:10 redis-server 0.0.0.0:7005 [cluster]

可以看到这6个实例全部以集群模式启动了。然后我们需要初始化我们的集群,也就是把这些节点加入到我们的集群中管理起来。 官方提供了命令,不过在执行命令之前需要打开各个节点的总线端口,什么是总线端口?每一个节点都需要暴露两个tcp端口,一个是服务于客户端的默认6379,另外一个是集群总线端口,设定为节点客户端数据端口号加10000,这个是定死的,大家按要求即可。这个总线端口主要是节点之间的通信 如果你也是yum安装的redis,可以在bin目录下执行

redis-cli --cluster create 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 \
--cluster-replicas 1 -a password

将这里的IP更换为自己的公网IP,将password替换为自己的redis密码,可以看到redis开始分配主从节点,当中会需要我们输入一次yes,如果一切顺利那么可以看到所有的slots被覆盖到了。 接下来可以通过客户端查看我们的集群信息

集群信息

首先输入

/bin/redis -c -p 7000

-c是启用集群模式 进入之后还是auth 密码,然后就可以查看了,执行cluster info

127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:71566
cluster_stats_messages_pong_sent:71999
cluster_stats_messages_sent:143565
cluster_stats_messages_ping_received:71999
cluster_stats_messages_pong_received:71551
cluster_stats_messages_publish_received:21
cluster_stats_messages_received:143571

执行cluster nodes

4d944403306cfeb92b9c511a36ee1402739b9024 127.0.0.1:7005@17005 slave 832255b11764dfb38b294dbeec319cf96c0b31cd 0 1649694669749 6 connected
202f7fea175aaba5f9046752e765d3da6ce4ad53 127.0.0.1:7000@17000 myself,master - 0 1649694670000 1 connected 0-5460
0433330b00481cf117ca9efeb5fee22a8cbd3daa 127.0.0.1:7004@17004 slave 202f7fea175aaba5f9046752e765d3da6ce4ad53 0 1649694669000 5 connected
27adbac0a6e723f9b057151324c68ed06802d4e0 127.0.0.1:7002@17002 master - 0 1649694670000 3 connected 10923-16383
f6f5f8bef66515f856cbfb12e41956df633e33fc 127.0.0.1:7003@17003 slave 27adbac0a6e723f9b057151324c68ed06802d4e0 0 1649694669550 4 connected
832255b11764dfb38b294dbeec319cf96c0b31cd 127.0.0.1:7001@17001 master - 0 1649694670753 2 connected 5461-10922

可以看到有6个节点,这里会有一个问题,如果我们在spring boot中整合redis集群,即使我们配置了节点列表并且使用公网IP,但是会发现有个端口没有使用公网IP而使用了内网IP进行连接。这是由于redis会把用于查询集群信息的节点使用内网去连接,解决这个的办法是在之前redis的工作目录下找到所有的nodes.conf,将各个节点配置文件中的内网IP改为公网IP,然后kill掉各个节点,重新启动,该问题即可解决。

以上就是我搭建redis的过程,希望可以对大家有所帮助