上一節課介紹了docker中指令的概念和使用方法,本節課我們將正式開始用docker來搭建redis的集群,在本
機課中有些理論知識都會講解,希望大家能吸收,相信對一個技術的運用永遠不要只建立在「會「,要理解怎麼回
事才是關鍵。因為多問自己一個為什麼才能更好地提升自己。

1、redis的集群方式有哪些?

  • 主從複製
  • 哨兵集群
  • redis-cluster集群

本節課我們主要講解主從複製,現在大家手上是否有一台屬於自己的雲伺服器了呢,今天我們要做的就是在雲伺服器上搭建我們的第一個集群主從複製。

在講之前,首先我們來了解下為什麼要用集群模式以及集群模式的優點、給我們的項目帶來了哪些重要的特性。

1、為什麼要是使用redis集群模式?

答:Redis是內存資料庫,因此它的讀取速度相比MySql等把數據存儲在真實的硬碟里要快的多,同時Redis也是最好的Cache工具,在大型網站中熱點數據量的請求【秒殺、雙十一】等等都是非常巨大的,而正常情況下數據存儲量的大小不能超過主機的內存,進而在這種高訪問量也就是我們經常談起的高並發場景時很容易照成數據的溢出至瓶頸受到限制,對於大型網站來說這是非常致命的。顯然單機就無法滿足我們的業務需求了。反之如果你的網站每天的pv量也就幾百、幾千、幾萬的話也就沒有必要做集群,因為沒有意義反而也是一種浪費,單機模式足夠了。

2、什麼是主從複製?

答:就是指將一台Redis伺服器的數據,複製到其他的Redis伺服器。前者稱為主節點(master),後者稱為從節點(slave),數據的複製是單向的,只能由主節點到從節點。默認情況下,每台Redis伺服器都是主節點,且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。給大家畫個圖來理解下:

3、主從複製有什麼作用?

答:①:數據冗餘:主從複製實現了數據的熱備份,是持久化之外的一種數據冗餘方式。

②:故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復;實際上是一種服務的冗餘。換句話說就是主伺服器掛掉了,從伺服器頂上去。

③:負載均衡:在主從複製的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis數據時應用連接主節點,讀Redis數據時應用連接從節點),分擔伺服器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis伺服器的並發量。

說到這裡,大家對集群應該有比較深刻的了解了那麼我們就來開始動手搭建吧【這裡我會一步步的分享給大家】

如果有大牛在這裡看到以下比較啰嗦的講解,希望理解。因為每個想學的人,基礎是不一樣的,能把最好的容易理解的東西獻給大家,是我的榮幸。謝謝各位的捧場。大家關注我的專欄後面會有很多精彩的內容等著大家,分享給你們。

話不多說開始進入我們的正題:

準備工作:

只要一台伺服器【僅此而已就這麼簡單】。

是不是有人會疑問:不是說主從嗎?怎麼就用一台伺服器啊?是的,我們是用來學習的要那麼多的伺服器幹嘛呢,我們用Docker來部署Redis的主從,讓大家充分理解Docker的魅力,從此讓你走上Docker的不尋常之路。

2、動起手來跟著我一起做【不要偷懶只會複製哦】

我們開始。。。

1、主從複製節點規劃->搭建一主三從

容器名稱 容器IP地址 映射埠號 服務運行模式
Redis-master 172.60.0.2 6382 -> 6379 Master
Redis-slave3 172.60.0.3 6383 -> 6379 Slave3
Redis-slave4 172.60.0.4 6384 -> 6379 Slave4
Redis-slave5 172.60.0.5 6385 -> 6379 Slave5

2、配置容器網路

為什麼要配置容器網路呢?

答:這裡我們用的一台伺服器做模擬集群,所以我們用埠映射的方法來實現集群的部署也就是「橋接網路」,一定要理解容器和宿主機的關係,宿主機簡單理解就是你這台主伺服器,主伺服器與內部里容器之間是相互獨立的,我們繼續往下講解,後面會結合結構圖來深化大家對容器網路的認識。

明白了以後,再給大家普及下網路的類型:(這裡做過虛擬機搭建的會比較屬性)

執行命令docker network ls不難發現,docker 有三種網路類型

①bridge:橋接網路,默認情況下啟動的Docker容器,都是使用 bridge,Docker安裝時創建的橋接網路,每次Docker容器重啟時,會按照順序獲取對應的IP地址,這個就導致重啟下,Docker的IP地址就變了

②host:主機網路,使用 --network=host,此時,Docker 容器的網路會附屬在主機上,兩者是互通的。在容器中運行一個Web服務,監聽8080埠,則主機的8080埠就會自動映射到容器中,因為容器的埠與宿主機的埠相同時,則宿主機的該埠就會被佔用,那麼宿主機的該埠就不能再使用了,是比較噁心的,但是有另外的一個好處就是客戶端可以直接通過宿主機的ip訪問到我們的容器。這裡我們來看一張圖片來更好地理解bridge和host兩個網路

③none:無指定網路,使用 --network=none ,docker 容器就不會分配區域網的IP

3、指定自定義網路

為什麼要採用自定義網路?

答:前面剛解釋過,因為我們將採用橋接的網路來配置我們的容器,如果不指定,一但容器重啟ip地址就會改變,直接導致我們的構建的容器網路失效。

4、接下里我們開始創建屬於我們自己的網路。

執行下面的命令開始創建:
[root@instance-rttngj1u ~]# docker network create --subnet=172.60.0.0/16 mynetwork
創建完成以後執行下面的命令查看mynetwork網路是否已經創建成功
[root@instance-rttngj1u ~]# docker network ls

5、創建Dockerfile

為什麼要創建Dockerfile?

