日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis简单了解 二 (集群)

發(fā)布時(shí)間:2025/3/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis简单了解 二 (集群) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

集群要實(shí)現(xiàn)的目的是要將不同的 key 分散放置到不同的 redis 節(jié)點(diǎn),這里我們需要一個(gè)規(guī)則或者算法,通常的做法是獲取 key 的哈希值,然后根據(jù)節(jié)點(diǎn)數(shù)來求模,但這種做法有其明顯的弊端,當(dāng)我們需要增加或減少一個(gè)節(jié)點(diǎn)時(shí),會(huì)造成大量的 key 無法命中,這種比例是相當(dāng)高的,所以就有人提出了一致性哈希的概念。

一致性哈希有四個(gè)重要特征:

均衡性:也有人把它定義為平衡性,是指哈希的結(jié)果能夠盡可能分布到所有的節(jié)點(diǎn)中去,這樣可以有效的利用每個(gè)節(jié)點(diǎn)上的資源。

單調(diào)性:對(duì)于單調(diào)性有很多翻譯讓我非常的不解,而我想要的是當(dāng)節(jié)點(diǎn)數(shù)量變化時(shí)哈希的結(jié)果應(yīng)盡可能的保護(hù)已分配的內(nèi)容不會(huì)被重新分派到新的節(jié)點(diǎn)。

分散性和負(fù)載:這兩個(gè)其實(shí)是差不多的意思,就是要求一致性哈希算法對(duì) key 哈希應(yīng)盡可能的避免重復(fù)。

但一致性哈希不是我們今天要介紹的重點(diǎn),因?yàn)?Redis 引入另一種哈希槽(hash slot)的概念。

Redis 集群中內(nèi)置了 16384 個(gè)哈希槽,當(dāng)需要在 Redis 集群中放置一個(gè) key-value 時(shí),redis 先對(duì) key 使用 crc16 算法算出一個(gè)結(jié)果,然后把結(jié)果對(duì) 16384 求余數(shù),這樣每個(gè) key 都會(huì)對(duì)應(yīng)一個(gè)編號(hào)在 0-16383 之間的哈希槽,redis 會(huì)根據(jù)節(jié)點(diǎn)數(shù)量大致均等的將哈希槽映射到不同的節(jié)點(diǎn)。

使用哈希槽的好處就在于可以方便的添加或移除節(jié)點(diǎn)。

當(dāng)需要增加節(jié)點(diǎn)時(shí),只需要把其他節(jié)點(diǎn)的某些哈希槽挪到新節(jié)點(diǎn)就可以了;

當(dāng)需要移除節(jié)點(diǎn)時(shí),只需要把移除節(jié)點(diǎn)上的哈希槽挪到其他節(jié)點(diǎn)就行了;

內(nèi)部機(jī)制,與我何干,對(duì)于我們來說,在新增或移除節(jié)點(diǎn)的時(shí)候不要讓我們先停掉所有的 redis 服務(wù)我就謝天謝地了,這點(diǎn)它做到了。

下面我們就開始動(dòng)手搭建一個(gè) redis 集群來體驗(yàn)一下。

因?yàn)槲覀円獑?dòng)多個(gè) redis 實(shí)例,雖然我們可以直接通過命令行來啟動(dòng),但始終是不怎么方便的,所以我們先來新建三個(gè)實(shí)例目錄,分別是9001,9002,9003,目錄名就是 redis 實(shí)例的端口號(hào)。

我這里已經(jīng)建好了目錄,然后我們把以前編譯過和修改過的 redis-server、redis.conf這兩個(gè)文件分別拷貝到這三個(gè)目錄里面,拷貝完之后就像這樣子了:

我們打開 redis.conf 文件,為了簡(jiǎn)單起見,我們只保留下面幾個(gè)配置項(xiàng):

daemonize yes
port 9001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

注意:port 要修改成對(duì)應(yīng)目錄的名字,也就是每個(gè)實(shí)例要有不同的端口。

下面我們分別啟動(dòng)這三個(gè)實(shí)例:

zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis-cluster

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9001

zhaoguihuadediannao:9001 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9003 zhaogh$ cd ../9002

zhaoguihuadediannao:9002 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9002 zhaogh$ cd ../9003

zhaoguihuadediannao:9003 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9003 zhaogh$

接下來我們來創(chuàng)建集群,讓三個(gè)實(shí)例互相通訊:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb create --replicas 0 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003

>>> Creating cluster

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

>>> Performing hash slots allocation on 3 nodes...

Using 3 masters:

127.0.0.1:9001

127.0.0.1:9002

127.0.0.1:9003

M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001

slots:0-5460 (5461 slots) master

M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002

slots:5461-10922 (5462 slots) master

M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003

slots:10923-16383 (5461 slots) master

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:9001)

M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001

slots:0-5460 (5461 slots) master

M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002

slots:5461-10922 (5462 slots) master

M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003

slots:10923-16383 (5461 slots) master

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

zhaoguihuadediannao:src zhaogh$

需要注意的是執(zhí)行 redis-trib.rb 命令需要 ruby 的支持,如果你沒有安裝可以先到 https://rubygems.org/gems/redis 下載,然后離線安裝。

sudo gem install redis-3.0.7.gem --local

下面我們用 redis 自帶的客戶端測(cè)試一下:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> get testkey001

-> Redirected to slot [12786] located at 127.0.0.1:9003

(nil)

127.0.0.1:9003> set testkey002 testvalue002

-> Redirected to slot [401] located at 127.0.0.1:9001

OK

127.0.0.1:9001> get testkey002

"testvalue002"

127.0.0.1:9001> set testkey003 testvalue003

OK

127.0.0.1:9001>

可以看到,雖然我們第一次連接的是9001端口,當(dāng)我們?nèi)カ@取 testkey001 的時(shí)候,redis cluster 自動(dòng)幫我們重定向到 9003 。

當(dāng)我們?cè)?9003 設(shè)置 testkey002 時(shí),redis cluster 又重定向到 9001 。

?

?

如何增加節(jié)點(diǎn):

首先我們創(chuàng)建一個(gè)叫做 9004 的目錄:

zhaoguihuadediannao:redis-cluster zhaogh$ mkdir 9004

zhaoguihuadediannao:redis-cluster zhaogh$

接著我們將 9001 目錄下的 redis-server 、 redis.conf 兩個(gè)文件拷貝到 9004 目錄:

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis-server 9004

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis.conf 9004

然后我們打開 redis.conf 文件修改里面的端口配置項(xiàng),將其改為 9004 。

啟動(dòng) 9004 實(shí)例:

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9004

zhaoguihuadediannao:9004 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9004 zhaogh$

想要把這個(gè)實(shí)例加入到集群,我們只需要執(zhí)行 redis-trib.rb 命令:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb add-node 127.0.0.1:9004 127.0.0.1:9001

第一個(gè)參數(shù)是我們剛才啟動(dòng)的新實(shí)例,第二個(gè)參數(shù)是集群中已有的節(jié)點(diǎn)。

檢查一下新節(jié)點(diǎn)是否已經(jīng)加入:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> cluster nodes

0e8f980bfe7a682e3d71b15523a41293535b8ccd :0 myself,master - 0 0 1 connected 0-5460

cbb01bdfdc265b190496956354d84aaae6e7d54d 127.0.0.1:9004 master - 0 1401952316346 0 connected

708e6e14474e3a99677b05ff89bd857375884437 127.0.0.1:9002 master - 0 1401952314325 2 connected 5461-10922

a7f9d3c64540cc3fc8cd3072e573bb8ab0bf1e6f 127.0.0.1:9003 master - 0 1401952315334 3 connected 10923-16383

127.0.0.1:9001>

我們可以發(fā)現(xiàn) 9004 并不包含任何哈希槽,因?yàn)樗€沒有數(shù)據(jù)。

我們還可以為集群中的主節(jié)點(diǎn)增加從節(jié)點(diǎn)用于只讀查詢。

如何增加從節(jié)點(diǎn):

