M1-Mac中docker的redis叢集配置

Xander發表於2023-01-26

M1-Mac中docker的redis叢集配置

前言

​ 標題起名有些繞不過為了防止讀者誤解這也是一個必要的,本文是個人的一次mac上搭建redis叢集的實戰筆記,筆者為mac系統,雖然很多操作類似Linux但是有差異,也踩了不少的坑,本教程也可以作為linux的docker搭建redis叢集參考使用,最後有任何疑問歡迎討論。

提示:本教程適用於linux和mac系統,但是需要注意的是mac系統中/usr/local目錄下面其實是被mac封閉的,不能作為配置和使用,雖然可以透過sudo強制構建配置等檔案,但是會出現莫名其妙的情況,本文也會列出個人的踩坑點,希望能幫助同樣使用mac系統的同學避坑。

一、準備docker

​ 巧婦難為無米之炊,所以先得在mac上裝一個docker。

1. 安裝docker

​ 個人目前使用mac作為主力機,所以所有的演示都是在mac上完成,當然下載也是隻提供mac的下載地址,首先需要跑到這個網址進行下載,https://docs.docker.com/deskt...

  1. mac的安裝直接拖過去就行,這裡安裝完成之後不知道為什麼docker容器老是無法啟動,但是點選了unintall啥的之後突然就好了,目前經過版本迭代docker已經可以正常在m1中使用了。
  2. 安裝完成之後啟動軟體,可以先執行一下docker的ddocker info的命令,也可以先選擇軟體推薦的映象來執行一下,命令如下 :docker run -d -p 80:80 docker/getting-started
  3. 執行完成之後,直接訪問localhost即可,此時會進入一個docker的快速入門頁面。

2. 更新映象

​ 由於國外的docker實在是慢,所以這裡需要先切換為國內的映象倉庫,最終使用的是網易的映象地址:http://hub-mirror.c.163.com。在工作列點選 Docker for mac 應用圖示 -> Perferences... -> Daemon -> Registry mirrors。在列表中填寫加速器地址即可,修改完成之後,點選 Apply & Restart 按鈕,Docker 就會重啟並應用配置的映象地址了。

新版的docker 只要更改 docker engine的相關json配置即可,比如下面的就是替換之後的結果,也算是一個踩坑點,網上的多數教程都是老版本的docker,找了半天沒找到在哪=-=:

​ 最後為了驗證配置是否生效我們可以使用docker info檢視,在列印資訊的最下方看到對應的配置地址說明配置生效了:

 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://docker.mirrors.ustc.edu.cn/
  https://hub-mirror.c.163.com/
 Live Restore Enabled: false

二、docker的redis單機部署

​ 單機部署就十分簡單了,只需要下面幾個命令即可:

#預設拉取一個最新的redis映象
docker pull redis
#在預設的6379埠上啟動一個redis服務
docker run --name test-redis -p 6379:6379 -d redis
#進入容器內部
docker exec -it test-redis /bin/bash
# 連線redis
redis-cli
#進入之後安裝慣例 ping一下即可
ping

​ 單機執行還是配置還是挺快的,不過需要注意單機的執行使用的配置都是預設的配置,並且docker啟動redis映象裡是沒有配置檔案的,如果想要像安裝redis一樣使用自定義的配置檔案啟動需要做如下的更改。

自定義redis配置啟動

  1. 如果是自定義的配置,首先在自己在任意的目錄位置建立用於對映的目錄以及從https://github.com/redis/redi... 拉一個模板的配置檔案過來即可。
  2. 最後,透過下面的命令內容進行配置
#-d 後臺執行返回容器id
#-p 埠對映
#-v 資料卷對映
#末尾[COMMAMD]執行該命令
docker run -d -p 6380:6380 -v /usr/docker/redis/myRedis/redis.conf:/etc/redis/redis.conf -v /usr/docker/redis/myRedis/data:/data --name myRedis redis redis-server /etc/redis/redis.conf

/usr/docker/redis/myRedis/redis.conf:這裡需要改為你需要對映的配置檔案地址,同理data檔案也需要對應的修改。

