自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:如何搭建Redis集群?

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
Redis 將所有的數(shù)據(jù)分為 16384 個(gè) slots(槽),每個(gè)節(jié)點(diǎn)負(fù)責(zé)其中的一部分槽位,當(dāng)有 Redis 客戶端連接集群時(shí),會(huì)得到一份集群的槽位配置信息,這樣它就可以直接把請(qǐng)求命令發(fā)送給對(duì)應(yīng)的節(jié)點(diǎn)進(jìn)行處理。

Redis 集群(Redis Cluster)是 Redis 3.0 版本推出的 Redis 集群方案,它將數(shù)據(jù)分布在不同的服務(wù)區(qū)上,以此來(lái)降低系統(tǒng)對(duì)單主節(jié)點(diǎn)的依賴,并且可以大大的提高 Redis 服務(wù)的讀寫性能。

Redis 將所有的數(shù)據(jù)分為 16384 個(gè) slots(槽),每個(gè)節(jié)點(diǎn)負(fù)責(zé)其中的一部分槽位,當(dāng)有 Redis 客戶端連接集群時(shí),會(huì)得到一份集群的槽位配置信息,這樣它就可以直接把請(qǐng)求命令發(fā)送給對(duì)應(yīng)的節(jié)點(diǎn)進(jìn)行處理。

Redis Cluster 是無(wú)代理模式去中心化的運(yùn)行模式,客戶端發(fā)送的絕大數(shù)命令會(huì)直接交給相關(guān)節(jié)點(diǎn)執(zhí)行,這樣大部分情況請(qǐng)求命令無(wú)需轉(zhuǎn)發(fā),或僅轉(zhuǎn)發(fā)一次的情況下就能完成請(qǐng)求與響應(yīng),所以集群?jiǎn)蝹€(gè)節(jié)點(diǎn)的性能與單機(jī) Redis 服務(wù)器的性能是非常接近的,因此在理論情況下,當(dāng)水平擴(kuò)展一倍的主節(jié)點(diǎn)就相當(dāng)于請(qǐng)求處理的性能也提高了一倍,所以 Redis Cluster 的性能是非常高的。

Redis Cluster 架構(gòu)圖如下所示:

圖片圖片

搭建Redis集群

Redis Cluster 的搭建方式有兩種:

  1. 使用 Redis 源碼中提供的 create-cluster 工具快速的搭建 Redis 集群環(huán)境。
  2. 通過(guò)配置文件的方式手動(dòng)搭建 Redis 集群環(huán)境。

具體實(shí)現(xiàn)如下。

1.快速搭建Redis集群

create-cluster 工具在 utils/create-cluster 目錄下,如下圖所示:

圖片圖片

使用命令 ./create-cluster start 就可以急速創(chuàng)建一個(gè) Redis 集群,執(zhí)行如下:

$ ./create-cluster start # 創(chuàng)建集群
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006

接下來(lái)我們需要把以上創(chuàng)建的 6 個(gè)節(jié)點(diǎn)通過(guò) create 命令組成一個(gè)集群,執(zhí)行如下:

[@iZ2ze0nc5n41zomzyqtksmZ:create-cluster]$ ./create-cluster create # 組建集群
>>> 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:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 445f2a86fe36d397613839d8cc1ae6702c976593 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
M: 63bb14023c0bf58926738cbf857ea304bff8eb50 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
M: 864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
S: 64828ab44566fc5ad656e831fd33de87be1387a0 127.0.0.1:30004
   replicates 445f2a86fe36d397613839d8cc1ae6702c976593
S: 0b17b00542706343583aa73149ec5ff63419f140 127.0.0.1:30005
   replicates 63bb14023c0bf58926738cbf857ea304bff8eb50
S: e35f06ca9b700073472d72001a39ea4dfcb541cd 127.0.0.1:30006
   replicates 864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc
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:30001)
M: 445f2a86fe36d397613839d8cc1ae6702c976593 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: e35f06ca9b700073472d72001a39ea4dfcb541cd 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc
S: 0b17b00542706343583aa73149ec5ff63419f140 127.0.0.1:30005
   slots: (0 slots) slave
   replicates 63bb14023c0bf58926738cbf857ea304bff8eb50
M: 63bb14023c0bf58926738cbf857ea304bff8eb50 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 64828ab44566fc5ad656e831fd33de87be1387a0 127.0.0.1:30004
   slots: (0 slots) slave
   replicates 445f2a86fe36d397613839d8cc1ae6702c976593
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

