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>
查詢集群
可以看出集群搭建成功
閱讀更多 編程小知識 的文章