Redis集群之数据分片
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)预安装软件
yum install gcc //#避免待会儿make时由于没安装gcc失败,提前安装gcc
yum install make //#避免make无法执行
注1:可通过如下两种方式检查软件是否已安装
gcc -v
make -v
3)下载redis 5.0–粗略讲解
创建redis安装目录
安装两种方式:
在线下载
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
离线上传
将预先下载好的redis-5.0.0.jar上传到安装目录下
解压redis
tar -zxf redis-5.0.0.tar.gz
编译及安装redis
make && make install
测试安装
redis-server //启动redis(前台方式)
redis-cli //登入redis客户端
详细安装可自行百度
######以上步骤完成后即表示单机版的redis安装成功######
3)创建redis-cluster目录和相应的配置目录
mkdir -p /usr/local/redis/redis-cluster
cd /usr/local/redis/redis-cluster
mkdir 7001 7002 7003 7004 7005 7006 //使用同一虚拟机、不同端口模拟6台redis服务器
创建6个redis配置文件,并配置,下面以7001为例
复制redis.conf到7001目录下并命名为redis-7001.conf
redis.conf 在下方百度网盘提供
修改redis-7001.conf相关参数,模板如下(重点):
1 绑定端口号
port 7001
2 注释掉,这样任何桌面客户端都可以连接了
bind 192.168.1.100
3 指定文件存放路径(.rdb .aof nodes-xxxx.conf等文件都会在此路径下)
dir /usr/local/redis/redis-5.0.0/redis-cluster/7001
4 开启redis-cluster集群
cluster-enabled yes
5 后台启动
daemonize yes
6 指定集群节点超时时间
cluster-node-timeout 5000
7 每个实例还包含存储此节点配置的文件路径,默认情况下为nodes.conf
,为redis-server
进程自动维护,不能手工修改
cluster-config-file nodes_7001.conf
8 指定持久化方式
appendonly yes
默认redis
使用的是rdb
方式持久化,这种方式在许多应用中已经足够用了。
但是redis
如果中途宕机,会导致可能有几分钟的数据丢失,根据save
来策略进行持久化,Append Only File
是另一种持久化方式,可以提供更好的持久化特性。Redis
会把每次写入的数据在接收后都写入appendonly.aof
文件,每次启动时Redis
都会先把这个文件的数据读入内存里,先忽略RDB
文件。
9 非保护模式,不然远程还是连接不了
protected-mode no
10 集群密码设置
masterauth 123456
问题:删除任意一个主节点,从节点选举失败?
解决方案:如果Redis在有密码登录的情况下,使用集群模式必须设置登录密码,不然在主节点下线时,从节点选举将会失败。请在redis.config
中的masterauth
中配置密码
细心细心细心
重复以上步骤创建7002~7006节点的配置文件,并修改相应端口号即可。
其实修改完一个后只需要改三个地方,步骤一、三、七,每个文件改成对应的端口号,其他配置不变即可。
启动节点两种方法
1.启动redis实例(即启动集群的各节点,不推荐)
$ redis-server /usr/local/redis/redis-cluster/7001/redis_7001.conf
$ redis-server /usr/local/redis/redis-cluster/7002/redis_7002.conf
$ redis-server /usr/local/redis/redis-cluster/7003/redis_7003.conf
$ redis-server /usr/local/redis/redis-cluster/7004/redis_7004.conf
$ redis-server /usr/local/redis/redis-cluster/7005/redis_7005.conf
$ redis-server /usr/local/redis/redis-cluster/7006/redis_7006.conf
2.可以写一个启动脚本start-redis-cluster.sh,模板如下(推荐)
返回/usr/local/redis/redis-cluster
目录
vim start-redis-cluster.sh
模板:
#!/bin/sh
REDIS_HOME=/usr/local/redis
redis-server $REDIS_HOME/redis-cluster/7001/redis_7001.conf
redis-server $REDIS_HOME/redis-cluster/7002/redis_7002.conf
redis-server $REDIS_HOME/redis-cluster/7003/redis_7003.conf
redis-server $REDIS_HOME/redis-cluster/7004/redis_7004.conf
redis-server $REDIS_HOME/redis-cluster/7005/redis_7005.conf
redis-server $REDIS_HOME/redis-cluster/7006/redis_7006.conf
添加权限,不然无法执行
chmod a+x ./start-redis-cluster.sh
执行脚本
./start-redis-cluster.sh
检查redis 启动情况
ps -ef | grep redis //查看redis启动情况
netstat -tnlp | grep redis //查看redis端口开启情况
启动集群
命令太长,用空格+斜杠换行
redis-cli --cluster create 192.168.208.130:7001 192.168.208.130:7002 \
192.168.208.130:7003 192.168.208.130:7004 \
192.168.208.130:7005 192.168.208.130:7006 \
--cluster-replicas 1 \
-a 123456 #如果redis加了密码
别傻不拉几的端口号都不改,改成自己的
运行过程中,会有个提示,输入yes回车即可。
redis-cli的参数说明:
1) create
表示创建一个redis集群
2) —cluster-replicas 1
表示为集群中的每一个主节点指定一个从节点,即一比一的复制
** 客户端连接集群**
redis-cli -c -h 192.168.208.130 -p 7001 -a 密码
进入后可,查看集群信息
cluster info
查看节点信息
cluster nodes
从图片上能看到那个是主节点,和他们所对应的子节点
集群测试
set name zs
get name
可以看到,客户端连接加-c选项的时候,存储和提取key的时候不断在7001和7006之间跳转,这个称为客户端重定向。之所以发生客户端重定向,是因为Redis Cluster
中的每个Master
节点都会负责一部分的槽(slot
),存取的时候都会进行键值空间计算定位key映射在哪个槽(slot
)上,如果映射的槽(slot
)正好是当前Master
节点负责则直接存取,否则就跳转到其他Master节点负的槽(slot
)中存取,这个过程对客户端是透明的。
输入exit
可退出集群,集群依然存在
新增节点
格式
redis-cli --cluster add-node { 新节点IP}:{ 新节点端口} { 任意集群节点IP}:{ 对应端口}
例如:
./src/redis-cli --cluster add-node 192.168.208.130:7007 192.168.208.130:7008
集群配置完毕
还没有评论,来说两句吧...