在執(zhí)行的過(guò)程中會(huì)詢問(wèn)你是否通過(guò)把 30001、30002、30003 作為主節(jié)點(diǎn),把 30004、30005、30006 作為它們的從節(jié)點(diǎn),輸入 yes 后會(huì)執(zhí)行完成。 我們可以先使用 redis-cli 連接到集群,命令如下:

$ redis-cli -c -p 30001

在使用 nodes 命令來(lái)查看集群的節(jié)點(diǎn)信息,命令如下:

127.0.0.1:30001> cluster nodes
864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc 127.0.0.1:30003@40003 master - 0 1585125835078 3 connected 10923-16383
e35f06ca9b700073472d72001a39ea4dfcb541cd 127.0.0.1:30006@40006 slave 864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc 0 1585125835078 6 connected
0b17b00542706343583aa73149ec5ff63419f140 127.0.0.1:30005@40005 slave 63bb14023c0bf58926738cbf857ea304bff8eb50 0 1585125835078 5 connected
63bb14023c0bf58926738cbf857ea304bff8eb50 127.0.0.1:30002@40002 master - 0 1585125834175 2 connected 5461-10922
445f2a86fe36d397613839d8cc1ae6702c976593 127.0.0.1:30001@40001 myself,master - 0 1585125835000 1 connected 0-5460
64828ab44566fc5ad656e831fd33de87be1387a0 127.0.0.1:30004@40004 slave 445f2a86fe36d397613839d8cc1ae6702c976593 0 1585125835000 4 connected

可以看出 30001、30002、30003 都為主節(jié)點(diǎn),30001 對(duì)應(yīng)的槽位是 0-5460,30002 對(duì)應(yīng)的槽位是 5461-10922,30003 對(duì)應(yīng)的槽位是 10923-16383,總共有槽位 16384 個(gè) (0 ~ 16383)。

create-cluster 搭建的方式雖然速度很快,但是該方式搭建的集群主從節(jié)點(diǎn)數(shù)量固定以及槽位分配模式固定,并且安裝在同一臺(tái)服務(wù)器上,所以只能用于測(cè)試環(huán)境。

我們測(cè)試完成之后,可以使用以下命令,關(guān)閉并清理集群:

$ ./create-cluster stop # 關(guān)閉集群
Stopping 30001
Stopping 30002
Stopping 30003
Stopping 30004
Stopping 30005
Stopping 30006
$ ./create-cluster clean # 清理集群

2.手動(dòng)搭建Redis集群

由于 create-cluster 本身的限制,在實(shí)際生產(chǎn)環(huán)境中我們需要使用手動(dòng)添加配置的方式搭建 Redis 集群,為此我們先要把 Redis 安裝包復(fù)制到 node1 到 node6 文件中,因?yàn)槲覀円惭b 6 個(gè)節(jié)點(diǎn),3 主 3 從,如下圖所示:

圖片圖片

圖片圖片

接下來(lái)我們進(jìn)行配置并啟動(dòng) Redis 集群。

2.1 設(shè)置配置文件

我們需要修改每個(gè)節(jié)點(diǎn)內(nèi)的 redis.conf 文件,設(shè)置 cluster-enabled yes 表示開啟集群模式,并且修改各自的端口,我們繼續(xù)使用 30001 到 30006,通過(guò) port 3000X 設(shè)置。

2.2 啟動(dòng)各個(gè)節(jié)點(diǎn)

redis.conf 配置好之后,我們就可以啟動(dòng)所有的節(jié)點(diǎn)了,命令如下:

cd /usr/local/soft/mycluster/node1 
./src/redis-server redis.conf

2.3 創(chuàng)建集群并分配槽位

之前我們已經(jīng)啟動(dòng)了 6 個(gè)節(jié)點(diǎn),但這些節(jié)點(diǎn)都在各自的集群之內(nèi)并未互聯(lián)互通,因此接下來(lái)我們需要把這些節(jié)點(diǎn)串連成一個(gè)集群,并為它們指定對(duì)應(yīng)的槽位,執(zhí)行命令如下:

redis-cli --cluster create 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006 --cluster-replicas 1

其中 create 后面跟多個(gè)節(jié)點(diǎn),表示把這些節(jié)點(diǎn)作為整個(gè)集群的節(jié)點(diǎn),而 cluster-replicas 表示給集群中的主節(jié)點(diǎn)指定從節(jié)點(diǎn)的數(shù)量,1 表示為每個(gè)主節(jié)點(diǎn)設(shè)置一個(gè)從節(jié)點(diǎn)。

