国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Redis集群容器化安裝

davidac / 2083人閱讀

摘要:本文將講解如何基于搭建集群,的集群設(shè)計包括兩個部分主從復(fù)制和哈希。對象保存到之前先經(jīng)過哈希到一個指定的上,例如圖中最終到了上。至此,集群基本安裝成功。返回個槽中的鍵常見問題把所有的物理節(jié)點映射到個哈希槽上,負(fù)責(zé)維護(hù)。

1. Redis集群概述

Redis作為當(dāng)前非常熱門的內(nèi)存型數(shù)據(jù)結(jié)構(gòu)存儲,可用于數(shù)據(jù)存儲,緩存和消息代理等。本文將講解如何基于docker搭建Redis集群,Redis的集群設(shè)計包括兩個部分:主從復(fù)制和哈希Slot。

1.1. 主從復(fù)制

主從復(fù)制在數(shù)據(jù)庫中很常見,一般用來做讀寫分離,Redis中也是如此。要求只有1個Master(主節(jié)點),可以有N個slaver(從節(jié)點),而且Slaver也可以有自己的Slaver,由于這種主從的關(guān)系決定他們是在配置階段就要指定他們的上下級關(guān)系,而不是Zookeeper那種平行關(guān)系是自主推優(yōu)出來的。

讀寫分離,Master只負(fù)責(zé)寫和同步數(shù)據(jù)給Slaver,Slaver承擔(dān)了被讀的任務(wù),所以Slaver的擴(kuò)容只能提高讀效率不能提高寫效率。

Slaver先將Master那邊獲取到的信息壓入磁盤,再load進(jìn)內(nèi)存,client端是從內(nèi)存中讀取信息的。當(dāng)一個新的Slaver加入到這個集群時,會主動找Master來拜碼頭,Master發(fā)現(xiàn)新的小弟后將全量數(shù)據(jù)發(fā)送給新的Slaver,數(shù)據(jù)量越大性能消耗也就越大,所以盡量避免在運行時做Slaver的擴(kuò)容。

優(yōu)點:讀寫分離,通過增加Slaver可以提高并發(fā)讀的能力。

缺點:Master寫能力是瓶頸,維護(hù)Slaver開銷也總將會變成瓶頸。

1.2. 哈希Slot

哈希Slot名字上可能不好理解,其實就是數(shù)據(jù)庫中的“水平劃分”。如果你之前有了解過數(shù)據(jù)庫的表分區(qū)的話,就會發(fā)現(xiàn)下來對于哈希Slot的描述,就和數(shù)據(jù)庫表分區(qū)里面的“HASH分區(qū)”原理上大致相同。

對象保存到Redis之前先經(jīng)過CRC16哈希到一個指定的Node上,例如圖中Object4最終Hash到了Node1上。

?每個Node被平均分配了一個Slot段,對應(yīng)著0-16384,Slot不能重復(fù)也不能缺失,否則會導(dǎo)致對象重復(fù)存儲或無法存儲。

?Node之間也互相監(jiān)聽,一旦有Node退出或者加入,會按照Slot為單位做數(shù)據(jù)的遷移。例如Node1如果掉線了,0-5640這些Slot將會平均分?jǐn)偟絅ode2和Node3上,由于Node2和Node3本身維護(hù)的Slot還會在自己身上不會被重新分配,所以遷移過程中不會影響到 5641-16384 Slot段的使用。

優(yōu)點:將Redis的寫操作分?jǐn)偟搅硕鄠€節(jié)點上,提高寫的并發(fā)能力,擴(kuò)容簡單。

缺點:每個Node承擔(dān)著互相監(jiān)聽、高并發(fā)數(shù)據(jù)寫入、高并發(fā)數(shù)據(jù)讀出,工作任務(wù)繁重。

1.3. 合二為一

看到這里大家也就發(fā)現(xiàn)了,主從和哈希的設(shè)計優(yōu)缺點正好是相互彌補(bǔ)的,將二者結(jié)合在一起,就是Redis集群的終極形態(tài),先Hash分邏輯節(jié)點,然后每個邏輯節(jié)點內(nèi)部是主從,如圖:

2. 集群安裝

默認(rèn)我們已經(jīng)有了docker環(huán)境,現(xiàn)在開始基于docker安裝Redis集群。redis 5.0 版本之前,網(wǎng)上有很多教程都是通過redis-trib.rb 來創(chuàng)建集群,但是redis 5.0 版本以后,就只能通過 redis-cli 來實現(xiàn)。本文即通過 redis-cli 創(chuàng)建集群,因為redis集群的節(jié)點選舉方式是需要半數(shù)以上的master通過,所以建議創(chuàng)建奇數(shù)個節(jié)點。本例中創(chuàng)建3個Master節(jié)點,并為每個Master節(jié)點各分配1個Slave節(jié)點。

