redis集群配置與管理的詳細(xì)介紹(附代碼)

本篇文章給大家?guī)淼膬?nèi)容是關(guān)于redis集群配置與管理的詳細(xì)介紹(附代碼),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

redis在3.0版本以后開始支持集群,經(jīng)過中間幾個(gè)版本的不斷更新優(yōu)化,最新的版本集群功能已經(jīng)非常完善。本文簡(jiǎn)單介紹一下Redis集群搭建的過程和配置方法,redis版本是5.0.4,操作系統(tǒng)是中標(biāo)麒麟(和centos內(nèi)核基本一致)。

1、Redis集群原理

Redis 集群是一個(gè)提供在多個(gè)Redis間節(jié)點(diǎn)間共享數(shù)據(jù)的程序集,集群節(jié)點(diǎn)共同構(gòu)建了一個(gè)去中心化的網(wǎng)絡(luò),集群中的每個(gè)節(jié)點(diǎn)擁有平等的身份,節(jié)點(diǎn)各自保存各自的數(shù)據(jù)和集群狀態(tài)。節(jié)點(diǎn)之間采用Gossip協(xié)議進(jìn)行通信,保證了節(jié)點(diǎn)狀態(tài)的信息同步。

Redis 集群數(shù)據(jù)通過分區(qū)來進(jìn)行管理,每個(gè)節(jié)點(diǎn)保存集群數(shù)據(jù)的一個(gè)子集。數(shù)據(jù)的分配采用一種叫做哈希槽(hash slot)的方式來分配,和傳統(tǒng)的一致性哈希不太相同。Redis 集群有16384個(gè)哈希槽,每個(gè)key通過CRC16校驗(yàn)后對(duì)16384取模來決定放置哪個(gè)槽。

為了使在部分節(jié)點(diǎn)失敗或者大部分節(jié)點(diǎn)無法通信的情況下集群仍然可用,集群使用了主從復(fù)制模型。讀取數(shù)據(jù)時(shí),根據(jù)一致性哈希算法到對(duì)應(yīng)的 master 節(jié)點(diǎn)獲取數(shù)據(jù),如果master 掛掉之后,會(huì)啟動(dòng)一個(gè)對(duì)應(yīng)的 salve 節(jié)點(diǎn)來充當(dāng) master 。

2、環(huán)境準(zhǔn)備

這里準(zhǔn)備在一臺(tái)PC上搭建一個(gè)3主3從的redis集群。

在/opt/目錄下新建一個(gè)文件夾rediscluster,用來存放集群節(jié)點(diǎn)目錄。

然后分別新建server10、server11、server20、server21、server30、server31 6個(gè)文件夾準(zhǔn)備6個(gè)redis節(jié)點(diǎn),這些節(jié)點(diǎn)分別使用6379、6380、6381、6382、6383、6384端口,以server10為例配置如下:

port?6379 daemonize?yes pidfile?/var/run/redis_6379.pid cluster-enabled?yes cluster-node-timeout?15000 cluster-config-file??nodes-6379.conf

其他節(jié)點(diǎn)只需修改端口和文件名,依次按此進(jìn)行配置即可,配置完成后啟動(dòng)這些節(jié)點(diǎn)。

[root@localhost?rediscluster]#?./server10/redis-server?./server10/redis.conf?& [root@localhost?rediscluster]#?./server11/redis-server?./server11/redis.conf?& [root@localhost?rediscluster]#?./server20/redis-server?./server20/redis.conf?& [root@localhost?rediscluster]#?./server21/redis-server?./server21/redis.conf?& [root@localhost?rediscluster]#?./server30/redis-server?./server30/redis.conf?& [root@localhost?rediscluster]#?./server31/redis-server?./server31/redis.conf?&

查看啟動(dòng)狀態(tài):

