RedisCluster集搭建及节点的添加、删除
⼀、什么是 Redis Cluster
Redis 是在内存中保存数据的,⽽我们的电脑⼀般内存都不⼤,这也意味着 Redis 不适合存储⼤数据,适合存储⼤数据的是 Hadoop ⽣态系统的 Hbase 或者是 MogoDB 。Redis 更适合处理⾼并发,⼀台设备的存储能⼒是有限的但是多台设备协同合作,就可以内存增⼤很多倍,这时就需要集。
Redis 集搭建的⽅式有很多种,但从 redis 3.0 版本之后,⽀持 redis-cluster 集,它是 Redis 官⽅提供的解决⽅案,Redis Cluster 采⽤的是 ⽆中⼼架构 ,每个节点保存数据和整个集状态,每个节点都和其他节点有所连接。Redis Cluster的基本原理可以从数据分⽚、数据迁移、集通讯、故障检测以及故障转移等⽅⾯进⾏了解,其架构如下:
客户端与 redis 节点直连,不需要中间件 proxy 层,客户端不需要连接集所有节点,连接集汇中任何⼀个节点即可。所有的 redis 节点彼此互联(PING-PONG 机制),内部使⽤⼆进制协议优化传输速度和带宽。
⼆、分布式存储机制-槽
【1】Redis Cluster 在设计中没有使⽤⼀致性哈希(Consistency Hashing),⽽是使⽤数据分⽚(Sharding)引⼊哈希槽
【2】Redis Cluster 把所有的节点映射到 [0-16383] slot 槽上,cluster 负责维护 node<->slot<->value 三者之间的关系。
【3】Redis 集中内置了 16384 个哈希槽,当需要在 Redis 集中放置⼀个 key-value 时,redis 先将 key 使⽤ CRC16 算法算出⼀个结果,然后把结果对 16384 求余数,这样每个 key 都会对应⼀个编号 0-16383 之间的哈希槽,redis 会根据节点数量⼤致均等的将哈希槽映射到不同的节点上。集之间通过⼀种特殊的⼆进制协议交互集信息。
例如,当有三个节点时,槽分布的值如下:
节点1: 0-5460
节点2: 5461-10921
节点3: 10922-16383
【4】Redis Cluster 允许⽤户强制把某个 key 挂在特定槽位上。通过在 key 字符串⾥⾯嵌⼊ tag 标记,这就可以强制 key 所挂的槽位等于 tag 所在的槽位。
【5】客户端为了可以直接定位某个具体的 key 所在的节点,需要缓存槽位相关信息,从⽽实现快速定位。同时因为客户端与服务端的槽位可能不⼀致,还需要纠正机制来实现槽位信息的校验调整。
【6】Redis Cluster 的每个节点会将集的配置信息持久化到配置⽂件中,所以必须确保配置⽂件可写,⽽且尽量不要依靠⼈⼯修改配置⽂件。
【7】ClusterNode 数据结构中的 slots和 numslots属性记录了节点负责处理哪些槽。其中,slot属性是⼀个⼆进制位数组(bitarray),其长度为16384/8=2048 Byte,共包含16384个⼆进制位。集中的 Master节点⽤bit(0和1)来标识是否拥有某个槽。⽐如,对于编号为1的槽,Master只要判断序列第⼆位(索引从0开始)的值是不是1即可,时间复杂度为O(1)。
集中所有槽的分配信息都保存在 ClusterState数据结构的 slots数组中,程序要检查槽是否已经被分配或者出处理槽i的节点,只需要访问 clusterState.slots[i] 的值即可,复杂度也为O(1)。ClusterState数据结构如图所⽰。
【查关系图】:
三、容错机制投票
【1】选举过程是集中所有 master 节点参与,如果半数以上 master 节点与故障节点通信超过设置的(cluster-node-timeout),认为该节点故障,⾃动触发故障转移操作。故障节点的从节点⾃动升级为主节点。
【2】如果集任意 master 挂掉,且当前 master 没有 slave。集进⼊ fail 状态,也可以理解成集的 slot 映射[0-16383]不到对应的槽时进⼊ fail 状态。
四、搭建Redis-Cluster
准备⼯作:准备六台 Redis 服务器,三台 Master 主机,三台 Slave 备机(我们因条件问题,下⾯六台服务器均出⾃⼀台计算机,只是端⼝不⼀致(从7001-7006))
【1】下载 Redis 的源码⽂件,进⾏解压(tar -zxvf redis-3.0.),进⼊解码⽬录,对 C语⾔开
发的 Redis 进⾏编译[make],编译完成后创建安装的⽬录(/usr/local/redis-cluster/redis-1 等),执⾏命令进⾏安装(make install PREFIX=/usr/local/redis-cluster/redis-1 等)
【2】复制配置⽂件,将 /redis-3.0.f 复制到 redis下的 bin⽬录下(f /usr/local/redis-cluster/redis-
1/bin)
【3】修改六台服务器中的f 配置⽂件,将配置集字段前的注释去掉: # cluster-enabled yes 并修改端⼝(45⾏:port 7001)
【4】安装 Ruby 环境:
yum -y install ruby
yum -y install rubygems
【5】⽹上下载 redis-3.,执⾏ gem install redis-3. 安装。
【6】使⽤ ruby 脚本搭建集:进⼊ Redis 源码⽬录中的 src ⽬录,执⾏如下命令:需要更换 IP 地址
.
/redis-trib.rb create --replicas 1192.168.88.131:7001 192.168.88.131:7002 192.168.88.131:7003 192.168.88.131:7004 192.168.88.131:7005 192.168.88. 131:7006
出现如下情况时表⽰集成功:如图所⽰,7001⾄7003为主机,7004⾄7006为备机:
然后输⼊ yes 输⼊如下信息时,则表⽰配置成功:成功后你会发现其他节点都会有变化:
五、客户端连接 RedisCluster
进⼊可以连接 Redis 的客户端⽂件中,例如:我在 Windows 环境下使⽤的是 可执⾏⽂件。
通过运⾏如下命令:进⼊ Redis 集(-h:连接的主机地址、-p:连接的端⼝、-c:表⽰集环境,不写表⽰连接的单机。Redis只需连接⼀个节点即可进⼊集环境,可以通过 quit 命令退出 Redis 客户端连接。通过客户端关闭Redis服务:./redis-cli -h 地址 -p 端⼝ shutdown)。
【跳转】:当客户端向⼀个错误的节点发出了指令后,该节点会发现指令的 key 所在的槽位并不归⾃⼰管理,这时它会向客户端发送⼀个特殊的跳转指令携带⽬标操作的节点地址,告诉客户端去连接这个节点以获取数据。
1 GET x
2 -MOVED 3999 127.0.0.1:8283
■ -MOVED:前⾯有个减号,表⽰该指令是⼀个错误消息。客户端在收到 MOVED 指令后,要⽴即纠正本地的槽位映射表。后续所有key 将使⽤新的槽位映射;
■ 3999:key 对应的槽位编号;
■ 127.0.0.1:8283:⽬标节点地址;
六、通过 SpringDataRedis 连接 Redis 集:主要是两个配置⽂件
redis-cluster-config.properties(主要⽤于配置可变的服务器地址和端⼝)
1 #cluster configuration
2 redis.host1=192.168.88.131
3 redis.port1=7001
4
5 redis.host2=192.168.88.131
6 redis.port2=7002
7
8 redis.host3=192.168.88.131
9 redis.port3=7003
redis五种数据结构
10
11 redis.host4=192.168.88.131
12 redis.port4=7004
13
14 redis.host5=192.168.88.131
15 redis.port5=7005
16
17 redis.host6=192.168.88.131
18 redis.port6=7006
19
20 redis.maxRedirects=3
21 redis.maxIdle=100
22 redis.maxTotal=600

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。