2.1. 宿主機(jī)環(huán)境

首先需要找一份原始的redis.conf文件,將其重命名為:redis-cluster.tmpl,并配置如下幾個參數(shù),此文件的目的是生成每一個redis實例的redis.conf:

</>復(fù)制代碼

  1. [root@kerry2 redis]# wget https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf
  2. [root@kerry2 redis]# mv redis.conf redis-cluster.tmpl

vi redis-cluster.tmpl

</>復(fù)制代碼

  1. # bind 127.0.0.1
  2. protected-mode no
  3. port ${PORT}
  4. daemonize no
  5. dir /data/redis
  6. appendonly yes
  7. cluster-enabled yes
  8. cluster-config-file nodes.conf
  9. cluster-node-timeout 15000

然后執(zhí)行下列腳本,給3個Master和3個Slave創(chuàng)建各自的掛載卷目錄

</>復(fù)制代碼

  1. # 創(chuàng)建 master 和 slave 文件夾
  2. for port in `seq 7700 7705`; do
  3. ms="master"
  4. if [ $port -ge 7703 ]; then
  5. ms="slave"
  6. fi
  7. mkdir -p ./$ms/$port/ && mkdir -p ./$ms/$port/data
  8. && PORT=$port envsubst < ./redis-cluster.tmpl > ./$ms/$port/redis.conf;
  9. done

當(dāng)前目錄結(jié)構(gòu)為

</>復(fù)制代碼

  1. [root@kerry2 redis]# tree
  2. .
  3. ├── master
  4. │?? ├── 7700
  5. │?? │?? ├── data
  6. │?? │?? └── redis.conf
  7. │?? ├── 7701
  8. │?? │?? ├── data
  9. │?? │?? └── redis.conf
  10. │?? └── 7702
  11. │?? ├── data
  12. │?? └── redis.conf
  13. ├── redis-cluster.tmpl
  14. ├── slave
  15. ?? ├── 7703
  16. ?? │?? ├── data
  17. ?? │?? └── redis.conf
  18. ?? ├── 7704
  19. ?? │?? ├── data
  20. ?? │?? └── redis.conf
  21. ?? └── 7705
  22. ?? ├── data
  23. ?? └── redis.conf
2.2. 創(chuàng)建Redis節(jié)點

假設(shè)我們只考慮單純的docker環(huán)境,并無docker-compose和k8s之類的服務(wù)編排,每個redis容器之間必須要保證通訊,可以通過創(chuàng)建docker network。(使用微服務(wù)編排的情況,后續(xù)再討論)

</>復(fù)制代碼

  1. [root@kerry2 redis]# docker network create redis-cluster-net

現(xiàn)在我們就可以運行docker redis 的 master 和 slave 實例了

</>復(fù)制代碼

  1. # 運行docker redis 的 master 和 slave 實例
  2. for port in `seq 7700 7705`; do
  3. ms="master"
  4. if [ $port -ge 7703 ]; then
  5. ms="slave"
  6. fi
  7. docker run -d -p $port:$port -p 1$port:1$port
  8. -v $PWD/$ms/$port/redis.conf:/data/redis.conf
  9. -v $PWD/$ms/$port/data:/data/redis
  10. --restart always --name redis-$ms-$port --net redis-cluster-net
  11. redis redis-server /data/redis.conf;
  12. done

查看已創(chuàng)建的redis容器

</>復(fù)制代碼

  1. [root@kerry2 redis]# docker ps |grep redis
  2. 010f295922e3 redis "docker-entrypoint..." 41 seconds ago Up 36 seconds 0.0.0.0:7705->7705/tcp, 6379/tcp, 0.0.0.0:17705->17705/tcp redis-slave-7705
  3. b5d89f0469ee redis "docker-entrypoint..." 45 seconds ago Up 40 seconds 0.0.0.0:7704->7704/tcp, 6379/tcp, 0.0.0.0:17704->17704/tcp redis-slave-7704
  4. f710e805fe96 redis "docker-entrypoint..." 50 seconds ago Up 45 seconds 0.0.0.0:7703->7703/tcp, 6379/tcp, 0.0.0.0:17703->17703/tcp redis-slave-7703
  5. b187603aec65 redis "docker-entrypoint..." 55 seconds ago Up 50 seconds 0.0.0.0:7702->7702/tcp, 6379/tcp, 0.0.0.0:17702->17702/tcp redis-master-7702
  6. ea635bd8b3dc redis "docker-entrypoint..." About a minute ago Up 55 seconds 0.0.0.0:7701->7701/tcp, 6379/tcp, 0.0.0.0:17701->17701/tcp redis-master-7701
  7. f02a468572ca redis "docker-entrypoint..." About a minute ago Up About a minute 0.0.0.0:7700->7700/tcp, 6379/tcp, 0.0.0.0:17700->17700/tcp redis-master-7700