[root@localhost?rediscluster]#?ps?-ef|grep?redis root?????11842?????1??0?15:03??????????00:00:12?./server10/redis-server?127.0.0.1:6379?[cluster] root?????11950?????1??0?15:03??????????00:00:13?./server11/redis-server?127.0.0.1:6380?[cluster] root?????12074?????1??0?15:04??????????00:00:13?./server20/redis-server?127.0.0.1:6381?[cluster] root?????12181?????1??0?15:04??????????00:00:12?./server21/redis-server?127.0.0.1:6382?[cluster] root?????12297?????1??0?15:04??????????00:00:12?./server30/redis-server?127.0.0.1:6383?[cluster] root?????12404?????1??0?15:04??????????00:00:12?./server31/redis-server?127.0.0.1:6384?[cluster]

3、集群配置

非常簡(jiǎn)單:redis-cli –cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 –cluster -replicas 1

其中-replicas 1表示每個(gè)主節(jié)點(diǎn)1個(gè)從節(jié)點(diǎn)

[root@localhost?rediscluster]#?./server10/redis-cli?--cluster?create?127.0.0.1:6379?127.0.0.1:6380?127.0.0.1:6381?127.0.0.1:6382?127.0.0.1:6383?127.0.0.1:6384?--cluster-replicas?1 >>>?Performing?hash?slots?allocation?on?6?nodes... Master[0]?->?Slots?0?-?5460 Master[1]?->?Slots?5461?-?10922 Master[2]?->?Slots?10923?-?16383 Adding?replica?127.0.0.1:6383?to?127.0.0.1:6379 Adding?replica?127.0.0.1:6384?to?127.0.0.1:6380 Adding?replica?127.0.0.1:6382?to?127.0.0.1:6381 >>>?Trying?to?optimize?slaves?allocation?for?anti-affinity [WARNING]?Some?slaves?are?in?the?same?host?as?their?master M:?efa84a74525749b8ea20585074dda81b852e9c29?127.0.0.1:6379 ???slots:[0-5460]?(5461?slots)?master M:?63e20c75984e493892265ddd2a441c81bcdc575c?127.0.0.1:6380 ???slots:[5461-10922]?(5462?slots)?master M:?d9a79ed6204e558b2fcee78ea05218b4de006acd?127.0.0.1:6381 ???slots:[10923-16383]?(5461?slots)?master S:?0469ec03b43e27dc2b7b4eb24de34e10969e3adf?127.0.0.1:6382 ???replicates?63e20c75984e493892265ddd2a441c81bcdc575c S:?fd8ea61503e7c9b6e950894c0da41aed3ee19e7e?127.0.0.1:6383 ???replicates?d9a79ed6204e558b2fcee78ea05218b4de006acd S:?ddebc3ca467d15c7d25125e4e16bcc5576a13699?127.0.0.1:6384 ???replicates?efa84a74525749b8ea20585074dda81b852e9c29 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?127.0.0.1:6379) M:?efa84a74525749b8ea20585074dda81b852e9c29?127.0.0.1:6379 ???slots:[0-5460]?(5461?slots)?master additional?replica(s) M:?d9a79ed6204e558b2fcee78ea05218b4de006acd?127.0.0.1:6381 ???slots:[10923-16383]?(5461?slots)?master additional?replica(s) S:?0469ec03b43e27dc2b7b4eb24de34e10969e3adf?127.0.0.1:6382 ???slots:?(0?slots)?slave ???replicates?63e20c75984e493892265ddd2a441c81bcdc575c S:?ddebc3ca467d15c7d25125e4e16bcc5576a13699?127.0.0.1:6384 ???slots:?(0?slots)?slave ???replicates?efa84a74525749b8ea20585074dda81b852e9c29 M:?63e20c75984e493892265ddd2a441c81bcdc575c?127.0.0.1:6380 ???slots:[5461-10922]?(5462?slots)?master additional?replica(s) S:?fd8ea61503e7c9b6e950894c0da41aed3ee19e7e?127.0.0.1:6383 ???slots:?(0?slots)?slave ???replicates?d9a79ed6204e558b2fcee78ea05218b4de006acd [OK]?All?nodes?agree?about?slots?configuration. >>>?Check?for?open?slots... >>>?Check?slots?coverage... [OK]?All?16384?slots?covered.

