Redis集群之数据分片

心已赠人 2023-06-30 02:50 85阅读 0赞

Redis集群之数据分片

一、redis5.0简介
2018年十月Redis发布了稳定版本的5.0版本,推出了各种新特性,其中一点是放弃Ruby的集群方式,
改为使用C语言编写的redis-cli的方式,使集群的构建方式复杂度大大降低。 、

本章目标:在一台Linux服务器上搭建有6个节点(3主3从)的Redis集群。(因为redis选举机制原因,集群最低6个节点,不然无法创建)

主从集群(master-slave):
主从结构的redis由主节点负责读写操作,从节点负责操作;
在这里插入图片描述
简单的主从集群有个问题,就是主节点挂了之后,无法重新选举新的节点作为主节点进行写操作,导致服务不可用。
因此,需要一种机制对主节点挂了的集群进行监控,并且重新选举主节点,这就是哨兵的作用。

哨兵主从集群(master-slave-sentinel)

在这里插入图片描述
由哨兵来检测主节点是否死亡,每个哨兵检测都会返回true或者false,以少数服从多数的原则来判断主节点是否死亡,如果判定死亡,从节点就会顶上。
缺点
如果每个从节点配置都不一样,例如salve1只有20g存储空间,而salve2有10g,主从节点数据都是同步的,如果数据超过最低配置,他会以最低配置(salve2)的来存储,不会再继续加数据,从而浪费了其他节点的空间。

数据分片(redis-cluster)
尽管可以使用哨兵主从集群实现可用性保证,但是这种实现方式每个节点的数据都是全量复制,数据存放量存在着局限性,受限于内存最小的节点,因此考虑采用数据分片的方式,来实现存储,这个就是redis-cluster
redis-cluster的优势:

  • 官方推荐,毋庸置疑。
  • 去中心化,集群最大可增加1000个节点,性能随节点增加而线性扩展。
  • 管理方便,后续可自行增加或摘除节点,移动分槽等等。
  • 简单,易上手。
    在这里插入图片描述
    简单说一下原理
    redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的。
    redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点。
    从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
    每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

    Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。
    redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot
    然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384

二、redis-cluster(数据分片)集群步骤
1)安装环境为CentOS7版
这里不做申明
2)预安装软件

  1. yum install gcc //#避免待会儿make时由于没安装gcc失败,提前安装gcc
  2. yum install make //#避免make无法执行

注1:可通过如下两种方式检查软件是否已安装

  1. gcc -v
  2. make -v

3)下载redis 5.0–粗略讲解
创建redis安装目录
安装两种方式:
在线下载

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

离线上传
将预先下载好的redis-5.0.0.jar上传到安装目录下

解压redis

  1. tar -zxf redis-5.0.0.tar.gz

编译及安装redis

  1. make && make install

测试安装

  1. redis-server //启动redis(前台方式)
  2. redis-cli //登入redis客户端

详细安装可自行百度
######以上步骤完成后即表示单机版的redis安装成功######

3)创建redis-cluster目录和相应的配置目录

  1. mkdir -p /usr/local/redis/redis-cluster
  2. cd /usr/local/redis/redis-cluster
  3. mkdir 7001 7002 7003 7004 7005 7006 //使用同一虚拟机、不同端口模拟6台redis服务器

在这里插入图片描述
创建6个redis配置文件,并配置,下面以7001为例

复制redis.conf到7001目录下并命名为redis-7001.conf
redis.conf 在下方百度网盘提供
修改redis-7001.conf相关参数,模板如下(重点)
1 绑定端口号

  1. port 7001

在这里插入图片描述
2 注释掉,这样任何桌面客户端都可以连接了

  1. bind 192.168.1.100

在这里插入图片描述
3 指定文件存放路径(.rdb .aof nodes-xxxx.conf等文件都会在此路径下)

  1. dir /usr/local/redis/redis-5.0.0/redis-cluster/7001

在这里插入图片描述
4 开启redis-cluster集群

  1. cluster-enabled yes

在这里插入图片描述
5 后台启动

  1. daemonize yes

在这里插入图片描述
6 指定集群节点超时时间

  1. cluster-node-timeout 5000

在这里插入图片描述
7 每个实例还包含存储此节点配置的文件路径,默认情况下为nodes.conf,为redis-server进程自动维护,不能手工修改

  1. cluster-config-file nodes_7001.conf

在这里插入图片描述
8 指定持久化方式

  1. appendonly yes