2.3. 構(gòu)建集群

通過redis-cli 命令構(gòu)建集群,隨便找一個redis容器,運行redis-cli --cluster create --cluster-replicas 1 ip:port 命令即可

</>復(fù)制代碼

  1. [root@kerry2 redis]# docker exec -it redis-master-7700 redis-cli --cluster create 宿主ip:7700 宿主ip:7701 宿主ip:7702 宿主ip:7703 宿主ip:7704 宿主ip:7705 --cluster-replicas 1
  2. # 提示輸入yes后,構(gòu)建集群成功

記住構(gòu)建集群時,要保證節(jié)點redis數(shù)據(jù)為空,否則會出現(xiàn)下列錯誤。

</>復(fù)制代碼

  1. [ERR] Node 172.18.0.2:7700 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
2.4. 集群驗證

集群搭建完成后,我們通過 redis-cli 命令連接集群節(jié)點驗證一下。redis 集群節(jié)點的連接命令是通過 redis-cli -c -h ${ip} -p ${port}

</>復(fù)制代碼

  1. [root@kerry2 ~]# docker exec -it redis-master-7700 redis-cli -c -h 宿主機(jī)ip -p 7700
  2. 宿主機(jī)ip :7700> cluster info
  3. cluster_state:ok
  4. cluster_slots_assigned:16384
  5. cluster_slots_ok:16384
  6. cluster_slots_pfail:0
  7. cluster_slots_fail:0
  8. cluster_known_nodes:6
  9. cluster_size:3
  10. cluster_current_epoch:6
  11. cluster_my_epoch:1
  12. cluster_stats_messages_ping_sent:23838
  13. cluster_stats_messages_pong_sent:24283
  14. cluster_stats_messages_sent:48121
  15. cluster_stats_messages_ping_received:24278
  16. cluster_stats_messages_pong_received:23838
  17. cluster_stats_messages_meet_received:5
  18. cluster_stats_messages_received:48121
  19. 宿主機(jī)ip :7700> cluster nodes
  20. 056b99fe5993510c264e3e9a1fd1a04144da6a7b 172.18.0.2:7700@17700 myself,master - 0 1558578383000 1 connected 0-5460
  21. 73376f00b2837309d77b82d98984715f44eb2dcf 宿主機(jī)ip:7704@17704 slave 056b99fe5993510c264e3e9a1fd1a04144da6a7b 0 1558578388562 5 connected
  22. 20e4b509a54fb17ed8d0f6c21bbc8693ab715ee7 宿主機(jī)ip:7705@17705 slave 1bcb0a6ac770e261c5b0de21cfe26b0bd614590e 0 1558578386658 6 connected
  23. 1bcb0a6ac770e261c5b0de21cfe26b0bd614590e 宿主機(jī)ip:7701@17701 master - 0 1558578386579 2 connected 5461-10922
  24. 07a4c19848d578ac339bfaf741e1edfd0b010b08 宿主機(jī)ip:7702@17702 master - 0 1558578388661 3 connected 10923-16383
  25. 506271ed3f0657f05f439108d9372b638d2c4571 宿主機(jī)ip:7703@17703 slave 07a4c19848d578ac339bfaf741e1edfd0b010b08 0 1558578386000 4 connected

可以看到通過 "cluster info"命令看到集群的基本信息,所有的slot (16384) 都分配完畢。然后通過 "cluster nodes" 命令查看到每個master節(jié)點的slot分配的區(qū)域。至此,redis集群基本安裝成功。

3. 后期運維 3.1. 基本命令

集群

</>復(fù)制代碼

  1. cluster info :打印集群的信息
  2. cluster nodes :列出集群當(dāng)前已知的所有節(jié)點( node),以及這些節(jié)點的相關(guān)信息。

節(jié)點

</>復(fù)制代碼

  1. cluster meet :將 ip 和 port 所指定的節(jié)點添加到集群當(dāng)中,讓它成為集群的一份子。
  2. cluster forget :從集群中移除 node_id 指定的節(jié)點。
  3. cluster replicate :將當(dāng)前節(jié)點設(shè)置為 node_id 指定的節(jié)點的從節(jié)點。
  4. cluster saveconfig :將節(jié)點的配置文件保存到硬盤里面。

槽(slot)