創(chuàng)建完成,主從節(jié)點(diǎn)分配如下:

Adding?replica?127.0.0.1:6383?to?127.0.0.1:6379 Adding?replica?127.0.0.1:6384?to?127.0.0.1:6380 Adding?replica?127.0.0.1:6382?to?127.0.0.1:6381

4、集群測(cè)試

通過6379客戶端連接后進(jìn)行測(cè)試,發(fā)現(xiàn)轉(zhuǎn)向了6381:

[root@localhost?rediscluster]#?./server10/redis-cli?-h?127.0.0.1?-c?-p?6379 127.0.0.1:6379>?set?foo?bar ->?Redirected?to?slot?[12182]?located?at?127.0.0.1:6381 OK 127.0.0.1:6381>?get?foo "bar"

在6381上連接測(cè)試:

[root@localhost?rediscluster]#?./server10/redis-cli?-h?127.0.0.1?-c?-p?6381 127.0.0.1:6381>?get?foo "bar"

結(jié)果相同,說明集群配置正常。

5、集群節(jié)點(diǎn)擴(kuò)容

rediscluster目錄下在新增兩個(gè)目錄server40和server41,新增2個(gè)redis節(jié)點(diǎn)配置6385和6386兩個(gè)端口。將6385作為新增的master節(jié)點(diǎn),6386作為從節(jié)點(diǎn),然后啟動(dòng)節(jié)點(diǎn):

[root@localhost?server41]#?ps?-ef|grep?redis root?????11842?????1??0?15:03??????????00:00:18?./server10/redis-server?127.0.0.1:6379?[cluster] root?????11950?????1??0?15:03??????????00:00:19?./server11/redis-server?127.0.0.1:6380?[cluster] root?????12074?????1??0?15:04??????????00:00:18?./server20/redis-server?127.0.0.1:6381?[cluster] root?????12181?????1??0?15:04??????????00:00:18?./server21/redis-server?127.0.0.1:6382?[cluster] root?????12297?????1??0?15:04??????????00:00:17?./server30/redis-server?127.0.0.1:6383?[cluster] root?????12404?????1??0?15:04??????????00:00:18?./server31/redis-server?127.0.0.1:6384?[cluster] root?????30563?????1??0?18:01??????????00:00:00?./redis-server?127.0.0.1:6385?[cluster] root?????30582?????1??0?18:02??????????00:00:00?./redis-server?127.0.0.1:6386?[cluster]

添加主節(jié)點(diǎn):

[root@localhost?server41]#?./redis-cli?--cluster?add-node?127.0.0.1:6385?127.0.0.1:6379 >>>?Adding?node?127.0.0.1:6385?to?cluster?127.0.0.1:6379 >>>?Performing?Cluster?Check?(using?node?127.0.0.1:6379) M:?efa84a74525749b8ea20585074dda81b852e9c29?127.0.0.1:6379 ???slots:[0-5460]?(5461?slots)?master additional?replica(s) M:?d9a79ed6204e558b2fcee78ea05218b4de006acd?127.0.0.1:6381 ???slots:[10923-16383]?(5461?slots)?master additional?replica(s) S:?0469ec03b43e27dc2b7b4eb24de34e10969e3adf?127.0.0.1:6382 ???slots:?(0?slots)?slave ???replicates?63e20c75984e493892265ddd2a441c81bcdc575c S:?ddebc3ca467d15c7d25125e4e16bcc5576a13699?127.0.0.1:6384 ???slots:?(0?slots)?slave ???replicates?efa84a74525749b8ea20585074dda81b852e9c29 M:?63e20c75984e493892265ddd2a441c81bcdc575c?127.0.0.1:6380 ???slots:[5461-10922]?(5462?slots)?master additional?replica(s) S:?fd8ea61503e7c9b6e950894c0da41aed3ee19e7e?127.0.0.1:6383 ???slots:?(0?slots)?slave ???replicates?d9a79ed6204e558b2fcee78ea05218b4de006acd [OK]?All?nodes?agree?about?slots?configuration. >>>?Check?for?open?slots... >>>?Check?slots?coverage... [OK]?All?16384?slots?covered. >>>?Send?CLUSTER?MEET?to?node?127.0.0.1:6385?to?make?it?join?the?cluster. [OK]?New?node?added?correctly.

