搭建分片集群(redis cluster)入门教程
redis cluster简介
- redis 3.0版本之前,只支持单例模式,在3.0版本之后才支持集群
- redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点
- redis集群是没有统一的入口的,客户端连接集群中的任意节点即可,集群内部的节点是相互通信的(Gossip通信协议, PING-PONG机制),每个节点都是一个redis实例
- 为了实现集群的高可用,即判断节点是否健康,redis cluster有这么一个投票容错机制:如果集群中找过半数的节点投票认为某节点挂了,那么该节点就挂了(fail)。
- 如何判断机器是否挂了呢: 如果集群中任意一个***主节点***挂了,而该节点又没有从节点(备份节点),那么这个集群就挂了。
- 为什么任意一个主节点挂了(又没有对应的从节点)这个集群就挂了呢:是因为集群内置了16384(0~16383)个slot(哈希槽),并且把所有的物理节点映射到了这16384个slot上,或者说把这些slot均等的分配给了各个节点。
- 当需要redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果
- 再把这个结果对16384进行取余,这个余数会对应到(0~16383)其中一个槽,进而决定key-value存储在哪个节点中
- 所以一旦某个主节点(又没有从节点)挂了,该节点的slot就无法使用了,那么就会导致集群无法正常工作
- redis集群至少需要3个主节点:因为投票容错机制要求超过半数节点认为某节点挂了该节点才是挂了,所以2个节点服务构建集群。
- redis集群至少需要6台服务器
- 因为要保证集群的高可用,需要每个主节点都有至少一个从节点(备份节点)
- 如果手上没那么多服务,也可以采用伪分布式集群搭法,即一台物理机启动多个redis实例
1.集群结构
分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:
这里我们会在三台服务器中开启6个redis实例,信息如下:
IP | PORT | 角色 |
---|---|---|
192.168.20.240 | 6379 | master |
192.168.20.240 | 6380 | slave |
192.168.20.241 | 6379 | master |
192.168.20.241 | 6380 | slave |
192.168.20.242 | 6379 | master |
192.168.20.242 | 6380 | slave |
2.准备实例和配置
# 我们准备把redis放在/software/redis-cluster目录下
# 创建目录
mkdir /software/redis-cluster
# 切换目录
cd /software/redis-cluster
# 下载redis
https://redis.io/download/
# 解压
tar -zxvf redis-7.0.5.tar.gz
cd redis-7.0.5
# 编译,注意:如果不加MALLOC=libc,会报fatal error: jemalloc/jemalloc.h: 没有那个文件或目录
make MALLOC=libc
# 安装, 安装后redis命令会放在/usr/local/bin目录下
make install
# 为redis 创建配置目录
mkdir -p /software/redis-cluster/redis_63{79,80}/{conf,pid,logs}
在/conf下准备一个新的redis.conf文件,内容如下:
# 守护进行模式启动
daemonize yes
# 关闭保护模式
protected-mode no
# 设置数据库数量,默认数据库为0
databases 16
# 绑定地址,需要修改
bind 192.168.20.240
# 绑定端口,需要修改
port 6379
# pid文件存储位置,文件名需要修改
pidfile /software/redis-cluster/redis_6379/pid/redis_6379.pid
# log文件存储位置,文件名需要修改
logfile /software/redis-cluster/redis_6379/logs/redis_6379.log
# RDB快照备份文件名,文件名需要修改
dbfilename redis_6379.rdb
# 本地数据库存储目录,需要修改
dir /software/redis-cluster/redis_6379
# 集群相关配置
# 是否以集群模式启动
cluster-enabled yes
# 集群节点回应最长时间,超过该时间被认为下线
cluster-node-timeout 15000
# 生成的集群节点配置文件名,文件名需要修改
cluster-config-file nodes_6379.conf
修改redis_6380配置:vim /software/redis-cluster/redis_6380/conf/redis.cnf
, 将上边配置文件中的79替换为80即可。
在另外两台服务器上做相同的操作。
3.启动
因为已经配置了后台启动模式,所以可以直接启动服务:
$ redis-server /software/redis-cluster/redis_6379/conf/redis.cnf
$ redis-server /software/redis-cluster/redis_6380/conf/redis.cnf
通过ps查看状态:
ps -ef | grep redis
发现服务都已经正常启动:
4.创建集群
虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。
我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。
1)Redis5.0之前
Redis5.0之前集群命令都是用redis安装包下的src/redis-trib.rb来实现的。因为redis-trib.rb是有ruby语言编写的所以需要安装ruby环境。
# 安装依赖
yum -y install zlib ruby rubygems
gem install redis
然后通过命令来管理集群:
# 进入redis的src目录
cd /tmp/redis-6.2.4/src
# 创建集群
./redis-trib.rb create --replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003
2)Redis5.0以后
我们使用的是Redis7.0.5版本,集群管理以及集成到了redis-cli中,格式如下:
redis-cli --cluster create 192.168.20.240:6379 192.168.20.240:6380 192.168.20.241:6379 192.168.20.241:6380 192.168.20.242:6379 192.168.20.242:6380 --cluster-replicas 1
命令说明:
redis-cli --cluster
或者./redis-trib.rb
:代表集群操作命令create
:代表是创建集群--replicas 1
或者--cluster-replicas 1
:指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1)
得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master
运行后的样子:
这里输入yes,则集群开始创建:
通过命令可以查看集群状态:
redis-cli -h master -p 6379
#查看集群状态
CLUSTER INFO
查看集群节点信息:
CLUSTER nodes
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3c9kcd3ljlc04