大家如果查找一些资料,很多redis集群的搭建要么是在一台Linux中搭建通过不同的端口搭建,要么是在多个Linux主机中进行的。由于现在在开发中Docker作为容器部署服务非常的普遍。所以我们在这里采用Docker进行Redis集群的搭建,它方便快捷、容易上手。首先我们必须聊聊集群是什么。

集群则是通过提高单位时间内执行的任务数来提升效率。举例说明,小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关系是集群

1)集群原理

在Redis集群中,所以的节点彼此关联,节点内部通过二进制协议优化传输速度和带宽。当一个节点挂掉后,集群超过半数的节点检查失效时该节点才会被认为挂掉。所以基于以上的情况,节点的数量一般都是奇数。一般为了保证安全性,每个节点有一个备份节点。所以最小的集群主节点的个数最少为3,从节点的个数也为3.这样一个集群最少需要6个节点。在做集群规划的时候特别需要注意这点。

Redis集群中内置了16384个哈希槽,当需要在Redis集群中存放一个key/value键值对的时候,redis会有一个算法,先把key使用CRC16算法计算一个结果,然后把结果对16384求余数,这样每个key都会对于一个编号在0-16383之间的哈希槽,redis会根据节点数量大致的均衡的将哈希槽映射到不同的节点。需要注意的是每个哈希槽存储的数据个数不做限制。

dg

2)集群规划

现在实验的宿主机的IP为192.168.21.135。自己在Docker中创建网络。网关是172.18.0.1.

172.18.0.2 7000 172.18.0.3 7001 172.18.0.4 7002

172.18.0.5 7003 172.18.0.6 7004 172.18.0.7 7005

3)集群部署

集群的部署可以使用docker-compose方式.

Docker compose构建Redis主从集群

Docker中通过容器编排Docker-compose.yml构建集群实际上也非常常用。各位小伙伴可能会对该技术不是很了解。大家如果想知道详情,可以看峰哥Docker实战教程系列。

其实不是很清楚也没有关系,任何技术的使用总有第一次。今天跟着峰哥写一写就当作第1次入门实战吧。

实现步骤:

  • A、登录Linux,在home目录下创建redis-cluster文件夹,编写文件redis-cluster.tmpl,文件的作用是用来创建Redis配置文件的模板文件。
port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file redis.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.21.135
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes

port ${PORT}: 是自定义端口号

protected-mode no:是关闭保护模式,否则可能造成无法通过公网访问。

cluster-enabled yes:启动集群。必须配置为yes

cluster-config-file redis.conf:集群节点配置文件的名字,一般我们都会取名redis.conf

cluster-node-timeout 5000:超时时间,单位是毫秒

cluster-announce-ip 192.168.21.134:集群宿主机IP

cluster-announce-port ${PORT}:节点映射端口

cluster-announce-bus-port 1${PORT}:节点总线端口

appendonly yes:开启持久化模式

  • B、在/home/redis-cluster下生成conf和data目录,并生成配置信息。这样做的目的是为了方便数据的挂载。编写Linux Shell脚本createFilePath.sh。注意要进行授权,否则脚本运行。
for port in `seq 7000 7005`
do
        mkdir -p ./${port}/conf \
        && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
        && mkdir -p ./${port}/data; \
done

给大家解读一下脚本内容,for循环6次,每次循环存储变量到port变量。然后循环创建目录,命令是mkdir -p ./{port}/conf,意思是在当前目录下面以端口后为目录名,下面创建子目录conf.后面的是连接符,表示连接后面的语句。
PORT=${port} envsubst < ./redis-cluster.tmpl >意思是将循环变量port的值复制给PORT,envsubst 是赋值给文件redis-cluster.tmpl.然后将该文件复制到端口号目录\conf文件夹中,名字是redis.conf; mkdir -p ./${port}/data; 表示继续创建在端口口目录data目录。

  • C、授权createFilePath.sh。让该文件具备可执行权限,并执行该文件。
chmod +x ./createFilePath.sh
./createFilePath.sh  
  • D、共生成6个文件夹,从7000到7005,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件。
  • E、Docker-compose的安装,通过这个工具对容器进行统一的编排。
[root@localhost redis-cluster]# curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose``[root@localhost redis-cluster]# chmod +x /usr/local/bin/docker-compose``[root@localhost redis-cluster]# docker-compose --version

Docker-Compose 是 Docker 的一种编排服务,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。通过 Docker-Compose 用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。

常用命令介绍:

1)启动所有容器,-d 将会在后台启动并运行所有的容器。docker-compose up -d

2)启动已经存在的服务容器。docker-compose start

3) 停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。docker-compose stop

4)停用移除所有容器以及网络相关。docker-compose down

  • F、在home/redis-cluster目录下面,编写docker-compose.yml编写
version: "2.0"
networks:
  redis-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.18.0.0/16
          gateway: 172.18.0.1
