日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Linux中部署Redis集群:RedisCluster

redis從3.0開(kāi)始支持集群功能。redis集群采用無(wú)中心節(jié)點(diǎn)方式實(shí)現(xiàn),無(wú)需proxy代理,客戶端直接與redis集群的每個(gè)節(jié)點(diǎn)連接,根據(jù)同樣的hash算法計(jì)算出key對(duì)應(yīng)的slot,然后直接在slot對(duì)應(yīng)的redisj節(jié)點(diǎn)上執(zhí)行命令。在redis看來(lái),響應(yīng)時(shí)間是最苛刻的條件,增加一層帶來(lái)的開(kāi)銷是redis不能接受的。因此,redis實(shí)現(xiàn)了客戶端對(duì)節(jié)點(diǎn)的直接訪問(wèn),為了去中心化,節(jié)點(diǎn)之間通過(guò)gossip協(xié)議交換互相的狀態(tài),以及探測(cè)新加入的節(jié)點(diǎn)信息。redis集群支持動(dòng)態(tài)加入節(jié)點(diǎn),動(dòng)態(tài)遷移slot,以及自動(dòng)故障轉(zhuǎn)移。

成都創(chuàng)新互聯(lián)公司專注于德安網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供德安營(yíng)銷型網(wǎng)站建設(shè),德安網(wǎng)站制作、德安網(wǎng)頁(yè)設(shè)計(jì)、德安網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造德安網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供德安網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

1. Linux系統(tǒng)配置

1.1. vm.overcommit_memory設(shè)置

overcommit_memory文件指定了內(nèi)核針對(duì)內(nèi)存分配的策略,其值可以是0、1、2。

0, 表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用;如果有足夠的可用內(nèi)存,內(nèi)存申請(qǐng)?jiān)试S;否則,內(nèi)存申請(qǐng)失敗,并把錯(cuò)誤返回給應(yīng)用進(jìn)程。 1, 表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何。2, 表示內(nèi)核允許分配超過(guò)所有物理內(nèi)存和交換空間總和的內(nèi)存

jenkins_service@jenkinsservice:~/Redis-3.0.1$ sudo sysctl vm.overcommit_memory=1

vm.overcommit_memory = 1

1.2. Transparent Huge Pages開(kāi)啟

THP(Transparent Huge Pages)是一個(gè)使管理Huge Pages自動(dòng)化的抽象層。

目前需要注意的是,由于實(shí)現(xiàn)方式問(wèn)題,THP會(huì)造成內(nèi)存鎖影響性能,尤其是在程序不是專門為大內(nèi)內(nèi)存頁(yè)開(kāi)發(fā)的時(shí)候,簡(jiǎn)單介紹如下:

操作系統(tǒng)后臺(tái)有一個(gè)叫做khugepaged的進(jìn)程,它會(huì)一直掃描所有進(jìn)程占用的內(nèi)存,在可能的情況下會(huì)把4kpage交換為Huge Pages,在這個(gè)過(guò)程中,對(duì)于操作的內(nèi)存的各種分配活動(dòng)都需要各種內(nèi)存鎖,直接影響程序的內(nèi)存訪問(wèn)性能,并且,這個(gè)過(guò)程對(duì)于應(yīng)用是透明的,在應(yīng)用層面不可控制,對(duì)于專門為4k page優(yōu)化的程序來(lái)說(shuō),可能會(huì)造成隨機(jī)的性能下降現(xiàn)象。

Redis Cluster 命令行

//集群(cluster)

