Centos7 單機搭建redis叢集(三主三從)
概要:本文主要介紹如何在Centos7中單機搭建redis叢集三主三從,按照本文絕對可以實現該需求,至於先搭建單機版主要為了方便理解redis叢集,為下一步開發或生產上redis叢集做鋪墊。同時本人在搭建過程中也做了點總結,希望對沒有接觸過redis叢集或剛接觸redis叢集的小夥伴有些許幫助,同時也建議在檢視本文前能先了解redis單節點的部署。下面進入正題。
1、使用yum安裝所需要的工具
yum -y install wget vim tcl gcc make
2、下載redis並解壓
cd /usr/local
wget http://download.redis.io/releases/redis-3.2.8.tar.gz (獲取redis)
tar -zxvf redis-3.2.8.tar.gz
3、編譯安裝redis原始檔
cd redis-3.2.8
make (若安裝報錯,可以改為這一句:make MALLOC=libc)
make install
(如果 /usr/local/bin/ 資料夾內沒有 redis-server 那幾個檔案,就從 /usr/local/redis-3.2.8/src/ 中拷貝過去,命令:cp redis-server redis-cli redis-sentinel redis-trib.rb redis-benchmark redis-check-aof redis-check-rdb /usr/local/bin/)
4、配置核心引數(可以省略)
--配置 vm.overcommit_memory 為1,這可以避免資料被截斷
systcl -w vm.overcommit_memory=1
5、建立多例項的資料夾
cd /usr/local/
mkdir cluster
cd cluster
mkdir 7000 7001 7002 8001 8002 8003
6、修改配置檔案
vim /usr/local/redis/redis.conf
bind 0.0.0.0 (0.0.0.0表示所有節點都可以訪問該redis)
protected-mode no
daemonize yes (設定後臺執行redis)
cluster-enabled yes(開啟叢集,把#去掉)
cluster-node-timeout 15000 (設定請求超時時間,預設為15秒,可以自行修改)
appendonly yes (aop日誌開啟,會每次進行寫操作都記錄一條日誌)
--根據不同的埠需要設定的地方
port 7000
pidfile /var/run/redis_7000.pid
dbfilename dump_7000.rdb
appendfilename "appendonly_7000.aof"
cluster-config-file nodes_7000.conf
7、複製配置檔案到各個例項資料夾,並且對相應的埠號和引數進行配置。
cp -f /usr/local/redis/redis.conf /usr/local/cluster/7000/
cp -f /usr/local/redis/redis.conf /usr/local/cluster/7001/
cp -f /usr/local/redis/redis.conf /usr/local/cluster/7002/
cp -f /usr/local/redis/redis.conf /usr/local/cluster/8001/
cp -f /usr/local/redis/redis.conf /usr/local/cluster/8002/
cp -f /usr/local/redis/redis.conf /usr/local/cluster/8003/
8、啟動各個節點
redis-server /usr/local/cluster/7000/redis.conf
...
redis-server /usr/local/cluster/8003/redis.conf
--使用ps -ef|grep redis | grep cluster檢視是否都啟動成功,ip和埠號是否都正確。
9、安裝ruby、redis環境
yum -y install ruby rubygems
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable
source /usr/local/rvm/scripts/rvm
rvm install ruby-2.3.3 (此過程耗時過長,耐心等待~)
rvm use 2.3.3 --default
gem install redis
10、建立叢集
(redis官方提供了redis-trib.rb 這個工具,就在解壓目錄src目錄中,第3步中已將它複製到/usr/local/bin目錄中,可以直接在命令列中使用,如果沒複製的話自行復制過去即可)
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 (redis-trib.rb建立叢集時會嘗試連線列出來的redis節點,如果這裡報錯你就要檢查一下你列出來的redis節點是否都正常執行或者所有節點直接是否都網路互通)
留意一下螢幕,會有一句(type 'yes' or accept),輸入yes,回車。(意思是:接受自主分配三主三從)
如果最後出現
>>> Check for open slots...
>>> Check slots coverage...
說明搭建成功。
11、驗證叢集
redis-cli -h 127.0.0.1 -c -p 7000 (加引數 -c 可以連線到叢集,因為redis.conf將bind改為了ip地址,所以 -h 不可以省略)
連線到7000埠使用set存測試值
再連線到7001埠取值,redis叢集可用
提示:在使用cli連線到redis後可以使用info replication命令來檢視主從關係等資訊。
12、其餘測試
搭建完成後可以做些其餘測試,比如在主節點A上存資料,看資料是存到A節點內還是會隨機存到任一主節點?
再比如down掉主節點A,看A的從節點是否會搶佔A節點等等。
這篇文章只是給大家入了個門,保證了該叢集是可用的,但幾乎所有redis的配置都是預設的。接下來一篇文章研究的重心就放在瞭如何調優和redis叢集在生產上的應用。
13、總結(必看):
- redis叢集至少3主3從
- Redis 叢集沒有使用一致性hash, 而是引入了雜湊槽的概念,Redis 叢集有16384個雜湊槽,每個key通過CRC16校驗後對16384取模來決定放置哪個槽.叢集的每個節點負責一部分hash槽。如果是3主3從,A掛了的話從節點A1就會頂替A來掌管它的雜湊槽,如果A1再掛了,其雜湊槽就會沒有節點來掌管,即cluster就會不可用。
- 寫操作會隨機到3個主節點上,即使是在從節點上進行的寫操作,也會被隨機重定向到某個主節點中,在主節點上操作也一樣會隨機重定向到一箇中,當然覆蓋原有key除外。
- 資料是分開儲存的,主節點不進行資料的相互同步與複製,資料的複製發生在主節點和其從節點之間。
- 資料a存在節點A中,在節點B中查詢資料a,redis會自動重定向到節點A中進行查詢
- Redis 並不能保證資料的強一致性. 這意味這在實際中叢集在特定的條件下可能會丟失寫操作。比如寫入A節點的資料,A在同步給從節點A1的過程中A出現宕機,這樣未同步過去的資料就出現了丟失的情況。
7、預設主節點A宕機後從節點A1成為master,但當A重新啟用後並不會重新搶佔為master。