使用docker快速构建redis集群

使用场景

Redis Cluster是Redis的分布式解决方案,当遇到单机内存,并发流量等瓶颈时,可以采用Culster集群架构,达到负载均衡的目的;
Redis集群提供的好处;
   1.将数据自动切分到多个节点的能力;
   2.当集群中的一部分节点失效或者无法进行通信时,任然可以继续处理命令请求的能力,拥有自动故障转移的能力;
Redis Cluster:主要是针对海量数据+高可用+高并发的场景,如果你的数据量很大,那么建议是用Redis Cluster;

架构图

MyAnswer博客

使用到 Dockerfile(构建基础镜像)  docker-compose(编排创建容器)   redis-trib.rb(redis集群构建)

一.编写Dockerfile文件

FROM centos:latest
MAINTAINER liuyu
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum -y update && yum -y install epel-release \
&&  yum -y install redis && yum -y install wget \
&&  yum -y install net-tools \
&&  yum -y install ruby && yum -y install rubygems
RUN wget https://rubygems.global.ssl.fastly.net/gems/redis-3.2.1.gem \
&&  gem install -l ./redis-3.2.1.gem \
&&  rm -f redis-3.2.1.gem
COPY ./config/redis-trib.rb /usr/bin
COPY ./config/redis.sh     /usr/bin
RUN mkdir -p /config && chmod 775 /usr/bin/redis.sh \
&& chmod 775 /usr/bin/redis-trib.rb \
&& mkdir -p /var/lib/redis_bak && mkdir /var/log/redis_bak

#使用redis.sh快速启动redis服务
#!/usr/bin/bash
redis-server /config/nodes-${PORT}.conf # ${PORT}使用变量

#redis-trib.rb 是redis自带的快速创建集群的工具
#构建基础镜像在Dockerfile文件的同级目录执行 docker build -t redis_colony .

MyAnswer博客

二.编写docker-compose文件

redis集群最少需要6个redis,3主3从;所有在这里我们编排6个服务;
#版本
version: "3"
#服务器
services:
    #容器1
    redis-master1:
      #镜像名称,首先从本地获取,如果没有再从远程镜像中拉去;这里我们的镜像是上面创建的镜像
      image: redis_colony
      #容器名称
      container_name: redis-master1
      #工作目录,进入容器默认进入的目录
      working_dir : /config
      #在容器当中定义变量
      environment:
         - PORT=6391
      #暴露/映射端口,将宿主机的端口与容器的端口映射; 6391作为节点的服务端口,cluster通信端口为节点端口+10000   
      ports:
         - "6391:6391"
         - "16391:16391"
      #开启输入输出命令   
      stdin_open: true
      #指定网络,这里使用下面创建的redis-master桥接网络,并且指定ip,不指定默认分配
      networks:
          redis-master:
            ipv4_address: 172.50.0.2
      #开启伪终端 即命令行      
      tty: true
      #运行容器运行特权命令
      privileged: true
      #宿主机的目录与容器的目录共享
      volumes: ["/docker/redis/config:/config"]
      #容器启动后执行的命令,也可以使用command
      entrypoint:
        - /bin/bash
        - redis.sh
    redis-master2:
          image: redis_colony
          container_name: redis-master2
          working_dir : /config
          environment:
             - PORT=6392
          ports:
             - "6392:6392"
             - "16392:16392"
          stdin_open: true
          networks:
              redis-master:
                ipv4_address: 172.50.0.3
          tty: true
          privileged: true
          volumes: ["/docker/redis/config:/config"]
          entrypoint:
            - /bin/bash
            - redis.sh
    redis-master3:
          image: redis_colony
          container_name: redis-master3
          working_dir : /config
          environment:
             - PORT=6393
          ports:
             - "6393:6393"
             - "16393:16393"
          stdin_open: true
          networks:
              redis-master:
                ipv4_address: 172.50.0.4
          tty: true
          privileged: true
          volumes: ["/docker/redis/config:/config"]
          entrypoint:
            - /bin/bash
            - redis.sh
    redis-slave1:
           image: redis_colony
           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: ["/docker/redis/config:/config"]
           entrypoint:
             - /bin/bash
             - redis.sh
    redis-slave2:
               image: redis_colony
               container_name: redis-slave2
               working_dir: /config
               environment:
                    - PORT=6395
               networks:
                  redis-slave:
                     ipv4_address: 172.30.0.3
               ports:
                 - "6395:6395"
                 - "16395:16395"
               stdin_open: true
               tty: true
               privileged: true
               volumes: ["/docker/redis/config:/config"]
               entrypoint:
                 - /bin/bash
                 - redis.sh
    redis-slave3:
               image: redis_colony
               container_name: redis-slave3
               working_dir: /config
               environment:
                    - PORT=6396
               networks:
                  redis-slave:
                     ipv4_address: 172.30.0.4
               ports:
                 - "6396:6396"
                 - "16396:16396"
               stdin_open: true
               tty: true
               privileged: true
               volumes: ["/docker/redis/config:/config"]
               entrypoint:
                 - /bin/bash
                 - redis.sh
#创建网络
networks:
  #网络名称
  redis-master:
     #使用桥接模式
     driver: bridge
     ipam:
       driver: default
       #定义ip段
       config:
          -
           subnet: 172.50.0.0/16
  redis-slave:
       driver: bridge
       ipam:
         driver: default
         config:
            -
             subnet: 172.30.0.0/16
docker-compose文件编排完成后,在文件的同级目录使用 docker-compose up -d 执行编排并且在后台运行;命令执行过程中查看有无报错;

查看容器状态,如果容器终止运行说某个地方报错; 使用 docker-compose logs查看日志信息

MyAnswer博客


三.使用redis-trib.rb创建集群

首先进入刚刚构建的任意容器当中

[root@VM_0_15_centos /]# docker exec -it 16b99fa4a312 bash
[root@16b99fa4a312 config]#
#使用之前拷贝的redis-trib.rb工具构建集群,注意:将要分配的主节点放在前面;执行后查看是否创建成功;
redis-trib.rb  create  --replicas  1 45.40.207.143:6391 45.40.207.143:6392 
45.40.207.143:6393 45.40.207.143:6394  45.40.207.143:6395  45.40.207.143:6396

如果集群未创建成功,查看下节点通信的端口是否开放,打开云防火墙和Linux内防火墙

使用reids客户端以集群的模式连接

[root@16b99fa4a312 config]# redis-cli -c -p 6392
#使用redis集群命令查看集群节点cluster nodes
#这里我们配置的是3主3从,3个主节点为上线状态,3个从节点为挂起状态;当主节点挂掉后对应的从节点将上线为master

MyAnswer博客

使用redis-trib.rb创建的集群,更具主节点的数量自动分配曹节点 曹节点范围 0-16383,每个主节点分配响应的数据曹段;

存储和获取进行哈希算法获取key对应的数据曹 CRC16('key')%16384 = 6782 

每一key是整个集群中唯一的


PHP连接Redis集群,首先要安装predis扩展;如果安装请看 '快速安装PHP扩展'

$obj_cluster = new RedisCluster(NULL, ['45.40.207.143:6391', '45.40.207.143:6392', '45.40.207.143:6393', 
'45.40.207.143:6394', '45.40.207.143:6395','45.40.207.143:6396']);
echo $obj_cluster->set('liuyu','12121213344');
echo $obj_cluster->get('liuyu');

MyAnswer博客



MyAnswer博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论