redis-集群分片
Redis 分區(qū)
??分區(qū)是分割數(shù)據(jù)到多個(gè)Redis實(shí)例的處理過程,因此每個(gè)實(shí)例只保存key的一個(gè)子集。
分區(qū)的優(yōu)勢(shì)
??1.通過利用多臺(tái)計(jì)算機(jī)內(nèi)存的和值,允許我們構(gòu)造更大的數(shù)據(jù)庫。
??2.通過多核和多臺(tái)計(jì)算機(jī),允許我們擴(kuò)展計(jì)算能力;通過多臺(tái)計(jì)算機(jī)和網(wǎng)絡(luò)適配器,允許我們擴(kuò)展網(wǎng)絡(luò)帶寬。
分區(qū)的不足
??1.redis的一些特性在分區(qū)方面表現(xiàn)的不是很好:
??2.涉及多個(gè)key的操作通常是不被支持的。舉例來說,當(dāng)兩個(gè)set映射到不同的redis實(shí)例上時(shí),你就不能對(duì)這兩個(gè)set執(zhí)行交集操作。
??3.涉及多個(gè)key的redis事務(wù)不能使用。
??4.當(dāng)使用分區(qū)時(shí),數(shù)據(jù)處理較為復(fù)雜,比如你需要處理多個(gè)rdb/aof文件,并且從多個(gè)實(shí)例和主機(jī)備份持久化文件。
??5.增加或刪除容量也比較復(fù)雜。redis集群大多數(shù)支持在運(yùn)行時(shí)增加、刪除節(jié)點(diǎn)的透明數(shù)據(jù)平衡的能力,但是類似于客戶端分區(qū)、代理等其他系統(tǒng)則不支持這項(xiàng)特性。然而,一種叫做presharding的技術(shù)對(duì)此是有幫助的。
?
分區(qū)類型
??1.范圍分區(qū):最簡(jiǎn)單的分區(qū)方式是按范圍分區(qū),就是映射一定范圍的對(duì)象到特定的Redis實(shí)例,比如,ID從0到10000的用戶會(huì)保存到實(shí)例R0,ID從10001到 20000的用戶會(huì)保存到R1,以此類推。
??2.哈希分區(qū):另外一種分區(qū)方法是hash分區(qū)。這對(duì)任何key都適用,也無需是object_name:這種形式,像下面描述的一樣簡(jiǎn)單:用一個(gè)hash函數(shù)將key轉(zhuǎn)換為一個(gè)數(shù)字,比如使用crc32 hash函數(shù)。對(duì)key foobar執(zhí)行crc32(foobar)會(huì)輸出類似93024922的整數(shù)。對(duì)這個(gè)整數(shù)取模,將其轉(zhuǎn)化為0-3之間的數(shù)字,就可以將這個(gè)整數(shù)映射到4個(gè)Redis實(shí)例中的一個(gè)了。93024922 % 4 = 2,就是說key foobar應(yīng)該被存到R2實(shí)例中。注意:取模操作是取除的余數(shù),通常在多種編程語言中用%操作符實(shí)現(xiàn)。
?
下面我嘗試在本機(jī)(mac,其他系統(tǒng)思路一樣)上開啟3個(gè)redis-service來模擬多機(jī)器環(huán)境。
??1.去官網(wǎng)( https://redis.io/download )上把redis下載了
??2.解壓之后切cd到第一層目錄之后 執(zhí)行 mark install
??3.把redis.conf文件找到,在第一層目錄下
??4.執(zhí)行上面之后就能在src文件夾下找到redis-cli和redis-server其他的文件都不用
??5.ok 目前是這三個(gè)文件 redis-serve/redis-cli/redis.conf
??6.現(xiàn)在模擬三個(gè)機(jī)器(端口6379/6380/6381),只要對(duì)應(yīng)制作三個(gè)redis.conf就行,以redis.conf為基礎(chǔ)模板改??
??7.改三個(gè)地方(其他部分別動(dòng),用redis.conf當(dāng)模板),得到如下三個(gè)配置文件
?
??redis6379.conf
????port 6379
????pidfile /var/run/redis_6379.pid
????dbfilename dump-6379.rdb
??redis6380.conf
????port 6380
????pidfile /var/run/redis_6380.pid
????dbfilename dump-6380.rdb
??redis6381.conf
????port 6381
????pidfile /var/run/redis_6381.pid
????dbfilename dump-6381.rdb
?
??8.嘗試把這三個(gè)redis-service 啟動(dòng)起來
????redis-server redis6379.conf
????redis-server redis6380.conf
????redis-server redis6381.conf
??
??9.ps -a | grep redis-server 產(chǎn)看啟動(dòng)結(jié)果,如下:
????1892 ttys001 ???0:03.28 redis-server 127.0.0.1:6381
????1863 ttys003 ???0:03.74 redis-server 127.0.0.1:6379
????1864 ttys004 ???0:04.01 redis-server 127.0.0.1:6380
?
然后是開始分片測(cè)試,java的話直接用 JedisShardInfo/ShardedJedisPool 就行,我是用的node,但是沒找到相關(guān)的庫,我手寫了下,代碼如下:
//npm install redis const redis = require("redis");//開3個(gè)redis節(jié)點(diǎn),可以在一個(gè)服務(wù)器上,也可以分散多個(gè)服務(wù)器 //PS:如果是自己搭建集群,可以直接一個(gè)節(jié)點(diǎn),指向負(fù)載均衡的節(jié)點(diǎn)上 const client_machine0 = redis.createClient(6379); const client_machine1 = redis.createClient(6380); const client_machine2 = redis.createClient(6381); //造999個(gè)用戶請(qǐng)求出來 const quaryCount = 999; let cacheDatas = []; for (let index = 0; index < quaryCount; index++) { const nowData = { userId: index, cacheKey: 'k' + index, cacheValue: 'v' + index } cacheDatas.push(nowData); } //分片算法,主流式根據(jù)id分區(qū)域或者key hash出來 //我這按照id然后mod服務(wù)器個(gè)數(shù)做的 //這里可以自定義算法,一是考慮負(fù)載均衡,而是考慮擴(kuò)展,三是考慮machine死掉怎么救 //運(yùn)行起來的服務(wù),如果要臨時(shí)更改,一定一定一定要考慮周全。 //PS:如果是集群的話,這部分邏輯是需要寫在集群里,使用者只是訪問唯一的地址(通常是某個(gè)負(fù)載均衡地址)const getMachine = (quaryData) => { let redisMachine = null; switch (quaryData.userId % 3) { case 0: redisMachine = client_machine0; break; case 1: redisMachine = client_machine1; break; case 2: redisMachine = client_machine2; break; default: break; } return redisMachine; }//開始請(qǐng)求模擬 for (let index = 1; index < quaryCount; index++) { const cacheData = cacheDatas[index]; const machine = getMachine(cacheData); if(!machine){ console.log('Error: not find machine!!!'); }else{ machine.set(cacheData.cacheKey, cacheData.cacheValue, redis.print); } }//關(guān)閉所有連接 client_machine0.quit(); client_machine1.quit(); client_machine2.quit();關(guān)于在線擴(kuò)容:Redis的作者提出了一種叫做presharding
??1.在新機(jī)器上啟動(dòng)好對(duì)應(yīng)端口的Redis實(shí)例。
??2.配置新端口為待遷移端口的從庫。
??3.待復(fù)制完成,與主庫完成同步后,切換所有客戶端配置到新的從庫的端口。
??4.配置從庫為新的主庫。
??5.移除老的端口實(shí)例。
??6.重復(fù)上述過程遷移好所有的端口到指定服務(wù)器上。
?
增加高可用的思路就是主從復(fù)制
基本命令
??成為別人的從庫: SLAVEOF host port
??取消成為別人的從庫 ?SLAVEOF NO ONE
主從配置更詳細(xì)的解釋跟更多細(xì)節(jié),看下這個(gè):
https://www.jianshu.com/p/ba3cc187da9c
?
?
總結(jié)
以上是生活随笔為你收集整理的redis-集群分片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区分docker stack/servi
- 下一篇: Docker 集群 图形化显示 Visu