【死磕 Redis】----- Redis 集群搭建

Java技术驿站

共 4757字,需浏览 10分钟

 ·

2020-08-07 00:18

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

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

准备工作

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

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

Redis 安装

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

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

开始解压

  1. tar -xzvf redis-5.0.3.tar.gz

  2. mv redis-5.0.3 redis

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

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

解决办法是:

  1. make MALLOC=libc

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

集群安装

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

配置

1、创建 Redis 目录

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

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

2、Redis 配置文件

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

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

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

  1. 注释# bind 127.0.0.1

  2. protected-mode no

  3. port 6379

  4. daemonize yes

  5. cluster-enabled yes

  6. supervised no

  7. pidfile /var/run/redis_6379.pid

  8. logfile "/var/redis/6379/log"

  9. cluster-config-file /var/redis/nodes-6379.conf

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

3、启动 Redis

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

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

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

可以看看 Redis 启动信息:

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

  1. [root@localhost 6379]# cat /var/redis/6379/nodes-6379.conf

  2. 4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3:6379@16379 myself,master - 000 connected

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

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

  1. 4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3192.168.2.170:6379@16379 myself,master - 015552326790000 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 节点执行如下命令:

  1. cluster meet 192.168.2.1706380

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

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

  1. cluster meet 192.168.2.1516379

  2. cluster meet 192.168.2.1516380

  3. cluster meet 192.168.2.1426379

  4. cluster meet 192.168.2.1426380

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

查看集群节点信息。

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

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

分配槽点

分配槽点的命令如下:

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

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

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


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


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

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

  1. cluster replicate 4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3


  2. cluster replicate 03d20cfe6e98f4b6f09d5299a465845ce70008c3


  3. 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 操作集群的命令帮助文档,如下:

搭建集群

搭建集群的命令如下:

  1. create host1:port1 ... hostN:portN --cluster-replicas

对于文中集群命令如下:

  1. redis-cli --cluster create 192.168.2.170:6379192.168.2.170:6380192.168.2.151:6379192.168.2.151:6380192.168.2.142:6379192.168.2.142:6380--cluster-replicas 1

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

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

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

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

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

更加的详细信息如下:

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











【死磕 Redis】----- 开篇

【死磕 Redis】----- Redis 通信协议 RESP

【死磕 Redis】----- Redis 的线程模型

【死磕 Redis】----- 事务

【死磕 Redis】----- 理解 pipeline 管道

【死磕 Redis】----- 布隆过滤器

【死磕 Redis】----- 发布与订阅

【死磕 Redis】-----如何排查 Redis 中的慢查询

【死磕 Redis】-----持久化

【死磕 Redis】----- 主从复制(一):概述

【死磕 Redis】----- 主从复制(二):全量复制和部分复制

【死磕 Redis】----- 主从复制(三):注意的问题

【死磕 Redis】----- 哨兵(一):部署哨兵架构

【死磕 Redis】----- 哨兵(二):基本原理

【死磕 Redis】----- info 命令详解

【死磕 Redis】------ 理解 Redis 的内存

浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报