redis集群搭建

1. redis知識整理

2. 安裝redis

推薦安裝5.0版本及以上,5.0版本將redis集群管理器由 Ruby (redis-trib.rb) 移植到了redis-cli,方便集群的搭建

  • 安裝命令
$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
$ tar xzf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make
# 設置端口  默認不設置為6379 避免攻擊
port 7000
# 后臺運行
daemonize yes
# 開放外網(wǎng)訪問  bind ip 或 將保護模式取消、注釋bind
# bind 127.0.0.1 
protected-mode no
# 修改pid進程文件名
pidfile "/var/run/redis_6379.pid"
# 日志文件配置   具體的日志文件無需創(chuàng)建 只需創(chuàng)建到文件夾
logfile "/usr/local/soft/redis-sentinel/6379/redis.log"
# 修改數(shù)據(jù)文件存放地址
dir "/usr/local/soft/redis-sentinel/6379"
# 啟動aof增量持久化策略
appendonly yes
# 設置aof同步策略  建議使用everysec(默認)  每秒寫一次到磁盤  always:每次寫操作立即寫入aof,性能低下  no:不要立刻刷,只有在操作系統(tǒng)需要刷的時候再刷,比較快
appendfsync everysec
  • 啟動
# 后臺啟動
./redis-server  redis.conf &
# 客戶端
./redis-cli -h 127.0.0.1 -p 7000 --raw

3. redis-sentinel搭建

一主二從三哨兵

  • 創(chuàng)建文件夾 redis-sentinel
mkdir redis-sentinel
  • 在 redis-sentinel下創(chuàng)建6379、6380、6381三個文件夾
cd redis-sentinel
mkdir 6379 6380 6381
  • 將redis-server、redis-cli、redis-sentinel文件夾拷貝至redis-sentinel下
cp -r redis-5.0.4/src/redis-server ./
cp -r redis-5.0.4/src/redis-cli ./
cp -r redis-5.0.4/src/redis-sentinel ./
  • 復制修改后的redis.conf到6379、6380、6381下 具體修改參照上面redis配置文件
cp redis.conf ./6379/
cp redis.conf ./6380/
cp redis.conf ./6381/
  • 修改6380、6381 redis配置文件
# 除上面redis配置之外 添加下面命令
replicaof 127.0.0.1 6379
  • 分別啟動三個redis節(jié)點 測試是否搭建成功
# 啟動redis節(jié)點
./redis-server ./6379/redis.conf &
./redis-server ./6380/redis.conf &
./redis-server ./63781/redis.conf &

# 驗證主從復制是否生效
./redis-cli -p 6379 --raw
# master節(jié)點寫入
127.0.0.1:6379> set name 1
# ok表示寫入成功
OK
# 退出master節(jié)點 進入子節(jié)點
./redis-cli -p 6380 --raw
127.0.0.1:6380> get name
# 出現(xiàn)上面設置的值則說明搭建成功
1
  • 哨兵配置 哨兵最少使用三個
# 將sentinel.conf拷貝到6379文件夾下
cp sentinel.conf ../redis-sentinel/6379 sentinel.conf

# 修改哨兵配置
# 端口設置 一般設為2 + 主節(jié)點端口,依次往下增加
port 26379
protected-mode no
daemonize yes
# 配置哨兵監(jiān)控的主節(jié)點以及判斷主節(jié)點失效的哨兵個數(shù) 這里設為2個
sentinel monitor mymaster 127.0.0.1 6379 2
# 30秒內(nèi)master沒有響應該哨兵,該則認定該節(jié)點為主觀下線  客觀下線 只適用于 主節(jié)點。如果 主節(jié)點 出現(xiàn)故障,Sentinel 節(jié)點會通過 sentinel is-master-down-by-addr 命令,向其它 Sentinel 節(jié)點詢問對該節(jié)點的 狀態(tài)判斷。如果超過 <quorum> 【即上面配置的2】個數(shù)的節(jié)點判定 主節(jié)點 不可達,則該 Sentinel 節(jié)點會判斷 主節(jié)點 為 客觀下線。
sentinel down-after-milliseconds mymaster 30000  
# 指定在發(fā)生故障轉(zhuǎn)移主備切換時,最多可以有多少個slave同時對新的master進行同步。這個數(shù)字越小,完成failover所需的時間就越長;反之,但是如果這個數(shù)字越大,就意味著越多的slave因為replication而不可用??梢酝ㄟ^將這個值設為1,來保證每次只有一個slave,處于不能處理命令請求的狀態(tài)
sentinel parallel-syncs mymaster 1 
# 故障轉(zhuǎn)移的超時時間failover-timeout,默認三分鐘,可以用在以下這些方面:
## 1. 同一個sentinel對同一個master兩次failover之間的間隔時間。  
## 2. 當一個slave從一個錯誤的master那里同步數(shù)據(jù)時開始,直到slave被糾正為從正確的master那里同步數(shù)據(jù)時結(jié)束。  
## 3. 當想要取消一個正在進行的failover時所需要的時間。
## 4.當進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個超時,slaves依然會被正確配置為指向master,但是就不按parallel-syncs所配置的規(guī)則來同步數(shù)據(jù)了
# sentinel failover-timeout <master-name> <milliseconds>  
sentinel failover-timeout mymaster 180000
  • 啟動哨兵
