>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring》、《Spring Cloud Alibaba微服务开发零基础入门到实操》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 26707 个阅读者 刷新本主题
 * 贴子主题:  Docker redis 集群搭建 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-28 13:14:53     消息  查看  搜索  好友  邮件  复制  引用

  

Docker redis 集群搭建

     Redis 集群是一个提供在多个 Redis 节点间共享数据的程序集。

         Redis 集群并不支持处理多个 keys 的命令,因为这需要在不同的节点间移动数据,从而达不到像 Redis 那样的性能,在高负载的情况下可能会导致不可预料的错误.

         Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令。

         Redis 集群的优势:    
  • 自动分割数据到不同的节点上。
  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
     Redis 集群没有使用一致性 hash, 而是引入了哈希槽的概念。Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。            

1、下载 redis.conf

     下载地址:https://github.com/antirez/redis/blob/unstable/redis.conf    

2、修改 redis.conf

     开启集群功能:

         cluster-enabled yes

             设置节点端口:

         port 6391

     节点超时时间,单位毫秒:

         cluster-node-timeout 15000

     集群内部配置文件:

         cluster-config-file "nodes-6379.conf"        

3、编写 docker-compose.yml

             节点规划图如下:

        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

         配置如下:

         version: "3.6"

services:

  redis-master1:

     image: redis:5.0 # 基础镜像

     container_name: redis-master1 # 容器服务名

     working_dir: /config # 工作目录

     environment: # 环境变量

       - PORT=6391 # 跟 config/nodes-6391.conf 里的配置一样的端口

     ports: # 映射端口,对外提供服务

       - "6391:6391" # redis 的服务端口

       - "16391:16391" # redis 集群监控端口

     stdin_open: true # 标准输入打开

     networks: # docker 网络设置

        redis-master:

            ipv4_address: 172.50.0.2

     tty: true

     privileged: true # 拥有容器内命令执行的权限

     volumes: ["/c/project/docker/redis/config:/config"] # 映射数据卷,配置目录

     entrypoint: # 设置服务默认的启动程序

       - /bin/bash

       - redis.sh

  redis-master2:

       image: redis:5.0

       working_dir: /config

       container_name: redis-master2

       environment:

              - PORT=6392

       networks:

          redis-master:

             ipv4_address: 172.50.0.3

       ports:

         - "6392:6392"

         - "16392:16392"

       stdin_open: true

       tty: true

       privileged: true

       volumes: ["/c/project/docker/redis/config:/config"]

       entrypoint:

         - /bin/bash

         - redis.sh

  redis-master3:

       image: redis:5.0

       container_name: redis-master3

       working_dir: /config

       environment:

              - PORT=6393

       networks:

          redis-master:

            ipv4_address: 172.50.0.4

       ports:

         - "6393:6393"

         - "16393:16393"

       stdin_open: true

       tty: true

       privileged: true

       volumes: ["/c/project/docker/redis/config:/config"]

       entrypoint:

         - /bin/bash

         - redis.sh

  redis-slave1:

       image: redis:5.0

       container_name: redis-slave1

       working_dir: /config

       environment:

            - PORT=6394

       networks:

          redis-slave:

             ipv4_address: 172.30.0.2

       ports:

         - "6394:6394"

         - "16394:16394"

       stdin_open: true

       tty: true

       privileged: true

       volumes: ["/c/project/docker/redis/config:/config"]

       entrypoint:

         - /bin/bash

         - redis.sh

  redis-salve2:

       image: redis:5.0

       working_dir: /config

       container_name: redis-salve2

       environment:

             - PORT=6395

       ports:

         - "6395:6395"

         - "16395:16395"

       stdin_open: true

       networks:

          redis-slave:

              ipv4_address: 172.30.0.3

       tty: true

       privileged: true

       volumes: ["/c/project/docker/redis/config:/config"]

       entrypoint:

         - /bin/bash

         - redis.sh

  redis-salve3:

       image: redis:5.0

       container_name: redis-slave3

       working_dir: /config

       environment:

          - PORT=6396

       ports:

         - "6396:6396"

         - "16396:16396"

       stdin_open: true

       networks:

          redis-slave:

            ipv4_address: 172.30.0.4

       tty: true

       privileged: true

       volumes: ["/c/project/docker/redis/config:/config"]

       entrypoint:

         - /bin/bash

         - redis.sh

networks:

  redis-master:

     driver: bridge # 创建一个docker 的桥接网络

     ipam:

       driver: default

       config:

          -

           subnet: 172.50.0.0/16

  redis-slave:

       driver: bridge

       ipam:

         driver: default

         config:

            -

             subnet: 172.30.0.0/16        

4、编写 redis 默认的启动脚本

     创建文件 config/redis.sh,内容如下:

                 redis-server  /config/nodes-${PORT}.conf        

5、启动集群

     启动服务命令如下:

         $ docker-compose up -d

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

         查看服务运行:

         $ docker ps

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

         初始化集群(这一步开始命令须在 redis5.0 及以上版本运行)。

         创建 3 主 3 从的 redis 集群:

         $ redis-cli --cluster create 192.168.99.100:6391 192.168.99.100:6392 192.168.99.100:6393 192.168.99.100:6394 192.168.99.100:6395 192.168.99.100:6396 --cluster-replicas 1

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

         输入 yes,确认要初始化:

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

         查看初始化结果。

         进入 redis-cli,  查看节点信息:

         root@ae9e587e62f4:/data# redis-cli -h 192.168.99.100 -p 6391

192.168.99.100:6391> cluster nodes

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

         上图显示,redis 集群符合预期。            

6、测试集群

     普通模式连接:由于 test 根据哈希槽计算,是分布在 6392 服务上。所以这里会提示转到 6392。

         root@ae9e587e62f4:/data# redis-cli -h 192.168.99.100 -p 6391

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                 集群模式连接:以下例子显示操作正常。

         root@ae9e587e62f4:/data# redis-cli -c -h 192.168.99.100 -p 6391 set test 1

         root@ae9e587e62f4:/data# redis-cli -c -h 192.168.99.100 -p 6391 get test

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

         集群模式连接读写正常,集群搭建成功。



程序猿的技术大观园:www.javathinker.net




[这个贴子最后由 sunweiqin 在 2020-01-28 14:41:17 重新编辑]
  Java面向对象编程-->多线程(上)
  JavaWeb开发-->JSP技术详解(Ⅰ)
  JSP与Hibernate开发-->Java对象持久化技术概述
  Java网络编程-->非阻塞通信
  精通Spring-->计算属性和数据监听
  Vue3开发-->虚拟DOM和render()函数
  福利:Spring Cloud Alibaba微服务开发零基础入门到实操-经典...
  Redis为什么单线程能够支持高并发
  面试官问什么是Spring循环依赖,该如何回答?
  如何编写优雅的Spring架构API
  拦截器不拦截静态资源的三种处理方法
  Spring MVC和前后端分离的RESTFul框架
  Spring Cloud Config 客户端的高可用实现
  RESTful API的最佳设计原则
  另一种缓存,Spring Boot 整合 Ehcache
  Spring Cloud 服务发布与调用
  3分钟让你明白JSON是什么
  微服务中的Kafka与Micronaut
  利用Spring Boot如何开发REST服务详解
  Axis、Axis2和CXF比较
  Hibernate拦截器与监听器
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 nihaota 
  
威望: 0
级别: 新手上路
魅力: 1315
经验: 1315
现金: 2944
发文章数: 243
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用


讨债公司
发文章时间 2022-10-28 20:20:58
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。