前文
Redis的Cluster集群,是在分布式且開源環境下最佳的高可用解決方案,可以有效的解決服務器宕機下或高並發下,數據的完整性。
文檔前提
Redis 3.0版本或更高版本。(3.0版本開始支持集群功能)
重要知識點
Redis群集TCP端口
每個Redis群集的節點都需要打開兩個TCP連接,由於這兩個連接就需要兩個端口,分別是用於為客戶端提供服務的常規Redis TCP命令端口(例如6379)以及通過將10000和命令端口相加(10000+6379)而獲得的端口,就是集群端口(例如16379)。
第二個大號端口用於群集總線,即使用二進制協議的節點到節點通信通道。 節點使用群集總線進行故障檢測,配置更新,故障轉移授權等。 客戶端不應嘗試與群集總線端口通信,為了保證Redis命令端口的正常使用,請確保在防火牆中打開這兩個端口,否則Redis群集節點將無法通信。命令端口和集群總線端口偏移量是固定的,始終為10000。
請注意,為了讓Redis群集正常工作,您需要為每個節點:
1、用於與客戶端進行通信的普通客戶端通信端口(通常為6379)對所有需要到達群集的客戶端以及所有其他群集節點(使用客戶端端口進行密鑰遷移)都是開放的。
2、集群總線端口(客戶端端口+ 10000)必須可從所有其他集群節點訪問。
如果您不打開這兩個TCP端口,則您的群集將無法正常工作。(重要,集群端口是redis端口+10000),集群總線使用不同的二進制協議進行節點到節點的數據交換,這更適合於使用很少的帶寬和處理時間在節點之間交換信息。
操作步驟
要創建一個集群,我們需要做的第一件事是在集群模式下運行幾個空的Redis實例。這就意味着群集不是使用普通的Redis實例創建的,因為需要配置特殊模式,以便Redis實例啟用群集特定的功能和命令。
以下是最小的Redis集群配置文件:
port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
正如您所看到的那樣,啟用群集模就是使用 cluster-enabled 這個指令。 每個Redis的實例還包含存儲此節點配置信息的文件的路徑,默認情況下為nodes.conf。 這個文件內容永遠不要人為地去修改,但是可以修改其名稱,它僅在Redis集群實例啟動時生成,並在每次需要時進行更新。
請注意,按預期工作的最小群集需要至少包含三個主節點。 對於第一次測試,強烈建議啟動一個由三個主服務器節點和三個從服務器節點組成的六個節點群集。我們通過以下步驟來一步一步的搭建Redis的Cluster集群環境。
1、我們創建相關目錄,主文件夾是redis-cluster,在此文件夾下建立6個子文件夾,名稱分別是:7000,7001,7002,7003,7004,7005,該目錄以我們將在任何給定目錄內運行的實例的端口號命名。
然后創建6個子目錄,如下圖:
mkdir redis-cluster cd redis-cluster mkdir 7000 7001 7002 7003 7004 7005
2、目錄創建好后,我們把Redis源文件里面包含的配置文件redis.conf拷貝一份,存放在7000目錄下,然后對其配置項進行修改,這個配置文件Redis.conf會作為其他Redis實例的配置文件的模板,並拷貝到其他目錄。
由於我們是做測試,並沒有啟動6個真正的物理節點,而是把6個Redis實例都部署在了同一台Linux服務器上,地址:192.168.127.130,為了區分Redis實例,我們是以不同的端口號來區分Redis實例的。然后我們修改Redis.conf的配置文件,修改項如下:
bind ******* //限制服務器IP地址,可以直接用'#'注銷,如果是本機測試,可以直接使用本地局域網IP,如果是生產環境,根據情況限制IP訪問
port 7000 //綁定端口號,必須修改,以此來區分Redis實例
daemonize yes //后台運行
pidfile /var/run/redis-7000.pid //修改pid進程文件名,以端口號命名
logfile /root/application/program/redis-cluster/7000/redis.log //修改日志文件名稱,以端口號為目錄來區分
dir /root/application/program/redis-cluster/7000/ //修改數據文件存放地址,以端口號為目錄名來區分
cluster-enabled yes //啟用集群
cluster-config-file nodes-7000.conf //配置每個節點的配置文件,同樣以端口號為名稱
cluster-node-timeout 15000 //配置集群節點的超時時間,可改可不改
appendonly yes //啟動AOF增量持久化策略
appendfsync always //發生改變就記錄日志
3、7000目錄下的Redis.conf配置文件修改后,分別拷貝到其他子目錄,依次為:7001,7002,7003,7004,7005,根據上面的配置,我們只需修改和端口號有關的項目,在Linux系統下,我們通過命令:%s/7000/7001/g,:%s/7000/7002/g,:%s/7000/7002/g,:%s/7000/7003/g,:%s/7000/7004/g,:%s/7000/7005/g 分別進行全局替換,並保存,完成對其他子目錄下的配置文件的修改。
4、我們安裝Redis的Cluster集群,需要使用Ruby命令,所以我們必須安裝對Ruby的支持。
在此說明一下,以前的Redis版本下,需要安裝Ruby和Rubygems,但是最新的版本不需要了,只要安裝Ruby,Rubygems就會自動安裝。
yum install ruby //安裝ruby yum install rubygems //安裝rubygems,最新版本會自動安裝
5、我們安裝完 Ruby 和 Rubygems 后,還需要繼續安裝Redis的Ruby接口程序。(注意:安裝接口程序,Ruby的版本必須是2.2.2以上,用ruby --version查詢版本號)
gem install redis
安裝Redis的ruby接口程序,可能會提示如下,錯誤:redis requires ruby version 2.2.2,怎么辦呢?如果是第一次遇到這個問題,可能會困擾你一陣子,我這里也有解決方案,幫你解憂。地址如下:http://www.cnblogs.com/PatrickLiu/p/8454579.html,按步驟執行就可以,一切順利。
6、開始啟動我們6個Redis實例,並且要指定配置文件,這些配置文件分別在各自的子目錄下面。
cd 7000 redis-server redis.conf cd 7001 redis-server redis.conf cd 7002 redis-server redis.conf cd 7003 redis-server redis.conf cd 7004 redis-server redis.conf cd 7005 redis-server redis.conf
7、創建集群,執行redis-trib.rb腳本,這個腳本文件可以拷貝出來,我是把它放在這個目錄:/root/application/program/redis/,當然在這個目錄下,也有其他文件,比如redis-cli,redis-server等。
(*注意:"192.168.127.130"是本地局域網IP,如果是生產環境下或者非本地測試,請直接使用服務器外網IP地址)
ruby redis-trib.rb create --replicas 1 192.168.127.130:7000 192.168.127.130:7001 192.168.127.130:7002 192.168.127.130:7003 192.168.127.130:7004 192.168.127.130:7005
我們有Redis集群命令行實用程序redis-trib的幫助,Ruby實用程序對實例執行特殊命令以創建新集群,檢查或重新設置現有集群,等等。 redis-trib實用程序位於Redis源代碼分發的src目錄中,當然也可以拷貝到其他目錄中,以方便使用。 您需要安裝redis gem才能運行redis-trib。
這里使用的命令是create,因為我們想創建一個新的集群。 選項--replicas 1 意味着我們需要為每個創建的主服務器節點創建一個從服務器節點。其他參數是我想用來創建新集群的實例的地址列表。
顯然,我們要求的唯一設置是創建一個具有3個主站和3個從站的集群。
可能出現問題:Waiting for the cluster to join....(一般出現這種情況大部分是沒有開啟集群總線端口==>"Redis端口+10000",即本文檔的端口號17000-17005)
8、 如果一切順利,你會看到類似這樣的消息: [OK] All 16384 slots covered, 這意味着至少有一個主實例服務於每個16384可用的插槽,成功創建了Redis的Cluster集群環境。
9、分別登陸7000,7001,7002Redis的實例客戶端,進行測試。效果如圖:
1、登陸7000操作:
redis-cli -c -h 192.168.127.130 -p 7000
2、登陸7001操作:
redis-cli -c -h 192.168.127.130 -p 7001
3、登陸7002操作:
redis-cli -c -h 192.168.127.130 -p 7002
10、通過Cluster Nodes命令和Cluster Info命令來看看集群效果。
11、在集群上通過增加數據來測試集群效果。直接看截圖效果吧:
每個Redis的節點都有一個ID值,此ID將被此特定redis實例永久使用,以便實例在集群上下文中具有唯一的名稱。 每個節點都會記住使用此ID的每個其他節點,而不是通過IP或端口。IP地址和端口可能會發生變化,但唯一的節點標識符在節點的整個生命周期內都不會改變。 我們簡單地稱這個標識符為節點ID。
后記
1、通過以上步驟,手動配置Redis集群就成功了。
2、總結可能出現的步驟問題,導致客戶端不能正常訪問Redis:
1、redis.conf限制了IP地址訪問
2、沒有開啟Redis集群總線端口==>"Redis端口+10000"
3、使用rudy命令開啟集群,在非本地環境下,沒有使用外網IP
ruby redis-trib.rb create --replicas 1 外網IP:7000 外網IP:7001 外網IP:7002 外網IP:7003 外網IP:7004 外網IP:7005
3、本文檔是在借鑒了別人的博文https://www.cnblogs.com/PatrickLiu/p/8458788.html,結合自己的實際操作總結而來