使用docker搭建redis集群有两种,一种是单机多个docker容器,一种是多个机器的集群

基础知识

每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,比如16379。第二个端口(本例中就是16379)用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权,等等。客户端从来都不应该尝试和这些集群总线端口通信,它们只应该和正常的Redis命令端口进行通信。注意,确保在你的防火墙中开放着两个端口,否则,Redis集群节点之间将无法通信。命令端口和集群总线端口的偏移量总是10000。
Redis集群不同一致性哈希,它用一种不同的分片形式,在这种形式中,每个key都是一个概念性(hash slot)的一部分。Redis集群中的每个节点负责一部分hash slots,并允许添加和删除集群节点。比如,如果你想增加一个新的节点D,那么久需要从A、B、C节点上删除一些hash slot给到D。同样地,如果你想从集群中删除节点A,那么会将A上面的hash slots移动到B和C,当节点A上是空的时候就可以将其从集群中完全删除。因为将hash slots从一个节点移动到另一个节点并不需要停止其它的操作,添加、删除节点以及更改节点所维护的hash slots的百分比都不需要任何停机时间。也就是说,移动hash slots是并行的,移动hash slots不会影响其它操作。
为了保持可用,Redis集群用一个master-slave模式,这样的话每个hash slot就有1到N个副本。而redis-cluster规定,至少需要3个master和3个slave,即3个master-slave对。当我们给每个master节点添加一个slave节点以后,我们的集群最终会变成由A、B、C三个master节点和A1、B1、C1三个slave节点组成,这个时候如果B失败了,系统仍然可用。节点B1是B的副本,如果B失败了,集群会将B1提升为新的master,从而继续提供服务。然而,如果B和B1同时失败了,那么整个集群将不可用。
Redis集群不能保证强一致性。换句话说,Redis集群可能会丢失一些写操作,原因是因为它用异步复制.
本段内容复制于docker redis 集群(cluster)搭建

单机搭建redis集群

先准备一台安装docker的机器,本人准备的是ubuntu的机器 没有安装ruby

  1. 建立一个network放全部的redis
docker network create redis-cluster-net
  1. 建立每个redis的文件夹
mkdir -p 6371/data && mkdir -p 6372/datamkdir -p 6373/data && mkdir -p 6374/data mkdir -p 6375/data && mkdir -p 6376/data
  1. 在每个文件夹下建立redis.conf文件
    vi redis.conf
# bind 127.0.0.1
protected-mode no
port ${PORT} #6371 -> 6376
daemonize no
dir /data/redis
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
  1. 建立redis集群控制的docker 因为需要用到redis_trib.rb 还有ruby的东西
sudo apt-get install ruby
sudo apt-get install gem
sudo gem install redis
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
tar -xvf redis-4.0.1.tar.gz
cd  redis-4.0.1
make

然后 redis-4.0.1目录下面的src中的 redis_trib.rb 就可以使用了

  1. 运行这6个rediscontainer
docker run -d -it -p 6371:6371 -p 16371:16371 \-v /mnt/data/redis/6371/redis.conf:/data/redis.conf -v /mnt/data/redis/6371/data/:/data/redis/ \--restart always --name redis-6371 --net redis-cluster-net redis:4.0.1 redis-server /data/redis.conf;docker run -d -it -p 6372:6372 -p 16372:16372 \-v /mnt/data/redis/6372/redis.conf:/data/redis.conf -v /mnt/data/redis/6372/data/:/data/redis/ \--restart always --name redis-6372 --net redis-cluster-net redis:4.0.1  redis-server /data/redis.conf;docker run -d -it -p 6373:6373 -p 16373:16373 \-v /mnt/data/redis/6373/redis.conf:/data/redis.conf -v /mnt/data/redis/6373/data/:/data/redis/ \--restart always --name redis-6373 --net redis-cluster-net redis:4.0.1  redis-server /data/redis.conf;docker run -d -it -p 6374:6374 -p 16374:16374 \-v /mnt/data/redis/6374/redis.conf:/data/redis.conf -v /mnt/data/redis/6374/data/:/data/redis/ \--restart always --name redis-6374 --net redis-cluster-net redis:4.0.1  redis-server /data/redis.conf;docker run -d -it -p 6375:6375 -p 16375:16375 \-v /mnt/data/redis/6375/redis.conf:/data/redis.conf -v /mnt/data/redis/6375/data/:/data/redis/ \--restart always --name redis-6375 --net redis-cluster-net redis:4.0.1  redis-server /data/redis.conf;docker run -d -it -p 6376:6376 -p 16376:16376 \-v /mnt/data/redis/6376/redis.conf:/data/redis.conf -v /mnt/data/redis/6376/data/:/data/redis/ \--restart always --name redis-6376 --net redis-cluster-net redis:4.0.1  redis-server /data/redis.conf;
  1. 找到这个network 中全部的ip和端口
matches=""
for port in `seq 6371 6376`; domatches=$matches$(docker inspect --format '{{(index .NetworkSettings.Networks "redis-cluster-net").IPAddress}}' "redis-${port}"):${port}" ";
doneecho $matches
  1. 搭建redis的集群 这里就用到了之前准备的redis-trib.rb
redis-4.0.1/src/redis-trib.rb create create --replicas 1  $matches

然后会进入集群的配置行,只要敲击yes就能自动完成集群的配置.

  1. 测试集群的使用
    在172.18.0.2的机器上使用
