一文聊聊Redis中的Cluster集群


本文摘自PHP中文网,作者青灯夜游,侵删。

本篇文章给大家介绍一下Redis中的Cluster集群,看看TCP端口、数据分片,了解一下如何利用docker搭建一个三主三从的Redis集群。

Redis Cluster (Redis集群)

Redis Cluster是Redis的分布式实现。 当我们传输数据到 Redis Cluster,数据会自动分片,存储到各个Redis节点上。【相关推荐:Redis视频教程】

Redis Cluster相对于单点Redis,可以在一些节点出现故障或无法通信时继续运行。但是,如果服务器出现较大故障(例如,超过一半以上的服务器不可用),群集将停止运行。

Redis Cluster TCP端口

每个Redis群集节点都需要打开两个TCP连接。 一是用于服务客户端的常规TCP端口,默认为6379。 第二个端口用于群集总线,默认设置16379,二进制协议的节点到节点通信通道。节点利用群集总线用于故障检测,配置更新,故障转移授权等。

  • 客户端永远不要尝试与群集总线端口进行通信,而应始终与普通的Redis命令端口进行通信,但是请确保同时打开防火墙中的两个端口,否则Redis群集节点将无法进行通信。命令端口和集群总线端口的偏移量是固定的,并且始终为10000。
  • 如果没有同时打开两个TCP端口,则群集将无法正常工作。
  • 集群总线使用不同的二进制协议进行节点到节点的数据交换,它更适合于用很少的带宽和处理时间在节点之间交换信息。

Redis Cluster数据分片

Redis Cluster不使用一致性哈希,而是使用一种叫哈希槽hash_slot的东西。

Redis群集中有16384个哈希槽,当我们在Redis中存储一对Key-Value时,要计算给定Key的哈希槽。方法是先计算Key的CRC16,然后对计算出的结果取模16384:

hash_slot = CRC16(key) mod 16384

Redis群集中的每个Redis节点都负责哈希槽的子集,因此,如果有一个包含3个节点的群集,其中:

  • 节点A包含从0到5500的哈希槽。
  • 节点B包含从5501到11000的哈希槽。
  • 节点C包含从11001到16383的哈希槽。

这样可以轻松添加和删除集群中的节点。例如,如果我想添加一个新节点D,则需要将一些哈希槽从节点A,B,C移到D。类似地,如果我想从群集中删除节点A,则只需移动A所服务的哈希槽到B和C。当节点A为空时,我可以将其从群集中完全删除。

因为将哈希槽从一个节点移动到另一个节点不需要停止操作,所以添加或删除或者更改节点持有的哈希槽的占比不需要任何停机时间。

接下来我们利用docker搭建一个三主三从的Redis集群。

使用Docker搭建RedisCluster

Redis配置

1

2

3

4

5

6

7

8

9

port ${PORT}                                       ##节点端口

protected-mode no                                  ##开启集群模式

cluster-enabled yes                                ##cluster集群模式

cluster-config-file nodes.conf                     ##集群配置名

cluster-node-timeout 5000                          ##超时时间

cluster-announce-ip 192.168.1.XX                   ##实际为各节点网卡分配ip  先用一个ip代替

cluster-announce-port ${PORT}                      ##节点映射端口

cluster-announce-bus-port 1${PORT}                 ##节点总线端口

appendonly yes                                     ##持久化模式

创建自定义network

1

docker network create redis-net

自定义路径

1

2

mkdir -p /usr/redis_cluster

cd /usr/redis_cluster

在自定义路径下生成成conf和data目标,并生成配置信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

for port in `seq 6001 6006`; do

    mkdir -p ./${port}/conf

    touch ./${port}/conf/redis.conf

    mkdir -p ./${port}/data

    echo "port ${port}" >>./${port}/conf/redis.conf

    echo "protected-mode no" >>./${port}/conf/redis.conf

    echo "cluster-enabled yes" >>./${port}/conf/redis.conf

    echo "cluster-config-file nodes.conf" >>./${port}/conf/redis.conf

    echo "cluster-node-timeout 5000" >>./${port}/conf/redis.conf

    echo "cluster-announce-ip 192.168.1.XX" >>./${port}/conf/redis.conf

    echo "cluster-announce-port ${port}" >>./${port}/conf/redis.conf

    echo "cluster-announce-bus-port 1${port}" >>./${port}/conf/redis.conf

    echo "appendonly yes" >>./${port}/conf/redis.conf

done

  • cluster-announce-ip 192.168.1.XX 中的IP必须是容器间通信的ip,之后可以在之前新增的network中查看。
  • 共生成6个文件夹,从6001到6006,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件。

启动Redis容器

1

2

3

4

5

6

7

for port in `seq 6001 6006`; do \

  docker run -d --privileged=true -p ${port}:${port} -p 1${port}:1${port}\

  -v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \

  -v $PWD/${port}/data:/data \

  --restart always --name redis-${port} --net redis-net \

  redis:5.0.5 redis-server /usr/local/etc/redis/redis.conf; \

done

启动集群

1

2

3

4

# 进入任意Redis容器

docker exec -it redis-6001 /bin/bash

# 初始化Redis集群命令

redis-cli --cluster create 172.19.0.2:6601 172.19.0.3:6602 172.19.0.4:6603 172.19.0.5:6604 172.19.0.6:6605 172.19.0.7:6606 --cluster-replicas 1

  • 创建成功后我们可以使用redis-cli命令连接到其中一个Redis服务.

1

2

3

4

# 单机模式启动

redis-cli -h 127.0.0.1 -p 6001

# 集群模式启动

redis-cli -c -h 127.0.0.1 -p 6001

  • 之后通过cluster nodes命令可以查看节点信息,发现符合3主3从的预期

参考文档

  • Redis官方文档

更多编程相关知识,请访问:编程视频!!

以上就是一文聊聊Redis中的Cluster集群的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

什么时候使用Redis集群锁

Redis运维之shell的使用――统计内存、定期备份、基准测试

一般什么数据存储到Redis

Redis中设置lru算法的方法

为什么要使用Redis

Redis缓存雪崩和穿透如何解决

为什么用Redis集群

Redis集群为什么是三个以上

Redis 模糊匹配 searchkeys

Redis的hash怎么实现的

更多相关阅读请进入《Redis》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...