Docker- Redis集群

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

六星教育

简介

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


Docker- Redis集群

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

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

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

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

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

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

Docker 集群的准备

1.目录的分配


Docker- Redis集群

与容器内的redis文件共享

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


Docker- Redis集群

cluster.sh

<code>

redis-trib.rb

<code>

4个master 4个slave 的文件目录

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


Docker- Redis集群


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

master conf.redis.conf 参考网络

<code>

/<code>

slave conf/redis.conf参考网络

<code>

2.编写Dockerfile 文件


<code>#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
/<code>


编写docker-compose.yaml

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


Compose 中有两个重要的概念:

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

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

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

>停止服务:

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

>重新启动服务:

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

节点的部署

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

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


文件编写

<code>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/<code>


开始操作


1.进入目录


Docker- Redis集群

生成镜像

<code>docker build -t cluster ./<code> 

使用编排工具

docker-compose start

查看容器是否运行 docker ps


Docker- Redis集群


进入master-1

docker exec -it master-1 bash


Docker- Redis集群

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

<code>./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/<code>

集群命令

<code>所有命令:
CLUSTER CLUSTER
CLUSTER CLUSTER CLUSTER CLUSTER
CLUSTER CLUSTER
CLUSTER info: 打印集群的信息。
CLUSTER nodes: 列出集群当前已知的所有节点(node)的相关信息。
CLUSTER meet <port>: 将ip和port所指定的节点添加到集群当中。

CLUSTER addslots <slot> [slot ...]:将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER delslots <slot> [slot ...]: 移除一个或多个槽对当前节点的指派。CLUSTER
slots: 列出槽位、节点信息。
slaves <node>: 列出指定节点下面的从节点信息。
replicate <node>: 将当前节点设置为指定节点的从节点。/<node>/<node>/<slot>/<slot>/<port>
/<code>

查询集群


Docker- Redis集群

可以看出集群搭建成功


分享到:


相關文章: