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: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
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 个文件夹,分别命名为 8001、8002、8003、8004、8005、8006,再将 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) 各个配置说明如下(其中第 1、3、4、8 条是在前文单机版的配置基础上新增的几条):
- 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 配置,使得从机可以登录到主机上。
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
(3)还可执行如下命令查询集群节点信息:
在集群节点信息中,可以看到每一个节点的 id,该节点是 slave 还是 master。如果是 slave,那么它的 master 的 id 是什么。如果是 master,那么每一个 master 的 slot 范围是多少......
cluster nodes
附:集群节点的新增与删除
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,也就意味着新添加的实例没有存储数据的机会。
(6)下面我们需要从另外三个实例中拿出一部分 slot 分配给新实例。首先执行如下命令对 slot 重新分配,最后一个参数表示连接集群中的任意一个实例:
redis-cli -a 123 --cluster reshard 192.168.60.133:8001
(7)在上面命令执行过程中有三个核心配置需要手动配置:
- 第一个配置是要拿多少个 slot 分配给新实例,这里配置了 1000 个。
- 第二个配置是把拿出来的 1000 个 slot 分配给谁,输入接收这 1000 个 slot 的 Rdis 实例的 id,这里我输入 8007 实例的 id。
- 第三个配置是这 1000 个 slot 有哪个实例出。比如我们输入 8001 实例的 id 则从 8001 的实例中拿出 1000 个 slot 分配给端口为 8007 的实例。这里输入 all 表示将 1000 个 slot 均摊到原有的所有实例中。
(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 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 后面的参数即表示该从节点 master 的 id。
- 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)查看集群节点信息可以看到该节点已经成功添加到集群:
3,删除节点
(1)如果需要删除一个从节点,执行如下命令根据节点的 id 进行删除,中间的实例地址表示集群中任意一个实例:
redis-cli -a 123 --cluster del-node 192.168.60.133:8001 20ac3692ec0ab2c1ac44531fc2eddc57bb52a63e
(2)如果删除的节点占有 slot,直接执行删除命令会失败。我们需要参考上面添加主节点中的 slot 分配部分,现将要删除节点的 slot 全部分配出去,然后再将该节点删除。