视频网站建设技术方案书,哪家装修公司口碑好?,网站开发注册个体工商,上海平台公司【Redis】Redis分片集群 文章目录【Redis】Redis分片集群1. 搭建分片集群1.1 分片集群结构1.2 搭建分片集群1.2.1 集群结构1.2.2 准备实例和配置1.2.3 启动1.2.4 创建集群1.2.5 测试2. 散列插槽2.1 总结3. 集群伸缩4. 故障转移4.1 数据迁移5. RedisTemplate访问分片集群1. 搭建…【Redis】Redis分片集群 文章目录【Redis】Redis分片集群1. 搭建分片集群1.1 分片集群结构1.2 搭建分片集群1.2.1 集群结构1.2.2 准备实例和配置1.2.3 启动1.2.4 创建集群1.2.5 测试2. 散列插槽2.1 总结3. 集群伸缩4. 故障转移4.1 数据迁移5. RedisTemplate访问分片集群1. 搭建分片集群
1.1 分片集群结构
主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决
海量数据存储问题高并发写的问题
使用分片集群可以解决上述问题分片集群特征
集群中有多个master每个master保存不同数据每个master都可以有多个slave节点master之间通过ping监测彼此健康状态客户端请求可以访问集群任意节点最终都会被转发到正确节点 1.2 搭建分片集群
1.2.1 集群结构
分片集群需要的节点数量较多这里我们搭建一个最小的分片集群包含3个master节点每个master包含一个slave节点结构如下 这里我们会在同一台虚拟机中开启6个redis实例模拟分片集群信息如下
IPPORT角色192.168.150.1017001master192.168.150.1017002master192.168.150.1017003master192.168.150.1018001slave192.168.150.1018002slave192.168.150.1018003slave1.2.2 准备实例和配置
删除之前的7001、7002、7003这几个目录重新创建出7001、7002、7003、8001、8002、8003目录
# 进入/tmp目录
cd /tmp
# 删除旧的避免配置干扰
rm -rf 7001 7002 7003
# 创建目录
mkdir 7001 7002 7003 8001 8002 8003在/tmp下准备一个新的redis.conf文件内容如下
port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称不需要我们创建由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 192.168.150.101
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /tmp/6379/run.log将这个文件拷贝到每个目录下
# 进入/tmp目录
cd /tmp
# 执行拷贝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf修改每个目录下的redis.conf将其中的6379修改为与所在目录一致
# 进入/tmp目录
cd /tmp
# 修改配置文件
printf %s\n 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i s/6379/{}/g {}/redis.conf1.2.3 启动
因为已经配置了后台启动模式所以可以直接启动服务
# 进入/tmp目录
cd /tmp
# 一键启动所有服务
printf %s\n 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf通过ps查看状态
ps -ef | grep redis发现服务都已经正常启动 如果要关闭所有进程可以执行命令
ps -ef | grep redis | awk {print $2} | xargs kill或者推荐这种方式
printf %s\n 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown1.2.4 创建集群
虽然服务启动了但是目前每个服务之间都是独立的没有任何关联。
我们需要执行命令来创建集群在Redis5.0之前创建集群比较麻烦5.0之后集群管理命令都集成到了redis-cli中。
1Redis5.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:80032Redis5.0以后
我们使用的是Redis6.2.4版本集群管理以及集成到了redis-cli中格式如下
redis-cli --cluster create --cluster-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命令说明
redis-cli --cluster或者./redis-trib.rb代表集群操作命令create代表是创建集群--replicas 1或者--cluster-replicas 1 指定集群中每个master的副本个数为1此时节点总数 ÷ (replicas 1) 得到的就是master的数量。因此节点列表中的前n个就是master其它节点都是slave节点随机分配到不同master
运行后的样子 这里输入yes则集群开始创建 通过命令可以查看集群状态
redis-cli -p 7001 cluster nodes1.2.5 测试
尝试连接7001节点存储一个数据
# 连接
redis-cli -p 7001
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1结果悲剧了 集群操作时需要给redis-cli加上-c参数才可以(表示集群模式)
redis-cli -c -p 7001这次可以了 2. 散列插槽
Redis会把每一个master节点映射到0~16383共16384个插槽hash slot上查看集群信息时就能看到 数据key不是与节点绑定而是与插槽绑定。redis会根据key的有效部分计算插槽值分两种情况
key中包含{}且“{}”中至少包含1个字符“{}”中的部分是有效部分key中不包含“{}”整个key都是有效部分
例如key是num那么就根据num计算如果是{itcast}num则根据itcast计算。计算方式是利用CRC16算法得到一个hash值然后对16384取余得到的结果就是slot值。 注一个插槽并不代表一个key一个插槽可以存储多个key。 2.1 总结
Redis如何判断某个key应该在哪个实例
将16384个插槽分配到不同的实例。根据key的有效部分计算哈希值对16384取余。余数作为插槽寻找插槽所在实例即可。 如何将同一类数据固定的保存在同一个Redis实例中
这一类数据使用相同的有效部分例如key都以{typeId}为前缀。 3. 集群伸缩
redis-cli --cluster提供了很多操作集群的命令可以通过下面方式查看 比如添加节点的命令 4. 故障转移
当集群中有一个master宕机会发生什么呢
首先是该实例与其它实例失去连接然后是疑似宕机 最后是确定下线自动提升一个slave为新的master 4.1 数据迁移
利用cluster failover命令可以手动让集群中的某个master宕机切换到执行cluster failover命令的这个slave节点实现无感知的数据迁移。其流程如下 手动的Failover支持三种不同模式
缺省默认的流程如图1~6步force省略了对offset的一致性校验takeover直接执行第5步忽略数据一致性忽略master状态和其他master的意见 5. RedisTemplate访问分片集群
RedisTemplate底层同样基于lettuce实现了分片集群的支持而使用的步骤与哨兵模式基本一致
引入redis的starter依赖配置分片集群地址配置读写分离
1)引依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId
/dependency2配置
spring:redis:cluster:nodes: # 指定分片集群的每一个节点信息- 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:80033配置读写分离
//配置读写分离
Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer() {return clientConfigurationBuilder - clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}