Docker部署Redis集群-小白入門

前言

閱讀本文需要具備docker涕蜂、docker-compose、redis等前置知識(shí)儲(chǔ)備阱洪。

centos版本:

cat /etc/redhat-release

CentOS Linux release 7.8.2003 (Core)

redis版本:

redis-server -v

Redis server v=6.0.8 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=75cef67090587c6

redis集群

Redis集群是Redis提供的分布式數(shù)據(jù)庫(kù)方案李根,集群通過(guò)分片(sharding)來(lái)進(jìn)行數(shù)據(jù)共享缓苛,并提供復(fù)制和故障轉(zhuǎn)移功能校摩。

Redis主從模式可以讀寫分離看峻;
Redis哨兵模式可以實(shí)現(xiàn)高可用的讀寫分離;
Redis集群模式則是在高可用的讀寫分離的基礎(chǔ)上再加上了數(shù)據(jù)分片衙吩。

以上只是個(gè)人對(duì)于Redis三種模式功能上總結(jié)互妓,實(shí)際上集群模式的數(shù)據(jù)存儲(chǔ)和故障轉(zhuǎn)移機(jī)制和哨兵模式并不一樣。

部署

目錄結(jié)構(gòu)

本文采用如下目錄結(jié)構(gòu):

.
|-- 7000.conf
|-- 7001.conf
|-- 7002.conf
|-- data
`-- docker-compose.yml

redis配置

準(zhǔn)備三個(gè)redis配置文件坤塞,端口分別是7000冯勉、7001和7002

7000.conf

# 監(jiān)聽(tīng)端口
port 7000

# 設(shè)定密碼認(rèn)證
requirepass 123456

# 開(kāi)啟集群配置
cluster-enabled yes
# 設(shè)定了保存節(jié)點(diǎn)配置文件的路徑,無(wú)需人為修改摹芙,Redis集群在啟動(dòng)時(shí)創(chuàng)建
cluster-config-file nodes.conf
# 節(jié)點(diǎn)連接超時(shí)配置
cluster-node-timeout 5000
appendonly yes

7001.conf

# 監(jiān)聽(tīng)端口
port 7001

# 設(shè)定密碼認(rèn)證
requirepass 123456

# 開(kāi)啟集群配置
cluster-enabled yes
# 設(shè)定了保存節(jié)點(diǎn)配置文件的路徑灼狰,無(wú)需人為修改,Redis集群在啟動(dòng)時(shí)創(chuàng)建
cluster-config-file nodes.conf
# 節(jié)點(diǎn)連接超時(shí)配置
cluster-node-timeout 5000
appendonly yes

7002.conf

# 監(jiān)聽(tīng)端口
port 7002

# 設(shè)定密碼認(rèn)證
requirepass 123456

# 開(kāi)啟集群配置
cluster-enabled yes
# 設(shè)定了保存節(jié)點(diǎn)配置文件的路徑浮禾,無(wú)需人為修改伏嗜,Redis集群在啟動(dòng)時(shí)創(chuàng)建
cluster-config-file nodes.conf
# 節(jié)點(diǎn)連接超時(shí)配置
cluster-node-timeout 5000
appendonly yes

docker-compose配置

用docker-compose來(lái)統(tǒng)一管理容器
docker-compose.yml

---

version: '3'

services:
  # 7000的容器
  node-1:
    image: redis
    container_name: node-1
    restart: always
    # 為了規(guī)避Docker中端口映射可能帶來(lái)的問(wèn)題
    # 這里選擇使用host網(wǎng)絡(luò)
    network_mode: host
    # 指定時(shí)區(qū)坛悉,保證容器內(nèi)時(shí)間正確
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      # 映射配置文件和數(shù)據(jù)目錄
      - ./7000.conf:/usr/local/etc/redis/redis.conf
      - ./data/7000:/data
    sysctls:
      # 必要的內(nèi)核參數(shù)
      net.core.somaxconn: '511'
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # 7001的容器
  node-2:
    image: redis
    container_name: node-2
    restart: always
    network_mode: host
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - ./7001.conf:/usr/local/etc/redis/redis.conf
      - ./data/7001:/data
    sysctls:
      net.core.somaxconn: '511'
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # 7002的容器
  node-3:
    image: redis
    container_name: node-3
    restart: always
    network_mode: host
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - ./7002.conf:/usr/local/etc/redis/redis.conf
      - ./data/7002:/data
    sysctls:
      net.core.somaxconn: '511'
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]

啟動(dòng)、坑

后臺(tái)啟動(dòng)

docker-compose up -d
docker-compose up -d

節(jié)點(diǎn)連接

這個(gè)時(shí)候?qū)嶋H上每個(gè)節(jié)點(diǎn)都是運(yùn)行一個(gè)獨(dú)立的集群當(dāng)中承绸,在7000節(jié)點(diǎn)中執(zhí)行cluster nodes命令:


cluster nodes

可以看到當(dāng)前集群中只有7000節(jié)點(diǎn)自己。所以需要把他們連接起來(lái)挣轨,融合到一個(gè)集群中军熏,使用cluster meet命令可以完成這個(gè)工作:

cluster meet 127.0.0.1 7001
cluster meet 127.0.0.1 7002

再次查看cluster nodes


cluster nodes

這就可以看到三個(gè)節(jié)點(diǎn)了

需要注意的是,這里雖然redis-server只用到了7000卷扮,7001和7002這三個(gè)端口荡澎,但實(shí)際上還會(huì)使用到17000,17001和17002三個(gè)端口晤锹,我就是因?yàn)閞edis部署在云端摩幔,安全組沒(méi)有放開(kāi)17000~17002這三個(gè)端口,所以在節(jié)點(diǎn)連接這里一直握手失敗鞭铆。

槽位指派

Redis集群通過(guò)分片的方式來(lái)保存數(shù)據(jù)庫(kù)中的鍵值對(duì):集群的整個(gè)數(shù)據(jù)庫(kù)被分為16384個(gè)槽(slot)或衡,數(shù)據(jù)庫(kù)中的每個(gè)鍵都屬于這16384個(gè)槽的其中一個(gè),集群中的每個(gè)節(jié)點(diǎn)可以處理0個(gè)或最多16384個(gè)槽车遂。
當(dāng)數(shù)據(jù)庫(kù)中的16384個(gè)槽都有節(jié)點(diǎn)在處理時(shí)封断,集群處于上線狀態(tài)(ok);相反地舶担,如果數(shù)據(jù)庫(kù)中有任何一個(gè)槽沒(méi)有得到處理坡疼,那么集群處于下線狀態(tài)(fail)。

下線狀態(tài)

參照書上的方法進(jìn)行槽位指派:


image.png

于是我進(jìn)行了如下各種命令組合的嘗試:

cluster addslots 0..5000
cluster addslots 0...5000
cluster addslots 0 .. 5000
cluster addslots 0 ... 5000
cluster addslots {0..5000}
cluster addslots {0...5000}

都沒(méi)有成功~衣陶,期待有大佬能教教我

折中方案

由于使用下面這些命令都不能正確執(zhí)行:

cluster addslots 0..5000
cluster addslots 0...5000
cluster addslots 0 .. 5000
cluster addslots 0 ... 5000
cluster addslots {0..5000}
cluster addslots {0...5000}
.........
感到絕望

不得已寫了個(gè)python腳本用于槽位分配

# -*- coding: utf-8 -*-
import redis

if __name__ == '__main__':
    ip = input("請(qǐng)輸入IP:")
    port = int(input("請(qǐng)輸入端口:"))
    password = input("請(qǐng)輸入密碼:")
    start_slot = int(input("請(qǐng)輸入開(kāi)始槽位號(hào):"))
    end_slot = int(input("請(qǐng)輸入結(jié)束槽位號(hào):"))

    # 拿到redis客戶端實(shí)例
    r = redis.Redis(host=ip, port=port, password=password)

    expect_num = end_slot - start_slot
    actual_num = 0
    for x in range(start_slot, end_slot + 1):
        try:
            result = r.execute_command("cluster addslots " + str(x))
            if result == b'OK':
                actual_num += 1
        except redis.exceptions.ResponseError as e:
            print("執(zhí)行 cluster addslots " + str(x) + " 失敱濉!")

    if expect_num == actual_num:
        print("所有槽位分配成功")
    else:
        print("部分槽位分配失敗")

集群狀態(tài)

腳本執(zhí)行成功以后再查看集群狀態(tài):


cluster info

可以看到剪况,集群狀態(tài)已經(jīng)是上線狀態(tài)了

再看看槽位分配情況:


cluster slots

和我們預(yù)期結(jié)果一致

7000: 0~5000
7001: 5001~ 10000
7002: 10001~16383

參考文章

槽指派
Redis 集群教程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末教沾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拯欧,更是在濱河造成了極大的恐慌详囤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镐作,死亡現(xiàn)場(chǎng)離奇詭異藏姐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)该贾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門羔杨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人杨蛋,你說(shuō)我怎么就攤上這事兜材±砼欤” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵曙寡,是天一觀的道長(zhǎng)糠爬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)举庶,這世上最難降的妖魔是什么执隧? 我笑而不...
    開(kāi)封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮户侥,結(jié)果婚禮上镀琉,老公的妹妹穿的比我還像新娘。我一直安慰自己蕊唐,他們只是感情好屋摔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著替梨,像睡著了一般钓试。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耙替,一...
    開(kāi)封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天亚侠,我揣著相機(jī)與錄音,去河邊找鬼俗扇。 笑死硝烂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铜幽。 我是一名探鬼主播滞谢,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼除抛!你這毒婦竟也來(lái)了狮杨?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤到忽,失蹤者是張志新(化名)和其女友劉穎橄教,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體喘漏,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡护蝶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翩迈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片持灰。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖负饲,靈堂內(nèi)的尸體忽然破棺而出堤魁,到底是詐尸還是另有隱情喂链,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布妥泉,位于F島的核電站椭微,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盲链。R本人自食惡果不足惜赏表,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匈仗。 院中可真熱鬧,春花似錦逢慌、人聲如沸悠轩。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)火架。三九已至,卻和暖如春忙菠,著一層夾襖步出監(jiān)牢的瞬間何鸡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工牛欢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骡男,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓傍睹,卻偏偏與公主長(zhǎng)得像隔盛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拾稳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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