一.簡介
docker作為一個容器技術,在搭建資源隔離性服務上具有很大的優勢,在一臺服務器上可以啟動多個docker容器,感覺每個在容器里面部署的服務就像是部署在不同的服務器上,此次基于docker以及docker-compose(一種容器編排技術)搭建redis集群,包含六個實體,分為三主三從,
二.構建鏡像
使用docker構建容器,首先需要一個鏡像,這個鏡像可以基于docker官方提供的標準鏡像,也可以自定義鏡像,
1)構建redis鏡像檔案
創建Dockerfile檔案,內容如下
#指定基礎鏡像
FROM alpine
#指定下載源,使用阿里的源,可以加快下載速度,同時安裝編譯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 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/module \
&& mkdir -p /usr/src/redis/log
#下載redis安裝包(可以根據你的需要下載指定版本的redis)
RUN wget -O /usr/src/redis/redis-5.0.5.tar.gz "https://github.com/antirez/redis/archive/5.0.5.tar.gz" \
&& tar -xzf /usr/src/redis/redis-5.0.5.tar.gz -C /usr/src/redis \
&& cp /usr/src/redis/redis-5.0.5/src/redis-trib.rb /usr/src/redis/ \
&& rm -rf /usr/src/redis/redis-5.0.5.tar.tgz
#然后編譯安裝
RUN cd /usr/src/redis/redis-5.0.5 && make && make PREFIX=/usr/local/redis install \
&& ln -s /usr/local/redis/bin/* /usr/local/bin/ && rm -rf /usr/src/redis/redis-5.0.5
#容器啟動后運行的命令(在容器啟動后運行redis)
CMD ["/usr/local/bin/redis-server","/usr/src/redis/conf/redis.conf"]
2)構建redis鏡像
基于上面的Dockerfile可以編譯生成一個鏡像檔案,使用如下命令
docker build -t redis:test .
說明:
docker build:鏡像構建命令
-t: 指定鏡像的名稱,后面:后的test表示版本
.: 指定Dockerfile檔案的路徑,使用上述命令后會在當前目錄下尋找Dockerfile檔案
鏡像構建完畢之后會得到一個鏡像redis,版本為test

構建程序中出現問題會有提示,根據相應的提示修改Dockerfile檔案中的內容
3)構建docker-compose.yml檔案
version: "3"
services:
redis-1:
# build:
# context: .
# dockerfile: Dockerfile
image: redis:test #指定鏡像,使用上一步構建的鏡像
restart: always
container_name: redis-1 #指定容器的名字
volumes: #掛載共享目錄,指定之后宿主機和容器就可以共享檔案,比如從宿主機發送檔案到容器或者從容器中發送檔案到宿主機
- /app/docker/redis/redis-1:/usr/src/redis
networks: #指定網段,也可以不指定,如果不指定的話每次重啟會隨機分配一個ip
mybridge:
ipv4_address: 192.168.1.2
ports: #指定埠映射
- 6380:6379
- 16380:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf
redis-2:
# build:
# context: .
# dockerfile: Dockerfile
image: redis:test
restart: always
container_name: redis-2
volumes:
- /app/docker/redis/redis-2:/usr/src/redis
networks:
mybridge:
ipv4_address: 192.168.1.3
ports:
- 6381:6379
- 16381:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf
redis-3:
# build:
# context: .
# dockerfile: Dockerfile
image: redis:test
restart: always
container_name: redis-3
volumes:
- /app/docker/redis/redis-3:/usr/src/redis
networks:
mybridge:
ipv4_address: 192.168.1.4
ports:
- 6382:6379
- 16382:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf
redis-4:
# build:
# context: .
# dockerfile: Dockerfile
image: redis:test
restart: always
container_name: redis-4
volumes:
- /app/docker/redis/redis-4:/usr/src/redis
networks:
mybridge:
ipv4_address: 192.168.1.5
ports:
- 6383:6379
- 16383:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf
redis-5:
image: redis:test
restart: always
container_name: redis-5
volumes:
- /app/docker/redis/redis-5:/usr/src/redis
networks:
mybridge:
ipv4_address: 192.168.1.6
ports:
- 6384:6379
- 16384:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf
redis-6:
image: redis:test
restart: always
container_name: redis-6
volumes:
- /app/docker/redis/redis-6:/usr/src/redis
networks:
mybridge:
ipv4_address: 192.168.1.7
ports:
- 6385:6379
- 16385:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf
networks:
mybridge:
external:
name: mynetwork
在docker-compose.yml檔案的目錄下執行docker-compose up -d命令啟動redis容器,完成之后可以通過docker ps命令查看啟動后的容器情況,如果啟動正常會有如下頁面

分別有每個容器的id以及容器對應的鏡像名稱,表示是從redis:test這個鏡像構建的
三.搭建redis集群
通過命令docker exec -it 868a909ee66c sh 命令進入到redis-6這個容器中,當然也可以選擇進入到別的容器,查看當前容器的埠占用情況,會出現如下所示,表示redis啟動正常,

redis5版本之后提供了cluster命令,使得構建cluster集群變得非常方便,使用如下命令即可
redis-cli --cluster create 192.168.1.2:6379 192.168.1.3:6379 192.168.1.4:6379 192.168.1.4:6379 192.168.1.6:6379 192.168.1.7:6379 --cluster-replicas 1
說明:
-cluster create:表示使用redis的cluster命令創建集群,后面跟著每個redis實體對應的ip和埠
--cluster-replicas:表示一個主節點有幾個從節點,本次配置為一個
運行上述命令創建集群如果正常的話,redis會自動分別主從以及slot的分配,然后會詢問是否接受它的分配規則,選擇yes即可,具體情況如下圖

第一次出現錯誤是應為我在redis的組態檔中配置了密碼,在生成集群時沒有加上密碼導致認證不通過,加上之后重新運行命令會自動生成集群,看到如下界面表示redis集群創建成功,

使用redis-cli -a 123456 cluster nodes查看集群節點的分布情況,

選擇192.168.1.2(master中的一個)這個redis實體

設定key first的值,會首先計算first對應的hash值,然后根據哈希值與slot的個數取余,決定first應該存放到哪個redis實體中,途中提示first應該到192.168.1.4中的redis中,進入到192.168.1.4對應的redis中,同樣進行設定操作,結果如下,

至此,整個redis集群搭建完畢,
注:redis組態檔的內容
bind 0.0.0.0
port 6379
tcp-keepalive 300
supervised no
loglevel notice
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/usr/src/redis/data"
masterauth "123456"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
requirepass "123456"
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
cluster-enabled yes
cluster-node-timeout 15000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/204760.html
標籤:其他
上一篇:Oracle初始——第一天
