2022-08-26
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://www.skjava.com/series/article/3593863360

Redis 是一个可基于内存亦可持久化的日志型(aof,rdb)、高性能 Key-Value 数据库,并提供多种语言的API ,Redis 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。

本文将详细介绍 Redis cluster 搭建过程,集群为三主三从。

准备工作

本次集群准备三台服务器(虚拟机也可以),每台服务器上面安装两个 Redis 实例,端口分别是 6379 和 6380,如下:

IP Redis 实例
192.168.2.170 Redis1(6379/主)、Redis2(6380/从)
192.168.2.142 Redis1(6379/主)、Redis2(6380/从)
192.168.2.151 Redis1(6379/主)、Redis2(6380/从)

Redis 安装

从 Redis 官网下载安装包,本文采用的版本是 5.0.3 版本。Redis 的 cluster 集群是从 Redis3.0 开始支持的。

wget http://download.redis.io/releases/redis-5.0.3.tar.gz

开始解压

tar -xzvf redis-5.0.3.tar.gz
mv redis-5.0.3 redis

编译。在编译的时候可能会遇到如下错误:

zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

解决办法是:

make MALLOC=libc

编译完成后就可以进行下面的集群安装了

集群安装

我们只需要配置好一台机器的配置,其余的配置直接采用 scp 命令进行。

配置

1、创建 Redis 目录

为 6379、6380 两个 Redis 实例创建数据目录,该目录用于存放 Redis 配置文件、日志数据等等。

mkdir -p /var/redis/{6379,6380}

2、Redis 配置文件

将 Redis 目录下的 redis.conf 配置文件 copy 到 /var/redis/6379,目录下

cp redis.conf /var/redis/redis6379.conf

修改配置配置文件,内容如下:

注释# bind 127.0.0.1
protected-mode no
port 6379
daemonize yes
cluster-enabled yes
supervised no
pidfile /var/run/redis_6379.pid
logfile "/var/redis/6379/log"
cluster-config-file /var/redis/nodes-6379.conf

修改完成后,将该文件 copy 到 /var/redis/6380 目录,同时将其内容中所有的 6379 修改为 6380

3、启动 Redis

执行如下两个命令,启动两个 Redis 实例

/usr/local/redis/src/redis-server /var/redis/6379/redis6379.conf
/usr/local/redis/src/redis-server /var/redis/6379/redis6379.conf

可以看看 Redis 启动信息:

同时,节点启动后会在相应的目录生成节点集群配置信息(cluster-config-file),文件内容记录了集群初始状态,内容如下:

[root@localhost 6379]# cat /var/redis/6379/nodes-6379.conf
4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3 :6379@16379 myself,master - 0 0 0 connected

内容中最重要的是节点 ID(4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3),他是一个 40 位 16 进制的字符串,用来唯一标识集群内的一个节点。节点 ID 在集群初始化时只创建一次,节点重启时会加载集群配置文件进行重用。

6 个 Redis 实例都已经启动成功了,但是 Redis 集群并没有搭建完成,这些实例都不知道其他实例的存在,都是孤立的并没有形成一个集群。查看集群节点新如下:

4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3 192.168.2.170:6379@16379 myself,master - 0 1555232679000 0 connected

6 个节点相互独立,如下:

节点握手

可以通过节点握手让 6 个 Redis 节点建立联系,从而形成一个集群。

节点握手是指一批运行在集群模式下的节点通过 Gossip 协议彼此通信,达到感知对方的过程。

通过在客户端执行命令 cluster meet{ip}{port} 就可以建立两个节点之间的握手,该命令是一个异步命令,执行后立刻返回,内部执行握手的过程。过程如下:

  1. 节点 6379 本地创建 6380 节点信息对象,并发送 meet 消息。
  2. 节点 6380 接受到 meet 消息后,保存 6379 节点信息并回复 pong 消息。
  3. 之后节点 6379 和 6380 彼此定期通过 ping/pong 消息进行正常的节点通信。

在节点 192.168.2.170:6379 节点执行如下命令:

cluster meet 192.168.2.170 6380

这样 6379 节点就与 6380 之间建立了联系,如下:

继续在该节点执行如下命令:

cluster meet 192.168.2.151 6379
cluster meet 192.168.2.151 6380
cluster meet 192.168.2.142 6379
cluster meet 192.168.2.142 6380

上面命令是可以在任意节点上面执行,握手状态会通过消息在集群内传播,这样其他节点会自动发现新节点并发起握手流程,这样 6 个节点都互相感知了,建立了一个集群,如下图:

查看集群节点信息。

在其余 5 个节点查看都可以得到相同的信息。

6 个节点建立握手后,集群还是不能正常工作,这是因为还有没有分配。Redis 集群一共 16384 个槽点,只有这些槽点全部分配节点后,集群才会进入在线状态。

分配槽点

分配槽点的命令如下:

redis-cli -h IP -p 端口 cluster addslots {begin .. end}

Redis 集群分为主从,其中首次启动的节点和被分配槽的节点都是主节点,从节点负责复制主节点槽信息和相关的数据。这里我们配置的三主三从,主节点为三台服务器的 6379 节点,从节点为 6380 节点。所以整个命令如下:

redis-cli -h 192.168.2.170 -p 6379 cluster addslots {0..5460}

redis-cli -h 192.168.2.151 -p 6379 cluster addslots {5461..10922}

redis-cli -h 192.168.2.142 -p 6379 cluster addslots {10923..16383}

这样主节点就已经配置完成了,下面则是配置从节点。cluster replicate {nodeId} 可以让某个节点成为从节点,在三台服务器执行如下三个命令,注意 Redis 节点是 6380,不是 6379。

cluster replicate 4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3

cluster replicate 03d20cfe6e98f4b6f09d5299a465845ce70008c3

cluster replicate 00c46cd6b8875a4c8fafac6f773c5c90a5331c7d

再次查看集群节点信息:

到这里我们就已经完成了 Redis 集群的搭建,整个集群图例如下:

我们测试下:

验证成功!!

小编使用的是 Redis 5 ,而 Redis 5 不支持 redis-trib.rb 来搭建集群了,推荐使用 redis-cli 来操作,所以关于 redis-trib.rb 搭建集群的方式,小编就不介绍了,各位可以自行 Google。下面演示利用 redis-cli 来操作集群

redis-cli 操作集群

所有配置依然采用上面的 Redis 配置,启动所有 Redis 服务(如果是复用上面的配置,需要删除掉所有的 node-xx.conf)。

我们可以利用 redis-cli --cluster help 查看利用 redis-cli 操作集群的命令帮助文档,如下:

搭建集群

搭建集群的命令如下:

create         host1:port1 ... hostN:portN --cluster-replicas <arg>

对于文中集群命令如下:

redis-cli --cluster create 192.168.2.170:6379 192.168.2.170:6380 192.168.2.151:6379 192.168.2.151:6380 192.168.2.142:6379 192.168.2.142:6380 --cluster-replicas 1

--cluster-replicas 1 表示一主一从,我们有 6个节点,即三主三从。运行结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tm70IDoq-1624799998338)(https://gitee.com/chenssy/blog-home/raw/master/image/sijava/sk-redis/redis-201904231002.png)]

使用命令 redis-cli --cluster check 检查创建集群的状态

redis-cli --cluster check 192.168.2.170:6379 ## 可以填写任意节点,会带出所有的

从图中可以看出,该命令自动

使用命令 redis-cli --cluster info 查看集群信息,如下:

更加的详细信息如下:

对于集群节点的删除和添加,这里就不做演示了,两个命令分别是 redis-cli --cluster del-node host:port node_idredis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id <arg>

阅读全文