1. CLUSTER INFO 打印集群的信息
2. CLUSTER NODES 列出集群當(dāng)前已知的所有節(jié)點(diǎn)(node),以及這些節(jié)點(diǎn)的相關(guān)信息。
3.
4. //節(jié)點(diǎn)(node)
5. CLUSTER MEET   將 ip 和 port 所指定的節(jié)點(diǎn)添加到集群當(dāng)中,讓它成為集群的一份子。
6. CLUSTER FORGET 
  
    從集群中移除 node_id 指定的節(jié)點(diǎn)。 7. CLUSTER REPLICATE 
   
     將當(dāng)前節(jié)點(diǎn)設(shè)置為 node_id 指定的節(jié)點(diǎn)的從節(jié)點(diǎn)。 8. CLUSTER SAVECONFIG 將節(jié)點(diǎn)的配置文件保存到硬盤里面。 9. 10. //槽(slot) 11. CLUSTER ADDSLOTS  [slot ...] 將一個(gè)或多個(gè)槽(slot)指派(assign)給當(dāng)前節(jié)點(diǎn)。 12. CLUSTER DELSLOTS  [slot ...] 移除一個(gè)或多個(gè)槽對(duì)當(dāng)前節(jié)點(diǎn)的指派。 13. CLUSTER FLUSHSLOTS 移除指派給當(dāng)前節(jié)點(diǎn)的所有槽,讓當(dāng)前節(jié)點(diǎn)變成一個(gè)沒(méi)有指派任何槽的節(jié)點(diǎn)。 14. CLUSTER SETSLOT  NODE 
    
      將槽 slot 指派給 node_id 指定的節(jié)點(diǎn),如果槽已經(jīng)指派給另一個(gè)節(jié)點(diǎn),那么先讓另一個(gè)節(jié)點(diǎn)刪除該槽>,然后再進(jìn)行指派。 15. CLUSTER SETSLOT  MIGRATING 
     
       將本節(jié)點(diǎn)的槽 slot 遷移到 node_id 指定的節(jié)點(diǎn)中。 16. CLUSTER SETSLOT  IMPORTING 
      
        從 node_id 指定的節(jié)點(diǎn)中導(dǎo)入槽 slot 到本節(jié)點(diǎn)。 17. CLUSTER SETSLOT  STABLE 取消對(duì)槽 slot 的導(dǎo)入(import)或者遷移(migrate)。 18. 19. //鍵 (key) 20. CLUSTER KEYSLOT  計(jì)算鍵 key 應(yīng)該被放置在哪個(gè)槽上。 21. CLUSTER COUNTKEYSINSLOT  返回槽 slot 目前包含的鍵值對(duì)數(shù)量。 22. CLUSTER GETKEYSINSLOT   返回 count 個(gè) slot 槽中的鍵。 
      
     
    
   
  

2. 配置文件

開(kāi)啟cluster的redis必須是空服務(wù)器

修改redis.conf開(kāi)啟cluster

img

設(shè)置3個(gè)cluster

10.24.6.7:6379

10.24.6.4:6379

10.24.6.6:6379

3. 查看初始redis集群狀態(tài)

啟動(dòng)三個(gè)節(jié)點(diǎn)上的Redis服務(wù)器。此時(shí),三個(gè)Redis服務(wù)器節(jié)點(diǎn)均會(huì)以Redis Cluster的方式開(kāi)始運(yùn)行,但并沒(méi)有自動(dòng)構(gòu)建集群,因?yàn)槿哌€處于“我不認(rèn)識(shí)你,你不屬于我”的狀態(tài),它們每個(gè)都是孤零零的Redis節(jié)點(diǎn),或者是只包含了一個(gè)節(jié)點(diǎn)的集群。我們可以通過(guò)Redis客戶端連接到服務(wù)器查看它們的狀態(tài),圖一給出了狀態(tài)查詢方法和查詢結(jié)果,其中cluster nodes命令用于查看當(dāng)前Redis節(jié)點(diǎn)所屬的Redis集群中的所有節(jié)點(diǎn),而cluster info則用于查看當(dāng)前Redis節(jié)點(diǎn)所屬的Redis集群的整體狀態(tài)。由圖中我們可以看到,Redis集群中僅包含一個(gè)Redis節(jié)點(diǎn),也就是當(dāng)前節(jié)點(diǎn),整個(gè)集群的狀態(tài)是fail。

