Bootstrap

redis-基于docker搭建redis集群

前言

学习了redis的主从,哨兵之后,学习redis高可用的最后一篇集群。学习集群不着急,先来看看怎么搭建集群。现在都讲究容器化部署,咱也来试试基于docker搭建redis集群。
ps:我只有一台虚拟机,所以。。。。。将就一下。

搭建集群

拉去镜像

基于docker搭建redis集群。

  • docker环境要装好;
  • 拉取redis的镜像(docker pull redis

在这里插入图片描述

创建容器

创建了6reids容器,所以主从分配就是3主节点3从节点。注意 主节点最少3个,3个才能保证集群的健壮性。
一个主节点和下面子节点全部挂掉,少于3个主节点时,redis集群将不可用。当再次启动至三个可用主节点时,之前挂掉的主节点不一定就还是主节点
创建 6 个Redis 容器:

  • redis-node1:6371
  • redis-node2:6372
  • redis-node3:6373
  • redis-node4:6374
  • redis-node5:6375
  • redis-node6:6376

在这里插入图片描述

docker create --name redis-node1 --net=host -v /data/redis-data/node1:/data redis --cluster-enabled yes --cluster-config-file nodes-node-1.conf --cluster-node-timeout 10000 --appendonly yes --port 6371docker create --name redis-node2 --net=host -v /data/redis-data/node2:/data redis --cluster-enabled yes --cluster-config-file nodes-node-2.conf --cluster-node-timeout 10000 --appendonly yes --port 6372docker create --name redis-node3 --net=host -v /data/redis-data/node3:/data redis --cluster-enabled yes --cluster-config-file nodes-node-3.conf --cluster-node-timeout 10000 --appendonly yes --port 6373docker create --name redis-node4 --net=host -v /data/redis-data/node4:/data redis --cluster-enabled yes --cluster-config-file nodes-node-4.conf --cluster-node-timeout 10000 --appendonly yes --port 6374docker create --name redis-node5 --net=host -v /data/redis-data/node5:/data redis --cluster-enabled yes --cluster-config-file nodes-node-5.conf --cluster-node-timeout 10000 --appendonly yes --port 6375docker create --name redis-node6 --net=host -v /data/redis-data/node6:/data redis --cluster-enabled yes --cluster-config-file nodes-node-6.conf --cluster-node-timeout 10000 --appendonly yes --port 6376

创建redis容器参数解释:

  • --net=host 容器和宿主机共用网络 不需要再做端口映射
  • -v 创建容器数据卷
  • --cluster-enabled:是否启动集群,选值:yes 、no
  • --cluster-config-file 配置文件.conf :指定节点信息,自动生成
  • --cluster-node-timeout 毫秒值: 配置节点连接超时时间
  • --appendonly 是否开启持久化,选值:yes、no
  • --port 端口

启动容器

 docker start redis-node1 redis-node2 redis-node3 redis-node4 redis-node5 redis-node6

在这里插入图片描述

组建 Redis 集群

  • 进入任一容器内部, 这里以 redis-node1 实例为例
docker exec -it redis-node1 /bin/bash
  • 执行组件集群的命令,localhost替换成实际的主机ip,也可以不替换。
redis-cli --cluster create localhost:6371 localhost:6372 localhost:6373 localhost:6374 localhost:6375 localhost:6376 --cluster-replicas 1
  • --cluster-replicas 1: 参数后面的数字表示的是主从比例,这里的1,表示1个主节点对应1个从节点。上面创建了6reids容器,所以主从分配就是3个主节点,3个从节点。

如果 --cluster-replicas 2 呢?那么主从比例就是 1:2,也就是1 个主节点对于应 2 个从节点。

  • 组建成功,进入redis查看一下集群节点信息:
//连接客户端
redis-cli -c -p 6371
     -c 代表集群模式
     -p 代表进入6371端口
  
//集群节点信息
cluster nodes 

在这里插入图片描述
在这里插入图片描述

Redis Cluster主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
至此redis集群搭建完毕。

测试集群数据

  • 插入一个字符串

在这里插入图片描述

  • 进入不同的redis容器,打开客户端,获取插入的值

在这里插入图片描述
可以获取到test的值,并且说明了数据的信息来源。

添加节点

添加从节点:

当创建了3个主节点,3个从节点以后。redis集群不够用的情况下,主节点可以再次添加从节点,进行扩容。

  • 创建并启动容器redis-node7
docker create --name redis-node7 --net=host -v /data/redis-data/node7:/data redis --cluster-enabled yes --cluster-config-file nodes-node-7.conf --cluster-node-timeout 10000 --appendonly yes --port 6377

docker start redis-node7
  • 执行添加从节点 组建集群的命令 localhost替换成实际主机ip
redis-cli --cluster add-node localhost:6377 localhost:6371  --cluster-slave --cluster-master-id e883411231bbc5e4e542b435f9950e6f6c580904
#注意语法,一个新节点IP:端口 空格 一个旧节点IP:端口,注意点是:
#1.不能多个新节点一次性添加
#2.新节点后是旧节点
#3.如果设置--cluster-slave,新节点挂在旧节点下的一个从节点
#4.如果设置 --cluster-master-id <arg> ,arg设置旧节点的id,具体可以使用cluster nodes查看各个节点的id
  • 查看节点信息

在这里插入图片描述

添加主节点

  • 创建并启动容器redis-node8
docker create --name redis-node8 --net=host -v /data/redis-data/node7:/data redis --cluster-enabled yes --cluster-config-file nodes-node-7.conf --cluster-node-timeout 10000 --appendonly yes --port 6378

docker start redis-node8
  • 进入redis-node8
docker exec -it redis-node8 /bin/bash
  • 添加节点
redis-cli --cluster add-node localhost:6378 localhost:6371

在这里插入图片描述
上面只是把6378节点加入了集群中,但是并没有分配slot,所以这个节点并没有真正的开始分担集群工作。
在这里插入图片描述

  • 分配槽点
redis-cli --cluster reshard localhost:6378 --cluster-from e883411231bbc5e4e542b435f9950e6f6c580904,565d4a2be6859f7b700f7d01df52bb6e9f5ac180, 793efcf5eef483bbb87e2e1d299b4f05ff5c35de --cluster-to 0a8161a8c20389df8183ad00fc78cff07574a2b2 --cluster-slots 1024
#参数解释
#--cluster-from:表示slot目前所在的节点的主节点ID,多个ID用逗号分隔,参与分配的主节点
#--cluster-to:表示需要新分配节点的节点ID(6378的id)
#--cluster-slots:分配的slot数量
#根据提示键入yes 向集群添加主节点完成
#Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384

在这里插入图片描述
在这里插入图片描述

  • 查看节点信息

在这里插入图片描述

服务搭建好了。

相关指令

  • redis-cli --cluster create [ip/port ,ip/port] --cluster-replicas n

    • 组件集群的命令
    • n: 参数后面的数字表示的是主从比例
  • redis-cli -c -p [port]

    • 进入redis节点
    • -c 代表集群模式
    • -p 代表进入端口
  • cluster nodes

    • 节点信息
  • redis-cli --cluster add-node [新节点ip:port] [旧主节点ip:port] --cluster-slave --cluster-master-id [id]

    • 加入一个节点
    • –cluster-slave,新节点挂在旧节点下的一个从节点(不加这个,加入一个主节点)
    • cluster-master-id ,arg设置旧节点的id
  • redis-cli --cluster reshard [待分配的主节点ip:port] --cluster-from [参与分配的主节点id] --cluster-to [待分配的主节点id] --cluster-slots [分配个数]

    • –cluster-from:表示slot目前所在的节点的主节点ID,多个ID用逗号分隔
    • –cluster-to:表示需要新分配节点的节点ID
    • –cluster-slots:分配的slot数量
  • redis-cli del-node [ip:port] [id]

    • 移除节点
  • 帮助指令

    • redis-cli --cluster help
    • 打开redis客户端,输入cluster help
;