Redis集群-Docker

Redis集群是Redis分布式解決方案,解決了單機中心化的問題

一、理論基礎(chǔ)

主要包括2部分:節(jié)點主從、哈希Slot(槽)

節(jié)點主從:

1、master可由有多個slaver,slaver可以有自己的slaver,主從關(guān)系手動指定,當master下線后slaver會自動升為master;

2、讀寫分離,master負責寫以及數(shù)據(jù)同步給slaver,slaver負責讀,slaver擴容提高讀效率;

3、slaver獲取master數(shù)據(jù)后壓入磁盤,再load進內(nèi)存,client端從內(nèi)存中讀取數(shù)據(jù),當增加一個slaver,會主動通知master,master將全量數(shù)據(jù)發(fā)送給slaver,數(shù)據(jù)量大將影響性能;

優(yōu)點:讀寫分離,增加slaver提交讀的并發(fā)能力;

缺點:master寫是瓶頸;


hash slot


1、對象保存前先進行CRC16哈希到指定slot(節(jié)點);

2、每個節(jié)點分配一個slot段,slot不能缺失也不能重復(fù);

3、node之間相互監(jiān)聽,一旦有node退出或加入,會按照slot為單位做數(shù)據(jù)遷移;

優(yōu)點:每個node互相監(jiān)聽,高并發(fā)數(shù)據(jù)寫入、讀出,任務(wù)繁重;

優(yōu)點:將寫操作分攤到了多個節(jié)點,提高寫并發(fā),擴容簡單;

節(jié)點主從 && 哈希slot


1、主從和hash相互彌補優(yōu)缺點;

2、先hash分邏輯節(jié)點,每個節(jié)點內(nèi)部主從;

3、擴展并發(fā)讀添加slaver,擴展并發(fā)寫添加master;


二、集群搭建

集群操作:

//集群(cluster)?

CLUSTER INFO 打印集群的信息?

CLUSTER NODES 列出集群當前已知的所有節(jié)點(node),以及這些節(jié)點的相關(guān)信息。??


//節(jié)點(node)?

CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節(jié)點添加到集群當中,讓它成為集群的一份子。?

CLUSTER FORGET <node_id> 從集群中移除 node_id 指定的節(jié)點。?

CLUSTER REPLICATE <node_id> 將當前節(jié)點設(shè)置為 node_id 指定的節(jié)點的從節(jié)點。?

CLUSTER SAVECONFIG 將節(jié)點的配置文件保存到硬盤里面。??


//槽(slot)?

CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節(jié)點。?

CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節(jié)點的指派。?

CLUSTER FLUSHSLOTS 移除指派給當前節(jié)點的所有槽,讓當前節(jié)點變成一個沒有指派任何槽的節(jié)點。?

CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節(jié)點,如果槽已經(jīng)指派給另一個節(jié)點,那么先讓另一個節(jié)點刪除該槽>,然后再進行指派。?

CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節(jié)點的槽 slot 遷移到 node_id 指定的節(jié)點中。?

CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節(jié)點中導(dǎo)入槽 slot 到本節(jié)點。?

CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的導(dǎo)入(import)或者遷移(migrate)。??


//鍵 (key)?

CLUSTER KEYSLOT <key> 計算鍵 key 應(yīng)該被放置在哪個槽上。?

CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數(shù)量。?

CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。



1、安裝redis鏡像

yimaoqian@yimaoqian  ~  docker pull redis

2、修改配置文件

下載redishttp://download.redis.io/releases/,解壓后得到redis.conf,添加或修改如下配置:

bind 0.0.0.0

daemonize no

requirepass 123456

masterauth 123456

cluster-enabled?yes

cluster-config-file?nodes-6379.conf

cluster-node-timeout 15000

3、運行redis集群

使用6個redis節(jié)點,3主3從

docker run --privileged=true --name redis1 --net redis-net -p 6001:6379 -v $PWD/6001/conf/redis.conf:/data/config/redis.conf -v $PWD/6001/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

