2019-07-03 NoSQL產(chǎn)品之Redis主從復制-哨兵


課程介紹

Redis

1-2

Mongodb

1-2

Elasticsearch

1

EFRLK

1-2

中小型互聯(lián)網(wǎng)企業(yè)架構演變


Redis環(huán)境準備

介紹

redis:緩存
NoSQL    非關系型數(shù)據(jù)庫
key-valus   鍵 值 對  k1:v1

特點:
1.支持6中數(shù)據(jù)類型:字符串、哈希、列表、集合、有序集合
2.速度非常快,所有數(shù)據(jù)存放在內(nèi)存中
3.持久化存儲,快照和日志

安裝完成后的可執(zhí)行文件
redis-benchmark  
redis-check-aof  
redis-check-rdb  
redis-cli           #客戶端連接工具
redis-sentinel      #哨兵服務端
redis-server        #服務端

利用官方腳本生成配置文件
/opt/redis_cluster/redis/utils/install_server.sh

一、環(huán)境準備

1.1 操作系統(tǒng)說明
操作系統(tǒng)    Centos7
數(shù)量       3臺機器 主機名:db01 db02 db03  IP地址:51,52,53
CPU        無要求
內(nèi)存       內(nèi)存1G
硬盤       無要求,不能太小

1.2 關閉防火墻和selinux
#停止防火墻并禁止自啟動
systemctl stop firewalld.service
systemctl disable firewalld.service

# 關閉selinux
sed -i.bak 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
setenforce 0

1.3 db01配置hosts和ssh

配置hosts和密鑰認證

[root@db01 ~]# cat > /etc/hosts << EOF
10.0.0.51 db01    
10.0.0.52 db02    
10.0.0.53 db03
EOF
[root@db01 ~]# ssh-keygen
[root@db01 ~]# ssh-copy-id db02
[root@db01 ~]# ssh-copy-id db03
1.4 所有節(jié)點安裝redis

注意:所有節(jié)點都需要安裝

mkdir -p /data/soft

mkdir -p /data/redis_cluster/redis_6379

mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}

cd /data/soft/

wget http://download.redis.io/releases/redis-3.2.9.tar.gz

tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/

ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis

cd /opt/redis_cluster/redis

make && make install
1.5 db01配置rudy環(huán)境
yum makecache fast

yum install rubygems

gem sources --remove [https://rubygems.org/](https://rubygems.org/)

gem sources -a http://mirrors.aliyun.com/rubygems/

gem update –system

gem install redis -v 3.3.5

ruby -v

gem -v

1.6 db01安裝鍵值分析工具
yum install python-pip gcc
pip install --upgrade pip
pip install rdbtools
1.7 所有節(jié)點部署redis管理腳本
[root@db01 ~]# cat redis_shell.sh 
#!/bin/bash
USAG(){
    echo "sh $0 {start|stop|restart|login|ps|tail} PORT"
}

if [ "$#" = 1 ]
then
    REDIS_PORT='6379'
elif 
    [ "$#" = 2 -a -z "$(echo "$2"|sed 's#[0-9]##g')" ]
then
    REDIS_PORT="$2"
else
    USAG
    exit 0
fi

REDIS_IP=$(hostname -I|awk '{print $1}')
PATH_DIR=/opt/redis_cluster/redis_${REDIS_PORT}/
PATH_CONF=/opt/redis_cluster/redis_${REDIS_PORT}/conf/redis_${REDIS_PORT}.conf
PATH_LOG=/opt/redis_cluster/redis_${REDIS_PORT}/logs/redis_${REDIS_PORT}.log

CMD_START(){
    redis-server ${PATH_CONF}
}

CMD_SHUTDOWN(){
    redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT} shutdown
}

CMD_LOGIN(){
    redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT}
}

CMD_PS(){
    ps -ef|grep redis
}

CMD_TAIL(){
    tail -f ${PATH_LOG}
}

case $1 in
    start)
        CMD_START
        CMD_PS
        ;;
    stop)
        CMD_SHUTDOWN
        CMD_PS
        ;;
    restart)
        CMD_START
        CMD_SHUTDOWN
        CMD_PS
        ;;
    login)
        CMD_LOGIN
        ;;
    ps)
        CMD_PS
        ;;
    tail)
        CMD_TAIL
        ;;
    *)
        USAG
esac

