Redis高可用集群詳細介紹

Redis高可用集群詳細介紹

redis的集群主從模型是一種高可用的集群架構。本章主要內容有:高可用集群的搭建,Jedis連接集群,新增集群節點,刪除集群節點,其他配置補充說明。(推薦:redis視頻教程

高可用集群搭建

集群(cluster)技術是一種較新的技術,通過集群技術,可以在付出較低成本的情況下獲得在性能、可靠性、靈活性方面的相對較高的收益,其任務調度則是集群系統中的核心技術。

Redis 3.0 之后便支持集群。Redis 集群中內置了 16384 個哈希槽。Redis 會根據節點數量大致均等的將哈希槽映射到不同的節點。
所有節點之間彼此互聯(PING-PONG機制),當超過半數的主機認為某臺主機掛了,則該主機就是真的掛掉了,整個集群就不可用了。
若給集群中的每臺主機分配多臺從機。主機掛了,從機上位,依然能正常工作。但是若集群中超過半數的主機掛了,無論是否有從機,該集群也是不可用的。

搭建前的準備工作

搭建ruby環境

redis集群管理工具 redis-trib.rb 是依賴 ruby 環境。

[root@itdragon?~]#?yum?install?ruby [root@itdragon?~]#?yum?install?rubygems [root@itdragon?~]#?gem?install?redis [root@itdragon?~]#?cd?redis-4.0.2/src/ [root@itdragon?src]#?cp?redis-trib.rb?/usr/local/redis-4/bin/

第一步:安裝 ruby 環境

第二步:安裝 gem 軟件包(gem是用來擴展或修改Ruby應用程序的)。

第三步:在redis解壓目錄中找到 redis-trib.rb 文件,將其拷貝到啟動redis服務的目錄下,方便管理。

可能存在的問題

1 redis requires Ruby version >= 2.2.2,解決方法如下

2 沒有/usr/local/rvm/scripts/rvm 這個目錄.可能是上一步執行失敗

[root@itdragon?~]#?ruby?--version ruby?1.8.7?(2013-06-27?patchlevel?374)?[x86_64-linux] [root@itdragon?~]#?yum?install?curl [root@itdragon?~]#?curl?-L?get.rvm.io?|?bash?-s?stable [root@itdragon?~]#?source?/usr/local/rvm/scripts/rvm? [root@itdragon?~]#?rvm?list?known [root@itdragon?~]#?rvm?install?2.3.3 [root@itdragon?~]#?rvm?use?2.3.3 [root@itdragon?~]#?gem?install?redis

準備六臺redis服務器

和主從復制邏輯一樣,將redis.conf文件拷貝6次,端口從6000~6005

[root@itdragon?bin]#?cp?redis.conf?redis6000.conf [root@itdragon?bin]#?vim?redis6000.conf?? port?xxxx???????????????????????????#修改端口 cluster-enabled?yes?????????????????#打開注釋,開啟集群模式 cluster-config-file?nodes-xxxx.conf?#集群的配置文件 pidfile?/var/run/redis_xxxx.pid?????#pidfile文件 logfile?"xxxx.log"??????????????????#日志文件 dbfilename?dump_xxxx.rdb????????????#rdb持久化文件 cluster-node-timeout?5000???????????#請求超時,單位毫秒 appendonly?yes??????????????????????#開啟aof持久化方式 [root@itdragon?bin]#?vim?start-all.sh ./redis-server?redis6000.conf ./redis-server?redis6001.conf ./redis-server?redis6002.conf ./redis-server?redis6003.conf ./redis-server?redis6004.conf ./redis-server?redis6005.conf [root@itdragon?bin]#?chmod?u+x?start-all.sh [root@itdragon?bin]#?./start-all.sh? [root@itdragon?bin]#?ps?aux?|?grep?redis root?????28001??0.0??0.9?145964??9696??????????Ssl??17:45???0:00?./redis-server?112.74.83.71:6000?[cluster] root?????28003??0.0??0.9?145964??9696??????????Ssl??17:45???0:00?./redis-server?112.74.83.71:6001?[cluster] root?????28008??0.0??0.9?145964??9656??????????Ssl??17:45???0:00?./redis-server?112.74.83.71:6002?[cluster] root?????28013??0.0??0.9?145964??9656??????????Ssl??17:45???0:00?./redis-server?112.74.83.71:6003?[cluster] root?????28018??0.1??0.9?145964??9652??????????Ssl??17:45???0:00?./redis-server?112.74.83.71:6004?[cluster] root?????28023??0.0??0.9?145964??9656??????????Ssl??17:45???0:00?./redis-server?112.74.83.71:6005?[cluster]

第一步:復制六個redis.conf 并修改相關配置,如果覺得麻煩可以用我配置的文件:https://github.com/ITDragonBlog/daydayup/tree/master/Redis/reids.conf
第二步:新增批量開啟redis服務程序,并增加執行權限

第三步:查看六臺redis服務是否啟動成功

主從集群搭建

集群創建命令: ./redis-trib.rb create 創建集群,–replicas 1 給每個主機分配一個從機,后面其他參數都是redis服務的ip:port。最后輸入yes來接受建議的配置

[root@itdragon?bin]#?./redis-trib.rb?create?--replicas?1?112.74.83.71:6000?112.74.83.71:6001?112.74.83.71:6002?112.74.83.71:6003?112.74.83.71:6004?112.74.83.71:6005 >>>?Creating?cluster >>>?Performing?hash?slots?allocation?on?6?nodes... Using?3?masters: 112.74.83.71:6000 112.74.83.71:6001 112.74.83.71:6002 Adding?replica?112.74.83.71:6003?to?112.74.83.71:6000 Adding?replica?112.74.83.71:6004?to?112.74.83.71:6001 Adding?replica?112.74.83.71:6005?to?112.74.83.71:6002 ......?#省略 Can?I?set?the?above?configuration??(type?'yes'?to?accept):?yes ......?#省略 [OK]?All?nodes?agree?about?slots?configuration. >>>?Check?for?open?slots... >>>?Check?slots?coverage... [OK]?All?16384?slots?covered.?#有16384個可用的插槽提供服務說明搭建成功  [root@itdragon?bin]#?./redis-cli?-h?112.74.83.71?-p?6002?-c 112.74.83.71:6002>?set?testKey?value ->?Redirected?to?slot?[5203]?located?at?112.74.83.71:6000 OK  112.74.83.71:6000>?cluster?info cluster_state:ok ......  112.74.83.71:6000>?cluster?nodes 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242?112.74.83.71:6002@16002?master?-?0?1512035804722?3?connected?10923-16383 13ddd4c1b8c00926f61aa6daaa7fd8d87ee97830?112.74.83.71:6005@16005?slave?0968ef8f5ca96681da4abaaf4ca556c2e6dd0242?0?1512035803720?6?connected a3bb22e04deec2fca653c606edf5b02b819f924f?112.74.83.71:6003@16003?slave?1d4779469053930f30162e89b6711d27a112b601?0?1512035802000?4?connected 1d4779469053930f30162e89b6711d27a112b601?112.74.83.71:6000@16000?myself,master?-?0?1512035802000?1?connected?0-5460 a3b99cb5d22f5cbd293179e262f5eda931733c88?112.74.83.71:6001@16001?master?-?0?1512035802719?2?connected?5461-10922 915a47afc4f9b94389676b4e14f78cba66be9e5d?112.74.83.71:6004@16004?slave?a3b99cb5d22f5cbd293179e262f5eda931733c88?0?1512035801717?5?connected

第一步:搭建集群 ./redis-trib.rb create ,選擇yes接受建議的配置

第二步:進入集群客戶端 ./redis-cli -h 任意主機host -p 任意主機port -c,-c表示以集群方式連接redis

第三步:保存數據

第四步:cluster info 查詢集群狀態信息

第五步:cluster nodes 查詢集群結點信息,這里有一個坑,后面會介紹

可能存在的問題

Sorry, the cluster configuration file nodes.conf is already used by a different Redis Cluster node. Please make sure that different nodes use different cluster configuration files.

說的很明確,修改cluster-config-file nodes.conf 文件避免重名,或者刪除該文件重新創建集群。

cluster nodes 查詢集群節點信息

這是很重要的命令,我們需要關心的信息有:

第一個參數:節點ID

第二個參數:IP:PORT@TCP 這里一個坑,jedis-2.9.0之前的版本解析@出錯

第三個參數:標志(Master,Slave,Myself,Fail…)

第四個參數:如果是從機則是主機的節點ID

最后兩個參數:連接的狀態和槽的位置。

Jedis 連接集群

首先要配置防火墻

[root@itdragon?~]#?vim?/etc/sysconfig/iptables -A?input?-p?tcp?-m?tcp?--dport?6000?-j?ACCEPT -A?INPUT?-p?tcp?-m?tcp?--dport?6001?-j?ACCEPT -A?INPUT?-p?tcp?-m?tcp?--dport?6002?-j?ACCEPT -A?INPUT?-p?tcp?-m?tcp?--dport?6003?-j?ACCEPT -A?INPUT?-p?tcp?-m?tcp?--dport?6004?-j?ACCEPT -A?INPUT?-p?tcp?-m?tcp?--dport?6005?-j?ACCEPT [root@itdragon?~]#?service?iptables?restart

最后是整合spring

<!-- jedis集群版配置 --> <bean> ????<constructor-arg> ????????<set> ????????????<bean> ????????????????<constructor-arg></constructor-arg> ????????????????<constructor-arg></constructor-arg> ????????????</bean> ????????????<bean> ????????????????<constructor-arg></constructor-arg> ????????????????<constructor-arg></constructor-arg> ????????????</bean> ????????????<bean> ????????????????<constructor-arg></constructor-arg> ????????????????<constructor-arg></constructor-arg> ????????????</bean> ????????????<bean> ????????????????<constructor-arg></constructor-arg> ????????????????<constructor-arg></constructor-arg> ????????????</bean> ????????????<bean> ????????????????<constructor-arg></constructor-arg> ????????????????<constructor-arg></constructor-arg> ????????????</bean> ????????????<bean> ????????????????<constructor-arg></constructor-arg> ????????????????<constructor-arg></constructor-arg> ????????????</bean> ????????</set> ????</constructor-arg> ????<constructor-arg></constructor-arg></bean><bean></bean>

單元測試

/** ?*?集群版測試 ?*?若提示以下類似的錯誤: ?*?Java.lang.NumberFormatException:?For?input?String:?"6002@16002" ?*?若安裝的redis?版本大于4,則可能是jedis?的版本低了。選擇?2.9.0 ?*?因為?cluster?nodes?打印的信息中,4版本之前的是沒有?@16002?tcp端口信息 ?*?0968ef8f5ca96681da4abaaf4ca556c2e6dd0242?112.74.83.71:6002@16002?master?-?0?1512035804722?3?connected?10923-16383 ?*/ @Test public?void?testJedisCluster()?throws?IOException?{ ????HashSet<hostandport>?nodes?=?new?HashSet(); ????nodes.add(new?HostAndPort(HOST,?6000)); ????nodes.add(new?HostAndPort(HOST,?6001)); ????nodes.add(new?HostAndPort(HOST,?6002)); ????nodes.add(new?HostAndPort(HOST,?6003)); ????nodes.add(new?HostAndPort(HOST,?6004)); ????nodes.add(new?HostAndPort(HOST,?6005)); ????JedisCluster?cluster?=?new?JedisCluster(nodes); ????cluster.set("cluster-key",?"cluster-value"); ????System.out.println("集群測試?:?"?+?cluster.get("cluster-key")); ????cluster.close(); }</hostandport>

可能存在的問題

java.lang.NumberFormatException: For input string: “6002@16002”

若redis 的版本在4.0.0之上,建議使用jedis-2.9.0以上。

源碼:
https://github.com/ITDragonBlog/daydayup/tree/master/Redis/ssm-redis

集群節點操作

添加主節點

[root@itdragon?bin]#?cp?redis6005.conf?redis6006.conf [root@itdragon?bin]#?./redis-server?redis6006.conf [root@itdragon?bin]#?./redis-trib.rb?add-node?112.74.83.71:6006?112.74.83.71:6000 [root@itdragon?bin]#?./redis-cli?-h?112.74.83.71?-p?6000?cluster?nodes 916d26e9638dc51e168f32969da11e19c875f48f?112.74.83.71:6006@16006?master?-?0?1512115612162?0?connected???#?沒有分配槽 [root@itdragon?bin]#?./redis-trib.rb?reshard?112.74.83.71:6000 How?many?slots?do?you?want?to?move?(from?1?to?16384)??500 What?is?the?receiving?node?ID??916d26e9638dc51e168f32969da11e19c875f48f 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 Do?you?want?to?proceed?with?the?proposed?reshard?plan?(yes/no)??yes [root@itdragon?bin]#?./redis-cli?-h?112.74.83.71?-p?6000?cluster?nodes 916d26e9638dc51e168f32969da11e19c875f48f?112.74.83.71:6006@16006?master?-?0?1512116047897?7?connected?0-165?5461-5627?10923-11088

第一步:創建 redis6006.conf 的新主機,并啟動Redis服務

第二步:新增主機節點,若打印”[OK] New node added correctly.” 表示添加成功

第三步:查詢集群節點信息,發現6006端口的主機雖然已經添加,但連接狀態后面沒有內容,即沒分配槽

第四步:給6006端口主機分配槽,

第一個參數:需要移動槽的個數,

第二個參數:接受槽的節點ID,

第三個參數:輸入”all”表示從所有原節點中獲取槽,

第四個參數:輸入”yes”開始移動槽到目標結點id

第五步:查詢集群節點信息,發現6006端口的主機已經分配了槽

核心命令:
./redis-trib.rb add-node 新增主機ip:port 集群任意節點ip:port
./redis-trib.rb reshard 集群任意節點ip:port

可能存在的問題
[ERR] Sorry, can’t connect to node 112.74.83.71:6006
說明:新增的主機必須要是啟動狀態。

添加從節點

[root@itdragon?bin]#?cp?redis6006.conf?redis6007.conf [root@itdragon?bin]#?vim?redis6007.conf? [root@itdragon?bin]#?./redis-server?redis6007.conf [root@itdragon?bin]#?./redis-trib.rb?add-node?--slave?--master-id?916d26e9638dc51e168f32969da11e19c875f48f?112.74.83.71:6007?112.74.83.71:6006 [root@itdragon?bin]#?./redis-cli?-h?112.74.83.71?-p?6000?cluster?nodes 80315a4dee2d0fa46b8ac722962567fc903e797a?112.74.83.71:6007@16007?slave?916d26e9638dc51e168f32969da11e19c875f48f?0?1512117377000?7?connected

第一步:創建 redis6007.conf 的新主機,并啟動Redis服務
第二步:新增從機節點,在原來的命令上多了 –slave –master-id 主節點ID
第三步:查詢集群節點信息

刪除結點

刪除節點前,要確保該節點沒有值,否則提示:is not empty! Reshard data away and try again. 若該節點有值,則需要把槽分配出去

./redis-trib.rb?del-node?112.74.83.71:6006?916d26e9638dc51e168f32969da11e19c875f48f

配置文件補充

前幾章Redis教程中介紹了以下配置

1 開啟Redis 的守護進程 :daemonize yes

2 指定pid文件寫入文件名 :pidfile /var/run/redis.pid

3 指定Redis 端口:port 6379

4 綁定的主機地址 :bind 127.0.0.1

5 Redis持久化默認開啟壓縮數據:rdbcompression yes

6 指定rdb文件名:dbfilename dump.rdb

7 指定rdb文件位置:dir ./

8 從機啟動時,它會自動從master進行數據同步:slaveof

9 開啟aof持久化方式:appendonly yes

10 指定aof文件名:appendfilename appendonly.aof

11 觸發aof快照機制:appendfsync everysec (no/always)

本章節是Redis教程中的最后一章,把剩下的配置也一起說了吧

1 設置客戶端連接超時時間,0表示關閉 :timeout 300

2 設置Redis日志級別,debug、verbose(默認)、notice、warning:loglevel verbose

3 設置數據庫的數量:databases 1

4 設置Redis連接密碼:requirepass foobared

5 設置同一時間最大客戶端連接數,默認無限制:maxclients 128

6 指定Redis最大內存限制:maxmemory

7 指定是否啟用虛擬內存機制:vm-enabled no

8 指定虛擬內存文件路徑:vm-swap-file /tmp/redis.swap

9 指定包含其它的配置文件:include /path/to/local.conf

更多redis知識請關注redis視頻教程欄目。

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享