Linux-基礎學習(六)-Redis的進階學習

1. redis的進階操做

1.1 redis的訂閱操做

image_thumb1_thumb

image_thumb3_thumb

發佈訂閱的命令node

PUBLISH channel msg
    將信息 message 發送到指定的頻道 channel

SUBSCRIBE channel [channel ...]
    訂閱頻道,能夠同時訂閱多個頻道

UNSUBSCRIBE [channel ...]
    取消訂閱指定的頻道, 若是不指定頻道,則會取消訂閱全部頻道
PSUBSCRIBE pattern [pattern ...]
    訂閱一個或多個符合給定模式的頻道,每一個模式以 * 做爲匹配符,好比 it* 匹配所    有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配全部    以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類
PUNSUBSCRIBE [pattern [pattern ...]]
    退訂指定的規則, 若是沒有參數則會退訂全部規則
PUBSUB subcommand [argument [argument ...]]
    查看訂閱與發佈系統狀態
注意:使用發佈訂閱模式實現的消息隊列,當有客戶端訂閱channel後只能收到後續發佈到該頻道的消息,以前發送的不會緩存,必須Provider和Consumer同時在線。

1554685023279_thumb1_thumb

1.2 redis持久化

redis是內存型的數據庫mysql

  • 數據斷電消失
  • redis服務器掛掉消失
  • redis服務停掉以後消失

1.2.1 RDB持久化

redis提供了RDB(Redis DataBase)持久化的功能,這個功能能夠將redis在內存中的的狀態保存到硬盤中,它能夠手動執行。也能夠再redis.conf中配置,按期執行。RDB持久化產生的RDB文件是一個通過壓縮的二進制文件,這個文件被保存在硬盤中,redis能夠經過這個文件還原數據庫當時的狀態。web

RDB(持久化)
內存數據保存到磁盤
在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)
優勢:速度快,適合作備份,主從複製就是基於RDB持久化功能實現
rdb經過再redis中使用save命令觸發 rdb
  1.基於內存的數據快照
  2.按期執行數據快照
  3.手動觸發數據快照
rdb配置參數:

dir /data/6379/
dbfilename  dbmp.rdb

每過900秒 有1個操做就進行持久化

save 900秒  1個修改類的操做
save 300秒  10個操做
save 60秒  10000個操做

save  900 1
save 300 10
save 60  10000

redis持久化之RDB實踐redis

(1)啓動redis服務端,準備配置文件sql

port 6379
daemonize yes
dir /data/6379                   # 定義持久化文件存儲位置
pidfile /data/6379/redis.pid     # redis進程pid文件
loglevel notice                  # 日誌級別
logfile "/data/6379/redis.log"   # redis日誌log文件
protected-mode yes               # 保護模式
dbfilename  dbmp.rdb             # rdb持久化文件
#bind 10.0.0.10  127.0.0.1       # redis綁定地址
#requirepass redhat              # redis登陸密碼
save 900 1                       # rdb機制 每900秒 有1個修改記錄
save 300 10                      # 每300秒        10個修改記錄
save 60 10000                    # 每60秒內        10000修改記錄

(2)啓動redis服務端數據庫

(3)登陸redis設置一個keyvim

redis-cli -a redhat

(4)此時檢查目錄,/data/6379底下沒有dbmp.rdb文件緩存

(5)經過save觸發持久化,將數據寫入RDB文件安全

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> save
OK

注意: 因爲這個dbmp.rdb文件是用來存儲持久化數據的,理所固然若是被刪除了的話,數據就會消失ruby

1554686474109_thumb1_thumb

1.2.2 AOF持久化

AOF(append-only log file)
記錄服務器執行的全部變動操做命令(例如set del等),並在服務器啓動時,經過從新執行這些命令來還原數據集
AOF 文件中的命令所有以redis協議的格式保存,新命令追加到文件末尾。
優勢:最大程度保證數據不丟失 (比RDB要好,由於RDB有可能丟失數據)
缺點:日誌記錄很是大

(1)配置參數

AOF持久化配置,兩條參數

appendonly yes
appendfsync  always    老是修改類的操做
             everysec   每秒作一次持久化
             no     依賴於系統自帶的緩存大小機制

(2)準備aof配置文件 redis.conf

daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename  dbmp.rdb
requirepass redhat
save 900 1
save 300 10
save 60  10000
appendonly yes
appendfsync everysec

(3)啓動redis服務

redis-server /etc/redis.conf

(4)檢查redis數據目錄/data/6379/是否產生了aof文件