1.8安裝配置文件:
cat > /opt/redis_cluster/redis_6379/conf/redis_6379.conf <<EOF
### 以守護進程模式啟動
daemonize yes
### 綁定的主機地址
bind 10.0.0.51 127.0.0.1
### 監(jiān)聽端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 設置數(shù)據(jù)庫的數(shù)量,默認數(shù)據(jù)庫為0
databases 16
### 指定本地持久化文件的文件名,默認是dump.rdb
dbfilename redis_6379.rdb
### 本地數(shù)據(jù)庫的目錄
dir /data/redis_cluster/redis_6379
EOF
1.9 啟動和關閉
啟動:
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

關閉:
redis-cli shutdown

1.10 相關命令
set 
get
mset
mget
incr key
decr key
incrby  key num
decrby  key num 
EXISTS key
DEl key
TTL k1 
EXPIRE k1 10
PERSIST k1 
-1  永不過期    
-2  鍵不存在
列表   排行榜
rpush
lpush
lrange
rpop
lpop
哈希 mysql的緩存層
HMSET   key  field value  
HMGET   key  field 
HGETALL key
HMSET user:1000 username zhangya age 28 job it
HMGET user:1000 
HMGET user:1000 username
HMGET user:1000 username age
HMGET user:1000 username age job
HMGET user:1000 all
HGETALL user:1000
HMSET user:1000 email 52615417@qq.com
HGETALL user:1000
集合 推薦系統(tǒng) 興趣標簽 廣告精確投放
SADD set1 1 2 3 5 7 
SMEMBERS set1
SADD set2  3 6 8 5 7 
SMEMBERS set2
SADD set1 1 
SADD set1 1 11
SMEMBERS set1
SMEMBERS set2
SDIFF set1 set2
SDIFF set2 set1
SADD set3 1 5 12 9
SDIFF set1 set2 set3
SDIFF set3 set1 set2
SINTER set1 set2
sunion set1 set2 set3
1.11 rdb和aof 持久化對比
持久化
rdb 
優(yōu)點:恢復速度快,空間小
缺點:可能會丟失

aof 
優(yōu)點:數(shù)據(jù)安全,不容易丟失
缺點:恢復速度慢,空間大
熱更新
CONFIG GET *
隱藏條件:

1.如果同時有AOF和RDB存在,重啟的時候,載入的是AOF文件
2.shutdown 
  - bgsave
  - shutdown
1.12 redis主從復制
1.從庫向主庫發(fā)起同步請求
2.主庫接收到從庫的同步請求
3.主庫開始bgsave生成rdb文件
4.主庫生成完之后,保存到磁盤成功
5.主庫將RDB文件發(fā)送給從庫
6.從庫接收主庫的RDB文件
7.從庫清空自己所有的數(shù)據(jù)
8.從庫將接受的RDB文件載入到內(nèi)存中

危險操作:
1.如果主庫不小心同步了空的從庫,會導致主庫數(shù)據(jù)全部丟失

謹慎的操作流程:
1.在配置文件里配置slaveof參數(shù),不要熱更新配置
2.主庫主動執(zhí)行bgsave保存rdb文件,然后備份一份rdb文件

恢復操作:

1.主庫停止復制關系,注釋掉 aof 相關參數(shù)
2.停止主庫
3.刪除原有的rdb數(shù)據(jù),重命名備份的rdb文件
4.重新啟動主庫,將rdb文件導入到內(nèi)存里
1.13模擬故障
模擬的場景:
1.備份了數(shù)據(jù)
2.但是主庫不小心同步了空的從庫
3.主庫恢復數(shù)據(jù)

所有節(jié)點都操作
#殺掉redis
pkill redis