redis-cli -p 6371
127.0.0.1:6371> set a aaa
(error) MOVED 15495 172.18.0.4:6373
127.0.0.1:6371> get a
(error) MOVED 15495 172.18.0.4:6373
127.0.0.1:6371>
redis-cli  -p 6373
127.0.0.1:6373> get a
(nil)

可见,并没有将数据set到redis集群中

然后在172.18.0.2的机器上

redis-cli -c -p 6371
172.18.0.2:6371> set b bbbb
OK
172.18.0.4:6373> get b
-> Redirected to slot [3300] located at 172.18.0.2:6371
"bbbb"
172.18.0.2:6371>

所以在使用redis-cli的使用,要是有-c才能访问到集群中的数据.

  1. 然后选择一个不在network上的其他机器
redis-cli -c -h 172.18.0.2 -p 6371
172.18.0.2:6371>get a
-> Redirected to slot [15495] located at 172.18.0.4:6373
一段时间等待后
Could not connect to Redis at 172.18.0.4:6373: Connection timed out
断开了链接...

所以 单机的这种建立network只能在这个网络上的能访问,在其他的机器上就不能访问了.

使用docker搭建redis集群相关推荐

  1. 基于Docker搭建Redis集群(主从集群)

    最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得之前写的这篇 <基于Docker的Redis集群搭建> 文章一定是有问题了,所以我花了几分钟浏览之前的文章总结了下面几 ...

  2. docker搭建redis集群

    #!/bin/bash #Author: 臆想的一只猫 #Created: 2022-04-06 17:42:33 #Description: 搭建redis集群function menu() {cl ...

  3. mac os 开启redis_高并发大流量,总会想到它!来一起通过docker搭建redis集群

    现在一般的项目都会用到redis做缓存,也不免有老铁没用过,我就一起说下吧. redis 官网 https://redis.io/ Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库.缓 ...

  4. 利用Docker搭建Redis集群

    Redis集群搭建 运行Redis镜像 分别使用以下命令启动3个Redis docker run --name redis-6379 -p 6379:6379 -d hub.c.163.com/lib ...

  5. Linux_基于Docker搭建Redis集群

    时间:2017年07月11日星期二 说明:基于Ubuntu16.04-64bit,开始本教程前,请确保您的Linux系统已安装Docker. 步骤一:Redis镜像安装 1.下载Redis镜像 镜像中 ...

  6. 在单机上通过docker搭建redis集群试验

    一 Redis集群搭建 1.1 运行redis镜像 [root@centos-linux docker]# docker run -id --name=redis-6379 -p 6379:6379 ...

  7. ubuntu中使用docker搭建redis集群

    docker的安装,redis镜像拉取 创建外部桥接网络 docker network create -d macvlan --subnet=192.168.148.0/24 --gateway=19 ...

  8. Docker 搭建 Redis 集群以及哈希槽动态扩容

    一.创建网络 docker network create --subnet=172.10.1.0/24 redis 二.创建 Redis 容器 创建6个redis实例 docker create -- ...

  9. 群辉通过Docker搭建Redis集群

    前言:打算整理一下redis使用分布式锁的方案,但是家里没有环境,刚好最近新搞了一台群辉,就用群辉来部署一个集群来做测试环境. 1,安装Docker 通过套件中心,在所有套件中找到Docker,然后点 ...

最新文章

  1. 富士康c语言试卷答案,2015富士康笔试题目及答案
  2. C++求n个字符的长度为m的组合
  3. 问题解决——使用CriticalSection后 0xXXXXXXXX处最可能的异常: 0xC0000005: 写入位置 0x00000014 时发生访问冲突
  4. 【设计模式】装饰者模式
  5. 新一代服务器和解决方案齐发力 推动虚拟化进程(一)
  6. 学生信息管理系统(连接数据库,面向对象的方法实现学生信息的增删改查操作)...
  7. K - FatMouse and Cheese
  8. sdutoj-3837-素数链表
  9. win10 python 调用模块_python常识系列14--gt;python通过jpype模块调用jar包
  10. ToolBar控件去除默认的左边距
  11. java继承矩形例子代码_Java代码实现矩形覆盖实例
  12. 国内网络游戏企业的困境和出路
  13. 问题:IndentationError: unindent does not match any outer indentation level
  14. 在angular2项目里使用ng-zorro的icon
  15. 老版本的linux内核中mtd test 出现 mtd_oobtest: error: verify failed at 0xXXXX 问题
  16. 程序员就业3年,月薪才2万,很丢人吗?
  17. 【千里之行,始于足下】大数据高频面试题——Hive篇(一)
  18. ssh远程连接报错:WARNING: POSSIBLE DNS SPOOFING DETECTED(已解决)
  19. EC-PCA: 利润中心记账流程
  20. static应用知识:代码块

热门文章

  1. 【Python】1039 到底买不买 (20 分)
  2. 通过IP地址和掩码计算地址范围(ipv4/ipv6)
  3. 科比投球预测-python实例
  4. 微信小程序云开发笔记
  5. “金财工程”网络安全 二
  6. C语言——二叉树的创建与遍历
  7. 【Java】锁的原理以及应用最详细教程
  8. div根据屏幕缩放进行比例缩放
  9. PCADV 117期、4月1日出刊:拒绝移动炸弹,14款移动电池拆解实测
  10. 格力回应全员定万元销售任务:没有考核 主要是激励