我們還是要?jiǎng)?chuàng)建目錄,拷貝那兩個(gè)文件,修改配置,然后啟動(dòng)實(shí)例:

zhaoguihuadediannao:redis-cluster zhaogh$ mkdir 9005

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis-server 9005

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis.conf 9005

修改 port 為 9005

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9005

zhaoguihuadediannao:9005 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9005 zhaogh$

執(zhí)行下面的命令,增加從節(jié)點(diǎn):

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb add-node --slave 127.0.0.1:9005 127.0.0.1:9001

第一個(gè)參數(shù)為從節(jié)點(diǎn),第二個(gè)參數(shù)為主節(jié)點(diǎn)。

如何刪除一個(gè)節(jié)點(diǎn):

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 'cbb01bdfdc265b190496956354d84aaae6e7d54d'

這里要注意一下,第一個(gè)參數(shù)是集群中的任何一個(gè)主節(jié)點(diǎn)地址,而第二個(gè)參數(shù)是要?jiǎng)h除節(jié)點(diǎn)的 ID,這個(gè)ID如果你不知道的話,可以通過 cluster nodes 命令查看。

還有一點(diǎn)就是要?jiǎng)h除的節(jié)點(diǎn)必須是空的,也就是不能緩存任何數(shù)據(jù),否則會(huì)刪除不成功。對(duì)于非空節(jié)點(diǎn),在刪除之前需要重新分片,將緩存的數(shù)據(jù)轉(zhuǎn)移到別的節(jié)點(diǎn)。

如何重新分片:

我們先給某個(gè)節(jié)點(diǎn)做點(diǎn)數(shù)據(jù):

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> set testkey001 testvalue001

-> Redirected to slot [12786] located at 127.0.0.1:9003

OK

127.0.0.1:9003>

現(xiàn)在 9003 上已經(jīng)有數(shù)據(jù)了,我們嘗試刪除一下:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 '78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3'

>>> Removing node 78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3 from cluster 127.0.0.1:9001

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

[ERR] Node 127.0.0.1:9003 is not empty! Reshard data away and try again.

zhaoguihuadediannao:src zhaogh$

沒有刪除成功,我們來重新分片,把 9003 上的數(shù)據(jù)轉(zhuǎn)移:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb reshard 127.0.0.1:9003

然后輸出了很多信息,很多數(shù)值和ID都可以從這段信息中找到。

How many slots do you want to move (from 1 to 16384)? 5461

會(huì)問你要移動(dòng)多少個(gè)哈希槽,我們把 9003 上的所有哈希槽都移走,5461 這個(gè)數(shù)字可以從終端上看到,或許你的實(shí)際情況不是這個(gè)數(shù)字。

What is the receiving node ID? 4d2e0a8360795ce7ce8381c68746034aeba3c9b9

然后問你你要把這些哈希槽移到哪兒去,我指定了 9001 的 節(jié)點(diǎn) ID。

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:78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3

Source node #2:done

之后,redis 列出了重新分片計(jì)劃,最后問你

Do you want to proceed with the proposed reshard plan (yes/no)? yes

?

執(zhí)行完成后,我們看看 9003 上還有沒有 key:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9003

127.0.0.1:9003> keys *

(empty list or set)

127.0.0.1:9003>

再看看 9001 上是不是有這個(gè) key 了

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9001

127.0.0.1:9001> keys *

1) "testkey001"

127.0.0.1:9001>

沒錯(cuò),果然轉(zhuǎn)移過來了。

最后我們?cè)囋嚹懿荒馨?9003 刪除:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 '78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3'

>>> Removing node 78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3 from cluster 127.0.0.1:9001

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

>>> Sending CLUSTER FORGET messages to the cluster...

>>> SHUTDOWN the node.

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9003

Could not connect to Redis at 127.0.0.1:9003: Connection refused

not connected>

?

轉(zhuǎn)載于:https://www.cnblogs.com/guoliangxie/p/5342033.html

總結(jié)

以上是生活随笔為你收集整理的redis简单了解 二 (集群)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。