</>復(fù)制代碼

  1. cluster addslots [slot ...] :將一個或多個槽( slot)指派( assign)給當(dāng)前節(jié)點。
  2. cluster delslots [slot ...] :移除一個或多個槽對當(dāng)前節(jié)點的指派。
  3. cluster flushslots :移除指派給當(dāng)前節(jié)點的所有槽,讓當(dāng)前節(jié)點變成一個沒有指派任何槽的節(jié)點。
  4. cluster setslot node :將槽 slot 指派給 node_id 指定的節(jié)點,如果槽已經(jīng)指派給
  5. 另一個節(jié)點,那么先讓另一個節(jié)點刪除該槽>,然后再進(jìn)行指派。
  6. cluster setslot migrating :將本節(jié)點的槽 slot 遷移到 node_id 指定的節(jié)點中。
  7. cluster setslot importing :從 node_id 指定的節(jié)點中導(dǎo)入槽 slot 到本節(jié)點。
  8. cluster setslot stable :取消對槽 slot 的導(dǎo)入( import)或者遷移( migrate)。
  9. cluster keyslot :計算鍵 key 應(yīng)該被放置在哪個槽上。
  10. cluster countkeysinslot :返回槽 slot 目前包含的鍵值對數(shù)量。
  11. cluster getkeysinslot :返回 count 個 slot 槽中的鍵
3.2. 常見問題

(1)redis-cluster 把所有的物理節(jié)點映射到[ 0 ~ 16383 ]個slot(哈希槽)上,cluster負(fù)責(zé)維護(hù) node<->slot<->value。

(2)集群任意一個節(jié)點中,如果master掛掉,但是還有slaver,slave將自動升為 master,系統(tǒng)正常。

(3)集群任意一個節(jié)點中,如果master掛掉,并且沒有slaver,集群將進(jìn)入fail狀態(tài)。

(4)如果集群超過半數(shù)以上節(jié)點的master掛掉,不管是否有slaver,集群都將進(jìn)入fail狀態(tài)。

(5)節(jié)點判斷是否失效的選舉,是集群中所有的master參與的,如果半數(shù)以上的master節(jié)點與當(dāng)前被檢測的master節(jié)點通訊檢測超時(cluster-node-timerout),就認(rèn)為當(dāng)前master節(jié)點掛掉了。

4. 腳本和yaml 參考文檔

docker redis 集群(cluster)搭建

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/27867.html

相關(guān)文章

  • Redis集群容器安裝

    摘要:本文將講解如何基于搭建集群,的集群設(shè)計包括兩個部分主從復(fù)制和哈希。至此,集群基本安裝成功。后期運維基本命令集群節(jié)點槽常見問題把所有的物理節(jié)點映射到個哈希槽上,負(fù)責(zé)維護(hù)。 Redis集群概述 Redis作為當(dāng)前非常熱門的內(nèi)存型數(shù)據(jù)結(jié)構(gòu)存儲,可用于數(shù)據(jù)存儲,緩存和消息代理等。本文將講解如何基于docker搭建Redis集群,Redis的集群設(shè)計包括兩個部分:主從復(fù)制和哈希Slot。1.1....

    xiaoqibTn 評論0 收藏0
  • Redis集群容器安裝

    摘要:本文將講解如何基于搭建集群,的集群設(shè)計包括兩個部分主從復(fù)制和哈希。至此,集群基本安裝成功。后期運維基本命令集群節(jié)點槽常見問題把所有的物理節(jié)點映射到個哈希槽上,負(fù)責(zé)維護(hù)。 Redis集群概述 Redis作為當(dāng)前非常熱門的內(nèi)存型數(shù)據(jù)結(jié)構(gòu)存儲,可用于數(shù)據(jù)存儲,緩存和消息代理等。本文將講解如何基于docker搭建Redis集群,Redis的集群設(shè)計包括兩個部分:主從復(fù)制和哈希Slot。1.1....

    sf_wangchong 評論0 收藏0
  • 關(guān)于Docker Swarm,你可能需要了解更多實踐經(jīng)驗

    摘要:雖然可以使用相同的方式部署應(yīng)用到云端,使用外部負(fù)載均衡器,但動態(tài)添加或者減少負(fù)載均衡節(jié)點依舊是痛點。這對使用外部負(fù)載均衡器幫助巨大。 數(shù)人云今天帶來的本篇文章將分享Docker在應(yīng)用程序生命周期每個階段中所扮演的角色,以及遷移到Swarm集群時需要考慮的問題。 利用Docker來開發(fā) Docker讓工作更輕松。如需要一個部署安裝MySQL數(shù)據(jù)庫,或者安裝Ghost,又或者Redis數(shù)據(jù)...

    bitkylin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<