答:Dockerfile是創建鏡像的基礎,有了鏡像我們方可構建容器。這個上節課中已經講解了十六個基本指令的使用了,如有不了解的可以查看上一節課的內容。

這裡我們單獨創建個目錄結構來存放Dockerfile文件
[root@instance-rttngj1u ~]# mkdir -p /usr/docker
進入到docker目錄創建Dockerfile
[root@instance-rttngj1u docker]# touch Dockerfile
對Dockerfile進行編輯模式vi或vim
FROM centos:latest
#基於最新的鏡像centos
MAINTAINER logic
#構建該鏡像的作者
RUN groupadd -r redis && useradd -r -g redis redis
#添加redis用戶和用戶組
RUN yum -y update && yum -y install epel-release && yum -y install redis && yum -y install net-tools
#更新yum源 && 安裝Linux的epel的yum源的命令 && 安裝redis && 安裝工具
EXPOSE 6379
#定義埠

Dockerfile的內容如下

注意:開始構建redis鏡像(還記得上節課說的嗎?一定要保證Dockerfile上下文的乾淨,不要構建一個臃腫的鏡像)

開始創建我們的鏡像文件:
[root@instance-rttngj1u docker]# docker build -t redis .
注意:這個點,這個點很重要表示的是上下文關係且與redis中間有個空格,
構建完成之後
執行命令下面的命令查看我們剛剛構建的鏡像
[root@instance-rttngj1u docker]# docker images -a
好了我們的第一個redis鏡像這麼簡單的構建成功了。
緊接著開始配置我們的主從集群就是我們的容器
回看我們剛剛準備的主從節點
主節點:(redis-master)
[root@instance-rttngj1u docker]# docker run -itd --name redis-master --net mynetwork -p 6382:6379 --ip 172.60.0.2 redis
三個從節點:(redis-slave)
從節點我們注重標識比如redis-slave3===>6383:6379===>172.60.0.3
[root@instance-rttngj1u docker]# docker run -itd --name redis-slave3 --net mynetwork -p 6383:6379 --ip 172.60.0.3 redis
[root@instance-rttngj1u docker]# docker run -itd --name redis-slave4 --net mynetwork -p 6384:6379 --ip 172.60.0.4 redis
[root@instance-rttngj1u docker]# docker run -itd --name redis-slave5 --net mynetwork -p 6385:6379 --ip 172.60.0.5 redis
然後執行查詢容器命令
[root@instance-rttngj1u docker]# docker ps -a
結果如下圖:

這裡給大家普及講解下各個參數的使用說明:

-d: 後台運行容器,並返回容器ID;
-i: 以交互模式運行容器,通常與 -t 同時使用;
-p: 埠映射,格式為:主機(宿主)埠:容器埠
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
--ip: 為容器制定一個固定的ip
--net: 指定網路模式

參考文獻:

Docker run 命令 | 菜鳥教程?

www.runoob.com

6、開始配置主從複製並啟用

執行啟動容器的命令
[root@instance-rttngj1u docker]# docker exec -it redis-master bash
注意當執行該命令後這就會發生改變是因為我們現在所進入的主題是容器而不是當前的宿主機了如下圖

:繼續配置主節點master的redis的配置
1、修改ip的監聽模式:
大概在61行改寫成
bind 0.0.0.0 目的允許所有的ip都能訪問,因為我們要主節點和從節點不是同一個ip
2、修改redis的保護模式:
大概在80行改寫成proctected-mode no
這樣做的目的是允許我們在連接時就不用輸入密碼了,就可以直接訪問了,畢竟我們是用來做測試的,不是生成
環境,所以這裡就無所謂了,但是生成環境的話 必須是為yes的
好了然後我們就可以保存退出了
3、修改三個從節點的redis配置(同樣先進入容器)
同樣分別進入三個從節點的容器中,改寫綁定的埠為bind 0.0.0.0,關閉redis的保護模式
關鍵的一點來了265行
修改 slaveof <masterip> <masterport>為slaveof <主節點ip> <主節點埠>
那麼三個從節點分別在相應的redis.conf里修改為:
slaveof 172.60.0.2 6379
保存退出,下面就開始見證奇蹟的時刻
分別進入各自的容器並啟動redis的客戶端進入客戶端的命令如下:
[root@90e5a51dda7f /]# redis-server /etc/redis.conf &
[root@90e5a51dda7f /]# redis-cli
127.0.0.1:6379>
這樣就成功啟動redis里
接下來我們在master節點上存一個數據試試,然後看從節點是否能讀取到
①、執行命令:
127.0.0.1:6379> set try success
②、在從節點執行獲取命令
127.0.0.1:6379> get try
結論:如果能獲取到值說明你成功了,或則就是你的配置有問題

下面是我本人演示的一段結果視頻:

視頻封面

01:59docker部署redis主從集群

好了今天的課程就到這了,有興趣的朋友請關注我的專欄--->謝謝各位的支持,

在這裡我要感謝我的老婆鼓勵我要這裡分享技術給大家,希望能幫助想學、愛學的人。下節課也就是本節課的下篇,給大家講講主從中會出現的一些問題和常規解決方法。這裡大家放心,過程都是我先做完,然後總結成文章 發布在知乎里,請大家放心質量,如果你們有什麼問題歡迎各位添加評論,我會給大家解答,如果不能及時解答也請諒解,不要私信,因為你的問題其他人可能也想問或他人也出現過,把問題放在評論討論區,其他讓也能看到,也是對其他人的一種幫助。謝謝。

最後,請大家關注我的專欄

感謝知乎平台給他家分享技術

感謝老婆的一直堅持讓我寫文章【做程序開發的不簡單!】

感謝大家的支持,謝謝。

我們下節課見。


推薦閱讀:
相关文章