Redis 是咱們目前大規模使用的緩存中間件,因爲它強大高效而又便捷的功能,獲得了普遍的使用。單節點的Redis已經就達到了很高的性能,爲了提升可用性咱們可使用Redis集羣。 固然了,如今集羣的方式有不少,隧道模式(還有更高級的虛擬隧道模式)、行星模型、智能路由、P2P模式,各類各樣的,算是各有各的好處吧,也有官方給了一種cluster工具,不過本文不用官方的,由於他的官方的這個是在一個服務器上折騰。。。一臺機器死了,直接全崩,有點不必,本文主要講 主從模式的redis.node
分佈式 - linux
內存數據存儲 - noSQLredis
請求、數據、計算分散出去數據庫
好比有十我的,一人負責一種數據,如今有一堆數據在等着,數據末尾是1的找第一我的,數據末尾是2的找第二我的。。。提及來很簡單,可是這個怎麼分散,以及分散以後萬一有人掛了備份怎麼備,怎麼找,備份機器也掛了該怎麼辦,學文仍是不少的。vim
本文須要用到至少三個服務器最好是四個,由於一臺單獨的機器去控制方便查看,你們請自行配好防火牆網關等配置且克隆,若是遇到問題可留言緩存
如今完這些後在服務器中先打開剛剛解壓的redis文件: bash
cd redis-5.0.5
複製代碼
而後能夠ls看一下里面的目錄,有一個deps文件夾,也打開它:服務器
cd deps
複製代碼
接下來我們就能夠make了,編譯redis裏的幾個模塊,它裏面有四大模塊,接下來還有另外一件事,就是把這些編譯好的模塊組裝成程序。在linux下不少東西都是這樣,先編譯再組裝,不少玩法。微信
make hiredis jemalloc linenoise lua
複製代碼
安裝markdown
make install
複製代碼
systemctl enable redis_port
前面說了分佈式的原理,這裏說一下,集羣和分佈式基本上是一個意思,可是集羣能夠表明除分佈式之外的意思。
還拿以前分佈式的例子來講,好比如今有三個服務,我須要 set 'name' 'aaa'
或者是 get name
這樣一個操做,他會拿着你這個 key
,也就是例子說的 name
,去計算一個所謂的 crc
。 crc
是所謂的 循環冗餘校驗
是一種數據裏經常使用的一種專門作散列、哈希的方法。說白了就是吧這個key轉換成一個數字,轉成一個數字以後會去%一個數,這個是redis本身定的,反正就是可能會有餘數,好比%完以後是0的,找第0個服務,1的是第一個服務,大概是這意思。
並且,還有一個很重要的一點,就是備份,若是其中的一個掛了,服務要馬上去找別的機器上的這個服務,並且要交叉着備,全放在一個裏也跟沒作同樣。
這種方案基本上能解決99%的錯誤了,由於硬件不可能常常壞,若是要99.999%,那可能就須要兩套交叉備份方案,看我的需求。
我們這邊講的主要是主從服務。好比說一臺服務器裏,開了兩個,一個是主服務,一個是從服務,若是服務器掛了那確定兩個一塊死,若是是主服務死了,那個從服務會立馬跟上,變成主服務,過一會剛纔死的主服務恢復了又回變成從服務,而後他繼續運行。
再次強調一下,配集羣前最好準備四臺虛擬機,最好網卡配上static,要否則每次重啓會很抓狂
redis集羣我比較喜歡手動配置,由於官方提供了一個一鍵配置的方法,可是它有個要求,這個集羣必須工做在一臺服務器上,這。。。純屬字就給本身找事兒幹。直接開個進程完事兒了
而後先在一臺機器上建一個配置文件,名字隨便取,我比較喜歡叫 redis.conf
vim redis.conf
複製代碼
redis.conf
#端口7000
port 7000
#關閉保護模式——不帶密碼啓動
protected-mode no
#集羣特性啓用
cluster-enabled yes
#存儲節點信息配置文件——全部節點會互相同步
cluster-config-file nodes.conf
#存活時間——超過5s沒有心跳自動刪除節點並廣播
cluster-node-timeout 5000
#只追加,不刪除
appendonly yes
複製代碼
接下來,我們就能夠直接按着我們的配置跑一下redis試一,直接
redis-server ./redis.conf
複製代碼
若是沒問題的話,你會看到這個頁面 剛纔我們說了我們的模式是是主從模式,有了一個主節點以後,還須要一個從節點,直接
cp redis.conf redis2.conf
複製代碼
而後把 redis2.conf
裏的端口改一下,改爲你心動的那個數字,還有就是 cluster-config-file
這個配置文件也換一個名字,要否則啓動的時候就報錯了
接下來,就是scp 把這個 redis.conf
以及 redis2.conf
分別傳到另外克隆的兩臺虛擬機上,這裏就很少介紹了。 scp 本地文件路徑 遠程用戶@服務器地址:對方服務器路徑
最後的最後,就是啓動我們的集羣了
順便一說,若是走到這一步了你尚未開防火牆的話,而且沒注意到我這句話你就要無比的酸爽了,由於意味着上邊一半的步驟你要刪了重來
直接每臺服務器來一句
firewall-cmd --add-port=7000/tcp --permanent
firewall-cmd --add-port=17000/tcp --permanent
複製代碼
爲何開兩個端口呢,由於redis定的。。。。 一個是你本身指定的,好比說7000,另外一個就是你的數+ 10000 7000 是負責數據通訊的 17000 專門來作命令通訊的,走redis本身的一套協議
redis-cli --cluster create 192.168.181.130:7000 192.168.181.130:7001 192.168.181.131:7000 192.168.181.131:7001 192.168.181.132:7000 192.168.181.132:7001 --cluster-replicas 1
複製代碼
--cluster 集羣配置 create 建立 --cluster-replicas 1 集羣冗餘 1
這裏把這些地址改爲你虛擬機的地址便可
緣由:爲了性能考慮
解決方法
參考微信頭像換了以後偶爾換完了以後別人半天刷新不過來
上面扯了這麼多,有不少東西是及其的不方便的,好比redis的控制,如今是三臺服務器,100臺一個個搞公司離職率會出奇的搞,因此乾脆寫一個腳原本統一控制一下會很方便。 這裏我秉承這linux社區一貫「會用用,不會用滾」的這麼一個友好的態度,把腳本放出來你們本身會用用不會留言吧,反正我也不會看的。。。。。。
#!/usr/bin/env bash
if [ ! $1 ]
then
echo 'command:' $0 '[cmd]'
exit
fi
cmd=$1;
if [ $cmd == 'initall' ]
then
for item in `cat server_list.txt`
do
echo init $item;
scp redis_sh.sh root@$item:/root/;
ssh root@$item '/root/redis_sh.sh init 7000';
ssh root@$item '/root/redis_sh.sh init 7001';
done
elif [ $cmd == 'startall' ]
then
for item in `cat server_list.txt`
do
echo start $item;
ssh root@$item '/root/redis_sh.sh start 7000';
ssh root@$item '/root/redis_sh.sh start 7001';
done
elif [ $cmd == 'ps' ]
then
for item in `cat server_list.txt`
do
echo $item;
ssh root@$item 'ps -ef | grep [r]edis';
done
elif [ $cmd == 'stopall' ]
then
for item in `cat server_list.txt`
do
echo stopall $item;
ssh root@$item '/root/redis_sh.sh stopall';
done
elif [ $cmd == 'create' ]
then
servers=''
for item in `cat server_list.txt`
do
servers+=$item:7000' ';
servers+=$item:7001' ';
done
redis-cli --cluster create $servers --cluster-replicas 1
else
echo no this command: $1
fi
複製代碼
有什麼感興趣的,或者遇到什麼問題能夠直接加我好友,我們一塊兒溝通
微信:Dyy916829411 qq: 916829411