#清空數(shù)據(jù)
rm -rf /data/redis_cluster/redis_6379/*

#配置文件
cat >/opt/redis_cluster/redis_6379/conf/redis_6379.conf <<EOF
### 以守護進程模式啟動
daemonize yes
### 綁定的主機地址
bind 10.0.0.51 127.0.0.1
### 監(jiān)聽端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 設置數(shù)據(jù)庫的數(shù)量,默認數(shù)據(jù)庫為0
databases 16
#### 指定本地持久化文件的文件名,默認是dump.rdb
dbfilename redis_6379.rdb
#### 本地數(shù)據(jù)庫的目錄
dir /data/redis_cluster/redis_6379
save 60 100 
save 300 10 
save 600 1
EOF

#所有節(jié)點啟動服務
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

#db01主庫上執(zhí)行
for i in {0..2000};do redis-cli set k_${i} v_${i}; echo "${i} is ok";done

#主庫生成rdb數(shù)據(jù)
進入到redis里
redis-cli 
bgsave

#備份數(shù)據(jù)
cd /data/redis_cluster/redis_6379/
cp redis_6379.rdb redis_6379.rdb.bak

#模擬操作失誤,同步了從庫
###注意:
[root@db01 ~]# redis-cli 
127.0.0.1:6379> SLAVEOF 10.0.0.52 6379


模擬恢復

1.停掉db01的redis服務
redis-cli shutdown

2.檢查redis是否真的停止了
ps -ef|grep redis

3.注釋掉配置文件里的slaveof

4.恢復備份的數(shù)據(jù)
cd /data/redis_cluster/redis_6379
cp redis_6379.rdb.bak redis_6379.rdb

5.啟動服務
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 

6.檢查數(shù)據(jù)是否恢復
redis-cli
keys *


#模擬主庫故障
##db02上操作:
redis-cli
SLAVEOF 10.0.0.51 6379

##查看db02日志
[root@db02 ~]# tail -f /opt/redis_cluster/redis_6379/logs/redis_6379.log 

##關閉db01
redis-cli shutdown

##從庫如何接管
從庫db02  slaveof no one 取消復制關系
redis-cli -h db02 -p 6379 slaveof no one

##db02備份從庫數(shù)據(jù)
cd /data/redis_cluster/redis_6379
cp redis_6379.rdb redis_6379.rdb.bak

##db01舊主庫修復上線
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
SLAVEOF 10.0.0.52 6379 
keys *

##負載均衡關閉后端負載,防止數(shù)據(jù)寫入

##修復后的db01從庫重新升級為主庫
SLAVEOF no one

##代碼修改為主庫db01的IP,負載均衡重新掛載后端服務

##db02重新生成主從關系
SLAVEOF 10.0.0.51 6379 

##確認數(shù)據(jù)同步正常
redis-cli
keys *

2、redis 哨兵

2.1 安裝步驟
#創(chuàng)建相關目錄
mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}

#配置文件
cat > /opt/redis_cluster/redis_26379/conf/redis_26379.conf<<EOF
bind $(hostname -i)
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379
sentinel monitor mymaster 10.0.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
EOF

2.2 主從關系
從庫執(zhí)行:
SLAVEOF 10.0.0.51 6379 
2.3 啟動哨兵
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf 

2.4 檢查服務
ps -ef|grep redis
2.5 查看哨兵配置文件
cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf

注意:
不要自己去改動哨兵的配置文件
2.6 原始配置文件和啟動redis后的對比
[root@db01 ~]# cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
bind 10.0.0.51
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379
sentinel monitor mymaster 10.0.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000

[root@db01 ~]# cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
bind 10.0.0.51
port 26379
daemonize yes
logfile "/opt/redis_cluster/redis_26379/logs/redis_26379.log"
dir "/data/redis_cluster/redis_26379"
sentinel myid d38f0c394afaf5fd462de16ff56be9f72f2f91d5
sentinel monitor mymaster 10.0.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 18000
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 10.0.0.52 6379
sentinel known-slave mymaster 10.0.0.53 6379
sentinel known-sentinel mymaster 10.0.0.53 26379 eb103c3bc5bc99997091273d95827006a0f9af9e
sentinel known-sentinel mymaster 10.0.0.52 26379 f1c1b37cfe230d656345a26f26e97e96b706fb90
sentinel current-epoch 0

2.7 故障模擬
0.殺掉redis
pkill redis

1.主從復制先做好
db02和db03復制db01

哨兵故障恢復:
1.先啟動db01
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

2.啟動哨兵
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf 

3.設置權重
db02和db03調(diào)大權重
CONFIG SET slave-priority 0

4.重新發(fā)起選舉
在db01上的26379節(jié)點執(zhí)行
redis-cli -h 10.0.0.51 -p 26379 Sentinel failover mymaster

5.觀察主從復制是否正常
redis-cli 
CONFIG GET slaveof

6.db01恢復權重
CONFIG SET slave-priority 100

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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