当前位置: > > > Redis - 安装和部署教程2(CentOS下Redis集群的搭建)

Redis - 安装和部署教程2(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 服务器(伪分布式集群):
  • 主节点172.16.8.49:8001172.16.8.49:8002172.16.8.49:8003
  • 从节点172.16.8.49:8004172.16.8.49:8005172.16.8.49:8006  

2,集群配置

(1)首先创建 rediCluster 文件夹,然后从 Redis 官网(点击访问)选择合适的版本安装包到该文件夹下,然后编译安装: 
mkdir rediCluster
cd rediCluster
wget http://download.redis.io/releases/redis-6.2.9.tar.gz
tar -zxvf redis-6.2.9.tar.gz
cd redis-6.2.9
make
make install

(2)接着将 redis-6.2.9/src 目录下的 redis-trib.rb 文件复制到 redisCluster 目录下:
cd ..
cp -f ./redis-6.2.9/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-6.2.9/redis.conf ./8001
cp -f ./redis-6.2.9/redis.conf ./8002
cp -f ./redis-6.2.9/redis.conf ./8003
cp -f ./redis-6.2.9/redis.conf ./8004
cp -f ./redis-6.2.9/redis.conf ./8005
cp -f ./redis-6.2.9/redis.conf ./8006

(4)分别修改这 6 个文件夹下的 redis.conf 文件,下面以 8001 目录下的 redis.conf 文件为例,修改如下部分:
(1) 各个配置说明如下(其中第 1348 条是在前文单机版的配置基础上新增的几条):
  • port:修改 Redis 端口
  • # bind 127.0.0.1 -::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 -::1
cluster-enabled yes
cluster-config-file nodes-8001.conf
protected-mode no
daemonize yes
requirepass 123
masterauth 123

(5)6 redis.conf 文件全部修改完毕后,进入 redis-6.2.9 文件夹,执行如下命令分别启动 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 172.16.8.49:8001 172.16.8.49:8002 172.16.8.49:8003 172.16.8.49:8004 172.16.8.49:8005 172.16.8.49:8006 --cluster-replicas 1

4,登录并查看集群信息

(1)集群创建成功后,我们可以通过 redis-cli 登录任意 Redis 实例,比如下面命令登入 8001 这个实例:
  • -p 表示要登录的集群的端口
  • -a 表示要登录的集群的密码
  • -c 表示以集群的方式登录
redis-cli -p 8001 -a 123 -c

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

(3)还可执行如下命令查询集群节点信息:
在集群节点信息中,可以看到每一个节点的 id,该节点是 slave 还是 master。如果是 slave,那么它的 masterid 是什么。如果是 master,那么每一个 masterslot 范围是多少......
cluster nodes

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

1,添加主节点

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

(2)参考前面的“2、集群配置”部分,修改 8007 目录下的 redis.conf 文件:
port 8007
# bind 127.0.0.1 -::1
cluster-enabled yes
cluster-config-file nodes-8007.conf
protected-mode no
daemonize yes
requirepass 123
masterauth 123

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

(4)启动成功后执行如下命令将 8007 这个节点添加到集群中:
redis-cli -a 123 --cluster add-node 172.16.8.49:8007 172.16.8.49:8001

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

(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 均摊到原有的所有实例中。

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

2,添加从节点

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

(2)参考前面的“2、集群配置”部分,修改 8008 目录下的 redis.conf 文件:
port 8008
# bind 127.0.0.1 -::1
cluster-enabled yes
cluster-config-file nodes-8008.conf
protected-mode no
daemonize yes
requirepass 123
masterauth 123
(3)修改完毕后,进入 redis-6.2.9 文件夹,执行如下命令启动该节点:
redis-server ../8008/redis.conf

(4)启动成功后执行如下命令将 8008 这个节点添加到集群中,作为 8007 的从节点:
参数说明:
  • 添加从节点需要指定该从节点的 masterid--cluster-master-id 后面的参数即表示该从节点 masterid
  • 172.16.8.49:8008 表示从节点的地址。
  • 172.16.8.49:8001 则表示集群中任意一个实例的地址。
redis-cli -a 123 --cluster add-node 172.16.8.49:8008 172.16.8.49:8001 --cluster-slave --cluster-master-id 761a6b346e0e6d4f6f9df9b0beaa401135938cce

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

3,删除节点

(1)如果需要删除一个从节点,执行如下命令根据节点的 id 进行删除,中间的实例地址表示集群中任意一个实例:
redis-cli -a 123 --cluster del-node 172.16.8.49:8001 20ac3692ec0ab2c1ac44531fc2eddc57bb52a63e

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