在執(zhí)行了 create 命令之后,系統(tǒng)會(huì)為我們指定節(jié)點(diǎn)的角色和槽位分配計(jì)劃,如下所示:

>>> 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:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
M: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
M: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
S: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30004
   replicates bdd1c913f87eacbdfeabc71befd0d06c913c891c
S: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30005
   replicates bdd1c913f87eacbdfeabc71befd0d06c913c891c
S: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30006
   replicates bdd1c913f87eacbdfeabc71befd0d06c913c891c
Can I set the above configuration? (type 'yes' to accept):

從以上信息可以看出,Redis 打算把 30001、30002、30003 設(shè)置為主節(jié)點(diǎn),并為他們分配的槽位,30001 對(duì)應(yīng)的槽位是 0-5460,30002 對(duì)應(yīng)的槽位是 5461-10922,30003 對(duì)應(yīng)的槽位是 10923-16383,并且把 30005 設(shè)置為 30001 的從節(jié)點(diǎn)、30006 設(shè)置為 30002 的從節(jié)點(diǎn)、30004 設(shè)置為 30003 的從節(jié)點(diǎn),我們只需要輸入 yes 即可確認(rèn)并執(zhí)行分配,如下所示:

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:30001)
M: 887397e6fefe8ad19ea7569e99f5eb8a803e3785 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: abec9f98f9c01208ba77346959bc35e8e274b6a3 127.0.0.1:30005
   slots: (0 slots) slave
   replicates 887397e6fefe8ad19ea7569e99f5eb8a803e3785
S: 1a324d828430f61be6eaca7eb2a90728dd5049de 127.0.0.1:30004
   slots: (0 slots) slave
   replicates f5958382af41d4e1f5b0217c1413fe19f390b55f
S: dc0702625743c48c75ea935c87813c4060547cef 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 3da35c40c43b457a113b539259f17e7ed616d13d
M: 3da35c40c43b457a113b539259f17e7ed616d13d 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: f5958382af41d4e1f5b0217c1413fe19f390b55f 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

顯示 OK 表示整個(gè)集群就已經(jīng)成功啟動(dòng)了。

接下來(lái),我們使用 redis-cli 連接并測(cè)試一下集群的運(yùn)行狀態(tài),代碼如下:

$ redis-cli -c -p 30001 # 連接到集群
127.0.0.1:30001> cluster info # 查看集群信息
cluster_state:ok # 狀態(tài)正常
cluster_slots_assigned:16384 # 槽位數(shù)
cluster_slots_ok:16384 # 正常的槽位數(shù)
cluster_slots_pfail:0 
cluster_slots_fail:0
cluster_known_nodes:6 # 集群的節(jié)點(diǎn)數(shù)
cluster_size:3 # 集群主節(jié)點(diǎn)數(shù)
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:130
cluster_stats_messages_pong_sent:127
cluster_stats_messages_sent:257
cluster_stats_messages_ping_received:122
cluster_stats_messages_pong_received:130
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:257

相關(guān)字段的說(shuō)明已經(jīng)標(biāo)識(shí)在上述的代碼中了,這里就不再贅述。

責(zé)任編輯:武曉燕 來(lái)源: Java中文社群
相關(guān)推薦

2024-04-09 10:40:04

2024-02-28 10:14:47

Redis數(shù)據(jù)硬盤

2024-10-22 16:39:07

2024-09-29 16:17:02

2015-08-13 10:29:12

面試面試官

2021-11-02 09:05:25

Redis

2023-02-16 08:10:40

死鎖線程

2022-08-08 13:45:12

Redis面試Hash

2022-07-06 13:48:24

RedisSentinel機(jī)制

2022-08-11 18:27:50

面試Redis分布式鎖

2021-07-06 07:08:18

管控數(shù)據(jù)數(shù)倉(cāng)

2024-09-11 22:51:19

線程通訊Object

2010-08-12 16:28:35

面試官

2025-03-17 00:00:00

2023-11-20 10:09:59

2024-03-18 14:06:00

停機(jī)Spring服務(wù)器

2024-02-20 14:10:55

系統(tǒng)緩存冗余

2025-03-24 00:12:00

2020-11-06 07:11:40

內(nèi)存虛擬Redis

2020-07-02 07:52:11

RedisHash映射
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)