linux安裝Redis集群(三主三備)
Redis是一個可基于內(nèi)存亦可持久化的日志型(aof蜕企,rdb)栈妆、高性能Key-Value數(shù)據(jù)庫愕提,并提供多種語言的API锐墙,Redis支持主從同步析校。數(shù)據(jù)可以從主服務器向任意數(shù)量的從服務器上同步构罗,從服務器可以是關聯(lián)其他從服務器的主服務器。
我們這里搭建的集群就需要六臺機器勺良,三臺為主绰播,redis集群和其他技術的集群有點不一樣。redis一共分成16384個槽尚困,并且把這些槽基本算是平均分配到三臺機器上蠢箩,。引入了備機才能算集群+高可用,即存入的數(shù)據(jù)采用一定策略存到三臺機器上谬泌,而備用機會實現(xiàn)同步主機的數(shù)據(jù)滔韵,并且當主機發(fā)生故障時,備用機能及時的通過選舉掌实,上來充當主機陪蜻,維護集群的穩(wěn)定。
-六臺虛擬機
192.168.40.142
………..
192.168.40.147
首先安裝分別安裝:
#yum -y install wget
注意:編譯時候如果報錯贱鼻⊙缏簦可能是沒安裝gcc,請安裝后再執(zhí)行 make && make install
# yum install gcc gcc-c++
安裝redis時遇到zmalloc.h:50:31: 致命錯誤:jemalloc/jemalloc.h:沒有那個文件或目錄
解決辦法
# make MALLOC=libc
下載并解壓
# cd /usr/local
# wget http://download.redis.io/releases/redis-3.2.4.tar.gz
# tar -zxvf redis-3.2.4.tar.gz
# mv redis-3.2.4 redis3
編譯安裝
# cd redis3
# make && make install
單機啟動辦法:
# redis-server redis.conf
創(chuàng)建集群配置目錄
第一臺:192.168.40.142
# mkdir -p /usr/local/redis3/cluster/7142
#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7142/redis-7142.conf
第二臺:192.168.40.143
# mkdir -p /usr/local/redis3/cluster/7143
#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7143/redis-7143.conf
第三臺:192.168.40.144
# mkdir -p /usr/local/redis3/cluster/7144
#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7144/redis-7144.conf
第四臺:192.168.40.145
# mkdir -p /usr/local/redis3/cluster/7145
#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7145/redis-7145.conf
第五臺:192.168.40.146
# mkdir -p /usr/local/redis3/cluster/7146
#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7146/redis-7146.conf
第六臺:192.168.40.147
# mkdir -p /usr/local/redis3/cluster/7147
#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7147/redis-7147.conf
4.修改配置文件redis-7142.conf … redis-7147.conf (6個文件都按照以下格式 一 一修改)
bind 127.0.0.1 # 改為本機地址
port 7142 #改為你設置的端口號
cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file? /usr/local/redis3/cluster/7142/nodes-7142.conf
cluster-migration-barrier 1
注意:6臺機器的配置都要改哦 特別容易出錯的是7142這種 因為每一臺機器設置都不一樣
比如我的就分別是7142邻悬,7143,7144,7145,7146,7147
在每臺機器的防火墻強上症昏,配置redis集群端口,除了設置7142這類端口父丰,還需設置redis集群直接通信的接口肝谭,系統(tǒng)默認是在你設置的redis端口上默認加上10000,及1742
編輯防火墻(此處只拿192.168.40.142機器來做演示蛾扇,其他機器仿照著改 只用改變端口號就行):
? #? vi /etc/sysconfig/iptables
添加如下兩個redis端口:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 7147 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 17147 -j ACCEPT
保存 退出 重啟防火墻
# service iptables restart
##-啟動各節(jié)點 ##
分別 啟動各個節(jié)點
第一臺:
# /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7142/redis-7142.conf
第二臺:
#? /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7143/redis-7143.conf
第三臺:
# /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7144/redis-7144.conf
第四臺:
#? /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7145/redis-7145.conf
第五臺:
# /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7146/redis-7146.conf
第六臺:
#? /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7147/redis-7147.conf
果成功則會顯示如下界面:
特別注意:該界面不能關閉攘烛,不能退出。必須保持镀首。否則會導致redis不可用
解決辦法使用nohup命令來啟動 就可以了
注意:此時雖然6臺機器都正常運行了redis坟漱,但是集群仍未完成
6、查看服務(新開終端)
# ps -ef | grep redis? #查看是否啟動成功
# netstat -tnlp | grep redis #可以看到redis監(jiān)聽端口
前面已經(jīng)準備好了搭建集群的redis節(jié)點靖秩,接下來我們要把這些節(jié)點都串連起來搭建集群须眷。官方提供了一個工具:redis-trib.rb(/usr/local/redis-3.2.1/src/redis-trib.rb) 看后綴就知道不能直接執(zhí)行竖瘾,它是用ruby寫的一個程序,所以我們還得安裝ruby.
# yum -y install ruby ruby-devel rubygems rpm-build
再用 gem 這個命令來安裝 redis接口 gem是ruby的一個工具包.
此時會出現(xiàn)一個問題:因為墻的緣故安裝gem會沒有反應花颗,解決辦法是更換為阿里巴巴的ruby源捕传。
# 刪除默認的官方源
# gem sources -r https://rubygems.org/
#添加淘寶源
# gem sources -a https://ruby.taobao.org/
#查看當前源?
[root@localhost src]# gem sources -l
*** CURRENT SOURCES ***
https://ruby.taobao.org/
安裝gem
[root@localhost src]# gem install redis
Successfully installed redis-3.3.3
Parsing documentation for redis-3.3.3
上面結束了,接下來運行一下redis-trib.rb
# /usr/local/redis3/src/redis-trib.rb
redis集群就是依靠 上面這些操作 完成集群搭建的.
確認所有的節(jié)點都啟動扩劝,接下來使用參數(shù)create 創(chuàng)建 (在192.168.40.142中來創(chuàng)建)
/usr/local/redis3/src/redis-trib.rb? create? --replicas? 1? 192.168.40.142:7142 192.168.40.143:7143? 192.168.40.144:7144 192.168.40.145:7145? 192.168.40.146:7146? 192.168.40.147:7147
集群創(chuàng)建成功:如下所示
[root@localhost src]#? /usr/local/redis3/src/redis-trib.rb? create? --replicas? 1? 192.168.40.142:7142 192.168.40.143:7143? 192.168.40.144:7144 192.168.40.145:7145? 192.168.40.146:7146? 192.168.40.147:7147
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.40.142:7142
192.168.40.143:7143
192.168.40.144:7144
Adding replica 192.168.40.145:7145 to 192.168.40.142:7142
Adding replica 192.168.40.146:7146 to 192.168.40.143:7143
Adding replica 192.168.40.147:7147 to 192.168.40.144:7144
M: d80a23c6773fef5456e81f0c1d187d7e51c3d650 192.168.40.142:7142
? slots:0-5460 (5461 slots) master
M: 382ed5a4cb3108c95cab35e27ea0ab340ce45270 192.168.40.143:7143
? slots:5461-10922 (5462 slots) master
M: 909bbc04c98fae3cd17cf4916b1edcec65cb57d1 192.168.40.144:7144
? slots:10923-16383 (5461 slots) master
S: 75cde28bfbfc8f27ead87302a3aa2baba44dd983 192.168.40.145:7145
? replicates d80a23c6773fef5456e81f0c1d187d7e51c3d650
S: 09314222f26560cf405c77ac77d09cae13a26fa5 192.168.40.146:7146
? replicates 382ed5a4cb3108c95cab35e27ea0ab340ce45270
S: 88a5ea69ec4f73b169f6ece244a1a525b86ccd66 192.168.40.147:7147
? replicates 909bbc04c98fae3cd17cf4916b1edcec65cb57d1
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 192.168.40.142:7142)
M: d80a23c6773fef5456e81f0c1d187d7e51c3d650 192.168.40.142:7142
? slots:0-5460 (5461 slots) master
? 1 additional replica(s)
M: 909bbc04c98fae3cd17cf4916b1edcec65cb57d1 192.168.40.144:7144
? slots:10923-16383 (5461 slots) master
? 1 additional replica(s)
S: 88a5ea69ec4f73b169f6ece244a1a525b86ccd66 192.168.40.147:7147
? slots: (0 slots) slave
? replicates 909bbc04c98fae3cd17cf4916b1edcec65cb57d1
M: 382ed5a4cb3108c95cab35e27ea0ab340ce45270 192.168.40.143:7143
? slots:5461-10922 (5462 slots) master
? 1 additional replica(s)
S: 75cde28bfbfc8f27ead87302a3aa2baba44dd983 192.168.40.145:7145
? slots: (0 slots) slave
? replicates d80a23c6773fef5456e81f0c1d187d7e51c3d650
S: 09314222f26560cf405c77ac77d09cae13a26fa5 192.168.40.146:7146
? slots: (0 slots) slave
? replicates 382ed5a4cb3108c95cab35e27ea0ab340ce45270
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
說明:
/usr/local/redis3/src/redis-trib.rb create –replicas 1 192.168.40.142:7142 192.168.40.143:7143 192.168.40.144:7144 192.168.40.145:7145 192.168.40.146:7146 192.168.40.147:7147
–replicas 1 表示 自動為每一個master節(jié)點分配一個slave節(jié)點 上面有6個節(jié)點庸论,程序會按照一定規(guī)則生成 3個master(主)3個slave(從)
前面已經(jīng)提醒過的 防火墻一定要開放監(jiān)聽的端口,否則會創(chuàng)建失敗棒呛。
運行中聂示,提示Can I set the above configuration? (type ‘yes’ to accept): yes //輸入yes
接下來 提示 Waiting for the cluster to join………. 安裝的時候在這里就一直等等等,沒反應簇秒,傻傻等半天鱼喉,看這句提示上面一句,Sending Cluster Meet Message to join the Cluster.
這下明白了,我剛開始在一臺Server上去配扛禽,也是不需要等的锋边,這里還需要跑到Server2上做一些這樣的操作。
在192.168.1.238, redis-cli -c -p 700* 分別進入redis各節(jié)點的客戶端命令窗口编曼, 依次輸入 cluster meet 192.168.1.238 7000……
回到Server1豆巨,已經(jīng)創(chuàng)建完畢了。
查看一下 /usr/local/redis/src/redis-trib.rb check 192.168.1.237:7000
到這里集群已經(jīng)初步搭建好了掐场。
最后可以測試:
[root@localhost ~]# /usr/local/redis3/src/redis-cli -h 192.168.40.145 -p 7145
192.168.40.145:7145> get test1
"hh"
192.168.40.145:7145> set gg shuaige
OK
192.168.40.145:7145>
在其他幾臺機器上獲取
[root@localhost src]#? redis-cli -h 192.168.40.145 -p 7145
192.168.40.145:7145> set test1 hh
OK
192.168.40.145:7145> get test
(error) MOVED 6918 192.168.40.143:7143
192.168.40.145:7145> get test1
"hh"
192.168.40.145:7145> get gg
"shuaige"
192.168.40.145:7145>
配置成功往扔。
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群當前已知的所有節(jié)點(node),以及這些節(jié)點的相關信息熊户。
CLUSTER MEET?將 ip 和 port 所指定的節(jié)點添加到集群當中瓤球,讓它成為集群的一份子。
CLUSTER FORGET?從集群中移除 node_id 指定的節(jié)點敏弃。
CLUSTER REPLICATE?將當前節(jié)點設置為 node_id 指定的節(jié)點的從節(jié)點卦羡。
CLUSTER SAVECONFIG 將節(jié)點的配置文件保存到硬盤里面。
CLUSTER ADDSLOTS?[slot …] 將一個或多個槽(slot)指派(assign)給當前節(jié)點麦到。
CLUSTER DELSLOTS?[slot …] 移除一個或多個槽對當前節(jié)點的指派绿饵。
CLUSTER FLUSHSLOTS 移除指派給當前節(jié)點的所有槽,讓當前節(jié)點變成一個沒有指派任何槽的節(jié)點瓶颠。
CLUSTER SETSLOT?NODE?將槽 slot 指派給 node_id 指定的節(jié)點拟赊,如果槽已經(jīng)指派給另一個節(jié)點,那么先讓另一個節(jié)點刪除該槽>粹淋,然后再進行指派吸祟。
CLUSTER SETSLOT?MIGRATING?將本節(jié)點的槽 slot 遷移到 node_id 指定的節(jié)點中。
CLUSTER SETSLOT?IMPORTING?從 node_id 指定的節(jié)點中導入槽 slot 到本節(jié)點桃移。
CLUSTER SETSLOT?STABLE 取消對槽 slot 的導入(import)或者遷移(migrate)屋匕。
CLUSTER KEYSLOT?計算鍵 key 應該被放置在哪個槽上。
CLUSTER COUNTKEYSINSLOT?返回槽 slot 目前包含的鍵值對數(shù)量借杰。
CLUSTER GETKEYSINSLOT?返回 count 個 slot 槽中的鍵过吻。
這些命令是集群所獨有的。執(zhí)行上述命令要先登錄
[root@manage redis]# redis-cli -c -p 6382 -h 192.168.10.220? ? //登錄
192.168.10.220:6382> cluster info? //查看集群情況
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:8
cluster_my_epoch:4
cluster_stats_messages_sent:82753
cluster_stats_messages_received:82754
redis集群節(jié)點 增刪
添加從節(jié)點slave(某個主節(jié)點的復制品)
#? ./redis-cli -h 192.168.40.145 -p 7145
192.168.40.145> cluster replicate 此處是主節(jié)點master的ID
192.168.40.145> ok
刪除從節(jié)點
# redis-trib.rb del-node 192.168.10.220:6385 '9c240333476469e8e2c8e80b089c48f389827265'
刪除主節(jié)點
如果主節(jié)點有從節(jié)點蔗衡,將從節(jié)點轉移到其他主節(jié)點
如果主節(jié)點有slot纤虽,去掉分配的slot,然后在刪除主節(jié)點
# redis-trib.rb reshard 192.168.10.219:6378 //取消分配的slot,下面是主要過程
How many slots do you want to move (from 1 to 16384)? 1000 //被刪除master的所有slot數(shù)量
What is the receiving node ID? 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 //接收6378節(jié)點slot的master
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:03ccad2ba5dd1e062464bc7590400441fafb63f2 //被刪除master的node-id
Source node #2:done?
Do you want to proceed with the proposed reshard plan (yes/no)? yes //取消slot后绞惦,reshard
新增master節(jié)點后逼纸,也進行了這一步操作,當時是分配济蝉,現(xiàn)在去掉杰刽。反著的呻纹。
# redis-trib.rb del-node 192.168.10.219:6378 '03ccad2ba5dd1e062464bc7590400441fafb63f2'
改變從節(jié)點的master
//查看一下6378的從節(jié)點
# redis-cli -p 6378 cluster nodes | grep slave | grep 03ccad2ba5dd1e062464bc7590400441fafb63f2
//將6385加入到新的master
# redis-cli -c -p 6385 -h 192.168.10.220
192.168.10.220:6385> cluster replicate 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052? //新master的node id
OK
192.168.10.220:6385> quit
//查看新master的slave
# redis-cli -p 6379 cluster nodes | grep slave | grep 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052
查看一下,集群情況
# /usr/local/redis3/src/redis-trib.rb check 192.168.40.145:7145
可以看到M為主節(jié)點专缠,S為從節(jié)點
redis cluster命令行(redis-cli -h 192.168.40.145 -p 7145)
1雷酪,新配置二個測試節(jié)點
# cd /etc/redis
//新增配置
# cp redis-6379.conf redis-6378.conf && sed -i "s/6379/6378/g" redis-6378.conf
# cp redis-6382.conf redis-6385.conf && sed -i "s/6382/6385/g" redis-6385.conf
//啟動
# redis-server /etc/redis/redis-6385.conf > /var/log/redis/redis-6385.log 2>&1 &
# redis-server /etc/redis/redis-6378.conf > /var/log/redis/redis-6378.log 2>&1 &
添加主節(jié)點
# redis-trib.rb add-node 192.168.10.219:6378 192.168.10.219:6379
注釋:
192.168.10.219:6378是新增的節(jié)點
192.168.10.219:6379集群任一個舊節(jié)點
# redis-trib.rb add-node --slave --master-id 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.220:6385 192.168.10.219:6379
注釋:
--slave,表示添加的是從節(jié)點
--master-id 03ccad2ba5dd1e062464bc7590400441fafb63f2,主節(jié)點的node id涝婉,在這里是前面新添加的6378的node id
192.168.10.220:6385,新節(jié)點
192.168.10.219:6379集群任一個舊節(jié)點
重新分配slot
# redis-trib.rb reshard 192.168.10.219:6378 //下面是主要過程
How many slots do you want to move (from 1 to 16384)? 1000 //設置slot數(shù)1000
What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新節(jié)點node id
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:all //表示全部節(jié)點重新洗牌
Do you want to proceed with the proposed reshard plan (yes/no)? yes //確認重新分
新增加的主節(jié)點哥力,是沒有slots的,
M: 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.219:6378
slots:0-332,5461-5794,10923-11255 (0 slots) master
主節(jié)點如果沒有slots的話墩弯,存取數(shù)據(jù)就都不會被選中吩跋。
可以把分配的過程理解成打撲克牌,all表示大家重新洗牌渔工;輸入某個主節(jié)點的node id锌钮,然后在輸入done的話,就好比從某個節(jié)點引矩,抽牌梁丘。