docker run --privileged=true --name redis2 --net redis-net -p 6002:6379 -v $PWD/6002/conf/redis.conf:/data/config/redis.conf -v $PWD/6002/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

docker run --privileged=true --name redis3 --net redis-net -p 6003:6379 -v $PWD/6003/conf/redis.conf:/data/config/redis.conf -v $PWD/6003/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

docker run --privileged=true --name redis4 --net redis-net -p 6004:6379 -v $PWD/6004/conf/redis.conf:/data/config/redis.conf -v $PWD/6004/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

docker run --privileged=true --name redis5 --net redis-net -p 6005:6379 -v $PWD/6005/conf/redis.conf:/data/config/redis.conf -v $PWD/6005/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

docker run --privileged=true --name redis6 --net redis-net -p 6006:6379 -v $PWD/6006/conf/redis.conf:/data/config/redis.conf -v $PWD/6006/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

4、查看容器狀態(tài)

yimaoqian@yimaoqian  ~  docker ps

CONTAINER ID? ? ? ? IMAGE? ? ? ? ? ? ? ? COMMAND? ? ? ? ? ? ? ? ? CREATED? ? ? ? ? ? STATUS? ? ? ? ? ? ? ? PORTS? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NAMES

264773dfc76a? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 3 hours? ? ? ? ? ? 0.0.0.0:6006->6379/tcp? ? ? ? ? ? ? redis6

cf017727c5e1? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 3 hours? ? ? ? ? ? 0.0.0.0:6005->6379/tcp? ? ? ? ? ? ? redis5

ab6041e6e5c2? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 3 hours? ? ? ? ? ? 0.0.0.0:6004->6379/tcp? ? ? ? ? ? ? redis4

8faeccf80150? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 3 hours? ? ? ? ? ? 0.0.0.0:6003->6379/tcp? ? ? ? ? ? ? redis3

bdb2a392c8c9? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 3 hours? ? ? ? ? ? 0.0.0.0:6002->6379/tcp? ? ? ? ? ? ? redis2

a986b0a1a4d8? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 37 minutes? ? ? ? ? 0.0.0.0:6001->6379/tcp? ? ? ? ? ? ? redis1

5、運行redis集群容器

查看容器IP:

yimaoqian@yimaoqian  ~/wutong/specialGroup/redis  docker inspect redis1 redis2 redis3 redis4 redis5 redis6|grep IPA

? ? ? ? ? ? "SecondaryIPAddresses": null,

? ? ? ? ? ? "IPAddress": "",

? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,

? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.2",

? ? ? ? ? ? "SecondaryIPAddresses": null,

? ? ? ? ? ? "IPAddress": "",

? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,

? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.3",

? ? ? ? ? ? "SecondaryIPAddresses": null,

? ? ? ? ? ? "IPAddress": "",

? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,

? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.4",

? ? ? ? ? ? "SecondaryIPAddresses": null,

? ? ? ? ? ? "IPAddress": "",

? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,

? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.5",

? ? ? ? ? ? "SecondaryIPAddresses": null,

? ? ? ? ? ? "IPAddress": "",

? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,

? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.6",

? ? ? ? ? ? "SecondaryIPAddresses": null,

? ? ? ? ? ? "IPAddress": "",

? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,

? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.7",

集群感知:

localhost:6001> CLUSTER MEET 172.20.0.3 6379

OK

localhost:6001> CLUSTER MEET 172.20.0.4 6379

OK

localhost:6001> CLUSTER MEET 172.20.0.5 6379

OK

localhost:6001> CLUSTER MEET 172.20.0.6 6379

OK

localhost:6001> CLUSTER MEET 172.20.0.7 6379

OK

localhost:6001> cluster nodes

a4cfac29113a66a278c37268d2ca49fb62873e93 172.20.0.7:6379@16379 master - 0 1572328475000 5 connected

e3316f5cdc75a7e7ea259c3b9a00dee4dc6afb4c 172.20.0.5:6379@16379 master - 0 1572328476000 3 connected