img

4. 分配hash slot

通過(guò)上面的操作,我們已經(jīng)將三個(gè)各自為政的Redis節(jié)點(diǎn)規(guī)劃到一個(gè)相同的集群中,那么我們現(xiàn)在是否就已經(jīng)完成了集群搭建的所有工作了呢?非也!通過(guò)圖二中對(duì)集群狀態(tài)的查看我們可以知道,當(dāng)前集群的狀態(tài)還是fail,此時(shí)的Redis集群是不工作的,無(wú)法處理任何Redis命令。那么集群的狀態(tài)為什么還是fail呢?本博主通過(guò)查看官方文檔說(shuō)明找到了原因所在,現(xiàn)摘錄原文如下:

The FAIL state for the cluster happens in two cases.

\1) If at least one hash slot is not served as the node serving it currently is in FAIL state.

\2) If we are not able to reach the majority of masters (that is, if the majorify of masters are simply in PFAIL state, it is enough for the node to enter FAIL mode).

很明顯,導(dǎo)致我們的集群處于fail狀態(tài)的原因不是第二個(gè)條,也就是說(shuō)至少有一個(gè)hash slot沒(méi)有被服務(wù)!稍微考慮一下,可不是!何止有一個(gè)hash slot沒(méi)有被服務(wù),壓根兒就沒(méi)有Redis節(jié)點(diǎn)為任何hash slot服務(wù)!眾所周知,Redis Cluster通過(guò)hash slot將數(shù)據(jù)根據(jù)主鍵來(lái)分區(qū),所以一條key-value數(shù)據(jù)會(huì)根據(jù)算法自動(dòng)映射到一個(gè)hash slot,但是一個(gè)hash slot存儲(chǔ)在哪個(gè)Redis節(jié)點(diǎn)上并不是自動(dòng)映射的,是需要集群管理者自行分配的。那么我們需要為多少個(gè)hash slot分配Redis節(jié)點(diǎn)呢?根據(jù)源碼可知是16384個(gè),即我們要將16384個(gè)hash slot分配到集群內(nèi)的三個(gè)節(jié)點(diǎn)上。Redis中用于分配hash slot的命令有很多,其中包括cluster addslots、cluster delslots和cluster setslot。鑒于我們現(xiàn)在是集群的初始化階段,所以我們可以選擇cluster addslots來(lái)分配hash slot,該命令的語(yǔ)法為cluster addslots slot1 [slot2] … [slotN]。

4.1. nodes-6379.conf分配

每個(gè)redis客戶端單獨(dú)分配自己負(fù)責(zé)的部分

修改內(nèi)容如下:cda76a0a094d2ce624e33bed7f3c75689a4128fd :0 myself,master – 0 0 connected 0-5000(注意是在自身節(jié)點(diǎn)的描述,也就是包含了myself那一行的后面追加hash slot的范圍)。類似的,Redis Cluster Node2上nodes-6379.conf文件中追加5001-10000,Redis Cluster Node3上nodes-6379.conf文件中追加10001-16383。經(jīng)過(guò)這樣的配置后,Redis Cluster Node1負(fù)責(zé)存儲(chǔ)0至5000之間的所有hash slots,Redis Cluster Node2負(fù)責(zé)存儲(chǔ)5001至10000之間的所有hash slots,Redis Cluster Node3負(fù)責(zé)存儲(chǔ)10001至16383的所有hash slots。

img

4.2. Redis cluster 命令分配

img

5. 搭建Redis集群