# 依次啟動三個哨兵節(jié)點
./redis-sentinel sentinel.conf > /dev/null 2>&1 &
  • 校驗是否啟動成功 能否自動完成故障轉(zhuǎn)移
# 查看哨兵進程
ps -ef | grep -v grep | grep sentinel
# kill 主節(jié)點
# 查看其它兩個從節(jié)點狀態(tài) 若發(fā)現(xiàn)其中一個節(jié)點變?yōu)閙aster則說明成功
./redis-cli -p 6380 info replication
./redis-cli -p 6381 info replication
# 驗證master節(jié)點寫入 slave節(jié)點讀取
./redis-cli -p 6380
127.0.0.1:6380> set name 6380
OK
./redis-cli -p 6381
127.0.0.1:6381> get name
"6380"
  • 啟動redis-sentinel shell腳本 此shell腳本只供參考 實際腳本視情況修改 腳本名稱請不要用sentinel或redis,會對grep命令產(chǎn)生影響導致shell腳本的終止
#!/bin/bash

# 終止哨兵集群
SENTINEL_PID=`ps -ef | grep -v grep | grep sentinel | awk '{print$2}'`
echo "當前哨兵集群進程id為: " $SENTINEL_PID
if [ -n "$SENTINEL_PID" ]
    then 
    echo "終止哨兵進程: "  $SENTINEL_PID
    for i in $SENTINEL_PID;
        do
            echo "kill sentinel pid: " $i
            kill -9 $i
        done
fi

# 終止redis主從集群
REDIS_PID=`ps -ef | grep -v grep | grep redis | awk '{print$2}'`
echo "當前redis主從集群進程id為: " $REDIS_PID
if [ -n "${REDIS_PID}" ]
    then
    echo "終止redis進程:" $REDIS_PID
    for i in $REDIS_PID
        do
            echo "kill redis pid: " $i
            kill -9 $i
        done
fi

# 啟動redis主從集群

echo "開始啟動redis: 6379"
cd /usr/local/soft/redis-sentinel/6379
./redis-server ./6379.conf > /dev/null 2>&1 &
echo "啟動redis: 6379成功"

echo "開始啟動redis: 6380"
cd /usr/local/soft/redis-sentinel/6380
./redis-server ./6380.conf > /dev/null 2>&1 &
echo "啟動redis: 6380成功"

echo "開始啟動redis: 6381"
cd /usr/local/soft/redis-sentinel/6381
./redis-server ./6381.conf > /dev/null 2>&1 &
echo "啟動redis: 6381成功"

# 啟動sentinel集群
echo "開始啟動sentinel: 26379"
cd /usr/local/soft/redis-sentinel/6379
./redis-sentinel sentinel.conf > /dev/null 2>&1 &
echo "啟動sentinel: 26379成功"

echo "開始啟動sentinel: 26380"
cd /usr/local/soft/redis-sentinel/6380
./redis-sentinel sentinel.conf > /dev/null 2>&1 &
echo "啟動sentinel: 26380成功"

echo "開始啟動sentinel: 26381"
cd /usr/local/soft/redis-sentinel/6381
./redis-sentinel sentinel.conf > /dev/null 2>&1  &
echo "啟動sentinel: 26381成功"
  • 關閉redis-sentinel shell腳本
#!/bin/bash

# 終止哨兵集群
SENTINEL_PID=`ps -ef | grep -v grep | grep sentinel | awk '{print$2}'`
echo "當前哨兵集群進程id為: " $SENTINEL_PID
if [ -n "$SENTINEL_PID" ]
    then 
    echo "終止哨兵進程: "  $SENTINEL_PID
    for i in $SENTINEL_PID;
        do
            echo "kill sentinel pid: " $i
            kill -9 $i
        done
fi

# 終止redis主從集群
REDIS_PID=`ps -ef | grep -v grep | grep redis | awk '{print$2}'`
echo "當前redis主從集群進程id為: " $REDIS_PID
if [ -n "${REDIS_PID}" ]
    then
    echo "終止redis進程:" $REDIS_PID
    for i in $REDIS_PID
        do
            echo "kill redis pid: " $i
            kill -9 $i
        done
fi

4. redis-cluster搭建 針對redis5.0及以上

#!/bin/bash

# 1 終止redis進程
echo "redis集群開始關閉..."
REDIS_PID=`ps -ef | grep -v grep | grep redis | awk '{print$2}'`
echo "redis-cluster 進程pid: " $REDIS_PID
if [ -n "$REDIS_PID" ]
    then 
    for i in $REDIS_PID
        do
            echo "kill redis:" $i
            kill -9 $i
        done
fi
echo "redis集群關閉成功"

# 2 啟動集群
echo "開始啟動redis-cluster..."
cd /usr/local/soft/redis-cluster
./redis-server ./7000/redis.conf
./redis-server ./7001/redis.conf
./redis-server ./7002/redis.conf
./redis-server ./7003/redis.conf
./redis-server ./7004/redis.conf
./redis-server ./7005/redis.conf
echo "redis-cluster啟動成功"
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容