Redis Cluster 分布式集群(上)
Redis Cluster 介绍
- Redis 集群是一个可以在多个Redis节点之间进行数据共享的设施(installation);
- Redis 集群不支持那些需要同时处理多个键的 Redis 命令,因为执行这些命令需要在多个Redis节点之间移动数据,并且在高负载的情况下,这些命令将降低 Redis 集群的性能,并导致不可预测的行为;
- Redis 集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求;
- Redis 集群有将数据自动切分(split)到多个节点的能力
Redis Cluster 特点
# 高性能:
- 在多分片节点中,将 16384 个槽位,均匀分布到多个分片节点中
- 存数据时,将 KEY 做 CRC16(KEY),然后与 16384 进行取模,得出槽位值( 0 - 16384 之间 )
- 根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上
- 如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储
- 客户端与 Redis 节点直连,不需要中间 Proxy 层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- Redis Cluster 解决了 Redis 资源利用率的问题
# 高可用
- 在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现 Slaveof 功能,同时当主节点 Down,实现类似于 Sentinel 的自动 Failover 的功能
槽(Slot)的概念
- 在集群中,会把所有节点分为 16384 个槽位
- 槽位的序号是 0 - 16383,序号不重要,数量才重要
- 每一个槽位分配到数据的概率是一样
Redis 故障转移
在集群里面,节点会对其他节点进行下线检测,当一个主节点下线时,集群里面的其他主节点负责对下线主节点进行故障移(到从节点);换句话说,集群的节点集成了下线检测和故障转移等类似 Sentinel 的功能
Redis Cluster 搭建(手动)
环境准备
节点 | IP | 端口 |
---|---|---|
节点① | 172.16.1.121 | 6379,6380 |
节点② | 172.16.1.122 | 6379,6380 |
节点③ | 172.16.1.123 | 6379,6380 |
搭建 Redis 多实例
# 删除以前的 Redis 数据
[root@dbtest01 ~]# rm -rf /service/redis/*
# 创建多实例目录
[root@dbtest01 ~]# mkdir /service/redis/{6379,6380}
[root@dbtest02 ~]# mkdir /service/redis/{6379,6380}
[root@dbtest03 ~]# mkdir /service/redis/{6379,6380}
# 配置所有 Redis
[root@dbtest01 ~]# vim /service/redis/6379/redis.conf
bind 172.16.1.121 127.0.0.1
port 6379
daemonize yes
pidfile /service/redis/6379/redis.pid
loglevel notice
logfile /service/redis/6379/redis.log
dbfilename dump.rdb
dir /service/redis/6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
[root@dbtest01 ~]# vim /service/redis/6380/redis.conf
bind 172.16.1.121 127.0.0.1
port 6380
daemonize yes
pidfile /service/redis/6380/redis.pid
loglevel notice
logfile /service/redis/6380/redis.log
dbfilename dump.rdb
dir /service/redis/6380
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
启动 Redis 多实例
[root@dbtest01 ~]# redis-server /service/redis/6379/redis.conf
[root@dbtest01 ~]# redis-server /service/redis/6380/redis.conf
[root@dbtest02 ~]# redis-server /service/redis/6379/redis.conf
[root@dbtest02 ~]# redis-server /service/redis/6380/redis.conf
[root@dbtest03 ~]# redis-server /service/redis/6379/redis.conf
[root@dbtest03 ~]# redis-server /service/redis/6380/redis.conf
关联所有节点
登录所有节点
[root@dbtest01 ~]# redis-cli -h 172.16.1.121 -p 6379
[root@dbtest01 ~]# redis-cli -h 172.16.1.121 -p 6380
[root@dbtest02 ~]# redis-cli -h 172.16.1.122 -p 6379
[root@dbtest02 ~]# redis-cli -h 172.16.1.122 -p 6380
[root@dbtest03 ~]# redis-cli -h 172.16.1.123 -p 6379
[root@dbtest03 ~]# redis-cli -h 172.16.1.123 -p 6380
查看集群节点
# 查看集群节点,每一各节点只能看到自己
172.16.1.121:6379> CLUSTER NODES
28faba09f4c0ec8cdb90d92e09636796427b7143 :6379 myself,master - 0 0 0 connected
关联所有节点
# 关联节点
172.16.1.121:6379> CLUSTER MEET 172.16.1.121 6380
OK
172.16.1.121:6379> CLUSTER MEET 172.16.1.122 6379
OK
172.16.1.121:6379> CLUSTER MEET 172.16.1.122 6380
OK
172.16.1.121:6379> CLUSTER MEET 172.16.1.123 6379
OK
172.16.1.121:6379> CLUSTER MEET 172.16.1.123 6380
OK
# 查看集群状态,所有节点
172.16.1.121:6379> CLUSTER NODES
aee9f4e6e09a452fd44bca7639be442b5138f141 172.16.1.122:6380 master - 0 1596687131655 4 connected
777412c8d6554e3390e1083bf1f55002be08cf62 172.16.1.121:6380 master - 0 1596687131352 2 connected
ef18ab5bab6d8bc06917a0cf2dc9bffa8b431087 172.16.1.122:6379 master - 0 1596687132362 3 connected
f2747c92813ea06b25c3e9c8d5232b46b3cf9d3d 172.16.1.123:6379 master - 0 1596687131856 0 connected
25f735f08ac62b2f758c1e2c21e178cc46279087 172.16.1.123:6380 master - 0 1596687131251 5 connected
28faba09f4c0ec8cdb90d92e09636796427b7143 172.16.1.121:6379 myself,master - 0 0 1 connected
平均分配槽位
# 查看集群状态
172.16.1.121:6379> CLUSTER INFO
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:1168
cluster_stats_messages_received:1168
# 槽位规划
dbtest01: 5462 个槽位 (0-5461)
dbtest02: 5461 个槽位 (5462-10922)
dbtest03: 5461 个槽位 (10923-16383)
# 分配槽位
[root@dbtest01 ~]# redis-cli -p 6379 -h 172.16.1.121 CLUSTER ADDSLOTS {0..5461}
OK
[root@dbtest02 ~]# redis-cli -p 6379 -h 172.16.1.122 CLUSTER ADDSLOTS {5462..10922}
OK
[root@dbtest02 ~]# redis-cli -p 6379 -h 172.16.1.123 CLUSTER ADDSLOTS {10923..16383}
插入数据,测试集群
# 插入一条数据
172.16.1.121:6379> set k1 v1
(error) MOVED 12706 172.16.1.123:6379
# 报错,该 KEY 的值只能插入到 12706 这个槽位
[root@dbtest03 ~]# redis-cli -h 172.16.1.123
172.16.1.123:6379> set k1 v1
OK
# 自动切换将数据添加到指定槽位
[root@dbtest03 ~]# redis-cli -h 172.16.1.123
172.16.1.123:6379> set k2 v2
(error) MOVED 449 172.16.1.121:6379
172.16.1.123:6379> quit
[root@dbtest03 ~]# redis-cli -c -h 172.16.1.123
172.16.1.123:6379> set k2 v2
-> Redirected to slot [449] located at 172.16.1.121:6379
OK
# 脚本插入数据测试
[root@dbtest03 ~]# vim data.sh
#!/bin/bash
for i in {1..1000};do
redis-cli -c -p 6379 -h 172.16.1.121 set k${i} v${i}
done
# 查看数据分配
172.16.1.121:6379> DBSIZE
(integer) 341
172.16.1.122:6379> DBSIZE
(integer) 332
172.16.1.123:6379> DBSIZE
(integer) 327
添加副本节点
给每一个分配了槽位的 Redis 实例,添加一个高可用从库,即集群中的副本节点 。
查看节点
# 查看所有节点,每一个都是 master
172.16.1.121:6379> CLUSTER NODES
5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.121:6380 master - 0 1596763193422 4 connected
5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.122:6379 master - 0 1596763192412 5 connected 5462-10922
50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.123:6380 master - 0 1596763192512 3 connected
acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.123:6379 master - 0 1596763191908 0 connected 10923-16383
2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.121:6379 myself,master - 0 0 1 connected 0-5461
381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.122:6380 master - 0 1596763193925 2 connected
配置主从
# dbtest01 的 6380 做 dbtest02 的 6379 的从库
172.16.1.121:6380> CLUSTER REPLICATE 5eb9e5356534ff4acda736d13f0dc9fc3d40049b
OK
# dbtest02 的 6380 做 dbtest03 的 6379 的从库
172.16.1.122:6380> CLUSTER REPLICATE acc3a4d0e6e43fc74630c1f0714865fdcbdaf677
OK
## dbtest03 的 6380 做 dbtest01 的 6379 的从库
172.16.1.123:6380> CLUSTER REPLICATE 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a
OK
再次查看节点信息
172.16.1.121:6379> CLUSTER NODES
5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.121:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596763362696 5 connected
5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.122:6379 master - 0 1596763363202 5 connected 5462-10922
50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.123:6380 slave 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 0 1596763362192 3 connected
acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.123:6379 master - 0 1596763363203 0 connected 10923-16383
2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.121:6379 myself,master - 0 0 1 connected 0-5461
381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.122:6380 slave acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 0 1596763364211 2 connected
故障测试
# 停掉一台节点,dbtest03:6379 的主库宕机,dbtest01:6380 的从库(副本)应该变成主库
[root@dbtest03 ~]# reboot
# 到另一台机器查看集群状态,发现集群是正常的
172.16.1.121:6379> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_sent:327031
cluster_stats_messages_received:326973
# 查看节点信息,副本被提升为主库
172.16.1.121:6379> CLUSTER NODES
5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.121:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596763771309 5 connected
5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.122:6379 master - 0 1596763771310 5 connected 5462-10922
50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.123:6380 slave,fail 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 1596763736458 1596763734245 3 disconnected
acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.123:6379 master,fail - 1596763736458 1596763735246 0 disconnected
2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.121:6379 myself,master - 0 0 1 connected 0-5461
381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.122:6380 master - 0 1596763772319 6 connected 10923-16383
恢复节点
# 修复机器
[root@dbtest03 ~]# redis-server /service/redis/6379/redis.conf
[root@dbtest03 ~]# redis-server /service/redis/6380/redis.conf
# 再次查看节点信息
172.16.1.121:6379> CLUSTER NODES
5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.121:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596764061287 5 connected
5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.122:6379 master - 0 1596764060781 5 connected 5462-10922
50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.123:6380 slave 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 0 1596764059770 3 connected
acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.123:6379 slave 381b54584572e8013becdae2eeaff48bf6eb5450 0 1596764062094 6 connected
2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.121:6379 myself,master - 0 0 1 connected 0-5461
381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.122:6380 master - 0 1596764061789 6 connected 10923-16383
# 原主节点修复后变为从节点
# 原主节点若想恢复为主节点,需要执行命令
172.16.1.123:6379> CLUSTER FAILOVER
# 即可恢复初始分布式集群状态
Redis Cluster 分布式集群(上)的更多相关文章
- Redis Cluster 分布式集群(下)
Redis Cluster 搭建(工具) 环境准备 节点 IP 端口 节点① 172.16.1.121 6379,6380 节点② 172.16.1.122 6379,6380 节点③ 172.16. ...
- Redis(1.13)Redis cluster 分布式集群手动配置
[1]试验环境 结构图如下: (这里试验没有那么多机器,就用3台机器搭建试验) redis1是redis集群的一个节点A,上面运行了两个redis实例,7001 7004 redis2是redis集群 ...
- CentOS中搭建Redis伪分布式集群【转】
解压redis 先到官网https://redis.io/下载redis安装包,然后在CentOS操作系统中解压该安装包: tar -zxvf redis-3.2.9.tar.gz 编译redis c ...
- 超详细的 Redis Cluster 官方集群搭建指南
今天从 0 开始搭建 Redis Cluster 官方集群,解决搭建过程中遇到的问题,超详细. 安装ruby环境 因为官方提供的创建集群的工具是用ruby写的,需要ruby2.2.2+版本支持,rub ...
- Redis Cluster(集群)的搭建
一.Redis的下载.安装.启动(单实例) 我们统一将Redis安装在/opt目录下,执行命令如下: $ cd /opt $ wget http://download.redis.io/release ...
- Redis Sentinel分布式集群
helm部署Redis哨兵分布式集群 Redis Sentinel集群 介绍 Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现.故障自动转移.配置中心和客 ...
- 在 Windows 上测试 Redis Cluster的集群填坑笔记
redis 集群实现的原理请参考http://www.tuicool.com/articles/VvIZje 集群环境至少需要3个节点.推荐使用6个节点配置,即3个主节点,3个从节点. 新 ...
- redis配置cluster分布式集群
#下载最新的redis5. wget http://download.redis.io/releases/redis-5.0.3.tar.gz .tar.gz cd redis- make make ...
- Redis(1.11)Redis4.0.11 cluster 分布式集群搭建
概念与了解:Redis(1.7)Redis高可用架构(理论篇) [0]试验环境 结构图如下: (这里试验没有那么多机器,就用3台机器搭建试验) redis1是redis集群的一个节点A,上面运行了两个 ...
随机推荐
- uni-app开发经验分享十四:小程序超过2M限制的方法——分包加载
起初小程序上线时,微信限制了代码包不能超过1MB,后来功能变大变成了2M了,限制大小是出于对小程序启动速度的考虑,希望用户在使用任何一款小程序时,都能获得一种"秒开"体验.但是 ...
- 浅谈自动化构建之grunt
自动化构建 开发行业的自动化构建 一句话把源代码转化为生产代码,作用是脱离运行环境兼容带来的问题开发阶段使用提高效率的语法,规范 和标准,构建转换那些不被支持的特性转化成能够执行的代码. 一.简单的自 ...
- 我教你如何解决 Docker 下载 mcr.microsoft.com 镜像慢的办法
我教你如何解决 Docker 下载 mcr.microsoft.com 镜像慢的办法 一.介绍 最近,我在写有关使用 Jenkins 搭建企业级持续集成环境的文章,准备了四台服务器,企业级别嘛,一台就 ...
- 编码占用的字节数 1 byte 8 bit 1 sh 1 bit 中文字符编码 2. 字符与编码在程序中的实现 变长编码 Unicode UTF-8 转换 在网络上传输 保存到磁盘上 bytes
小结: 1.UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等: 2 服务器->网页 utf-8 ...
- 前置时间(Lead Time),也称前置期、备货周期
https://wiki.mbalib.com/wiki/前导时间 什么是前导时间 所谓的前导时间(leading time),就是产品从设计,到生产.物流.销售的过程. BELLWETHER:&qu ...
- Spring 设计模式介绍
JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见.我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是千篇一律,而且大部分都年代久远.所以,花了 ...
- OAuth2.0与前端无感知token刷新实现
前言 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛的应用.Facebook.Twitter和Google等各种在线服务都提供了基于OAuth规范的认证机制. ...
- 接口鉴权之sign签名校验与JWT验证
需求描述: 项目里的几个Webapi接口需要进行鉴权,同接口可被小程序或网页调用,小程序里没有用户登录的概念,网页里有用户登录的概念,对于调用方来源是小程序的情况下进行放权,其他情况下需要有身份验证. ...
- DoTween动画插件学习
一.简单的变量插值运算 using System.Collections; using System.Collections.Generic; using UnityEngine; using DG. ...
- Failed to initialize policy for cpu: 0
今天在使用vmware安装ubuntu16.04的时候出现下列错误: Failed to initialize policy for cpu: 0 (-19),刚开始还以为是镜像文件出现了问题,结果发 ...