[root@web02 6379]# ls
appendonly.aof  dbmp.rdb  redis.log

(5)登陸redis-cli,寫入數據,實時檢查aof文件信息

[root@web02 6379]# tail -f appendonly.aof

(6)設置新key,檢查aof信息,而後關閉redis,檢查數據是否持久化

redis-cli -a redhat shutdown
redis-server /etc/redis.conf
redis-cli -a redhat

1554687112149_thumb5

1554687264749_thumb3

注:edis 持久化方式有哪些?有什麼區別?

rdb:基於快照的持久化,速度更快,通常用做備份,主從複製也是依賴於rdb持久化功能

aof:以追加的方式記錄redis操做日誌的文件。能夠最大程度的保證redis數據安全,相似於mysql的binlog

1.2.3  redis持久化RDB轉化AOF

1554687642093_thumb3

1.3 redis主從同步

1132884-20180922122856003-755522114_

原理:

  1. 從服務器向主服務器發送 SYNC 命令。

  2. 接到 SYNC 命令的主服務器會調用BGSAVE 命令,建立一個 RDB 文件,並使用緩衝區記錄接下來執行的全部寫命令。

  3. 當主服務器執行完 BGSAVE 命令時,它會向從服務器發送 RDB 文件,而從服務器則會接收並載入這個文件。

  4. 主服務器將緩衝區儲存的全部寫命令發送給從服務器執行。

****************************************************************************************

  • 在開啓主從複製的時候,使用的是RDB方式的,同步主從數據的
  • 同步開始以後,經過主庫命令傳播的方式,主動的複製方式實現
  • 2.8之後實現PSYNC的機制,實現斷線重連

1.3.1 主從同步實驗

(1)準備三個redis數據庫配置文件

背景: 一主兩從

6380爲主,6381和6382 爲從

cd /opt/redis_conf
vim redis-6380.conf
寫入如下配置
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no

再建立兩個配置文件6381和6382

sed "s/6380/6381/g" redis-6380.conf > redis-6381.conf
sed "s/6380/6382/g" redis-6380.conf > redis-6382.conf

建立數據文件目錄

[root@qishi666 redis_conf]# mkdir -p /data/6380
[root@qishi666 redis_conf]# mkdir -p /data/6381
[root@qishi666 redis_conf]# mkdir -p /data/6382

(2)啓動redis數據庫

[root@qishi666 redis_conf]# redis-server redis-6380.conf 
[root@qishi666 redis_conf]# redis-server redis-6381.conf 
[root@qishi666 redis_conf]# redis-server redis-6382.conf

(3)確保這三個redis數據庫是徹底獨立的數據庫

1554691250220_thumb3

(4)給兩個從服務器配置文件再添加一行配置(很重要)

在6381和6382配置文件添加這一行配置,表示指定主服務器爲6380
slaveof 127.0.0.1 6380

(5)重啓數據庫

pkill redis
redis-server /opt/redis_conf/redis-6380.conf
redis-server /opt/redis_conf/redis-6381.conf
redis-server /opt/redis_conf/redis-6382.conf

(6)查看主從數據庫狀態

redis-cli -p 6380 info
redis-cli -p 6380 info replication

1554691633454_thumb3

1554691676278_thumb2

1554691687764_thumb2

(7)添加數據進行測試

1554691756052_thumb2

1554691825416_thumb1

(8)手動進行主從複製故障切換

1.關閉6381的從庫身份

redis-cli -p 6381
info replication
slaveof no one

2.將6382設爲6381的從庫