這里所謂的搭建集群,說(shuō)白了就是讓之前啟動(dòng)的三個(gè)Redis節(jié)點(diǎn)彼此連通,意識(shí)到彼此的存在,那么如何做到這一點(diǎn)呢?答案就是cluster meet命令。該命令的作用就是將當(dāng)前節(jié)點(diǎn)主動(dòng)介紹給另外一個(gè)節(jié)點(diǎn)認(rèn)識(shí),圖二給出了cluster meet命令的執(zhí)行方法和執(zhí)行效果,由圖中可知我們使用cluster meet命令分別將Redis Cluster Node1介紹給了Redis Cluster Node2(節(jié)點(diǎn)IP地址為192.168.32.3,運(yùn)行端口為6379)和Redis Cluster Node3(節(jié)點(diǎn)IP地址為192.168.32.4,運(yùn)行端口為6379),之后我們?cè)俅尾榭醇汗?jié)點(diǎn)和集群狀態(tài)就可以知道,三個(gè)節(jié)點(diǎn)已經(jīng)成功合并到了同一個(gè)集群中。

img

這里找到了3個(gè)節(jié)點(diǎn)

查看10.24.6.6客戶端

img

至此,3個(gè)結(jié)點(diǎn)

img

搭建完成標(biāo)識(shí):

img

在集群狀態(tài)顯示為ok之后,我們就可以像在Redis單機(jī)版上一樣執(zhí)行Redis命令了。

6. 測(cè)試

6.1. 非集群模式

6.1.1. Redis-cli

img

img

非集群模式客戶端在cluster跳轉(zhuǎn)時(shí)會(huì)提示MOVED錯(cuò)誤

6.1.2. Redis客戶端庫(kù)

from redis.sentinel import Sentinel
sentinel = Sentinel([(
‘10.24.6.7’26379)], socket_timeout=0.1)
master = sentinel.master_for(
‘10.24.6.5master’, socket_timeout=0.1)
print master
master.set(
‘a(chǎn)aaaaaaaaaaaaaa’‘bar’)
master.set(
‘bbbbbbbbbbbbbbbb’‘bar’)
print master.get(‘a(chǎn)aaaaaaaaaaaaaa’)
print master.get(‘bbbbbbbbbbbbbbbb’)

Traceback (most recent call last):

File “E:/HomeInternet/server/utest_workspace/utest_utils/utest_unit/init.py”, line 23, in

master.set(‘bbbbbbbbbbbbbbbb’, ‘bar’)

File “build\bdist.win32\egg\redis\client.py”, line 1055, in set

File “build\bdist.win32\egg\redis\client.py”, line 565, in execute_command

File “build\bdist.win32\egg\redis\client.py”, line 577, in parse_response

File “build\bdist.win32\egg\redis\sentinel.py”, line 55, in read_response

File “build\bdist.win32\egg\redis\connection.py”, line 574, in read_response

redis.exceptions.ResponseError: MOVED 9577 10.24.6.6:6379

6.2. 集群模式(-C)

6.2.1. Redis-cli

img

集群模式客戶端在跳轉(zhuǎn)時(shí)會(huì)自動(dòng)進(jìn)行結(jié)點(diǎn)轉(zhuǎn)向

6.2.2. Redis Cluster

from rediscluster import StrictRedisCluster
startup_nodes = [{
“host”“10.24.6.7”“port”“6379”}] rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
print rc.set(“bbbbbbbbbbbbbbbb”“bar”)
True
print rc.get(“bbbbbbbbbbbbbbbb”)

img

6.2.3. Redis Sentinel + Cluster

from redis.sentinel import Sentinel
from redisclusterimport StrictRedisCluster
sentinel = Sentinel([(
‘10.24.6.7’26379)], socket_timeout=0.1)
ip, port = sentinel.discover_master(
‘10.24.6.5master’)
rc = StrictRedisCluster(host=ip, port=port, decode_responses=True)
print rc.set(“bbbbbbbbbbbbbbbb”“bar”)
print rc.get(“bbbbbbbbbbbbbbbb”)

**


新聞標(biāo)題:Linux中部署Redis集群:RedisCluster
標(biāo)題URL:http://m.5511xx.com/article/cogosoo.html