8a5363c38e406227ffcc89080edd4b84d0d22ba4 172.20.0.2:6379@16379 myself,master - 0 1572328474000 1 connected

a179d778c65c3caeeaca5f095fb4a1380453a07a 172.20.0.4:6379@16379 master - 0 1572328476510 2 connected

fdddf383f8bf53447926e5efb80a7405ec85294d 172.20.0.3:6379@16379 master - 0 1572328474495 0 connected

383bd17b9a8c3a64f664637dd7cdb764a17324b8 172.20.0.6:6379@16379 master - 0 1572328475000 4 connected

分配slot:

查看槽信息

localhost:6001>?CLUSTER INFO

cluster_state:fail

cluster_slots_assigned:0?# 被分配槽的個數(shù)為0

cluster_slots_ok:0

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:6

cluster_size:0

cluster_current_epoch:5

cluster_my_epoch:2

cluster_stats_messages_ping_sent:260418

cluster_stats_messages_pong_sent:260087

cluster_stats_messages_meet_sent:10

cluster_stats_messages_sent:520515

cluster_stats_messages_ping_received:260086

cluster_stats_messages_pong_received:260328

cluster_stats_messages_meet_received:1

cluster_stats_messages_received:520415

分配槽位:

#!/bin/bash

# node1 localhost:6001? 172.20.0.2

n=0

for ((i=n;i<=5461;i++))

do

? /usr/local/bin/redis-cli -h localhost -p 6001 -a 123456? CLUSTER ADDSLOTS $i

done

# node2 localhost:6002? ? 172.20.0.3

n=5462

for ((i=n;i<=10922;i++))

do

? /usr/local/bin/redis-cli -h localhost -p 6002 -a 123456 CLUSTER ADDSLOTS $i

done

# node3 localhost:6003? ? 172.20.0.4

n=10923

for ((i=n;i<=16383;i++))

do

? /usr/local/bin/redis-cli -h localhost -p 6003 -a 123456 CLUSTER ADDSLOTS $i

done

6、高可用

添加從節(jié)點:

#!/bin/bash

/usr/local/bin/redis-cli -h localhost -p 6004 -a 123456 CLUSTER REPLICATE 8a5363c38e406227ffcc89080edd4b84d0d22ba4

/usr/local/bin/redis-cli -h localhost -p 6005 -a 123456 CLUSTER REPLICATE fdddf383f8bf53447926e5efb80a7405ec85294d

/usr/local/bin/redis-cli -h localhost -p 6006 -a 123456 CLUSTER REPLICATE a179d778c65c3caeeaca5f095fb4a1380453a07a

1、備用節(jié)點不允許分配槽位;

2、在當前節(jié)點操作,將當前節(jié)點添加為node_id的副本節(jié)點;

3、從節(jié)點需要運行在cluster模式下,先添加到集群,再做復(fù)制;

查看節(jié)點信息:3主3從高可用

ocalhost:6004> cluster nodes

a4cfac29113a66a278c37268d2ca49fb62873e93 172.20.0.7:6379@16379 slave a179d778c65c3caeeaca5f095fb4a1380453a07a 0 1572332713422 5 connected

a179d778c65c3caeeaca5f095fb4a1380453a07a 172.20.0.4:6379@16379 master - 0 1572332714428 2 connected 10923-16383

fdddf383f8bf53447926e5efb80a7405ec85294d 172.20.0.3:6379@16379 master - 0 1572332712417 0 connected 5462-10922

383bd17b9a8c3a64f664637dd7cdb764a17324b8 172.20.0.6:6379@16379 slave fdddf383f8bf53447926e5efb80a7405ec85294d 0 1572332713000 4 connected

e3316f5cdc75a7e7ea259c3b9a00dee4dc6afb4c 172.20.0.5:6379@16379 myself,master - 0 1572332712000 6 connected 0-5461

8a5363c38e406227ffcc89080edd4b84d0d22ba4 172.20.0.2:6379@16379 slave e3316f5cdc75a7e7ea259c3b9a00dee4dc6afb4c 0 1572332712000 6 connected

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容