三臺機器使用Docker部署Redis集群方式
三臺機器使用Docker部署Redis集群
我們這里采用Docker在三臺服務(wù)器上面進(jìn)行Redis集群的搭建,它方便快捷、容易上手。
1.集群原理
在Redis集群中,所以的節(jié)點彼此關(guān)聯(lián),節(jié)點內(nèi)部通過二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬。當(dāng)一個節(jié)點掛掉后,集群超過半數(shù)的節(jié)點檢查失效時該節(jié)點才會被認(rèn)為掛掉。所以基于以上的情況,節(jié)點的數(shù)量一般都是奇數(shù)。一般為了保證安全性,每個節(jié)點由一個備份節(jié)點。所以最小的集群主節(jié)點的個數(shù)最少為3,從節(jié)點的個數(shù)也為3.這樣一個集群最少需要6個節(jié)點。在做集群規(guī)劃的時候特別需要注意這點。
Redis集群中內(nèi)置了16384個哈希槽,當(dāng)需要在Redis集群中存放一個key/value鍵值對的時候,redis會有一個算法,先把key使用CRC16算法計算一個結(jié)果,然后把結(jié)果對16384求余數(shù),這樣每個key都會對于一個編號在0-16383之間的哈希槽,redis會根據(jù)節(jié)點數(shù)量大致的均衡的將哈希槽映射到不同的節(jié)點。需要注意的是每個哈希槽存儲的數(shù)據(jù)個數(shù)不做限制。
2.集群規(guī)劃
三臺宿主機的IP和redis節(jié)點規(guī)劃:
宿主機器IP | redis節(jié)點規(guī)劃 | redis節(jié)點規(guī)劃 |
---|---|---|
172.15.1.11 | 172.15.1.11:7801 | 172.15.1.11:7804 |
172.15.1.12 | 172.15.1.12:7802 | 172.15.1.12:7805 |
172.15.1.13 | 172.15.1.13:7800 | 172.15.1.13:7803 |
3.集群部署
集群的部署采用Linux Shell腳本的方式,步驟如下
A、創(chuàng)建模板文件
登錄三臺機器,在home目錄下創(chuàng)建redis-cluster文件夾,編寫文件redis-cluster.tmpl,文件的作用是用來創(chuàng)建Redis配置文件的模板文件。
port ${PORT} protected-mode no cluster-enabled yes cluster-config-file redis.conf cluster-node-timeout 5000 cluster-announce-ip 172.15.1.11 #另外兩臺ip分別為172.15.1.12、172.15.1.13 cluster-announce-port ${PORT} cluster-announce-bus-port 1${PORT} appendonly yes
- port ${PORT}: 是自定義端口號
- protected-mode no:是關(guān)閉保護(hù)模式,否則可能造成無法通過公網(wǎng)訪問。
- cluster-enabled yes:啟動集群。必須配置為yes
- cluster-config-file redis.conf:集群節(jié)點配置文件的名字,一般我們都會取名redis.conf
- cluster-node-timeout 5000:超時時間,單位是毫秒
- cluster-announce-ip 172.15.1.11:集群宿主機IP
- cluster-announce-port ${PORT}:節(jié)點映射端口
- cluster-announce-bus-port 1${PORT}:節(jié)點總線端口
- appendonly yes:開啟持久化模式
B、自定義網(wǎng)絡(luò)
所有節(jié)點在一個網(wǎng)絡(luò)中,方便通信。
在Docker中創(chuàng)建網(wǎng)絡(luò)。(三臺機器在docker swarm集群,創(chuàng)建overlay網(wǎng)絡(luò))
docker network create -d overlay --attachable redis_net
C、創(chuàng)建配置生成腳本
在三臺機器/home/redis-cluster下生成conf和data目錄,并生成配置信息。
這里編寫一個Linux Shell腳本createFilePath.sh。
注意要進(jìn)行授權(quán),否則腳本運行。
for port in 7801 7804 #另外兩臺的port分別修改為7802 7805、7800 7803 do mkdir -p ./${port}/conf \ && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \ && mkdir -p ./${port}/data; \ done
給大家解讀一下腳本內(nèi)容,for循環(huán)2次,每次循環(huán)存儲變量到port變量。然后循環(huán)創(chuàng)建目錄,命令是mkdir -p ./{port}/conf\,意思是在當(dāng)前目錄下面以端口后為目錄名,下面創(chuàng)建子目錄conf.后面的\是連接符,表示連接后面的語句。
PORT=${port} envsubst < ./redis-cluster.tmpl >意思是將循環(huán)變量port的值復(fù)制給PORT,envsubst 是賦值給文件redis-cluster.tmpl.然后將該文件復(fù)制到端口號目錄\conf文件夾中,名字是redis.conf; mkdir -p ./${port}/data; 表示繼續(xù)創(chuàng)建在端口目錄\data目錄。
D、執(zhí)行創(chuàng)建配置生成腳本
授權(quán)createFilePath.sh。讓該文件具備可執(zhí)行權(quán)限,并執(zhí)行該文件
chmod +x ./createFilePath.sh ./createFilePath.sh
在三臺機器共生成6個文件夾,從7800到7805,每個文件夾下包含data和conf文件夾,同時conf里面有redis.conf配置文件。
E、創(chuàng)建容器生成腳本
在三臺機器編寫創(chuàng)建Redis容器的腳本createRedisContainer.sh。
current_dir=`pwd` for port in 7801 7804 #另外兩臺的port分別修改為7802 7805、7800 7803 do docker run -dit -p ${port}:${port} -p 1${port}:1${port} \ --privileged=true -v $current_dir/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \ --privileged=true -v $current_dir/${port}/data:/data \ --restart always --name redis-${port} --net redis_net \ --sysctl net.core.somaxconn=1024 redis:5.0.5 redis-server /usr/local/etc/redis/redis.conf done
- docker run -dit -p ${port}: ${port} -p 1${port}:1${port},意思是啟動容器.-d表示后臺啟動;-i 表示開啟交互模式。-t表示偽終端。這三個參數(shù)可以簡寫成-dit。${port}: ${port}表示把宿主機端口映射到容器端口。1${port}:1${port} 表示把宿主機和容器的總線端口映射。
- –privileged=true -v $current_dir/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf,privileged意思是授權(quán),-v表示容器掛載,把宿主機/home/redis-cluster/${port}/conf/目錄下的redis.conf文件掛載到容器內(nèi)部的/usr/local/etc/redis的目錄中,在容器內(nèi)部的配置文件名為redis.conf。
- –privileged=true -v $current_dir/${port}/data:/data,同樣授權(quán)將宿主機data目錄掛載到容器的data目錄。
- –restart always:表示Docker重啟時,容器自動重啟。
- –name redis-${port} 表示容器的自定的容器名字是redis-端口號
- –net redis_net:表示容器工作的網(wǎng)絡(luò)是redis_net
- –sysctl net.core.somaxconn=1024表示修改somaxconn的值,內(nèi)核大小為1024M,一把來說負(fù)載很大的程序的時候,往往由于內(nèi)存不夠,會啟動失敗。
- redis:5.0.5表示鏡像的版本。至此容器創(chuàng)建完畢。
- redis-server /usr/local/etc/redis/redis.conf表示啟動Redis服務(wù)端。必須指定配置文件。
F、執(zhí)行容器生成腳本
授權(quán)createFilePath.sh。讓該文件具備可執(zhí)行權(quán)限,并執(zhí)行該文件
chmod +x ./createRedisContainer.sh ./createRedisContainer.sh
在三臺機器共生成6個容器,redis-7800到redis-7805,
使用命令來確認(rèn):
docker ps -a|grep redis-780
G、配置redis集群
任意進(jìn)入一個節(jié)點,并啟動集群。注意redis容器啟動,并不代表集群啟動。
docker exec -it redis-7801 bash redis-cli --cluster create 172.15.1.13:7800 172.15.1.11:7801 172.15.1.12:7802 172.15.1.13:7803 172.15.1.11:7804 172.15.1.12:7805 --cluster-replicas
至此集群搭建完畢。
4.集群檢測
驗證集群狀態(tài),進(jìn)入容器內(nèi)部,執(zhí)行
docker exec -it redis-7801 bash redis-cli -c -p 7801 info replication cluster nodes cluster info
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker images導(dǎo)出和導(dǎo)入操作
這篇文章主要介紹了Docker images導(dǎo)出和導(dǎo)入操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Docker安裝Tomcat、MySQL和Redis的步驟詳解
這篇文章主要介紹了Docker安裝Tomcat、MySQL和Redis的步驟詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11MacOS使用Docker創(chuàng)建MySQL主從數(shù)據(jù)庫的方法
這篇文章主要介紹了MacOS使用Docker創(chuàng)建MySQL主從數(shù)據(jù)庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12Docker為網(wǎng)絡(luò)bridge模式指定容器ip的方法
Docker在創(chuàng)建容器時有四種網(wǎng)絡(luò)模式,bridge為默認(rèn)不需要用--net去指定,其他三種模式需要在創(chuàng)建容器時使用--net去指定。那Docker為網(wǎng)絡(luò)bridge模式指定容器ip該如何實現(xiàn)呢?下面通過通過這篇文章一起看看吧,文中給出了詳細(xì)的示例代碼,有需要的可以參考借鑒。2016-11-11