Redis優化系列(一)基于docker搭建Redis主從
一、開胃小菜(前期準備工作):
1、準備一臺Linux服務器并安裝及啟動docker 本文使用的是:CentOS 7.6 x64
2、準備一個Dockfile文件 用來構建redis鏡像,該文件我會在下面提供
Dockerfile文件:Dockerfile.zip 自行下載解壓后將文件上傳到服務器。本文將該文件上傳到服務器的路徑:/root
3、啟動系統的iptables,一般不需要更改該規則文件,如果下面步驟提示報相關網絡錯誤,上網查一下即可解決
4、本系列博文使用的redis版本:3.2.12
二、了解docker網絡模式(為接下來的主從配置搭建做準備)
Docker安裝后,默認會創建下面三種網絡類型
docker network ls 查看默認的網絡
在啟動容器時使用 --network bridge 指定網絡類型
bridge:橋接網絡
默認情況下啟動的Docker容器,都是使用 bridge,Docker安裝時創建的橋接網絡,每次Docker容器重啟時,會按照順序獲取對應的IP地址,這個就導致重啟下,Docker的IP地址就變了(橋接網絡模式也可以,就是通過端口映射訪問到容器里面的redis,不過本文選擇用下面的自定義網絡模式)
none:無指定網絡
使用 --network=none ,docker 容器就不會分配局域網的IP
host: 主機網絡
使用 --network=host,此時,Docker 容器的網絡會附屬在主機上,兩者是互通的。
例如,在容器中運行一個Web服務,監聽8080端口,則主機的8080端口就會自動映射到容器中
2.2、指定自定義網絡,設置容器的固定IP(下面的Redis主從搭建選擇用自定義網絡)
因為默認的網絡不能制定固定的地址,所以我們將創建自定義網絡,并指定網段:172.10.0.0/16 并命名為mynetwork,這里選擇了172.10.0.0/16網段,當然你也可以指定其他任意空閑的網段。將名字命名為mynetwork,你也可以換成其它的任意名字。具體創建指令如下:
#創建一個mynetwork網絡 并指定網段(子網)為:172.10.0.0/16(執行這一步,下面要用到該網絡)``docker network create --subnet=172.10.0.0``/16` `mynetwork
/偉大的分割線*****/
三、開始搭建Redis主從模式
概述:
主從復制說明,單一節點的redis(單臺服務器的redis)容易面臨的問題:
比如:**
**
1、機器故障。我們部署到一臺 Redis 服務器,當發生機器故障時,需要遷移到另外一臺服務器并且要保證數據是同步的。而數據是最重要的,如果你不在乎,基本上也就不會使用 Redis 了。
2、容量瓶頸。當我們有需求需要擴容 Redis 內存時,從 16G 的內存升到 64G,單機肯定是滿足不了。當然,你可以重新買個 128G 的新機器。
要實現分布式數據庫的更大的存儲容量和承受高并發訪問量,我們會將原來集中式數據庫的數據分別存儲到其他多個網絡節點上。
Redis 為了解決這個單一節點的問題,也會把數據復制多個副本部署到其他節點上進行復制,實現 Redis的高可用,實現對數據的冗余備份,從而保證數據和服務的高可用。
什么是主從復制?
主從復制,是指將一臺Redis服務器的數據,復制到其他的Redis服務器。前者稱為主節點(master),后者稱為從節點(slave),數據的復制是單向的,只能由主節點到從節點。**
**
默認情況下,每臺Redis服務器都是主節點,且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。也就是說一臺redis從服務只能屬于一臺redis主服務。
主從復制的作用:
主從復制的作用主要包括:
1、數據冗余:主從復制實現了數據的熱備份,是持久化之外的一種數據冗余方式。
2、故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復;實際上是一種服務的冗余。
3、負載均衡:在主從復制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis數據時應用連接主節點,讀Redis數據時應用連接從節點),分擔服務器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis服務器的并發量。
4、讀寫分離:可以用于實現讀寫分離,主庫寫、從庫讀,讀寫分離不僅可以提高服務器的負載能力,同時可根據需求的變化,改變從庫的數量;
5、高可用基石(基礎):除了上述作用以外,主從復制還是哨兵和集群能夠實施的基礎,因此說主從復制是Redis高可用的基礎。
具體操作步驟如下:
3.1、進入到root目錄下(具體換成你自己的路徑),并使用Dockerfile文件構建redis鏡像
#進入到root目錄下``cd` `/root/` `#使用Dockerfile文件構建一個redis鏡像(注意后面有一個點)``docker build -t redis .
可以使用docker images查看剛剛構建完成的redis鏡像
3.2、使用此構建生成的redis鏡像創建容器(創建2個redis容器 一主一從)
#主redis,該容器命名為redis-master 使用mynetwork網絡 端口映射6380對應容器內部端口的6379 指定容器固定IP:172.10.0.2 使用redis鏡像來生成容器并在后臺運行``docker run -itd --name redis-master --net mynetwork -p 6380:6379 --ip 172.10.0.2 redis` `#從redis,該容器命名為redis-slave 使用mynetwork網絡 端口映射6381對應容器內部端口的6379 指定容器固定IP:172.10.0.3 使用redis鏡像來生成容器并在后臺運行``docker run -itd --name redis-slave --net mynetwork -p 6381:6379 --ip 172.10.0.3 redis
可以使用docker ps 查看正在運行中的容器(查看我們上面創建的兩個一主一從的redis容器)
可以使用docker network inspect mynetwork命令查看容器的ip地址等相關信息
3.3、分別進入主redis容器和從redis容器 修改redis.conf配置文件
#1、主redis容器redis.conf配置文件改動``使用docker ``exec``命令進入容器里面:docker ``exec` `-it 你生成的主redis容器ID 或 容器名字 ``/bin/bash` `本文中的對應命令為(容器``id``方式):docker ``exec` `-it e4fbae61823b ``/bin/bash``本文中的對應命令為(容器名字方式):docker ``exec` `-it redis-master ``/bin/bash` `修改redis.conf配置文件 ``vi` `/etc/redis``.conf``#將bind 127.0.0.1注釋 或 改為bind 0.0.0.0 表示允許任何ip連接該redis服務,同時將protected-mode yes 改為 protected-mode no 表示關閉保護模式` `#2、從redis容器redis.conf配置文件改動(和主redis的改動一樣,唯一區別就是進入容器的時候,要進入從redis容器也就是容器id或容器名字不一樣了 不過還是演示下吧。。)``使用docker ``exec``命令進入容器里面:docker ``exec` `-it 你生成的從redis容器ID 或 容器名字 ``/bin/bash` `本文中的對應命令為(容器``id``方式):docker ``exec` `-it a172d66c4e4d ``/bin/bash``本文中的對應命令為(容器名字方式):docker ``exec` `-it redis-slave ``/bin/bash` `修改redis.conf配置文件 ``vi` `/etc/redis``.conf``#將bind 127.0.0.1注釋 或 改為bind 0.0.0.0 表示允許任何ip連接該redis服務,同時將protected-mode yes 改為 protected-mode no 表示關閉保護模式
redis.conf配置文件改動后的截圖如下:
3.4、啟用主從模式(有三種方式):
(1)redis.conf配置文件(本文使用這種方式)
在從服務器的配置文件中加入:slaveof
(2)啟動命令
redis-server啟動命令后加入 --slaveof
(3)客戶端命令
Redis服務器啟動后,直接通過客戶端執行命令:slaveof
通過 info replication 命令可以看到復制的一些參數信息
3.5、從redis容器中的redis.conf的redis配置文件加入配置信息,完成主從同步(別忘了 你要進入從redis容器里面)
vi` `/etc/redis``.conf` `將 ``# slaveof
從redis容器的里的redis.conf配置文件更改后的截圖如下:
3.6、分別啟動主從redis容器里面的redis服務(再次提醒。。別忘了進入主從redis容器里面啟動)
#主從redis容器里面啟動redis服務都用以下這個命令即可``redis-server ``/etc/redis``.conf & ``#啟動redis服務 &表示以后臺守護進程方式啟動(就是啟動了后 在后臺默默的服務)
3.7、測試主從同步是否搭建成功(提醒啊。。別忘了進入主從redis容器里面進行操作。。真是操碎了心。。)
3.7.1、主redis容器操作:
redis-cli ``#進入redis客戶端``set` `wzyl 123 ``#創建一個key
3.7.2、從redis容器操作:
redis-cli ``#進入redis客戶端` `使用get命令:get wzyl 或 使用keys命令:keys *
注:上面的keys * 命令不建議使用,除非你redis里面沒有多少數據你可以使用keys * 命令,如果redis里面有很多數據 使用keys * 的話,會很慢。。會造成redis堵塞的。。
至此。。redis主從搭建成功。。往redis主節點寫數據的時候,會自動同步到配置的redis從節點里(同步會有延時,因為需要用到網絡,1秒鐘之內會完成同步,大概也就幾百毫秒的樣子就可以了)實現了redis的讀寫分離。。這樣寫的操作可以寫到主redis節點,讀的操作可以讀取從redis節點。。PS:一主一從搭建完了,一主多從應該也會了吧。。舉一反三啊。。基于docker搭建redis主從都會了。。直接基于每一臺服務器搭建redis主從就更簡單了吧。。
3.8、使用RedisDesktopManager工具來連接到docker里面的redis(我們就鏈接主redis這個容器里的redis吧)
119.3.220.26是我服務器的公網IP,記得換成你自己服務器的公網IP,6380是我在上面創建主redis容器的時候指定的6380端口,實際上鏈接的時候會自動將6380映射成6379。。別直接上來就復制粘貼最后一點擊測試發現各種error。。
3.9、主從結構還有一種叫:樹狀主從結構
樹狀主從結構:就是從節點它不但可以復制我們的主節點的數據,它同時也可以做為其它從節點的主節點,繼續向下復制。說白了就是主節點有從節點,但是從節點還有從節點**
**
那這種樹狀主從結構是為了解決什么問題?
主要就是避免主節點同步壓力過大,造成性能干擾
樹狀主從結構示例圖如下:
四、后記、尾聲
本文中沒有設置redis密碼,你可以在配置文件中進行設置,如果設置了驗證密碼,那么從redis節點中的配置文件中也要找到對應的密碼位置進行修改才能主從同步成功,在生產環境中不建議將protected-mode yes 改為 no 并且會設置redis密碼。。本文為了操作簡單就沒有設置密碼這一步。
總結redis主從、哨兵、集群的概念:
【redis主從】:
是備份關系, 我們操作主庫,數據也會同步到從庫。 如果主庫機器壞了,從庫可以上。就好比你 D盤的片丟了,但是你移動硬盤里邊備份有。
【redis哨兵】:
哨兵保證的是HA(高可用),保證特殊情況故障自動切換,哨兵盯著你的“redis主從集群”,如果主庫死了,它會告訴你新的老大是誰。
哨兵:主要針對redis主從中的某一個單節點故障后,無法自動恢復的解決方案。(哨兵 保證redis主從的高可用)
【redis集群】:
集群保證的是高并發,因為多了一些兄弟幫忙一起扛。同時集群會導致數據的分散,整個redis集群會分成一堆數據槽,即不同的key會放到不不同的槽中。
集群主要針對單節點容量、高并發問題、線性可擴展性的解決方案。
集群:是為了解決redis主從復制中 單機內存上限和并發問題,假如你現在的服務器內存為256GB,當達到這個內存時redis就沒辦法再提供服務,同時數據量能達到這個地步寫數據量也會很大,容易造成緩沖區溢出,造成從節點無限的進行全量復制導致主從無法正常工作。
Docker Redis 容器
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。