redis(9)集群搭建
一、搭建流程
redis集群至少需要3個redis實例,不過官方推薦采用6個實例;3個master,3個slave。
那麽我們需要做以下幾件事:
1)編譯一個redis-server
2)創建6個redis.conf配置文件
3)啟動6個redis實例
4)redis-trib.rb創建集群
二、創建集群
1)編譯一個redis-server
$ wget http://download.redis.io/releases/redis-4.0.10.tar.gz $ tar xzf redis-4.0.10.tar.gz $ cd redis-4.0.10 $ make
詳細可以參考:https://www.cnblogs.com/lay2017/p/9248454.html
2)創建6個redis.conf配置文件
我們先創建以下文件夾目錄:
mkdir redis-cluster cd redis-cluster mkdir 7000 7001 7002 7003 7004 7005
然後我們將第一步編譯出來的src/redis-server拷貝一份到redis-cluster下,然後把redis.conf拷貝6份分別放入到上面創建的6個文件夾內。
分別修改每個redis.conf的內容:
port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes daemonize yes
這裏的port分別設置為:7000、7001、7002、7003、7004、7005
3)啟動6個redis實例
./redis-server 7000/redis.conf
分別執行啟動命令,加載redis.conf配置文件
查看一下啟動進程:
ps -ef | grep redis
顯示如下:
501 37933 1 0 9:10PM ?? 0:03.85 ../redis-server 127.0.0.1:7000 [cluster] 501 37941 1 0 9:11PM ?? 0:03.82 ../redis-server 127.0.0.1:7001 [cluster] 501 37949 1 0 9:11PM ?? 0:03.82 ../redis-server 127.0.0.1:7002 [cluster] 501 37968 1 0 9:11PM ?? 0:03.75 ../redis-server 127.0.0.1:7003 [cluster] 501 37977 1 0 9:11PM ?? 0:03.76 ../redis-server 127.0.0.1:7004 [cluster] 501 37988 1 0 9:12PM ?? 0:03.76 ../redis-server 127.0.0.1:7005 [cluster]
則表示每個實例已經啟動成功
4)redis-trib.rb創建集群
在src目錄下自帶了redis-trib.rb可以用於創建集群
但是在使用之前 需要安裝ruby,以及redis和ruby連接
yum -y install ruby ruby-devel rubygems rpm-build gem install redis
然後采用redis-trib.rb創建集群
redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
如果你最終看到:
[OK] All 16384 slots covered
說明集群創建完成
我們可以用命令檢查一下目前的集群情況
./redis-trib.rb check 127.0.0.1:7000
輸出內容如下:
>>> Performing Cluster Check (using node 127.0.0.1:7000) M: ca34d6741d5b3f5bfc7941c652a09961fddb6d0a 127.0.0.1:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: e04be0db2d11fb98133c163bd97426e0f3f2f540 127.0.0.1:7003 slots: (0 slots) slave replicates ca34d6741d5b3f5bfc7941c652a09961fddb6d0a M: 048c96b56c043aab8d297b147cfe7068c74498c9 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: b711233443a7a097511fc1681403f2d83b5c8773 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: cb6ee10ec8a45f68efddc84b4acaf01fbd244627 127.0.0.1:7005 slots: (0 slots) slave replicates 048c96b56c043aab8d297b147cfe7068c74498c9 S: b630796514a48438d177fbe8f89610f1afe9b41f 127.0.0.1:7004 slots: (0 slots) slave replicates b711233443a7a097511fc1681403f2d83b5c8773 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
我們看到:
master主節點是:7000、7001、7002,7003是7000的從節點、7004是7001的從節點、7005是7002的從節點;
7000分配的哈希槽[0,5460],7001分配的哈希槽[5461,10922],7002分配的哈希槽[10923,16383]
5)測試
5-1、測試設置值、取值
我們使用redis-cli命令連接7000,並設置一個值:
lay-macdeAir:redis-cluster lay$ ./redis-cli -c -p 7000 127.0.0.1:7000> set name lay -> Redirected to slot [5798] located at 127.0.0.1:7001 OK
我們連接7001,執行獲取這個值:
lay-macdeAir:redis-cluster lay$ ./redis-cli -c -p 7001 127.0.0.1:7001> get name "lay"
我們發現我們從7001中獲取7000設置的值,集群的數據共享成功。
5-2、測試主從切換
當前有6個實例
501 37933 1 0 9:10PM ?? 0:03.85 ../redis-server 127.0.0.1:7000 [cluster] 501 37941 1 0 9:11PM ?? 0:03.82 ../redis-server 127.0.0.1:7001 [cluster] 501 37949 1 0 9:11PM ?? 0:03.82 ../redis-server 127.0.0.1:7002 [cluster] 501 37968 1 0 9:11PM ?? 0:03.75 ../redis-server 127.0.0.1:7003 [cluster] 501 37977 1 0 9:11PM ?? 0:03.76 ../redis-server 127.0.0.1:7004 [cluster] 501 37988 1 0 9:12PM ?? 0:03.76 ../redis-server 127.0.0.1:7005 [cluster]
我們先殺死7000
lay-macdeAir:redis-cluster lay$ kill -9 37933 lay-macdeAir:redis-cluster lay$ ps -ef|grep redis 501 37941 1 0 9:11PM ?? 0:05.08 ../redis-server 127.0.0.1:7001 [cluster] 501 37949 1 0 9:11PM ?? 0:05.08 ../redis-server 127.0.0.1:7002 [cluster] 501 37968 1 0 9:11PM ?? 0:05.02 ../redis-server 127.0.0.1:7003 [cluster] 501 37977 1 0 9:11PM ?? 0:05.00 ../redis-server 127.0.0.1:7004 [cluster] 501 37988 1 0 9:12PM ?? 0:05.01 ../redis-server 127.0.0.1:7005 [cluster]
檢查現在集群情況
lay-macdeAir:redis-cluster lay$ ./redis-trib.rb check 127.0.0.1:7001 >>> Performing Cluster Check (using node 127.0.0.1:7001) M: b711233443a7a097511fc1681403f2d83b5c8773 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: cb6ee10ec8a45f68efddc84b4acaf01fbd244627 127.0.0.1:7005 slots: (0 slots) slave replicates 048c96b56c043aab8d297b147cfe7068c74498c9 M: 048c96b56c043aab8d297b147cfe7068c74498c9 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: e04be0db2d11fb98133c163bd97426e0f3f2f540 127.0.0.1:7003 slots:0-5460 (5461 slots) master 0 additional replica(s) S: b630796514a48438d177fbe8f89610f1afe9b41f 127.0.0.1:7004 slots: (0 slots) slave replicates b711233443a7a097511fc1681403f2d83b5c8773 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
我們看到7000掛掉以後它的從節點7003提升為了主節點,並且所有16384個哈希槽都覆蓋了
以上我們簡單實現了redis-cluster模塊的集群效果,參考官方文檔:https://redis.io/topics/cluster-tutorial
redis(9)集群搭建