查看節(jié)點(diǎn)列表:

[root@localhost?server41]#?./redis-cli? 127.0.0.1:6379>?cluster?nodes 22e8a8e97d6f7cc7d627e577a986384d4d181a4f?127.0.0.1:6385@16385?master?-?0?1555064037664?0?connected efa84a74525749b8ea20585074dda81b852e9c29?127.0.0.1:6379@16379?myself,master?-?0?1555064036000?1?connected?0-5460 d9a79ed6204e558b2fcee78ea05218b4de006acd?127.0.0.1:6381@16381?master?-?0?1555064038666?3?connected?10923-16383 0469ec03b43e27dc2b7b4eb24de34e10969e3adf?127.0.0.1:6382@16382?slave?63e20c75984e493892265ddd2a441c81bcdc575c?0?1555064035000?4?connected ddebc3ca467d15c7d25125e4e16bcc5576a13699?127.0.0.1:6384@16384?slave?efa84a74525749b8ea20585074dda81b852e9c29?0?1555064037000?6?connected 63e20c75984e493892265ddd2a441c81bcdc575c?127.0.0.1:6380@16380?master?-?0?1555064037000?2?connected?5461-10922 fd8ea61503e7c9b6e950894c0da41aed3ee19e7e?127.0.0.1:6383@16383?slave?d9a79ed6204e558b2fcee78ea05218b4de006acd?0?1555064037000?5?connected

添加從節(jié)點(diǎn):

[root@localhost?server41]#?./redis-cli?--cluster?add-node?127.0.0.1:6386?127.0.0.1:6379?--cluster-slave?--cluster-master-id?22e8a8e97d6f7cc7d627e577a986384d4d181a4f >>>?Adding?node?127.0.0.1:6386?to?cluster?127.0.0.1:6379 >>>?Performing?Cluster?Check?(using?node?127.0.0.1:6379) M:?efa84a74525749b8ea20585074dda81b852e9c29?127.0.0.1:6379 ???slots:[0-5460]?(5461?slots)?master additional?replica(s) M:?22e8a8e97d6f7cc7d627e577a986384d4d181a4f?127.0.0.1:6385 ???slots:?(0?slots)?master M:?d9a79ed6204e558b2fcee78ea05218b4de006acd?127.0.0.1:6381 ???slots:[10923-16383]?(5461?slots)?master additional?replica(s) S:?0469ec03b43e27dc2b7b4eb24de34e10969e3adf?127.0.0.1:6382 ???slots:?(0?slots)?slave ???replicates?63e20c75984e493892265ddd2a441c81bcdc575c S:?ddebc3ca467d15c7d25125e4e16bcc5576a13699?127.0.0.1:6384 ???slots:?(0?slots)?slave ???replicates?efa84a74525749b8ea20585074dda81b852e9c29 M:?63e20c75984e493892265ddd2a441c81bcdc575c?127.0.0.1:6380 ???slots:[5461-10922]?(5462?slots)?master additional?replica(s) S:?fd8ea61503e7c9b6e950894c0da41aed3ee19e7e?127.0.0.1:6383 ???slots:?(0?slots)?slave ???replicates?d9a79ed6204e558b2fcee78ea05218b4de006acd [OK]?All?nodes?agree?about?slots?configuration. >>>?Check?for?open?slots... >>>?Check?slots?coverage... [OK]?All?16384?slots?covered. >>>?Send?CLUSTER?MEET?to?node?127.0.0.1:6386?to?make?it?join?the?cluster. Waiting?for?the?cluster?to?join  >>>?Configure?node?as?replica?of?127.0.0.1:6385. [OK]?New?node?added?correctly.