6382鏈接到6381:
[root@db03 ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF no one
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381

1554692113987_thumb3

1554692290788_thumb2

1.4 redis哨兵

sentinel主要功能以下:

  • 不時的監控redis是否良好運行,若是節點不可達就會對節點進行下線標識

  • 若是被標識的是主節點,sentinel就會和其餘的sentinel節點「協商」,若是其餘節點也人爲主節點不可達,就會選舉一個sentinel節點來完成自動故障轉義

  • 在master-slave進行切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換1554694202558_thumb31554695435544_thumb2

1.4.1  配置三個redis數據庫, 一主兩從

redis-6380.conf
redis-6381.conf
redis-6382.conf

1.4.2  啓動三個redis數據庫,確保主從複製正常運行

redis-server redis-6380.conf
redis-server redis-6381.conf
redis-server redis-6382.conf
redis-cli -p 6380 info replication
redis-cli -p 6381 info replication
redis-cli -p 6382 info replication

1.4.3 配置三個哨兵

cd /opt/redis_conf
vim redis-26380.conf
vim redis-26381.conf
vim redis-26382.conf

寫入如下配置文件

port 26379
dir /var/redis/data/
logfile "26379.log"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
daemonize yes

若是發現哨兵沒有正常啓動,必須把IP改成127.0.0.1

若是你是在三個不一樣的機器上,只能用機器對外訪問的IP,那就須要添加這一個配置

sentinel announce-ip 127.0.0.1

1.4.4 啓動三個哨兵

[root@qishi666 redis_conf]# redis-sentinel redis-26380.conf 
[root@qishi666 redis_conf]# redis-sentinel redis-26381.conf 
[root@qishi666 redis_conf]# redis-sentinel redis-26382.conf

1.4.5 此時查看哨兵是否成功通訊

1554694511880_thumb3

1.4.6 若是出現問題,沒有配置成功,沒有顯示前面這幾條配置成功的信息,就推倒重來

若是出現問題,沒有配置成功,沒有顯示前面這幾條配置成功的信息,就推倒重來
若是出現問題,沒有配置成功,沒有顯示前面這幾條配置成功的信息,就推倒重來
若是出現問題,沒有配置成功,沒有顯示前面這幾條配置成功的信息,就推倒重來

從配置主從同步開始作

1554695773679_thumb3

1.4.7 驗證redis高可用故障切換

大體思路

  • 殺掉主節點的redis進程6379端口,觀察從節點是否會進行新的master選舉,進行切換

  • 從新恢復舊的「master」節點,查看此時的redis身份

首先查看三個redis的進程狀態

1554696065803_thumb2

1.5 redis集羣

全量數據, 量很大,一臺機器沒有辦法所有處理完,因此須要多臺機器同時處理,才能達到咱們想要的效果

就相似於一大車貨物,經過5輛馬車來運輸

1554696507496_thumb3

redis集羣槽位概念:虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把全部的數據映射到一個固定範圍內的整數集合,整數定義爲槽(slot)。

  • Redis Cluster槽的範圍是0~16383。
  • 槽是集羣內數據管理和遷移的基本單位。採用大範圍的槽的主要目的是爲了方便數據的拆分和集羣的擴展,
  • 每一個節點負責必定數量的槽。

1554697005452_thumb2

1554697312544_thumb2

redis集羣配置

1.5.1準備六個節點

cd /opt/jq
vim redis-7000.conf
vim redis-7001.conf
vim redis-7002.conf
vim redis-7003.conf
vim redis-7004.conf
vim redis-7005.conf

寫入配置

port 7000
daemonize yes
dir "/opt/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf

1554697607887_thumb3

這6個節點配置文件都同樣,僅僅是端口的不一樣

[root@qishi666 jq]# sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf
[root@qishi666 jq]# sed "s/7000/7002/g" redis-7000.conf > redis-7002.conf
[root@qishi666 jq]# sed "s/7000/7003/g" redis-7000.conf > redis-7003.conf
[root@qishi666 jq]# sed "s/7000/7004/g" redis-7000.conf > redis-7004.conf
[root@qishi666 jq]# sed "s/7000/7005/g" redis-7000.conf > redis-7005.conf

1.5.2 啓動這六個節點

cd /opt/jq
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf

1.5.3 隨便進入一個redis交互模式,寫入數據,發現沒法寫入

報錯,沒有分配哈希槽

1554698053927_thumb2

1.5.4 準備ruby環境,安裝ruby並執行redis-trib.rb腳本

分配redis集羣狀態,以及槽位分配,互聯網企業,豆瓣公司開源的一個工具

  • 下載、編譯、安裝Ruby

  • 安裝rubygem redis

  • 安裝redis-trib.rb命令

1.5.5 添加ruby環境變量

1554698280673_thumb2

1.5.6 安裝ruby gem 包管理工具

wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l redis-3.3.0.gem

安裝redis-trib.rb命令
[root@qishi666 jq]# find /opt -name redis-trib.rb
/opt/redis-4.0.10/src/redis-trib.rb
[root@qishi666 jq]# cp /opt/redis-4.0.10/src/redis-trib.rb /usr/local/bin/

1.5.7 一鍵開啓redis-cluster集羣

# 每一個主節點,有一個從節點,表明--replicas 1
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
​
# 集羣自動分配主從關係  70007001、7002爲主 70037004、7005爲從

1554698646496_thumb2

1554698792255_thumb2

1554698905680_thumb2

查看集羣狀態

1554699001336_thumb2

1.5.8 進入集羣狀態

redis-cli -p 7000 -c

1554699060088_thumb2

相關文章
相關標籤/搜索