1.概述

我們在部署 tendis 集羣的時候,我們需要準備 6台機器,3主三從,當然 我們可以將他們部署同一台機器上,只要端口不一樣就可以。
我們準備 6個文件夾
端口分別從 7001到 7006

2. 構建過程

2.1.準備6個文件夾

tendis1
tendis2
tendis3
tendis4
tendis5
tendis6

文件夾下放

start.sh
stop.sh
tendisplus.conf

這些文件從 tendis 的 script copy 出來
需要修改
stop.sh

ip=127.0.0.1
port=7001
echo shutdown |../bin/redis-cli -h ${ip} -p ${port}

這個文件修改端口即可
tendisplus.conf ,這個文件也是

port 7001
daemon on
loglevel notice
logdir ./home/log
dumpdir ./home/dump
dir ./home/db
pidfile ./home/tendisplus.pid
slowlog ./home/log/slowlog
rocks.blockcachemb 4096
executorThreadNum 48
cluster-enabled yes

這個文件也是修改端口和是否開啓集羣

2.2.編寫批處理一次性啓動6個節點

  • 啓動節點
#!/bin/bash

echo "Starting all Tendis instances..."

# 循環處理 tendis1 到 tendis6
for i in {1..6}; do
    dir="tendis${i}"

    if [[ -d "$dir" ]]; then
        echo "----------------------------------------"
        echo "Processing $dir..."

        # 進入目錄,執行腳本,然後返回 (pushd/popd 是另一種方式)
        ( cd "$dir" && echo "In directory: $(pwd)" && ./start.sh )

        if [[ $? -eq 0 ]]; then
            echo "Started $dir successfully."
        else
            echo "Failed to start $dir."
        fi

    else
        echo "Directory $dir not found, skipping."
    fi
done

echo "----------------------------------------"
echo "All Tendis instance start commands issued."

這樣我們可以一次性啓動 6個節點

  • 停止節點
#!/bin/bash
echo "Stoping all Tendis instances..."
# 循環處理 tendis1 到 tendis6
for i in {1..6}; do
    dir="tendis${i}"

    if [[ -d "$dir" ]]; then
        echo "----------------------------------------"
        echo "Processing $dir..."

        # 進入目錄,執行腳本,然後返回 (pushd/popd 是另一種方式)
        ( cd "$dir" && echo "In directory: $(pwd)" && ./stop.sh )

        if [[ $? -eq 0 ]]; then
            echo "stop $dir successfully."
        else
            echo "Failed to stop $dir."
        fi
    else
        echo "Directory $dir not found, skipping."
    fi
done
echo "----------------------------------------"
echo "All Tendis instance stop commands issued."

2.3 節點握手

當6個節點啓動後,我們可以連到 節點1 和其他的節點握手
連接節點1

redis-cli -p 7001

分別執行

cluster meet 127.0.0.1 7002
cluster meet 127.0.0.1 7003
cluster meet 127.0.0.1 7004
cluster meet 127.0.0.1 7005
cluster meet 127.0.0.1 7006

2.4 分配slots

默認情況下,Tendis存儲版跟Redis一樣,將所有的數據映射到16384個slot中,每個key都會對應一個槽。只有把slot分配給了Tendis節點,Tendis節點才能響應與slot相關的命令,否則就會返回move錯誤。

分配slots可使用cluster addslots指令
我們分別將 1,3,5 節點分配 solt
分別登錄 7001,7003,7005
連接後分別執行

cluster addslots {0..5461}
cluster addslots {5462..10922}
cluster addslots {10923..16383}

2.5 配置主從複製

我們將1,3,5 作為主節點,2,4,6 作為從 節點
我們先查看節點
登錄節點1 執行命令

cluster nodes

看到節點

9474f3e26932126611bf00940ac06fbe9ceb1940 127.0.0.1:7003@17003 master - 0 1763797462000 0 connected 5462-10922
88419aaa88393e14da923f65795266c076cb71f7 127.0.0.1:7001@17001 myself,master - 0 1763797462000 2 connected 0-5461
3dba50eb72c1790fb0109795d92b24457b33e406 127.0.0.1:7005@17005 master - 0 1763797462634 4 connected 10923-16383
8200c98af4c657a681bbd1582a22fc06a86e6c07 127.0.0.1:7004@17004 slave 9474f3e26932126611bf00940ac06fbe9ceb1940 0 1763797461000 3 connected
3b5b89b032a8dc9c1c232da4ee03e1725c750e7a 127.0.0.1:7002@17002 slave 88419aaa88393e14da923f65795266c076cb71f7 0 1763797461579 2 connected
00aa76b24d4d43f48b81893438350914fc10fc1a 127.0.0.1:7006@17006 slave 3dba50eb72c1790fb0109795d92b24457b33e406 0 1763797463680 5 connected

這個是我配置好了的情況,如果沒有配置主從的話 6個節點都是主節點。

我們分別登錄 2,4,5 執行命令

cluster replicate 4233f87b9899774feb71bcef1cfeec964de0535b
cluster replicate 這裏是主節點的ID

2.6 測試

我們可以登錄其中的某個節點
執行 set 命令,可以看到他會將key 分佈到不同的節點上。
我們連接 tendis 時 需要使用如下命令

./redis-cli -c -p 端口

:~/tendis/tendisplus/bin$ ./redis-cli -c -p 7001
127.0.0.1:7001> get name
-> Redirected to slot [5798] located at 127.0.0.1:7003
"小李"

這樣集羣就配置完成了。

3.部署單實例

比如啓動兩個實例 比如 端口為 8001,8002
我們使用 8001 作為主實例
執行命令將 8002 作為複製實例

slaveof localhost 8001
# 將節點不作為 從實例
slaveof no one

比如我們需要切換主從可以這樣做。
切換 8002 為主服務

slave no one
# 將 8001 作為從服務
flush all
slaveof localhost 8002