添加成功后,為新節(jié)點(diǎn)分配數(shù)據(jù):

[root@localhost?server41]#?./redis-cli?--cluster?reshard?127.0.0.1:6385  How?many?slots?do?you?want?to?move?(from?1?to?16384)??1000 What?is?the?receiving?node?ID??22e8a8e97d6f7cc7d627e577a986384d4d181a4f 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

這樣就新增完畢了,可以通過cluster nodes命令查看一下新增后的slot分布

127.0.0.1:6379>?cluster?nodes 22e8a8e97d6f7cc7d627e577a986384d4d181a4f?127.0.0.1:6385@16385?master?-?0?1555064706000?7?connected?0-332?5461-5794?10923-11255 efa84a74525749b8ea20585074dda81b852e9c29?127.0.0.1:6379@16379?myself,master?-?0?1555064707000?1?connected?333-5460 d9a79ed6204e558b2fcee78ea05218b4de006acd?127.0.0.1:6381@16381?master?-?0?1555064705000?3?connected?11256-16383 7c24e205301b38caa1ff3cd8b270a1ceb7249a2e?127.0.0.1:6386@16386?slave?22e8a8e97d6f7cc7d627e577a986384d4d181a4f?0?1555064705000?7?connected 0469ec03b43e27dc2b7b4eb24de34e10969e3adf?127.0.0.1:6382@16382?slave?63e20c75984e493892265ddd2a441c81bcdc575c?0?1555064707000?4?connected ddebc3ca467d15c7d25125e4e16bcc5576a13699?127.0.0.1:6384@16384?slave?efa84a74525749b8ea20585074dda81b852e9c29?0?1555064707236?6?connected 63e20c75984e493892265ddd2a441c81bcdc575c?127.0.0.1:6380@16380?master?-?0?1555064706000?2?connected?5795-10922 fd8ea61503e7c9b6e950894c0da41aed3ee19e7e?127.0.0.1:6383@16383?slave?d9a79ed6204e558b2fcee78ea05218b4de006acd?0?1555064708238?5?connected

6、集群節(jié)點(diǎn)縮減

縮減節(jié)點(diǎn)時(shí)先縮減從節(jié)點(diǎn):

[root@localhost?server41]#?./redis-cli?--cluster?del-node?127.0.0.1:6386?7c24e205301b38caa1ff3cd8b270a1ceb7249a2e >>>?Removing?node?7c24e205301b38caa1ff3cd8b270a1ceb7249a2e?from?cluster?127.0.0.1:6386 >>>?Sending?CLUSTER?FORGET?messages?to?the?cluster... >>>?SHUTDOWN?the?node.

然后進(jìn)行主節(jié)點(diǎn)slot轉(zhuǎn)移:

[root@localhost server41]# ./redis-cli --cluster reshard 127.0.0.1:6385How many slots do you want to move (from 1 to 16384)? 1000What is the receiving node ID? efa84a74525749b8ea20585074dda81b852e9c29  //要移到的節(jié)點(diǎn)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: 22e8a8e97d6f7cc7d627e577a986384d4d181a4f   //要?jiǎng)h除的主節(jié)點(diǎn)Source node #2: done

最后在縮減主節(jié)點(diǎn)

[root@localhost?server41]#?./redis-cli?--cluster?reshard?127.0.0.1:6385  How?many?slots?do?you?want?to?move?(from?1?to?16384)??1000 What?is?the?receiving?node?ID??efa84a74525749b8ea20585074dda81b852e9c29??//要移到的節(jié)點(diǎn) 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:?22e8a8e97d6f7cc7d627e577a986384d4d181a4f???//要?jiǎng)h除的主節(jié)點(diǎn) Source?node?#2:?done

縮減完成!【相關(guān)推薦:Redis教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊13 分享