【死磕 Redis】----- Redis 集群搭建
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 - 000 connected
内容中最重要的是节点 ID(4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3),他是一个 40 位 16 进制的字符串,用来唯一标识集群内的一个节点。节点 ID 在集群初始化时只创建一次,节点重启时会加载集群配置文件进行重用。
6 个 Redis 实例都已经启动成功了,但是 Redis 集群并没有搭建完成,这些实例都不知道其他实例的存在,都是孤立的并没有形成一个集群。查看集群节点新如下:
4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3192.168.2.170:6379@16379 myself,master - 015552326790000 connected
6 个节点相互独立,如下:
节点握手
可以通过节点握手让 6 个 Redis 节点建立联系,从而形成一个集群。
节点握手是指一批运行在集群模式下的节点通过 Gossip 协议彼此通信,达到感知对方的过程。
通过在客户端执行命令 cluster meet{ip}{port}
就可以建立两个节点之间的握手,该命令是一个异步命令,执行后立刻返回,内部执行握手的过程。过程如下:
节点 6379 本地创建 6380 节点信息对象,并发送 meet 消息。
节点 6380 接受到 meet 消息后,保存 6379 节点信息并回复 pong 消息。
之后节点 6379 和 6380 彼此定期通过 ping/pong 消息进行正常的节点通信。
在节点 192.168.2.170:6379 节点执行如下命令:
cluster meet 192.168.2.1706380
这样 6379 节点就与 6380 之间建立了联系,如下:
继续在该节点执行如下命令:
cluster meet 192.168.2.1516379
cluster meet 192.168.2.1516380
cluster meet 192.168.2.1426379
cluster meet 192.168.2.1426380
上面命令是可以在任意节点上面执行,握手状态会通过消息在集群内传播,这样其他节点会自动发现新节点并发起握手流程,这样 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
对于文中集群命令如下:
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
检查创建集群的状态
redis-cli --cluster check 192.168.2.170:6379## 可以填写任意节点,会带出所有的
从图中可以看出,该命令自动
使用命令 redis-cli--cluster info
查看集群信息,如下:
更加的详细信息如下:
对于集群节点的删除和添加,这里就不做演示了,两个命令分别是 redis-cli--clusterdel-node host:port node_id
和 redis-cli--cluster add-node new_host:new_port existing_host:existing_port--cluster-slave--cluster-master-id
【死磕 Redis】----- Redis 通信协议 RESP
【死磕 Redis】----- 理解 pipeline 管道
【死磕 Redis】-----如何排查 Redis 中的慢查询