Redis - 安装和部署教程2(CentOS下Redis集群的搭建)

作者: hangge 发布时间: 2019-10-23 浏览: 2326 次 编辑

Redis - 安装和部署教程1(CentOS下单个Redis实例安装)

四、Redis 集群原理

1,基本介绍

  • Redis 集群中,所有的 Redis 节点彼此互联,节点内部使用二进制协议优化速度和带宽。当一个节点挂掉后,集群中超过半数的节点检测失效时才认为该节点已失效。
  • 不同于 Tomcat 集群需要使用反向代理服务器,Redis 集群中的任意节点都可以直接和 Java 客户端连接。

2,数据分配策略

(1)Redis 集群上的数据分配则是采用哈希槽(HASH SLOT):

Redis 集群中内置了 16384 个哈希槽,当有数据需要存储时,Redis 会首先使用 CRC16 算法对 key 进行计算,将计算获得的结果对 16384 取余,这样每一个 key 都会对应一个取值在 0~16383 之间的哈希槽,Redis 则根据这个余数将该条数据存储到对应的 Redis 节点上。

(2)开发者可以根据每个 Redis 实例的性能来调整每个 Redis 实例上哈希槽的分布范围。

五、Redis 集群搭建

1,集群规划

Redis 要求至少三主三从共 6 个节点才能组成 Redis 集群。本次我们在同一个台服务上用不同的端口表示不同的 Redis 服务器(伪分布式集群):

  • 主节点192.168.60.133:8001192.168.60.133:8002192.168.60.133:8003
  • 从节点192.168.60.133:8004192.168.60.133:8005192.168.60.133:8006

2,集群配置

(1)首先创建 rediCluster 文件夹,下载 Redis 压缩文件到该文件夹下,然后编译安装:

mkdir rediCluster
cd rediCluster
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar -zxvf redis-5.0.5.tar.gz
cd redis-5.0.5
make MALLOC=libc
make install 

(2)接着将 redis-5.0.5/src 目录下的 redis-trib.rb 文件复制到 redisCluster 目录下:

cd ..
cp -f ./redis-5.0.5/src/redis-trib.rb ./

(3)然后在 redisCluster 目录下创建 6 个文件夹,分别命名为 800180028003800480058006,再将 redis-5.0.5 目录下的 redis.conf 文件分别往这 6 个目录中复制一份。

mkdir 8001
mkdir 8002
mkdir 8003
mkdir 8004
mkdir 8005
mkdir 8006
cp -f ./redis-5.0.5/redis.conf ./8001
cp -f ./redis-5.0.5/redis.conf ./8002
cp -f ./redis-5.0.5/redis.conf ./8003
cp -f ./redis-5.0.5/redis.conf ./8004
cp -f ./redis-5.0.5/redis.conf ./8005
cp -f ./redis-5.0.5/redis.conf ./8006

(4)分别修改这 6 个文件夹下的 redis.conf 文件,下面以 8001 目录下的 redis.conf 文件为例,修改如下部分:

(1) 各个配置说明如下(其中第 1348 条是在前文单机版的配置基础上新增的几条):

  • port:修改 Redis 端口
  • #bind 127.0.0.1:注释掉后外网就可以连接 Redis
  • cluster-enabled:设置为 yes 表示开启集群
  • cluster-config-file: 表示集群节点的配置文件
  • protected-mode:由于配置了密码登录,这里将 protected-mode 设置为 no 关闭保护模式。
  • daemonize:设置为 yes 表示允许 Redis 在后台启动。
  • requirepass:表示登录该 Redis 实例所需的密码
  • masterauth:由于每个节点都开启了密码认证,因此又增加 masterauth 配置,使得从机可以登录到主机上。
(2)下面是 8001 文件夹下的 redis.conf 配置修改,其它 5 个文件夹下的 redis.conf 也参照这个修改,主要是 port cluster-config-file 不同。
port 8001
#bind 127.0.0.1
cluster-enabled yes
cluster-config-file nodes-8001.conf
protected-mode no
daemonize yes
requirepass 123
masterauth 123

(5)6 redis.conf 文件全部修改完毕后,进入 redis-5.0.5 文件夹,执行如下命令分别启动 6 Redis 实例:

redis-server ../8001/redis.conf
redis-server ../8002/redis.conf
redis-server ../8003/redis.conf
redis-server ../8004/redis.conf
redis-server ../8005/redis.conf
redis-server ../8006/redis.conf

3,创建集群

Redis 5.0 版本起就放弃 Ruby 的集群方式,改为 使用 C 语言编写的 redis-cli 的方式,使得 Redis5 集群的构建方式复杂度大大降低。我们执行如下命令创建 Redis 集群:

  • --a 后面为前面设置的 Redis 密码
  • --cluster-replica 表示每个主节点的 slave 数量。在集群的创建过程中会分配主机和从机,每个集群在创建过程中都将会分配到一个唯一的 id 并分配到一段 slot
redis-cli -a 123 --cluster create 192.168.60.133:8001 192.168.60.133:8002 192.168.60.133:8003 192.168.60.133:8004 192.168.60.133:8005 192.168.60.133:8006 --cluster-replicas 1

