Docker的基本命令在以往文章例。
六星教育
简介
Redis Cluster 是 Redis 的分布式解决方案,在3.0版本正式推出,有效地解决了 Redis 分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用 Cluster 架构方案达到负载均衡的目的。 架构图:
在这个图中,每一个蓝色的圈都代表着一个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.目录的分配
与容器内的redis文件共享
sh目录是里面存放sh文件,容器创建调用
cluster.sh
<code>
redis-trib.rb
<code>
4个master 4个slave 的文件目录
文件内部文件目录,master与slave 一致
但是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.进入目录
生成镜像
<code>docker build -t cluster ./<code>
使用编排工具
docker-compose start
查看容器是否运行 docker ps
进入master-1
docker exec -it master-1 bash
使用集群工具 必须是双数,前面的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所指定的节点添加到集群当中。 /<code>
CLUSTER addslots <slot> [slot ...]:将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER delslots <slot> [slot ...]: 移除一个或多个槽对当前节点的指派。CLUSTER
slots: 列出槽位、节点信息。
slaves <node>: 列出指定节点下面的从节点信息。
replicate <node>: 将当前节点设置为指定节点的从节点。/<node>/<node>/<slot>/<slot>/<port>
查询集群
可以看出集群搭建成功
閱讀更多 編程小知識 的文章