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集群

可以看出集群搭建成功


分享到:


相關文章: