Redis 基礎應用(二)html
==============================================================================node
概述:redis
安全相關的配置;數據庫
事務功能;vim
connection(鏈接)及Server 相關的命令centos
發佈與訂閱(publish/subscribe)數組
Redis的持久化緩存
Redis的主從複製安全
Redis的sentinel機制bash
Redis的Clustering機制
==============================================================================
1.配置和使用Redis
★配置段:
基本配置項;
網絡配置項;
持久化相關的配置;
複製相關的配置
安全相關的配置;
Limit 相關的配置;
SlowLog 相關的配置;
INCLUDES
Advanced配置
☉通用配置項
deamonize,supervised,loglevel,logfile,pidfile
◆databases:
設定數據庫數量,默認爲16個,每一個數據庫的名字均爲整數,從0開始編號,默認操做的數據庫爲0;
切換數據庫的方法: SELECT <dbid>
☉網絡配置項:
bind IP
port PORT
tcp-backlog:後援隊列長度
unixsocket:監聽的套接字文件
timeout:鏈接的超時時長
☉安全相關的配置
requirepass <PASSWORD>
在 redis-cli 接口中使用 AUTH 命令完成認證
或者在鏈接時使用 -a 指明密碼
rename-command <COMMAND><NEW_CMND_NAME>
在 AOF和Replication環境中,不建議使用
☉清空數據庫:
FLUSHDB:清空當前庫
FLUSHALL:清空全部庫
演示:
3.配置文件/etc/redis.conf以下: [root@centos7 ~]# cp /etc/redis.conf{,.bak} [root@centos7 ~]# grep "^##" /etc/redis.conf ################################## INCLUDES ################################### ################################## NETWORK ##################################### ################################# GENERAL ##################################### ################################ SNAPSHOTTING ################################ ################################# REPLICATION ################################# ################################## SECURITY ################################### ################################### LIMITS #################################### ############################## APPEND ONLY MODE ############################### ################################ LUA SCRIPTING ############################### ################################ REDIS CLUSTER ############################### ################################## SLOW LOG ################################### ################################ LATENCY MONITOR ############################## ############################# EVENT NOTIFICATION ############################## ############################### ADVANCED CONFIG ############################### [root@centos7 ~]# vim /etc/redis.conf bind 0.0.0.0 # 修改綁定的端口 # 啓動 redis,查看堅挺的端口 6379 [root@centos7 ~]# systemctl start redis [root@centos7 ~]# ss -tnlp |grep "redis" LISTEN 0 128 *:6379 *:* users:(("redis-server",pid=3840,fd=4))
2.編輯配置文件 /etc/redis.conf 啓用認證功能,並添加密碼:
重啓服務,再次執行命令就須要添加認證密碼,以下:
2.事務功能
★事務
經過 MULTI,EXEC,WATCH 等命令實現事務功能;
將一個或者到多個命令歸併爲一個操做提請服務器按順序執行的機制,不支持回滾操做;
☉Redis 事務能夠一次執行多個命令, 而且帶有如下兩個重要的保證:
事務是一個單獨的隔離操做:事務中的全部命令都會序列化、按順序地執行。事務在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷。
事務是一個原子操做:事務中的命令要麼所有被執行,要麼所有都不執行。
☉一個事務從開始到執行會經歷如下三個階段:
開始事務。
命令入隊。
執行事務。
★事務命令:
☉MULTI:標記一個事務塊的開始;
☉EXEC:
執行全部事務塊中的命令;
一次性將事務中的全部操做執行完成後返回給客戶端;
☉WHATCH key [key...]
樂觀鎖;在EXEC執行以前,用於監視指定數量鍵 key,若是監視中的某任意鍵數據被修改,則服務器拒絕執行事務(事務被打斷);
☉DISCARD
取消事務,放棄執行事務塊內的命令;
☉UNWATCH
取消 WATCH 命令對全部 key 的監控;
演示:
先以 MULTI 開始一個事務, 而後將多個命令入隊到事務中, 最後由 EXEC 命令觸發事務, 一併執行事務中的全部命令:
[root@centos7 ~]# redis-cli -h 192.168.1.112 -a taoxiu 192.168.1.112:6379> MULTI OK 192.168.1.112:6379> SET ip 192.168.1.118 QUEUED 192.168.1.112:6379> GET ip QUEUED 192.168.1.112:6379> SET port 8088 QUEUED 192.168.1.112:6379> GET port QUEUED 192.168.1.112:6379> EXEC 1) OK 2) "192.168.1.118" 3) OK 4) "8088" # 用 WATCH 命令監視一個或者多個 key,而後啓動一個事務,在未執行EXEC以前,在另外一個終端修改這個被監視的 key, 192.168.1.112:6379> WATCH ip OK 192.168.1.112:6379> MULTI OK 192.168.1.112:6379> SET ip 10.1.0.1 QUEUED 192.168.1.112:6379> GET ip QUEUED 192.168.1.112:6379> EXEC (nil) 192.168.1.112:6379> GET ip "10.1.252.116" 在未執行EXEC以前,在另外一個終端修改這個被監視的 key, 192.168.1.112:6379> GET ip "192.168.1.118" 192.168.1.112:6379> SET ip 10.1.252.116 OK 192.168.1.112:6379> GET ip "10.1.252.116" # 而後在監視 指定 key 的終端 執行EXEC 執行事務,發現事務執行失敗 192.168.1.112:6379> WATCH ip OK 192.168.1.112:6379> MULTI OK 192.168.1.112:6379> SET ip 10.1.0.1 QUEUED 192.168.1.112:6379> GET ip QUEUED 192.168.1.112:6379> EXEC (nil) # 執行失敗 192.168.1.112:6379> GET ip "10.1.252.116"
3.connection(鏈接)及Server 相關的命令
★Connection命令
AUTH:認證相關的命令
ECHO:
PING:
QUIT:
SELECT:切換數據庫
★Server命令
Redis 服務器命令主要是用於管理 redis 服務。
下表列出了 redis 服務器的相關命令:
序號 命令及描述 1 BGREWRITEAOF
異步執行一個 AOF(AppendOnly File) 文件重寫操做2 BGSAVE
在後臺異步保存當前數據庫的數據到磁盤3 CLIENT KILL [ip:port] [ID client-id]
關閉客戶端鏈接4 CLIENT LIST
獲取鏈接到服務器的客戶端鏈接列表5 CLIENT GETNAME
獲取鏈接的名稱6 CLIENT PAUSE timeout
在指定時間內終止運行來自客戶端的命令7 CLIENT SETNAME connection-name
設置當前鏈接的名稱8 CLUSTER SLOTS
獲取集羣節點的映射數組9 COMMAND
獲取 Redis 命令詳情數組10 COMMAND COUNT
獲取 Redis 命令總數11 COMMAND GETKEYS
獲取給定命令的全部鍵12 TIME
返回當前服務器時間13 COMMAND INFO command-name [command-name ...]
獲取指定 Redis 命令描述的數組14 CONFIG GET parameter
獲取指定配置參數的值15 CONFIG REWRITE
對啓動 Redis 服務器時所指定的 redis.conf 配置文件進行改寫16 CONFIG SET parameter value
修改 redis 配置參數,無需重啓17 CONFIG RESETSTAT
重置 INFO 命令中的某些統計數據18 DBSIZE
返回當前數據庫的 key 的數量19 DEBUG OBJECT key
獲取 key 的調試信息20 DEBUG SEGFAULT
讓 Redis 服務崩潰21 FLUSHALL
刪除全部數據庫的全部key22 FLUSHDB
刪除當前數據庫的全部key23 INFO [section]
獲取 Redis 服務器的各類信息和統計數值24 LASTSAVE
返回最近一次 Redis 成功將數據保存到磁盤上的時間,以 UNIX 時間戳格式表示25 MONITOR
實時打印出 Redis 服務器接收到的命令,調試用26 ROLE
返回主從實例所屬的角色27 SAVE
異步保存數據到硬盤28 SHUTDOWN [NOSAVE] [SAVE]
異步保存數據到硬盤,並關閉服務器29 SLAVEOF host port
將當前服務器轉變爲指定服務器的從屬服務器(slave server)30 SLOWLOG subcommand [argument]
管理 redis 的慢日誌31 SYNC
用於複製功能(replication)的內部命令
4.發佈與訂閱(publish/subscribe)
★pub/sub
Redis 發佈訂閱(pub/sub)是一種消息通訊模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
Redis 客戶端能夠訂閱任意數量的頻道。
下圖展現了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關係:
當有新消息經過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被髮送給訂閱它的三個客戶端:
注意:
頻道:消息隊列
下表列出了 redis 發佈訂閱經常使用命令:
序號 命令及描述 1 PSUBSCRIBE pattern [pattern ...]
訂閱一個或多個符合給定模式的頻道。2 PUBSUB subcommand [argument [argument ...]]
查看訂閱與發佈系統狀態。3 PUBLISH channel message
將信息發送到指定的頻道。4 PUNSUBSCRIBE [pattern [pattern ...]]
退訂全部給定模式的頻道。5 SUBSCRIBE channel [channel ...]
訂閱給定的一個或多個頻道的信息。6 UNSUBSCRIBE [channel [channel ...]]
指退訂給定的頻道。
演示:
如下實例演示了發佈訂閱是如何工做的。在咱們實例中咱們建立了訂閱頻道名爲 redisChat:
192.168.1.112:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1
如今,咱們先從新開啓個 redis 客戶端,而後在同一個頻道 redisChat 發佈兩次消息,訂閱者就能接收到消息。
192.168.1.112:6379> PUBLISH redisChat "Redis is a great caching technique" (integer) 1 192.168.1.112:6379> PUBLISH redisChat "Learn redis by runoob.com" (integer) 1 #訂閱者的客戶端會顯示以下消息 1) "message" 2) "redisChat" 3) "Redis is a great caching technique" 1) "message" 2) "redisChat" 3) "Learn redis by runoob.com"
5.Redis的持久化
★RDB和AOF
☉RDB:
snapshot(快照),二進制格式;按事先定製的策略,週期性的將數據保存至磁盤;數據文件默認爲dump.rdb
◆定義方法:
▲客戶端也可顯示使用 SAVE 和 BGSAVE 命令啓動快照保存機制
※SAVE:
執行一個同步保存操做,將當前 Redis 實例的全部數據快照(snapshot)以 RDB 文件的形式保存到硬盤。
在主進程中保存快照,此會阻塞全部客戶端的請求;
※BGSAVE:
在後臺異步保存當前數據庫的數據到磁盤。
BGSAVE 命令執行以後當即返回 OK ,而後 Redis fork 出一個新子進程,原來的 Redis 進程(父進程)繼續處理客戶端請求,而子進程則負責將數據保存到磁盤,而後退出。
▲在配置文件中定義週期性的工做機制參數:
1.指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合
save <seconds> <changes>
Redis默認配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
2.指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,若是爲了節省CPU時間,能夠關閉該選項,但會致使數據庫文件變的巨大
rdbcompression yes
3.指定本地數據庫文件名,默認值爲dump.rdb
dbfilename dump.rdb
4.指定本地數據庫存放目錄
dir /vat/lib/redis
5.rdnchecksum yes
6.stop-writes-on-bgsave-error yes
☉AOF:
Append Only File ;
記錄每一次寫操做至指定的文件尾部實現持久化(相似MySQL的binlog);當redis重啓時,可經過從新執行文件中的命令在內存中重建數據庫;
◆BGREWRITEAOF:
用於異步執行一個 AOF(AppendOnly File) 文件重寫操做。重寫會建立一個當前 AOF 文件的體積優化版本。
即便 Bgrewriteaof 執行失敗,也不會有任何數據丟失,由於舊的 AOF 文件在 Bgrewriteaof 成功以前不會被修改。
不會讀取正在使用的AOF文件,而經過將內存中的數據以命令的方式保存到臨時文件中,完成以後替換原來的AOF文件;
注意:
從 Redis 2.4 開始, AOF 重寫由 Redis 自行觸發, BGREWRITEAOF 僅僅用於手動觸發重寫操做。
◆AOF重寫過程
1)redis 主進程經過 fock 建立子進程;
2)子進程根據redis內存中的數據建立數據庫重建命令序列於臨時文件中;
3)父進程繼承Client 的請求,並會把這些請求中的寫操做繼續追加至原來的AOF文件;額外的,這些新的請求還會被放置於一個緩衝隊列中;
4)子進程重寫完成會通知父進程;父進程會把緩衝中的命令寫到臨時文件中;
5)父進程用臨時文件替換掉老的AOF文件;
◆相關參數:
1. 指定是否在每次更新操做後進行日誌記錄,Redis在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於 redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認爲no
appendonly no
2. 指定更新日誌文件名,默認爲appendonly.aof
appendfilename appendonly.aof
3. 指定更新日誌條件,共有3個可選值:
appendfsync everysec
no:表示等操做系統進行數據緩存同步到磁盤(快)
always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全)
everysec:表示每秒同步一次(折衷,默認值)
4. no-appendfsync-on-rewrite no
5.auto-aof-rewrite-percentage 100
//表示現有的aof文件是上次文件大小的2倍,即改變已達到100%,就再次重寫
6.auto-aof-rewrite-min-size 64mb
//表示重寫的大小要至少達到64M以後纔開始重寫
注意:
持久自己不能取代備份;還應該指定備份策略,對redis數據庫按期進行備份;
☉BDF與AOF同時啓用:
1)BGSAVE和BGREWRITEAOF不會同時執行;
2)在Redis服務器啓動用於數據恢復時,會優先選用AOF;
6.Redis的主從複製
★特色:
一個Master能夠有多個Slave;
支持鏈式複製
Master以非阻塞方式同步數據至Slave
☉配置文件參數:
◆slaveof <masterip> <masterport>
設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步
◆masterauth <master-password>
當master服務設置了密碼保護時,slav服務鏈接master的密碼
☉SLAVEOF 命令:
◆語法:
>SLAVEOF host port
注意:
Redis Slaveof 命令能夠將當前服務器轉變爲指定服務器的從屬服務器(slave server)。
若是當前服務器已是某個主服務器(master server)的從屬服務器,那麼執行 SLAVEOF host port 將使當前服務器中止對舊主服務器的同步,丟棄舊數據集,轉而開始對新主服務器進行同步。
另外,對一個從屬服務器執行命令 SLAVEOF NO ONE 將使得這個從屬服務器關閉複製功能,並從從屬服務器轉變回主服務器,原來同步所得的數據集不會被丟棄。
利用『 SLAVEOF NO ONE 不會丟棄同步所得數據集』這個特性,能夠在主服務器失敗的時候,將從屬服務器用做新的主服務器,從而實現無間斷運行。
演示:
1.準備一個新的節點 node2 (192.168.1.113),一樣安裝redis,並配置做爲node1(192.168.1.112)的從庫;
[root@centos7 ~]# redis-cli -h 192.168.1.113 192.168.1.113:6379> SLAVEOF 192.168.1.112 6379 OK 192.168.1.113:6379> GET port "8088" 192.168.1.113:6379> GET ip "192.168.1.118" 192.168.1.113:6379> key * (error) ERR unknown command 'key' 192.168.1.113:6379> KEYS * 1) "ip" 2) "port" # 從節點查看INFO 信息及 日誌以下: 192.168.1.113:6379> INFO replication # Replication role:slave master_host:192.168.1.112 master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:1247 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 [root@centos7 ~]# tail /var/log/redis/redis.log 2550:S 25 Mar 16:53:14.973 * Connecting to MASTER 192.168.1.112:6379 2550:S 25 Mar 16:53:14.973 * MASTER <-> SLAVE sync started 2550:S 25 Mar 16:53:14.973 * Non blocking connect for SYNC fired the event. 2550:S 25 Mar 16:53:14.974 * Master replied to PING, replication can continue... 2550:S 25 Mar 16:53:14.975 * Partial resynchronization not possible (no cached master) 2550:S 25 Mar 16:53:14.977 * Full resync from master: e83d8db2749c0174c2f60c46c6ad0566272876aa:1 2550:S 25 Mar 16:53:15.008 * MASTER <-> SLAVE sync: receiving 108 bytes from master 2550:S 25 Mar 16:53:15.008 * MASTER <-> SLAVE sync: Flushing old data 2550:S 25 Mar 16:53:15.008 * MASTER <-> SLAVE sync: Loading DB in memory 2550:S 25 Mar 16:53:15.009 * MASTER <-> SLAVE sync: Finished with success # 主節點查看INFO 信息及 日誌以下: 192.168.1.112:6379> INFO replication # Replication role:master connected_slaves:1 slave0:ip=192.168.1.113,port=6379,state=online,offset=1233,lag=1 master_repl_offset:1233 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:1232 [root@centos7 ~]# tail /var/log/redis/redis.log 3426:M 25 Mar 16:53:14.958 * Slave 192.168.1.113:6379 asks for synchronization 3426:M 25 Mar 16:53:14.958 * Full resync requested by slave 192.168.1.113:6379 3426:M 25 Mar 16:53:14.958 * Starting BGSAVE for SYNC with target: disk 3426:M 25 Mar 16:53:14.959 * Background saving started by pid 3429 3429:C 25 Mar 16:53:14.977 * DB saved on disk 3429:C 25 Mar 16:53:14.978 * RDB: 2 MB of memory used by copy-on-write 3426:M 25 Mar 16:53:14.990 * Background saving terminated with success 3426:M 25 Mar 16:53:14.990 * Synchronization with slave 192.168.1.113:6379 succeeded
7.Redis的sentinel機制
★sentinel
☉做用:
用於管理多個Redis服務實現HA
監控主服務器Master;
通知;
自動故障轉移;
☉使用協議:
流言協議;投票協議
☉程序(啓用sentinel 必需要指明配置文件)
redis-sentinel /path/to/file
redis-server /path/to/file --sentinel
◆工做過程
1)服務器自身初始化,運行於redis-server中專用於sentinel功能的代碼;
2)初始化sentinel狀態,根據給定的配置文件,初始化監控的master服務器列表;
3)建立連向master的鏈接;
☉專用配置文件
/etc/redis-sentinel.conf
◆配置項
sentinel monitor <master-name> <ip> <redis-port> <quorum>
//鏈接的主節點,能夠有多行,quorum表示法定票數,建議sentinel節點爲奇數個
//只須要指明主節點便可,從節點會經過主節點自動獲取
示例:sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds <master-name> <milliseconds>
//判斷某主節點不在線的超時時長
示例:sentinel down-after-milliseconds mymaster 30000 (單位:毫秒)
sentinel parallel-syncs <master-name> <numslaves>
//執行故障轉移時(即剛剛設定爲新主服務器時),容許最多有多少個從服務器能夠向主服務器發起鏈接請求
示例: sentinel parallel-syncs mymaster 1
sentinel failover-timeout <master-name> <milliseconds>
//故障轉移的超時時間,即當主服務器出現故障時,提高新的從服務器爲主服務器的超時時間;
示例: sentinel failover-timeout mymaster 180000
sentinel auth-pass <master-name> <password>
// 鏈接主節點的認證密碼
示例:sentinel auth-pass mymaster taoxiu
☉主觀下線和客觀下線
主管下線:單個sentinel實例判斷出某節點下線
客觀下線:多個sentinel節點協商後判斷出某節點下線;
☉專用命令
SENTINEL master
SENTINEL slaves <master name>
SENTINEL get-master-addr-by-name <master name>
SENTINEL reset
SENTINEL failover <master name>
演示:
操做環境
node1 節點幾位master節點,又爲 sentinel 節點
node2 和 node3 節點爲 從節點
1.準備操做環境,以下:
主節點 node1 以下:
192.168.1.112:6379> INFO replication # Replication role:master connected_slaves:2 slave0:ip=192.168.1.113,port=6379,state=online,offset=11593,lag=0 slave1:ip=192.168.1.114,port=6379,state=online,offset=11593,lag=1 master_repl_offset:11593 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:11592 192.168.1.112:6379> KEYS * 1) "ip" 2) "port"
從節點 node2和node3 以下:
# node 2 192.168.1.113:6379> SLAVEOF 192.168.1.112 6379 OK 192.168.1.113:6379> INFO replication # Replication role:slave master_host:192.168.1.112 master_port:6379 master_link_status:up master_last_io_seconds_ago:6 master_sync_in_progress:0 slave_repl_offset:11579 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 192.168.1.113:6379> KEYS * 1) "ip" 2) "port" # node3 [root@centos7 ~]# redis-cli -h 192.168.1.114 192.168.1.114:6379> SLAVEOF 192.168.1.112 6379 OK 192.168.1.114:6379> INFO replication # Replication role:slave master_host:192.168.1.112 master_port:6379 master_link_status:up master_last_io_seconds_ago:6 master_sync_in_progress:0 slave_repl_offset:11565 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 192.168.1.114:6379> KEYS * 1) "ip" 2) "port"
2.在主節點node1 配置啓用 sentinel 機制,編輯配置文件 /etc/redis-sentinel.conf,並啓動以下:
[root@centos7 ~]# cp /etc/redis-sentinel.conf{,.bak} [root@centos7 ~]# vim /etc/redis-sentinel.conf sentinel monitor mymaster 192.168.1.112 6379 1 # 要鏈接的主服務器ip和端口,若是要監控多組主從的話 主節點名稱要不相同 sentinel down-after-milliseconds mymaster 5000 # 判斷主節點不在線的超時時長 sentinel failover-timeout mymaster 60000 # 故障轉移的超時時長 # 啓動 sentinel 服務,並查看端口 26379 [root@centos7 ~]# redis-sentinel /etc/redis-sentinel.conf [root@centos7 ~]# ss -tnlp |grep "sentinel" LISTEN 0 128 *:26379 *:* users:(("redis-sentinel",pid=4146,fd=5)) LISTEN 0 128 :::26379 :::* users:(("redis-sentinel",pid=4146,fd=4))
3.鏈接sentinel 執行命令以下:
192.168.1.112:26379> info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=192.168.1.112:6379,slaves=2,sentinels=1 192.168.1.112:26379> SENTINEL masters # 獲取全部主節點的詳細信息 1) 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.1.112" 5) "port" 6) "6379" 7) "runid" 8) "64b7b580bb66b3bf757682cff46c2fdab8f8274f" 9) "flags" 10) "master" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "377" 19) "last-ping-reply" 20) "377" 21) "down-after-milliseconds" 22) "5000" 23) "info-refresh" 24) "5155" 25) "role-reported" 26) "master" 27) "role-reported-time" 28) "1581867" 29) "config-epoch" 30) "0" 31) "num-slaves" 32) "2" 33) "num-other-sentinels" 34) "0" 35) "quorum" 36) "1" 37) "failover-timeout" 38) "60000" 39) "parallel-syncs" 40) "1" 192.168.1.112:26379> SENTINEL slaves mymaster # 獲取從服務器信息 1) 1) "name" 2) "192.168.1.114:6379" 3) "ip" 4) "192.168.1.114" 5) "port" 6) "6379" 7) "runid" 8) "f62c27d585c3ac4c8730c8b578838ca6434e27bf" 9) "flags" 10) "slave" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "809" 19) "last-ping-reply" 20) "809" 21) "down-after-milliseconds" 22) "5000" 23) "info-refresh" 24) "5225" 25) "role-reported" 26) "slave" 27) "role-reported-time" 28) "1742587" 29) "master-link-down-time" 30) "0" 31) "master-link-status" 32) "ok" 33) "master-host" 34) "192.168.1.112" 35) "master-port" 36) "6379" 37) "slave-priority" 38) "100" 39) "slave-repl-offset" 40) "173202" 2) 1) "name" 2) "192.168.1.113:6379" 3) "ip" 4) "192.168.1.113" 5) "port" 6) "6379" 7) "runid" 8) "489d228990a895ff207aec9f3dda2474cbd1d096" 9) "flags" 10) "slave" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "808" 19) "last-ping-reply" 20) "808" 21) "down-after-milliseconds" 22) "5000" 23) "info-refresh" 24) "5225" 25) "role-reported" 26) "slave" 27) "role-reported-time" 28) "1742587" 29) "master-link-down-time" 30) "0" 31) "master-link-status" 32) "ok" 33) "master-host" 34) "192.168.1.112" 35) "master-port" 36) "6379" 37) "slave-priority" 38) "100" 39) "slave-repl-offset" 40) "173202"
4.測試,讓主節點下線,而後再次查看 sentinel 節點信息,發現主節點已經變爲 node2(192.168.1.113)
192.168.1.112:26379> info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=192.168.1.113:6379,slaves=2,sentinels=1 192.168.1.112:26379> SENTINEL masters 1) 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.1.113" 5) "port" 6) "6379" 7) "runid" 8) "489d228990a895ff207aec9f3dda2474cbd1d096" 9) "flags" 10) "master" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "422" 19) "last-ping-reply" 20) "422" 21) "down-after-milliseconds" 22) "5000" 23) "info-refresh" 24) "3757" 25) "role-reported" 26) "master" 27) "role-reported-time" 28) "64236" 29) "config-epoch" 30) "1" 31) "num-slaves" 32) "2" 33) "num-other-sentinels" 34) "0" 35) "quorum" 36) "1" 37) "failover-timeout" 38) "60000" 39) "parallel-syncs" 40) "1"
在配置過程當中遇到的問題:
配置完成 sentinel.conf 後使用redis-cli -h 127.0.0.1 -p 26379鏈接sentinel能夠執行命令,而使用redis-cli -h 192.168.1.112 -p 26379鏈接sentinel執行命令則會報錯誤,以下:
DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside
因爲此錯誤和 redis server 的 protect-mode爲yes的訪問錯誤頗爲類似,官方在redis.conf的註釋說明中有protected-mode這一配置項,但sentinel.conf 的註釋中徹底沒有提到過該配置項,我很疑惑,但仍是嘗試在經過查詢得知 須要添加 protectd-mode no ,以後保存並重啓sentinel 再次鏈接,沒有報錯
8.Redis的Clustering機制
★Clistering:
分佈式數據庫,經過分片機制進行數據分佈,clustering內的內的每一個節點僅持有數據庫的一部分數據;
每一個節點持有全局元數據,但僅持有一部分數據
★Redis 分佈式的解決方案
Twemproxy (Twitter)
Codis(豌豆莢)
Redis Cluster(Redis 官方)
Cerberus (芒果TV)
☉Twemproxy (Twitter)
代理分片機制
◆優勢:
很是穩定,企業級方案;
◆缺點:
單點故障;
須要依賴第三方軟件:keepalived
沒法平滑的橫向擴展;
沒有後臺界面;
代理分片引入更多的來回次數,並提升延遲;
單核模式,沒法充分利用多核,除非多實例
Twitter內部再也不繼續使用 Twemproxy
☉Codis(豌豆莢)
代理分片機制
2014年11月開源
◆基於Go以及C語言開發
◆優勢
很是穩定,企業級方案
數據自動平衡
高性能
簡單的測試顯示較Twemproxy快一倍
善用多核CPU
簡單
沒有Paxos類的協調機制
沒有主從複製
有後臺界面
◆缺點
代理分片機制引入更多的來回次數並提升延遲
須要第三方軟件支持協調機制
目前支持Zookeeper及Etcd
不支持主從複製,須要另外實現
Codis採用了Proxy的方案,因此必然會帶來單機性能的損失
經測試,在不開pipeline的狀況下,大概會損失40%的性能
☉Redis Cluster(官方)
官方實現
須要Redis 3.0
◆優勢:
無中心的P2P Gossip 分散式模式;
更少的來回次數並下降延遲;
自動於多個Redis進行分片;
不須要第三方軟件支持協調機制
◆缺點:
依賴於 Rdeis 3.0 或更高版本;
須要時間驗證其穩定性;
沒有後臺界面;
須要智能客戶端;
Redis 客戶端必須支持Redis Cluster 架構;
較Codis有更多的維護升級成本;
☉Cerberus (芒果TV)
◆優勢:
數據自動平衡;
自己實現了Redis的Smart Client
支持讀寫分離
◆缺點:
依賴 Redis 3.0 或更高版本;
代理分片機制引入更多的來回次數並增大延遲;
須要時間驗證其穩定性;
沒有後臺界面