默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。
但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,
Append Only File是另一种持久化方式,可以提供更好的持久化特性。
Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
在这里插入图片描述
9 非保护模式,不然远程还是连接不了

  1. protected-mode no

在这里插入图片描述
10 集群密码设置

  1. masterauth 123456

在这里插入图片描述
问题:删除任意一个主节点,从节点选举失败?
解决方案:如果Redis在有密码登录的情况下,使用集群模式必须设置登录密码,不然在主节点下线时,从节点选举将会失败。请在redis.config中的masterauth中配置密码

细心细心细心
重复以上步骤创建7002~7006节点的配置文件,并修改相应端口号即可。
其实修改完一个后只需要改三个地方,步骤一、三、七,每个文件改成对应的端口号,其他配置不变即可。

启动节点两种方法
1.启动redis实例(即启动集群的各节点,不推荐)

  1. $ redis-server /usr/local/redis/redis-cluster/7001/redis_7001.conf
  2. $ redis-server /usr/local/redis/redis-cluster/7002/redis_7002.conf
  3. $ redis-server /usr/local/redis/redis-cluster/7003/redis_7003.conf
  4. $ redis-server /usr/local/redis/redis-cluster/7004/redis_7004.conf
  5. $ redis-server /usr/local/redis/redis-cluster/7005/redis_7005.conf
  6. $ redis-server /usr/local/redis/redis-cluster/7006/redis_7006.conf

2.可以写一个启动脚本start-redis-cluster.sh,模板如下(推荐)
返回/usr/local/redis/redis-cluster目录

  1. vim start-redis-cluster.sh

模板:

  1. #!/bin/sh
  2. REDIS_HOME=/usr/local/redis
  3. redis-server $REDIS_HOME/redis-cluster/7001/redis_7001.conf
  4. redis-server $REDIS_HOME/redis-cluster/7002/redis_7002.conf
  5. redis-server $REDIS_HOME/redis-cluster/7003/redis_7003.conf
  6. redis-server $REDIS_HOME/redis-cluster/7004/redis_7004.conf
  7. redis-server $REDIS_HOME/redis-cluster/7005/redis_7005.conf
  8. redis-server $REDIS_HOME/redis-cluster/7006/redis_7006.conf

添加权限,不然无法执行

  1. chmod a+x ./start-redis-cluster.sh

执行脚本

  1. ./start-redis-cluster.sh

检查redis 启动情况

  1. ps -ef | grep redis //查看redis启动情况
  2. netstat -tnlp | grep redis //查看redis端口开启情况

在这里插入图片描述
在这里插入图片描述
启动集群
命令太长,用空格+斜杠换行

  1. redis-cli --cluster create 192.168.208.130:7001 192.168.208.130:7002 \
  2. 192.168.208.130:7003 192.168.208.130:7004 \
  3. 192.168.208.130:7005 192.168.208.130:7006 \
  4. --cluster-replicas 1 \
  5. -a 123456 #如果redis加了密码

别傻不拉几的端口号都不改,改成自己的
运行过程中,会有个提示,输入yes回车即可。
redis-cli的参数说明:
1) create
表示创建一个redis集群
2) —cluster-replicas 1
表示为集群中的每一个主节点指定一个从节点,即一比一的复制

** 客户端连接集群**

  1. redis-cli -c -h 192.168.208.130 -p 7001 -a 密码

在这里插入图片描述
进入后可,查看集群信息

  1. cluster info

在这里插入图片描述
查看节点信息

  1. cluster nodes

在这里插入图片描述
从图片上能看到那个是主节点,和他们所对应的子节点

集群测试

  1. set name zs
  2. get name

可以看到,客户端连接加-c选项的时候,存储和提取key的时候不断在7001和7006之间跳转,这个称为客户端重定向。之所以发生客户端重定向,是因为Redis Cluster中的每个Master节点都会负责一部分的槽(slot),存取的时候都会进行键值空间计算定位key映射在哪个槽(slot)上,如果映射的槽(slot)正好是当前Master节点负责则直接存取,否则就跳转到其他Master节点负的槽(slot)中存取,这个过程对客户端是透明的。

输入exit可退出集群,集群依然存在

新增节点
格式

  1. redis-cli --cluster add-node { 新节点IP}:{ 新节点端口} { 任意集群节点IP}:{ 对应端口}

例如:

  1. ./src/redis-cli --cluster add-node 192.168.208.130:7007 192.168.208.130:7008

集群配置完毕

发表评论

表情:
评论列表 (有 0 条评论,85人围观)

还没有评论,来说两句吧...

相关阅读