services:
  redis-7000: #服务名称
    image: redis:5.0.5 #基础镜像版本
    container_name: redis-7000 #容器名称
    environment: #环境变量
      - PORT=7000
    stdin_open: true
    ports:
      - "7000:7000" #端口映射
      - "17000:17000" #总线映射
    tty: true #启动起来的容器可能会立即停止,添加这个启动
    networks: #设置网络
      redis-net:
        ipv4_address: 172.18.0.2
    privileged: true
    restart: always
    volumes:
      - "/home/redis-cluster/7000/conf/redis.conf:/usr/local/etc/redis/redis.conf"
      - "/home/redis-cluster/7000/data:/data"
  redis-7001: #服务名称
      image: redis:5.0.5 #基础镜像版本
      container_name: redis-7001 #容器名称
      environment: #环境变量
        - PORT=7001
      stdin_open: true
      ports:
        - "7001:7001" #端口映射
        - "17001:17001" #总线映射
      tty: true #启动起来的容器可能会立即停止,添加这个启动
      networks: #设置网络
        redis-net:
          ipv4_address: 172.18.0.3
      privileged: true
      restart: always
      volumes:
        - "/home/redis-cluster/7001/conf/redis.conf:/usr/local/etc/redis/redis.conf"
        - "/home/redis-cluster/7001/data:/data"
  redis-7002: #服务名称
      image: redis:5.0.5 #基础镜像版本
      container_name: redis-7002 #容器名称
      environment: #环境变量
        - PORT=7002
      stdin_open: true
      ports:
        - "7002:7002" #端口映射
        - "17002:17002" #总线映射
      tty: true #启动起来的容器可能会立即停止,添加这个启动
      networks: #设置网络
        redis-net:
          ipv4_address: 172.18.0.4
      privileged: true
      restart: always
      volumes:
        - "/home/redis-cluster/7002/conf/redis.conf:/usr/local/etc/redis/redis.conf"
        - "/home/redis-cluster/7002/data:/data"
  redis-7003: #服务名称
        image: redis:5.0.5 #基础镜像版本
        container_name: redis-7003 #容器名称
        environment: #环境变量
          - PORT=7003
        stdin_open: true
        ports:
          - "7003:7003" #端口映射
          - "17003:17003" #总线映射
        tty: true #启动起来的容器可能会立即停止,添加这个启动
        networks: #设置网络
          redis-net:
            ipv4_address: 172.18.0.5
        privileged: true
        restart: always
        volumes:
          - "/home/redis-cluster/7003/conf/redis.conf:/usr/local/etc/redis/redis.conf"
          - "/home/redis-cluster/7003/data:/data"
  redis-7004: #服务名称
        image: redis:5.0.5 #基础镜像版本
        container_name: redis-7004 #容器名称
        environment: #环境变量
          - PORT=7004
        stdin_open: true
        ports:
          - "7004:7004" #端口映射
          - "17004:17004" #总线映射
        tty: true #启动起来的容器可能会立即停止,添加这个启动
        networks: #设置网络
          redis-net:
            ipv4_address: 172.18.0.6
        privileged: true
        restart: always
        volumes:
          - "/home/redis-cluster/7004/conf/redis.conf:/usr/local/etc/redis/redis.conf"
          - "/home/redis-cluster/7004/data:/data"
  redis-7005: #服务名称
        image: redis:5.0.5 #基础镜像版本
        container_name: redis-7005 #容器名称
        environment: #环境变量
          - PORT=7005
        stdin_open: true
        ports:
          - "7005:7005" #端口映射
          - "17005:17005" #总线映射
        tty: true #启动起来的容器可能会立即停止,添加这个启动
        networks: #设置网络
          redis-net:
            ipv4_address: 172.18.0.7
        privileged: true
        restart: always
        volumes:
          - "/home/redis-cluster/7005/conf/redis.conf:/usr/local/etc/redis/redis.conf"
          - "/home/redis-cluster/7005/data:/data"

完毕后,进行授权。

chmod +x ./docker-compose.yml 
  • G、编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p 使配置文件生效
23:M 27 Mar 2020 04:14:41.331 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
23:M 27 Mar 2020 04:14:41.331 # Server initialized
23:M 27 Mar 2020 04:14:41.331 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
23:M 27 Mar 2020 04:14:41.331 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
23:M 27 Mar 2020 04:14:41.331 * Ready to accept connections
  • H、在工作目录/home/redis-cluster目录下执行./docker-compose up -d创建6个redis容器.

我们现在查询容器状态,发现容器启动,但是Redis服务并没有启动起来。

  • J、进入每个容器内部,启动Redis服务。现在以redis-7000为例,其他一样。
docker exec -it redis-7000 bash
root@394a7c4d3c00:/data# redis-server /usr/local/etc/redis/redis.conf

再次查看,容器状况,发送redis服务全部启动完毕。

  • K、完成集群的master和slave的主从结构部署。
redis-cli --cluster create 172.18.0.2:7000 172.18.0.3:7001 172.18.0.4:7002 172.18.0.5:7003 172.18.0.6:7004 172.18.0.7:7005 --cluster-replicas 1

执行过程中,首先是分配槽到三个master,然后把7004作为7000的slave节点,后面的同理。接着说明7000、7001、7002是master节点。7003、7004、7005是slave节点。然后询问是否接受上面的分配方式,我们只能选择yes,否则回滚。

  • L、测试集群是否搭建成功,在容器内容执行如下命令,这里举例redis-7000容器
cluster nodes

gdfg

至此,集群搭建完毕。这两种方式,希望搭建都能努力实践一下。

文章名: Docker环境中Redis集群搭建
文章链接:https://www.sjl511.cn/28.html
版权声明:版权归苏里,转载时请注明本文出处及文章链接。
最后修改:2020 年 06 月 04 日 05 : 54 PM
谢谢饲主了~~喵