四时宝库

程序员的知识宝库

Docker- Redis集群(redis dockerfile)

Docker的基本命令在以往文章例。

六星教育

简介

Redis Cluster 是 Redis 的分布式解决方案,在3.0版本正式推出,有效地解决了 Redis 分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用 Cluster 架构方案达到负载均衡的目的。 架构图:


在这个图中,每一个蓝色的圈都代表着一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集 群中的任何一个节点,对其进行存取和其他操作。

Redis 集群提供了以下两个好处:

1、将数据自动切分到多个节点的能力。

2、当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力,拥有自动故障转移的能力。

2、redis cluster vs replication + sentinal如何选择

如果你的数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个G,单机足够了。
Replication:一个mater,多个slave,要几个slave跟你的要求的读吞吐量有关系,结合sentinal集群,去保证redis主从架构的高可用性,就可以了。
redis cluster:主要是针对海量数据+高并发+高可用的场景,海量数据,如果你的数据量很大,那么建议就用redis cluster。

Docker 集群的准备

1.目录的分配


与容器内的redis文件共享

sh目录是里面存放sh文件,容器创建调用


cluster.sh

redis-trib.rb

4个master 4个slave 的文件目录

文件内部文件目录,master与slave 一致



但是master和slave 的conf/redis.conf内容有些差异

master conf.redis.conf 参考网络



slave conf/redis.conf参考网络

2.编写Dockerfile 文件


