本文版權歸部落格園和作者吳雙本人共同所有 轉載和爬蟲請註明原文地址 www.cnblogs.com/tdws
一.基礎安裝
wget http://download.redis.io/releases/redis-4.0.0.tar.gz tar xzf redis-4.0.0.tar.gz cd redis-4.0.0 cd src make make test //有問題可參考 http://www.cnblogs.com/tdws/p/6360024.html ./redis-server ../redis.conf ps -ef |grep redis 檢視redis程式 netstat -lntp | grep 6380 查詢指定埠監聽 kill -9 程式id 強制殺死redis程式
二. 4.0版本初步瞭解
Redis4.0中增加了UNLINK 命令(替換del命令),這個命令在刪除體積較大的鍵時,命令在後臺執行緒裡面執行,還有非同步的flushdb和flushall命令分別是
flushdb async
flushall async
儘可能的避免了伺服器阻塞。
增加了交換資料庫命令,比如SWAPDB 0 1 ,交換0庫和1庫
增加了memory命令,可以視察記憶體使用情況,通過help命令可以看到
127.0.0.1:6379> memory help
1) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key"
2) "MEMORY STATS - Show memory usage details"
3) "MEMORY PURGE - Ask the allocator to release memory"
4) "MEMORY MALLOC-STATS - Show allocator internal stats"
MEMORY USAGE <key> 預估指定key所需記憶體
MEMORY STATS 視察記憶體使用詳情
MEMORY PURGE 向分配器索要釋放更多記憶體
MEMORY MALLOC-STATS 視察分配器內部狀態
另外還有一系列優化比如 LRU和PSYNC,還有模組系統。
三.Cluster
雖然一主一從加哨兵可以解決普通場景下服務可用的問題,但是兩個節點分別儲存所有的快取資料,這不僅導致容量受限,更是讓我們受限於機器配置最差的那一臺,這就是木桶效應。硬體垂直擴容並不能解決日益龐大的快取資料量和提供能搞得可用性。
在古老的Redis版本中,水平擴容的能力來自於傳送命令的客戶端,由客戶端路由不同的key給到不同的節點,下次讀取的時候,也按照相同方式路由key到指定節點拿到資料。如果接下來還希望增加擴容節點的話,就要對歷史快取資料做遷移,遷移過程中為保證資料一致性也要付出一定代價。為了解決節點的不斷擴容,設計初期可以預先設定很多節點,以備日後使用,所有設計的節點都參與到分片當中,鑑於初期資料較少,可單臺伺服器多個節點,在日後資料增多的情況下,只需要遷移節點到新的伺服器。而不需要對資料進行重新分配等操作。但是這種做法依然讓我們覺得難維護,難遷移,難應對故障,遷移過程中也很難保證資料一致性,比如50個節點,任意一個節點想要停止並遷移伺服器,都會引發資料不一致或者出現故障,只能停止叢集,等待遷移完成後,叢集上線。
Redis3.0提供了Cluster叢集。這個叢集的概念和前面提到的叢集有所不同。前面的叢集僅代表,多個節點間沒有相互的關係,只是根據客戶端路由分配key到不同的節點,所有節點共同分配所有資料。3.0的Cluster功能,擁有和單機例項相同的效能,幾乎支援所有命令,對於涉及多個鍵的命令,比如MGET,如果每一個鍵都在同一個節點則可以正常返回資料,否則提示錯誤。另外叢集中限制了0號資料庫,如果切換資料庫則會提示錯誤。
哨兵和叢集是兩個獨立的功能,但從特性來看哨兵可以視為叢集的子集。當不需要資料分片或者已經利用客戶端分片的場景下哨兵已經足夠使用,如果需要水平擴容,Cluster是非常好的選擇。
每個叢集至少三臺主節點。
到redis-4.0.0目錄下 修改redis.conf
修改所有redis.conf檔案 在GENERAL一般設定中找到daemonize 將其設定為yes 我們將後臺執行redis
protect mode為no
bind ip為0.0.0.0
叢集搭建成功前不要設定連線密碼。
設定maxmemory 100m
cluster-enabled設定為yes
注意cluster-config-file配置不同的名稱。我剛開始給每個節點都配置nodes.conf , 結果弄了幾個小時都不行,一直在waiting claster join. WTF??? 工作目錄明明都是自己的資料夾呀,後來在stackoverflow上 看到有人相同情況,我就改下配置檔名試了一下,還真可以了....
把redis-4.0.0資料夾複製6份
我準備了兩臺伺服器,當然一臺伺服器也是可以玩轉的。
六個節點分別啟動,此時叢集是不能正常工作的,因為他們還是六個獨立的節點。下面我們要使用src目錄下的redis-trib.rb來將他們加入到同一個叢集當中。但是.rb由Ruby編寫,我們需要安裝環境,還需要gem redis包。yum install ruby下載的是2.0版本,並且得不到升級, 我們需要ruby2.2+,所以我們不使用。ruby安裝指南http://blog.csdn.net/lixwjava/article/details/49231899
wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.7.tar.gz tar -zxvf ruby-2.2.7.tar.gz cd ruby-2.2.7 ./configure make make test make install 如果順利的話就安裝完ruby了
如果沒有zlib 先安裝一下 yum install zlib-devel yum install zlib 接下來進入ruby資料夾下ext/zlib中 安裝ruby自身提供的zlib包 cd ext/zlib ruby ./extconf.rb make make install
另外需要安裝openssl (不裝也行) http://blog.csdn.net/yangxuan0261/article/details/52065158 如果沒裝,更換gem映象為非ssl的中國ruby映象https://ruby.taobao.org/
gem sources --add http://gems.ruby-china.org/ --remove https://rubygems.org/ gem sources -l gem install redis
在執行create cluster之前 請保證每個node的0庫不包含任何key.如果有key 就對不純潔的節點執行flushall和cluster reset 。每個Node都有一個特定的TCP埠,用來接收其他nodes的連結;此埠號為面向Client的埠號 + 10000,比如果客戶端埠號為6379,那麼次node的BUS埠號為16379,客戶端埠號可以在配置檔案中宣告。由此可見,nodes之間的互動通訊是通過Bus埠進行,使用了特定的二進位制協議,此埠通常應該只對nodes可用,可以藉助防火牆技術來遮蔽其他非法訪問。所以注意我們的所有節點埠+10000 也要保持開放
./redis-trib.rb create --replicas 1 47.92.93.157:6379 47.92.93.157:6380 47.92.93.157:6381 47.92.93.157:6382 47.92.93.157:6383 47.92.93.157:6384
啟動redis-cli 使用-c引數 連線叢集,將會為我們做一些自動重定向工作。
設定叢集密碼:
config set masterauth abc config set requirepass abc
上面的配置 一定要每一個節點都配置執行一遍哦
config rewrite