三、docker 中redis叢集部署(重點)

​ 首先需要確保上面的內容都已經完成了處理,下面就可以進行相關的redis安裝了,安裝的過程如下:

1. 檢索redis映象

docker search redis,展示之後發現了常見的官方提供的redis映象,直接啦取即可。

2. 拉取映象

docker pull redis,同樣也是把redis的映象拉到本地來,拉取之後執行docker images,下面是執行結果:

zxd@zxddeMacBook-Pro ~ % docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
redis                    latest    c3d77c9fc5b8   2 weeks ago    107MB
docker/getting-started   latest    613921574f76   4 months ago   26.7MB

3. 構建redis自定義

​ 執行:docker network create redis-net,執行命令之後出現如下的返回結果,這樣就建立了redis叢集的通訊端了

建立完成之後出現下面的內容:

a42040f20cb54027b75a68f3d000a7bb02f417e2f202297658bfc1a2c88041d7

4. 構建叢集配置檔案模板檔案

​ 構建基礎叢集的配置檔案,如果你是linux系統可以執行:cd /usr/local/src && mkdir redis-cluster && cd ./redis-cluster && touch redis-cluster.conf。但是如果你是mac系統,建議不要這樣操作,更加建議在/User/使用者名稱/redis/xxx下面構建自己的配置,下面是redis-cluster.conf檔案的模板。

# ${PORT}不需要替換,為佔位符,注意
port ${PORT}
cluster-enabled yes
protected-mode no
cluster-config-file nodes.conf
cluster-node-timeout 5000
#對外ip,這裡的ip要改為你的伺服器Ip。【注意不能使用127.0.0.1】
cluster-announce-ip 192.168.0.12
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes

5. 生成具體叢集配置檔案

如果是linux系統,則可以使用命令cd /usr/local/src/redis-cluster進入到對應的構建配置的目錄,當然這裡是mac進行了對應的目錄,然後我們生成conf和data目錄,並生成配置資訊:

seq 6000 6005: 可以自己指定遍歷的埠,這裡剛好是6個redis例項,也就是預設的3主3從的方式。

for port in `seq 6000 6005`; do 
  mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.conf > ./${port}/conf/redis.conf && mkdir -p ./${port}/data;
done

​ 生成之後的效果如下,可以看到生成了從6000-6005的配置檔案以及data目錄,這就是搭建叢集的基礎配置 :

​ 如果開啟其中一個配置檔案,它的內容如下,這裡可以對比之前的模板配置就能明白改了哪些內容:

port 6000
cluster-enabled yes
protected-mode no
cluster-config-file nodes.conf
cluster-node-timeout 5000
#對外ip
cluster-announce-ip 192.168.0.12
cluster-announce-port 6000
cluster-announce-bus-port 16000
appendonly yes

6. 編寫並執行叢集執行指令碼

​ 接著,在當前的目錄下我們可以建立一個指令碼檔案start.sh,並且執行vim start.sh,在指令碼的內容如下,編寫完成之後使用shell命令執行如下:sh start.sh執行指令碼即可。

​ 下面重點來了,前文說過mac系統的/usr/local/src目錄是不給訪問的,雖然可以使用sudo強制建立或者修改檔案,但是這並不是許可權的問題,是mac把這個資料夾進行封閉並且不建議在此資料夾操作,所以下面的命令僅僅適用Linux系統

for port in `seq 6000 6005`; do 
  docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} -v /usr/local/src/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/src/redis-cluster/${port}/data:/data  --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; 
done

​ 針對這個問題,在mac的系統中我做出瞭如下的調整(資料夾包含部分個人資訊,已作處理):

for port in `seq 6000 6005`; do 
  docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} -v /Users/zxd/com/docker-redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /Users/zxd/com/docker-redis/${port}/data:/data  --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; 
done

​ 下面是部分的引數解釋:

#-d 後臺執行返回容器id
#-p 埠對映,注意在上面中兩個-p,前一個是啟動埠,後一個是匯流排的通訊埠
#-v 資料卷對映
#--net redis-net 自定義network(redis-net)
#--sysctl net.core.somaxconn=1024 是Linux中的一個kernel引數,表示socket監聽(listen)的backlog上限。它的主要作用是限制了接收新 TCP 連線偵聽佇列的大小。對於一個經常處理新連線的高負載 web服務環境來說,預設的 128 太小了。大多數環境這個值建議增加到 1024 或者更多
#redis redis-server /usr/local/etc/redis/redis.conf 使用配置檔案開啟一個redis服務的命令,注意這裡的redis.conf實際上會對映到不同的資料夾中的conf中執行

7. 構建redis叢集

​ 構建叢集的方式如下,驗證是否可以使用,當然這裡的/usr/local/bin使用的是對應的配置檔案存放位置。首先我們需要使用docker exec -it deb9f97f6f0a(改為你的容器ID) /bin/bash進入任意點一個docker容器,然後才能進行下面點操作。

注意需要把ip改為之前的模板配置的ip否則是無法啟動的
cd /usr/local/bin && redis-cli --cluster create 192.168.0.12:6000 192.168.0.12:6001 192.168.0.12:6002 192.168.0.12:6003 192.168.0.12:6004 ip:6005 --cluster-replicas 1

​ 然後我們執行docker ps出現如下的結果,另外這裡有可能存在由於埠沒有開放的報錯,但是由於我是本地搭建的,所以沒有出現此問題:

docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS        PORTS                                                        NAMES
deb9f97f6f0a   redis     "docker-entrypoint.s…"   33 hours ago   Up 30 hours   0.0.0.0:6005->6005/tcp, 0.0.0.0:16005->16005/tcp, 6379/tcp   redis-6005
b226de3d1fa1   redis     "docker-entrypoint.s…"   33 hours ago   Up 30 hours   0.0.0.0:6004->6004/tcp, 0.0.0.0:16004->16004/tcp, 6379/tcp   redis-6004
c805e9704a1a   redis     "docker-entrypoint.s…"   33 hours ago   Up 30 hours   0.0.0.0:6003->6003/tcp, 0.0.0.0:16003->16003/tcp, 6379/tcp   redis-6003
fbae17f03f77   redis     "docker-entrypoint.s…"   33 hours ago   Up 30 hours   0.0.0.0:6002->6002/tcp, 0.0.0.0:16002->16002/tcp, 6379/tcp   redis-6002
93e668ff8f2b   redis     "docker-entrypoint.s…"   33 hours ago   Up 30 hours   0.0.0.0:6001->6001/tcp, 0.0.0.0:16001->16001/tcp, 6379/tcp   redis-6001
9bdb2de54709   redis     "docker-entrypoint.s…"   33 hours ago   Up 30 hours   0.0.0.0:6000->6000/tcp, 0.0.0.0:16000->16000/tcp, 6379/tcp   redis-6000

8. 驗證叢集是否可用

​ 最後我們透過連線某一個節點驗證叢集是否成功可用:

​ 首先進入任意一個Redis容器內(CONTAINER ID為容器id)

docker exec -it deb9f97f6f0a(改為你的容器ID) /bin/bash

​ 然後進入 redis-cli(ip為你伺服器ip)

redis-cli -h 192.168.0.12 -p 6000

​ 檢視節點訊息

cluster nodes

​ 檢視叢集資訊

cluster info

9. 驗證叢集分佈

​ 最後是實際輸入幾條簡單的命令驗證一下是否真的可以分片並且分佈到多臺機器進行處理

​ 叢集模式連線:以下例子顯示操作正常(首先要退出當前redis-cli,然後再執行以下程式碼,ip為你伺服器ip)。

redis-cli -c -h ip -p 6000 set test 1
redis-cli -c -h ip -p 6000 get test

其他補充

關閉系統防火牆

systemctl restart firewalld

重啟docker

systemctl restart docker

寫在最後

​ 內容比較多,一次成功的機率其實並不算很高,如果有疑問歡迎評論。

相關文章