4,登录并查看集群信息

(1)集群创建成功后,我们可以通过 redis-cli 登录任意 Redis 实例,比如下面命令登入 8001 这个实例:

  • -p 表示要登录的集群的端口
  • -a 表示要登录的集群的密码
  • -c 表示以集群的方式登录
redis-cli -p 8001 -a 123 -c

(2)登录成功后可以通过如下命令查看集群状态信息:

cluster info

原文:Redis - 安装和部署教程2(CentOS下Redis集群的搭建)


(3)还可执行如下命令查询集群节点信息:

在集群节点信息中,可以看到每一个节点的 id,该节点是 slave 还是 master。如果是 slave,那么它的 masterid 是什么。如果是 master,那么每一个 masterslot 范围是多少......

cluster nodes

原文:Redis - 安装和部署教程2(CentOS下Redis集群的搭建)

附:集群节点的新增与删除

1,添加主节点

(1)当集群节点创建成功后,随着业务的增长,可能需要添加主节点。要添加主节点需要先构建主节点的实例,将 redisCluster 目录下的 8001 目录复制一份,名为 8007

cp -p -r 8001 8007

(2)参考前面的“2、集群配置”部分,修改 8007 目录下的 redis.conf 文件:

port 8007
#bind 127.0.0.1
cluster-enabled yes
cluster-config-file nodes-8007.conf
protected-mode no
daemonize yes
requirepass 123
masterauth 123

(3)修改完毕后,进入 redis-5.0.5 文件夹,执行如下命令启动该节点:

redis-server ../8007/redis.conf

(4)启动成功后执行如下命令将 8007 这个节点添加到集群中:

redis-cli -a 123 --cluster add-node 192.168.60.133:8007 192.168.60.133:8001


(5)添加成功后查看集群节点信息,可以看到该实例已经被添加进集群了。但由于 slot 已经被之前的实例分配完了,新添加的实例没有 slot,也就意味着新添加的实例没有存储数据的机会。

原文:Redis - 安装和部署教程2(CentOS下Redis集群的搭建)

(6)下面我们需要从另外三个实例中拿出一部分 slot 分配给新实例。首先执行如下命令对 slot 重新分配,最后一个参数表示连接集群中的任意一个实例:

redis-cli -a 123 --cluster reshard 192.168.60.133:8001

(7)在上面命令执行过程中有三个核心配置需要手动配置:

  • 第一个配置是要拿多少个 slot 分配给新实例,这里配置了 1000 个。
  • 第二个配置是把拿出来的 1000slot 分配给谁,输入接收这 1000slotRdis 实例的 id,这里我输入 8007 实例的 id
  • 第三个配置是这 1000slot 有哪个实例出。比如我们输入 8001 实例的 id 则从 8001 的实例中拿出 1000slot 分配给端口为 8007 的实例。这里输入 all 表示将 1000slot 均摊到原有的所有实例中。

原文:Redis - 安装和部署教程2(CentOS下Redis集群的搭建)

(8)slot 分配成功后,再查看节点信息,可以看到新实例也有 slot

原文:Redis - 安装和部署教程2(CentOS下Redis集群的搭建)

2,添加从节点

(1)相较于添加主节点,添加从节点更简单些。我们通用需要先构建主节点的实例,将 redisCluster 目录下的 8001 目录复制一份,名为 8008

cp -p -r 8001 8008

(2)参考前面的“2、集群配置”部分,修改 8008 目录下的 redis.conf 文件:

port 8008
#bind 127.0.0.1
cluster-enabled yes
cluster-config-file nodes-8008.conf
protected-mode no
daemonize yes
requirepass 123
masterauth 123

(3)修改完毕后,进入 redis-5.0.5 文件夹,执行如下命令启动该节点:

redis-server ../8008/redis.conf


(4)启动成功后执行如下命令将 8008 这个节点添加到集群中,作为 8007 的从节点:

参数说明:

  • 添加从节点需要指定该从节点的 masterid--cluster-master-id 后面的参数即表示该从节点 masterid
  • 192.168.60.133:8008 表示从节点的地址。
  • 192.168.60.133:8001 则表示集群中任意一个实例的地址。
redis-cli -a 123 --cluster add-node 192.168.60.133:8008 192.168.60.133:8001 --cluster-slave --cluster-master-id bb997870dc1b21e0333c0aa4393b5d3c982ecb3f

5)查看集群节点信息可以看到该节点已经成功添加到集群:

原文:Redis - 安装和部署教程2(CentOS下Redis集群的搭建)

3,删除节点

(1)如果需要删除一个从节点,执行如下命令根据节点的 id 进行删除,中间的实例地址表示集群中任意一个实例:

redis-cli -a 123 --cluster del-node 192.168.60.133:8001 20ac3692ec0ab2c1ac44531fc2eddc57bb52a63e

(2)如果删除的节点占有 slot,直接执行删除命令会失败。我们需要参考上面添加主节点中的 slot 分配部分,现将要删除节点的 slot 全部分配出去,然后再将该节点删除。


原文出自:www.hangge.com 转载请保留原文链接:https://www.hangge.com/blog/cache/detail_2591.html