歡迎關注劉哥講技術。上一節我們講到通過docker安裝了多臺的mysql,很簡單,那麼我們這一節,利用 Docker 在一臺機器上部署多個 Redis 實例。
那麼redis是什麼呢?Redis 是一個開源的使用 ANSI C 語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value 的 NoSQL 數據庫,並提供多種語言的 API。
現在分佈式緩存首選的應用,面試也基本離不開它,一起來學習學習它吧。
一、單機版本Redis
- 1、查看可用的 Redis 版本
訪問 Redis 鏡像庫地址:
<code>https://hub.docker.com/_/redis/<code>
此外,我們還可以用命令來查看可用版本。
<code> docker search redis/<code>
- 2、取最新版的 Redis 鏡像
這裡我們獲取官方的默認的鏡像:
<code>docker pull redis/<code>
- 3、查看本地鏡像
使用以下命令來查看是否已安裝了 redis。
<code>docker images/<code>
- 4、運行容器
安裝完成後,我們可以使用以下命令來運行 redis 容器
(1)創建掛載目錄
創建一個文件夾用來存放redis的配置文件、數據等(也就是所謂的掛載目錄,作用就是將此目錄中的文件或文件夾覆蓋掉容器內部的文件或文件夾)
<code>mkdir -p $HOME/docker/redis/<code>
(2)進入到該目錄下
<code>cd $HOME/docker/redis/<code>
(3)啟動redis容器
<code>docker run -d -p 6379:6379 -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf -v $PWD/data:/data --name myredis redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes --requirepass "123456"/<code>
參數詳解:
- -d:表示後臺運行
- -p:表示端口映射,冒號左面的是我們的宿主機的端口,也就是我們虛擬機的端口
- --name:給容器取的名字
- -v:表示掛載路徑。
- redis-server --appendonly yes :在容器執行redis-server啟動命令,並打開redis持久化配置
- --requirepass 設置redis密碼
(4)檢測是否安裝成功
最後我們可以通過 docker ps 命令查看容器的運行信息
<code>docker ps/<code>
(5)查看容器的ip
如果沒有指定容器內的ip,每次啟動有可能都是會變化的。如果沒有指定,那麼我們可以通過以下命令來查看ip,然後登陸:
<code>docker inspect myredis | grep IPAddress/<code>
我電腦分配的ip為:
<code>"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",/<code>
(6)測試使用redis 服務
可以通過以下連接命令進行連接。
<code>不帶密碼版本,命令窗口再輸入
docker exec -ti myredis redis-cli -h 172.17.0.2 -p 6379 -a 123456
帶密碼版本,不用再輸入密碼
docker exec -ti myredis redis-cli -h 172.17.0.2 -p 6379 -a 123456
/<code>
說明:
- myredis 你設置的容器名字。
- 默認是通過6379端口
- 默認ip為:127.0.0.1
- 一般需要指定獲取的ip地址。
(7)測試過程
我這裡先通過密碼框登陸
<code>docker exec -ti myredis redis-cli -h 172.17.0.2 -p 6379/<code>
首先獲取一下值,看看是否可以使用,發現提示未認證:(error) NOAUTH Authentication required.
<code>get myname/<code>
先輸入錯誤的密碼,進行驗證,發現提示密碼錯誤:(error) NOAUTH Authentication required.
<code>auth 12345/<code>
我們再輸入正確的密碼,提示ok即可
<code>auth 123456/<code>
再次獲取值,發現redis存儲為空:(nil)
<code>get myname/<code>
對name值進行設置
<code>set myname liuge/<code>
獲取name值
<code>get myname/<code>
我們可以通過redis desktop manager 進行連接進行查看。Redis桌面管理器(又名RDM) 是一個用於Windows,Linux和MacOS的快速開源Redis數據庫管理應用程序。當然你也可以通過以下方式連接測試:RedisView、WebRedisManager、RedisDesktopManager、RedisPlus、AnotherRedisDesktopManager、FastoRedis。
小結:
如果你是簡單實用,那麼上面就能滿足日常測試,學習redis命令等應用了。
但是,有時候還需要另外一臺作為比較正式或者其他用,還是需要再搭建一臺。
在windows那時候,我是通過修改配置文件,然後通過啟動腳本,重新啟動一份,比較折騰,有了docker,這個比較好解決。
如果有這個需求,可以接下來的教程。
二、多臺Redis共存的情況
(1)創建掛在目錄
data存放數據,conf存放配置文件。
<code>mkdir -p $HOME/docker/redis2/<code>
(2)進入該目錄
<code>cd $HOME/docker/redis2/<code>
(3)啟動redis容器
<code>docker run -d -p 6388:6379 -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf -v $PWD/data:/data --name myredis2 redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes --requirepass "redispassword"/<code>
(4)檢測是否安裝成功
最後我們可以通過 docker ps 命令查看容器的運行信息
<code>docker ps/<code>
(5)查看容器的ip
<code>docker inspect myredis2 | grep IPAddress/<code>
目前電腦的redis的ip為
<code>"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.4",
"IPAddress": "172.17.0.4",/<code>
(6)測試使用redis 服務
可以通過以下連接命令進行連接,myredis你設置的容器名字。
<code>docker exec -it myredis2 redis-cli/<code>
輸入密碼
<code>docker exec -it myredis2 redis-cli/<code>
三、搭建Redis集群
對於大多數中小公司來說,通常單機的Redis已經足夠,最多根據不同業務分散到多臺Redis。
為什麼需要集群呢?
- Redis單線程特性,多請求順序執行,單個耗時的操作會阻塞後續的操作
- 單機內存有限
- 某些特殊業務,帶寬壓力較大
- 單點問題,缺乏高可用性
- 不能動態擴容
- Redis集群的目標就是為了實現高可用性,避免性能瓶頸,可動態擴容,易於做監控告警。
那麼接下來,我們看下如何進行安裝。
我這裡是通過一個比較快捷的方案,是一個開源的redis集群鏡像來搭建。
集群是6個Redis實例,其中運行3個主節點和3個從節點,每個主節點一個從節點。它們在端口7000到7005上運行。接下來我們看看如何搭建:
鏡像地址
<code>源碼
https://github.com/Grokzen/docker-redis-cluster
倉庫地址
https://hub.docker.com/r/grokzen/redis-cluster//<code>
拉取鏡像
<code>docker pull grokzen/redis-cluster/<code>
通過這個鏡像可以快速輕鬆地啟動和運行Redis集群,用於演示/演示/開發。注意生產環境沒經過嚴格驗證,還不推薦直接使用。
<code>docker run -e "IP=0.0.0.0" -e STANDALONE=true -e SENTINEL=true -d grokzen/redis-cluster:latest/<code>
參數說明
- -e "IP=0.0.0.0" 將內部IP環境變量添加到docker run命令中。使用此容器在Mac計算機上運行Redis集群,則需要將容器配置為使用另一個IP地址進行集群發現,因為它無法使用硬編碼到容器中的默認發現IP。
- -e SENTINEL=true 默認情況下,未啟用Sentinel實例。表示啟用哨兵實例。如果-e "STANDALONE=true"通過該標誌,則默認情況下在端口7006和7007上運行2個獨立實例。但是,您可以將此變量設置為所需的多個獨立節點,例如-e "STANDALONE=1"。請注意,獨立端口在最後一個從屬設備之後立即啟動。如果-e "SENTINEL=true"傳遞了該標誌,則在與群集的主實例匹配的端口5000到5002上運行3個Sentinel節點。
查看容器的ip
<code>docker inspect distracted_wing | grep IPAddress/<code>
測試
<code>docker exec -ti distracted_wing redis-cli -p 7000/<code>
(error) MOVED 原因和解決方案
錯誤:
<code>(error) MOVED 6918 127.0.0.1:7001/<code>
這種情況一般是因為redis-cli連接redis服務時候,沒有指定是集群模式連接。啟動時使用-c參數來啟動集群模式,命令如下:
<code>docker exec -ti distracted_wing redis-cli -c -p 7000/<code>
查看集群信息
<code>cluster info/<code>
查看節點信息
<code>cluster nodes/<code>
後面有時間再分享,如何通過redis源碼自己構建一個docker redis 集群鏡像。
閱讀更多
閱讀更多 大劉哥聊技術 的文章