Centos 7 兩臺機器搭建三主三從的redis叢集
忠告:在學習搭建redis叢集之前,先學會搭建單個的redis。上一篇我們就介紹了單個的redis搭建,有興趣的朋友可以參照一下。
兩臺伺服器,個啟動三個例項,形成三主三從。
ip: 192.9.200.159 192.9.200.160
1、使用yum安裝所需環境和工具。
yum -y install wget vim tcl gcc make
2、下載redis並解壓。
cd /usr/local/ (本人用的是local目錄,當然其他目錄也是可以。)
wget http://download.redis.io/releases/redis-3.2.x.tar.gz
tar -zxf redis-3.2.x.tar.gz
(也可以在網站上下載下來,然後上傳解壓,付網址:http://download.redis.io/releases/redis-3.2.5.tar.gz)
3、編譯安裝redis原始檔
cd /redis
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-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
6、修改配置檔案
vim /usr/local/redis/redis.conf
bind 192.9.200.159 (需要不同的伺服器進行節點的聯通,就不能設為127.0.0.1)
protected-mode no (需要不同的伺服器進行節點的聯通,就不能設為yes)
daemonize yes (設定後臺執行redis)
cluster-enabled yes(開啟叢集,把#去掉)
cluster-node-timeout 15000 (設定請求超時時間,預設為15秒,可以自行修改)
appendonly yes (aop日誌開啟,會每次進行寫操作都記錄一條日誌)
--根據不同的埠需要設定的地方
port 7000
pidfile /var/run/redis_7000.pid
logfile /var/log/redis/redis_7000.log
dbfilename dump_7000.rdb
applendfilename "applendonly_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/
8、啟動各個節點
redis-server /usr/local/cluster/7000/redis.conf
redis-server /usr/local/cluster/7001/redis.conf
redis-server /usr/local/cluster/7002/redis.conf
--使用ps -ef|grep redis | grep cluster檢視是否都啟動成功,ip和埠號是否都正確。
9、防火牆開通策略 (防火牆未開就不用配置)
firewall-cmd --zone=public --add-port=7000-7002/tcp --permanent
firewall-cmd --zone=public --add-port=17000-17002/tcp --permanent (必須開叢集匯流排埠,叢集匯流排埠=埠號 +10000,例:7000的叢集匯流排埠是17000。這個叢集匯流排埠不開放,叢集的時候外部伺服器的節點新增不進來)
===============================一條華麗的分割線=================================
以上1-9的步驟在另一臺伺服器上也需要配置,另一臺伺服器埠可以設為7003,7004,7005,或者跟上面一樣也可以
===============================一條華麗的分割線=================================
10、測試兩臺伺服器是否都能 telnet 得通另一臺的 7000~7002 和 17000~17002
telnet -tlnp | grep redis
11、安裝ruby環境
yum -y install ruby rubygems
12、跟新gem源
gem sources -a http://ruby.taobao.org/
13、使用gem安裝redis和ruby介面
gem install redis (或者gem install redis --version3.2.x)
14、建立叢集
cd /usr/local/redis/src/
(redis官方提供了redis-trib.rb 這個工具,就這解壓目錄src目錄中,第3步中已將它複製到/usr/local/bin目錄中,可以直接在命令列中使用。)
redis-trib.rb create --replicas 1 192.9.200.159:7000 192.9.200.159:7001 192.9.200.159:7002 192.9.200.160:7000 192.9.200.160:7001 192.9.200.160:7002
留意一下螢幕,會有一句(type 'yes' or accept),輸入yes,回車。(意思是:接受自主分配三主三從)
如果最後出現
說明搭建成功。
如果出現
一直出現'...',說明另一臺伺服器的埠策略沒通,一直在等那邊的節點加入叢集,O(∩_∩)O哈哈哈~~那麼恭喜你,悲劇發生咯!!
15、驗證叢集
在第一臺伺服器上連線叢集的某一埠(7000)節點,在另一臺伺服器上連線某一埠(7002)節點,連線方式為:redis-cli -h 192.9.200.159 -c -p 7000 (加引數 -c 可以連線到叢集,因為redis.conf將bind改為了ip地址,所以 -h 不可以省略)
在7000節點上執行命令 set hello world
在另一臺伺服器上7002節點執行命令檢視kay為‘hello’的內容 get hello
說明叢集執行正常。
16、總結
redis cluster在設計的時候,就考慮到了去中心化,去中介軟體,也就是說,叢集中的每個節點都是平等的關係,每個節點都儲存著各自的資料和整個叢集的狀態。每個節點都和其他所有節點連線,而且這些節點保持著活躍,這樣就保證了我們只需要連線叢集中的任意一個節點,就可以獲取到其他節點的資料。
redis叢集並沒有使用傳統的一致性hash來分配資料,而是採用另外一種叫做hash槽(hash slot)的方式來進行分配。redis cluster預設分配了16384個槽,當我們set一個key時,會用CRC16演算法來取模得到所屬的slot,然後將這個key分配到hash slot區間的節點上,具體的演算法就是:CRC16(key) %16384。
redis叢集會把資料存在一個master節點,然後在這個master和其對應的salve之間進行資料同步。當讀取資料時,也根據一致性hash演算法到對應的master節點獲取資料。只有當一個master掛掉之後,才會啟動一個對應的salve節點,充當master。
值得注意的是:必須要3個以及以上的主節點,否則會建立叢集不成功,並且當存活的主節點樹小於總結點數一半的時候,整個叢集就 無法提供服務了。