#FROM  ruby:2.5-alpine 
FROM  daocloud.io/ruby:2.6-alpine3.8 #这个功能是采用 Ruby 实现的 Redis 集群管理工具
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
  && apk add  gcc g++ libc-dev  wget vim  openssl-dev make  linux-headers  bash \
  && rm -rf /var/cache/apk/*

RUN wget https://rubygems.org/downloads/redis-4.0.2.gem  &&  gem install -l ./redis-4.0.2.gem \
&&  rm -f redis-4.0.2.gem

RUN mkdir -p /usr/src/redis \
      && mkdir -p /usr/src/redis/data \
      && mkdir -p /usr/src/redis/conf \
      && mkdir -p /usr/src/sh         \
      && mkdir -p /usr/src/redis/log

RUN wget  -O /usr/src/redis/redis-4.0.11.tar.gz  "http://download.redis.io/releases/redis-4.0.11.tar.gz" \
   && tar -xzf /usr/src/redis/redis-4.0.11.tar.gz  -C /usr/src/redis \
   && cp  /usr/src/redis/redis-4.0.11/src/redis-trib.rb  /usr/src/redis/ \
   && rm -rf /usr/src/redis/redis-4.0.11.tar.tgz

RUN cd /usr/src/redis/redis-4.0.11 &&  make && make PREFIX=/usr/local/redis install \
&& ln -s /usr/local/redis/bin/*  /usr/local/bin/  && rm -rf /usr/src/redis/redis-4.0.11

COPY ./sh/cluster.sh   /usr/src/sh 
COPY ./sh/redis-trib.rb   /usr/src/sh/redis-trib.rb
RUN  chmod +x  /usr/src/sh/cluster.sh && chmod +x  /usr/src/sh/redis-trib.rb


编写docker-compose.yaml

Compose是 Docker  的服务编排工具,主要用来构建基于Docker的复杂应用Compose 通过一个配置文件来管理多个 -Docker  容器,非常适合组合使用多个容器进行开发的场景。

Compose 中有两个重要的概念:

-  服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
-  项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

>服务后台后,可以使用下列命令查看状态:  

**```docker-compose ps```**

>停止服务:  

**```docker-compose stop```**

>重新启动服务:

**```docker-compose restart```**
>删除服务
**```docker-compose rm```**

节点的部署

容器名称 容器IP地址 映射端口号 服务运行模式

cluster-1            192.168.1.12       6380:6379 16380:16379              master
cluster-2          192.168.1.13        6381:6379 16381:16379               master
cluster-3          192.168.1.14        6382:6379 16382:16379              master
cluster-4          192.168.1.15        6383:6379 16383:16379             slave
cluster-5          192.168.1.16        6384:6379 16384:16379             slave
cluster-6          192.168.1.17        6385:6379 16385:16379             slave


文件编写

version: "3.6"
services:
  cluster-1:
    image: cluster  #镜像
    container_name: cluster-1  #容器名
    networks:
      mynetwork:
        ipv4_address: 192.168.1.12   #设置ip地址
    working_dir: /usr/src/redis #工作目录
    environment:          #设置启动参数 并传递到cluster.sh中
    - REALIP=23.248.162.103
    - PORT= 6380
    - PORT2=16380
    stdin_open: true
    tty: true
    ports: #端口映射
    - "6380:6379"  #启动端口
    - "16380:16379"  #集群通信端口
    volumes:  #目录共享
    - /www/wwwroot/aaa/docker-redis/cluster/master:/usr/src/redis
    entrypoint: #执行shell 脚本
    - /bin/sh
    - /usr/src/sh/cluster.sh

  cluster-2:
    image: cluster
    container_name: cluster-2
    networks:
      mynetwork:
        ipv4_address: 192.168.1.13   #设置ip地址
    working_dir: /usr/src/redis #工作目录
    environment:
    - REALIP=23.248.162.103
    - PORT=6381
    - PORT2=16381
    stdin_open: true
    tty: true
    ports:
    - "6381:6379"
    - "16381:16379"
    volumes:
    - /www/wwwroot/aaa/docker-redis/cluster/master-1:/usr/src/redis
    entrypoint:
    - /bin/sh
    - /usr/src/sh/cluster.sh

  cluster-3:
    image: cluster
    container_name: cluster-3
    networks:
      mynetwork:
        ipv4_address: 192.168.1.14   #设置ip地址
    working_dir: /usr/src/redis #工作目录
    environment:
    - REALIP=23.248.162.103
    - PORT=6382
    - PORT2=16382
    stdin_open: true
    tty: true
    ports:
    - "6382:6379"
    - "16382:16379"
    volumes:
    - /www/wwwroot/aaa/docker-redis/cluster/master-2:/usr/src/redis
    entrypoint:
    - /bin/sh
    - /usr/src/sh/cluster.sh

#  cluster-7:
#    image: cluster
#    container_name: cluster-7
#    networks:
#      mynetwork:
#        ipv4_address: 192.168.1.18   #设置ip地址
#    working_dir: /usr/src/redis #工作目录
#    environment:
#    - REALIP=23.248.162.103
#    - PORT=6386
#    - PORT2=16386
#    stdin_open: true
#    tty: true
#    ports:
#    - "6386:6379"
#    - "16386:16379"
#    volumes:
#    - /www/wwwroot/aaa/docker-redis/cluster/master-3:/usr/src/redis
#    entrypoint:
#    - /bin/sh
#    - /usr/src/sh/cluster.sh

  cluster-4:
    image: cluster
    container_name: cluster-4
    networks:
      mynetwork:
        ipv4_address: 192.168.1.15   #设置ip地址
    working_dir: /usr/src/redis #工作目录
    environment:
    - REALIP=23.248.162.103
    - PORT=6383
    - PORT2=16383
    stdin_open: true
    tty: true
    ports:
    - "6383:6379"
    - "16383:16379"
    volumes:
    - /www/wwwroot/aaa/docker-redis/cluster/slave:/usr/src/redis
    entrypoint:
    - /bin/sh
    - /usr/src/sh/cluster.sh

  cluster-5:
    image: cluster
    container_name: cluster-5
    networks:
      mynetwork:
        ipv4_address: 192.168.1.16  #设置ip地址
    working_dir: /usr/src/redis #工作目录
    environment:
    - REALIP=23.248.162.103
    - PORT=6384
    - PORT2=16384
    stdin_open: true
    tty: true
    ports:
    - "6384:6379"
    - "16384:16379"
    volumes:
    - /www/wwwroot/aaa/docker-redis/cluster/slave-1:/usr/src/redis
    entrypoint:
    - /bin/sh
    - /usr/src/sh/cluster.sh


  cluster-6:
    image: cluster
    container_name: cluster-6
    networks:
      mynetwork:
        ipv4_address: 192.168.1.17  #设置ip地址
    working_dir: /usr/src/redis #工作目录
    environment:
    - REALIP=23.248.162.103
    - PORT=6385
    - PORT2=16385
    stdin_open: true
    tty: true
    ports:
    - "6385:6379"
    - "16385:16379"
    volumes:
    - /www/wwwroot/aaa/docker-redis/cluster/slave-2:/usr/src/redis
    entrypoint:
    - /bin/sh
    - /usr/src/sh/cluster.sh
#    command: ["redis-sentinel","/usr/src/redis/conf/sentinel.conf"]

#  cluster-8:
#    image: cluster
#    container_name: cluster-8
#    networks:
#      mynetwork:
#        ipv4_address: 192.168.1.19  #设置ip地址
#    working_dir: /usr/src/redis #工作目录
#    environment:
#    - REALIP=23.248.162.103
#    - PORT=6387
#    - PORT2=16387
#    stdin_open: true
#    tty: true
#    ports:
#    - "6387:6379"
#    - "16387:16379"
#    volumes:
#    - /www/wwwroot/aaa/docker-redis/cluster/slave-3:/usr/src/redis
#    entrypoint:
#    - /bin/sh
#    - /usr/src/sh/cluster.sh


#设置网络环境
networks:
  #引用外部预先定义好的网段
  mynetwork:
    external:
      name: mynetwork


开始操作


1.进入目录


生成镜像

docker build -t cluster .

使用编排工具

docker-compose start

查看容器是否运行 docker ps



进入master-1

docker exec -it master-1 bash


使用集群工具 必须是双数,前面的3个是master 后面的是slave

./redis-trib.rb  create --replicas 1  23.248.162.103:6380  23.248.162.103:6381  23.248.162.103:6382  23.248.162.103:6383  23.248.162.103:6384  23.248.162.103:6385

集群命令

所有命令:
CLUSTER CLUSTER
CLUSTER CLUSTER CLUSTER CLUSTER
CLUSTER CLUSTER
CLUSTER info: 打印集群的信息。
CLUSTER nodes: 列出集群当前已知的所有节点(node)的相关信息。
CLUSTER meet <ip> <port>: 将ip和port所指定的节点添加到集群当中。
CLUSTER addslots <slot> [slot ...]:将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER delslots <slot> [slot ...]: 移除一个或多个槽对当前节点的指派。CLUSTER
 slots: 列出槽位、节点信息。  
slaves <node_id>: 列出指定节点下面的从节点信息。 
replicate <node_id>: 将当前节点设置为指定节点的从节点。

查询集群


可以看出集群搭建成功

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接