redis簡介
redis單純程模型,支持主從模式佑菩,提高可用性,是一個開源項目裁赠,經(jīng)常用來當一個數(shù)據(jù)結(jié)構(gòu)服務(wù)器倘待。其是內(nèi)存級別的緩存服務(wù)器并可實現(xiàn)持久化功能. 據(jù)稱一百萬的變量存儲(字串)占用100M內(nèi)存空間,單臺redis服務(wù)器可達到5萬并發(fā)的能力组贺。
redis與memcache的對比
redis的優(yōu)勢
- 支持豐富的操作
- 主從復制和集群
- 就地更新操作
- 支持持久化(磁盤),避免雪崩效應
memcache優(yōu)勢
- 多線程祖娘,善用多核CPU失尖,更少的阻塞操作
- 更少的內(nèi)存開銷
- 更少的內(nèi)存分配壓力
- 可能有更少的內(nèi)存碎片
redis的組件
-
redis-server
-
redis-cli
-
redis-benchmark
-
redis-check-dump & redis-check-aof
redis的工作端口
6379/TCP
redis-cli命令的參數(shù)
-
-h HOST
: 連接的主機地址或主機名 -
-p PORT
:連接的端口 -
-s socket
: 指定套接字 -
-a password
: 指定連接密碼 -
-r <repeat>
: 指定命令運行多次
redis-cli中相關(guān)的命令
-
connection相關(guān)的命令
-
auth PASS
: 認證 -
ping
: 測試服務(wù)器是否在線 -
echo "string"
: 顯示string -
quit
: 退出 -
select #
: 挑選指定的名稱空間(即數(shù)據(jù)庫) -
help @connection
: 獲取與連接相關(guān)的命令幫助
-
-
與服務(wù)器端支持的命令
help @server
: 獲取與服務(wù)器端相關(guān)的命令幫助bgsave
: 實現(xiàn)異步將數(shù)據(jù)集同步到磁盤上client getname
: 獲取當前客戶端的連接名client kill IP:PORT
: 指定IP:PORT可關(guān)閉相關(guān)的連接信息-
client list
: 查看客戶端的連接信息
```-
client setname CONNECTION-NAME
: 設(shè)定當前連接的名稱 -
info
: 查看當前服務(wù)器的狀態(tài)信息 -
info memory
: 只顯示memory段的相關(guān)信息 -
config resetstart
: 重置info中所統(tǒng)計的數(shù)據(jù) -
config set PARAMETER value
: 運行時修改設(shè)定指定參數(shù)的值,只保存在內(nèi)存中 -
config rewrite
: 將修改在內(nèi)存中的參數(shù)值同步到配置文件中 -
config get dir
: 查看redis的文件保存目錄 -
dbsize
: 顯示數(shù)據(jù)庫中所有鍵的數(shù)量 -
lastsave
: 用來獲取最新一次save執(zhí)行的時間戳 -
save
: 保存數(shù)據(jù)到磁盤 -
monitor
: 實時監(jiān)控所接收到的請求 -
shutdown
: 將所有數(shù)據(jù)從內(nèi)存同步到磁盤渐苏,并安全關(guān)閉 -
shutdown [nosave][save]
: 關(guān)閉程序并選擇是否將數(shù)據(jù)同步到磁盤上 -
salveof HOST PORT
:配置主從掀潮,當前節(jié)點將變成從節(jié)點 -
slowlog
: 查看慢查詢?nèi)罩荆枰_啟慢查詢?nèi)罩竟δ?/li> -
sync
: 復制功能的內(nèi)建命令
-
與訂閱相關(guān)的命令
-
help @pubsub
: 獲取與訂閱相關(guān)的命令 -
psubscribe
: 基于模式進行訂閱 -
publish
: 向頻道發(fā)送消息 -
subscribe CHANNEL
: 訂閱一個頻道
-
redis的認證功能
vim /etc/redis.conf
requirepass zhenping.com
重啟redis服務(wù)
systemctl restart redis
連接redis并認證的方法
redis-cli -h 172.16.36.70
172.16.36.70:6379> select 0
(error) NOAUTH Authentication required.
172.16.36.70:6379> auth zhenping
OK
redis清空數(shù)據(jù)庫
flushdb
: 清空當前庫-
flushall
: 清空所有庫[root@Centos7 ~]# redis-cli -h 172.16.36.70 172.16.36.70:6379> flushall OK 172.16.36.70:6379> flushdb OK
redis的事務(wù)功能
通過multi
,exec
,watch
等命令來實現(xiàn)事務(wù)功能琼富,將多個命令打包仪吧,多個命令按順序執(zhí)行,并一次執(zhí)行完成鞠眉,并將執(zhí)行結(jié)果一次性全部返回給客戶端薯鼠。redis事務(wù)不支持回滾操作,在事務(wù)中應避免發(fā)生錯誤(如命令寫錯等)械蹋,事務(wù)了也將會執(zhí)行失敗出皇。
-
multi
: 啟動一個事務(wù) -
exec
: 執(zhí)行事務(wù),一次性將事務(wù)中的所有操作執(zhí)行完成后哗戈,返回給客戶端 -
watch
: 樂觀鎖機制郊艘,在EXEC命令執(zhí)行之前 ,用于監(jiān)視指定數(shù)據(jù)鍵,如果監(jiān)視的某任意鍵數(shù)據(jù)被修改纱注,服務(wù)器拒絕執(zhí)行事務(wù)
####建立一個事務(wù)
[root@Centos7 ~]# redis-cli -h 172.16.36.70
172.16.36.70:6379> multi
OK
172.16.36.70:6379> set ip 172.16.36.70
QUEUED
172.16.36.70:6379> get ip
QUEUED
172.16.36.70:6379> set prot 8080
QUEUED
172.16.36.70:6379> exec
1) OK
2) "172.16.36.70"
3) OK
####使用watch機制監(jiān)控鍵
[root@Centos7 ~]# redis-cli -h 172.16.36.70
172.16.36.70:6379> watch ip
OK
172.16.36.70:6379> multi
OK
172.16.36.70:6379> set ip 172.16.36.71
QUEUED
172.16.36.70:6379> get ip
QUEUED
172.16.36.70:6379> exec
(nil)
說明: 當watch ip指令發(fā)出后畏浆,其它的請求操作改變了IP鍵的值,此時新發(fā)起的事務(wù)中狞贱,如果也要改變其值刻获, 此事務(wù)申請將會失敗
redis的發(fā)布和訂閱功能(publish/subscribe)
發(fā)布和訂閱功能被廣泛用于構(gòu)建即時通信應用,比如:網(wǎng)絡(luò)聊天室和實時廣播斥滤、實時提醒等将鸵。 訂閱發(fā)布功能就能幫你很輕松地實現(xiàn)通知、監(jiān)控程序
-
subsciribe CHANNEL_NAME
: 訂閱一個頻道 -
publish CHANNEL_NAME
: 向頻道發(fā)送一個消息 -
unsubscribe CHANNEL_NAME
: 退訂頻道 -
psubscribe CHANNEL_NAME_PATTERN
: 基于正則表達式模式定義多個頻道
1佑颇、訂閱一個頻道:
72.16.36.70:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
2顶掉、向頻道發(fā)送消息
172.16.36.70:6379> publish news weizhenping
(integer) 1
3、頻道會接收下來消息
[root@Centos7 ~]# redis-cli -h 172.16.36.70
172.16.36.70:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"
2) "news"
3) "weizhenping" #此內(nèi)容為頻道發(fā)送過來的消息
基于模式的頻道訂閱示例
1挑胸、基于模式訂閱頻道
[root@Centos7 ~]# redis-cli -h 172.16.36.70
172.16.36.70:6379> PSUBSCRIBE news.i[to] #訂閱了news.io,news,io兩個頻道
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.i[to]"
3) (integer) 1
2痒筒、向頻道發(fā)送消息
172.16.36.70:6379> PUBLISH news.io hello
(integer) 1
3、頻道會接收下來消息
[root@Centos7 ~]# redis-cli -h 172.16.36.70
172.16.36.70:6379> PSUBSCRIBE news.i[to]
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.i[to]"
3) (integer) 1
1) "pmessage"
2) "news.i[to]"
3) "news.io"
4) "hello"
redis的持久化功能
-
1茬贵、RDB(redisDB)
-
工作原理
RDB為snapshot(快照)存儲機制簿透,其也是redis默認的存儲機制,按照事先定制的策略解藻,周期性地將數(shù)據(jù)從內(nèi)存中讀取出來保存至磁盤老充,當?shù)竭_
save
指令指定的時間,redis主進程將fork一個子進程螟左,負責內(nèi)存中的內(nèi)容快照并保存到磁盤中啡浊。 Linux系統(tǒng)有寫時復制機制,父進程與子進程會共享相同的物理頁面胶背,當父進程處理寫請求時巷嚣,操作系統(tǒng)為寫的數(shù)據(jù)創(chuàng)建一個副本,因此子進程保存的數(shù)據(jù)一定是與時間點一致的數(shù)據(jù)钳吟。當子進程將快照寫入臨時文件后廷粒,會使用臨時文件替換舊的文件,然后子進程完成退出 红且。保存的數(shù)據(jù)文件默認為dump.rdb
. 如果在SAVE周期之前停電了坝茎,會造成部分數(shù)據(jù)丟失。-
數(shù)據(jù)保存機制
-
save
: 在主線程中保存快照暇番,保存時會阻塞所有客戶端請求景东,每次將完整數(shù)據(jù)寫至dump.rdb文件中,會帶來大量的IO壓力 -
bgsave
: 異步保存機制奔誓,在后端自動保存斤吐,其不會阻塞窩客戶端請求
-
-
RDB相關(guān)的配置參數(shù)(/etc/redis/redis.conf)
-
stop-writes-on-bgsave-error yes
: 在基于快照備份時搔涝,一旦發(fā)生錯誤,是否停止寫操作 -
rdbcompression yes
: rdb文件是否壓縮來節(jié)約空間 -
rdbchecksum yes
: 是否對rdb的鏡像文件做校驗碼檢測和措,當redis啟動時會根據(jù)事先保存好的校驗碼進行對比庄呈,保證數(shù)據(jù)的完整性 -
dbfilename dump.rdb
: 保存的文件名 -
dir /var/lib/redis/
: 文件保存目錄 -
save ""
: 關(guān)閉rdb功能
-
-
-
2、AOF(append only file)
-
工作原理
redis以順序IO的方式附加在文件的尾部派阱,將每一次的寫命令操作都通過write函數(shù)追加到文件后面诬留,其是比RDB更好的持久化方案,但文件會變得越來越大贫母。當redis重啟時文兑,可通過執(zhí)行文件中的命令在內(nèi)存中重建數(shù)據(jù)庫
-
數(shù)據(jù)保存機制
-
bgrewriteaof
:AOF文件重寫
,它不會讀取正在使用的AOF文件腺劣,而是通過將內(nèi)存中的數(shù)據(jù)以命令的方式保存至臨時文件中绿贞,完成之后替換原來的AOF文件,這樣可以減少AOF的大小
-
-
AOF重寫過程
- 1橘原、redis主進程通過fork機制創(chuàng)建子線程
- 2籍铁、子進程根據(jù)redis內(nèi)存中現(xiàn)有的數(shù)據(jù)通過重建命令創(chuàng)建數(shù)據(jù)庫于臨時文件中
- 3、父進程繼續(xù)接收客戶請求趾断,并會把這些請求中的寫操作繼續(xù)追加到原來的AOF文件中拒名,額外地,也將新的寫請求放置于一個緩沖隊列中
- 4芋酌、子進程重寫完成增显,會通知父進程,父進程把緩沖中的隊列命令寫到臨時文件中
- 5脐帝、父進程用臨時文件替換老的AOF文件
-
AOF相關(guān)的配置參數(shù)(/etc/redis/redis.conf)
-
appendonly no
: 是否啟用AOF功能同云,yes表示啟用 -
appendfilename "appendonly.aof"
: aof存儲文件 -
appendfsync always
: 每次收到寫命令,立即寫入磁盤 -
appendfsync everysec
: 每秒鐘寫一次腮恩,推薦操作 -
appendfsync no
: append功能自己觸發(fā)寫操作,將所有操作都提交給OS温兼,由操作系統(tǒng)決定什么時候?qū)?/li> -
no-appendfsync-no-rewrite no
: 在重寫的過程中是否調(diào)用fsync -
auto-aof-rewrite-percentage 100
: 在aof文件已經(jīng)是上次重寫時的2倍大小秸滴,將自動啟動重寫操作 -
auto-aof-rewrite-min-size 64mb
: 當文件達到64MB才執(zhí)行重寫操作
RDB與AOF同時啟用時: 1、bgsave和bgrewriteaof不會同時執(zhí)行 2募判、在redis服務(wù)器啟動用于恢復數(shù)據(jù)時荡含,會優(yōu)先使用AOF
-
-
redis的主從復制
-
1、redis的主從復制特點
- 一個master可以有多個slave
- 支持鏈式復制
- master以非阻塞方式同步數(shù)據(jù)至slave,意味著可同時與多個slave同步
-
2届垫、復制的工作原理
- 1释液、主庫會自己基于ping check機制來檢查從庫是否在線
- 2、如果從庫在線就同步數(shù)據(jù)文件至從服務(wù)器端
- 3装处、從服務(wù)器也可以發(fā)送請求同步的請求误债,主庫將啟動一個線程浸船,把內(nèi)存中的數(shù)據(jù)同步給從庫,從庫將數(shù)據(jù)保存至文件中
- 4寝蹈、從庫再把文件裝載到內(nèi)存中李命,從而完成復制功能
-
3、主從相關(guān)配置(/etc/redis.conf)
-
slave-serve-stale-data yes
: 當主服務(wù)器連接不上了箫老,從服務(wù)器是否可以使用過期數(shù)據(jù)響應 -
repl-diskless-sync no
: 是否基于diskless機制同步 -
slave-priority 100
: 指定從服務(wù)器優(yōu)先級 -
min-slave-to-write 3
: 如果從節(jié)點小于三個封字,主服務(wù)器將拒絕寫操作 -
min-slave-max-lag 10
: 從服務(wù)器不能晚于主服務(wù)器10秒鐘,是否將停止復制
如果master使用了requirepass開啟了認證功能耍鬓,從服務(wù)器要使用masterauth <password>來連接阔籽,使用指定的密碼進行認證
主從設(shè)置示例: 172.16.36.70 : 主redis服務(wù) 172.16.36.71 : 從redis服務(wù) 172.16.36.70配置 vim /etc/redis.conf bind 172.16.36.70 172.16.36.71配置: vim /etc/redis.conf bind 172.16.36.71 [root@Centos7 ~]# redis-cli -h 172.16.36.71 172.16.36.71:6379> SLAVEOF 172.16.36.70 6379 OK 172.16.36.71:6379> get ip #查看是否能獲取到主庫數(shù)據(jù) "172.16.36.70" 172.16.36.71:6379> dbsize (integer) 3
-
redis高可用的實現(xiàn)
-
sentinel機制
-
工作原理
找一臺專用的監(jiān)控主機,即能提供監(jiān)控又可以提供配置功能牲蜀,如果發(fā)現(xiàn)master離線了笆制,監(jiān)控主機會從從節(jié)點選擇新的主節(jié)點。為了不誤判各薇,setinel至少奇數(shù)個節(jié)點项贺,同時監(jiān)控。如果主節(jié)點不在線峭判,多個setinel會協(xié)調(diào)一個新的主節(jié)點开缎,以免發(fā)生誤判,所有setinel每秒一次向所有服務(wù)器發(fā)送ping請求林螃,判斷節(jié)點是否在線奕删。setinel是一個分布式系統(tǒng),使用流言協(xié)議和投票協(xié)議來決定故障遷移疗认⊥瓴校可以監(jiān)控多組redis實例。
-
sentinel的功用
- 用于管理多個redis服務(wù)横漏,實現(xiàn)HA
- 監(jiān)控
- 通知
- 自動故障轉(zhuǎn)移
-
工作過程
- 啟用sentinel時谨设, 首先服務(wù)器做自身初始化,運行redis-server中專用于sentinel功能中的代碼
- 初始化sentinel狀態(tài)缎浇,根據(jù)給定的配置文件扎拣,初始化監(jiān)控的master服務(wù)列表(可以根據(jù)master的配置,獲取從服務(wù)器節(jié)點)
- 創(chuàng)建連向Master的連接
-
sentinel下線機制
-
主觀下線
: 一個sentinel實例判斷出某節(jié)點下線 -
客觀下線
: 多個sentinel節(jié)點協(xié)商后判斷出某節(jié)點下線
-
-
-
setinel程序
redis-sentinel /path/to/sentinel.conf
redis-server /path/to/sentinel --sentinel
-
setinel的工作端口
26379/TCP
-
專用配置文件
/etc/redis-sentinel.conf
-
redis-sentinel.conf配置參數(shù)
prot 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
mymaster: sentinel要監(jiān)控的實例名稱素跺,此名稱可以隨意取 127.0.0.1 : 主節(jié)點的IP地址 6379 : 主節(jié)點的端口 2 : sentinel節(jié)點的票數(shù)二蓝,此值要大于sentinel節(jié)點數(shù)量的半數(shù)
-
sentinel down-after-milliseconds mymaster 30000
: 判斷主節(jié)點不在線的默認超時時長,默認30秒 -
sentinel parallel-syncs mymaster 1
: 故障轉(zhuǎn)移時最多能有多少個從服務(wù)器向主服務(wù)器發(fā)起同步請求 -
sentinel failover-timeout mymaster 180000
: 提升主節(jié)點的超時時長指厌,表示提升新的主節(jié)點在3分鐘內(nèi)未完成刊愚,操作將失敗
-
sentinel專用命令
-
sentinel masters
: 列出所有主服務(wù)器 -
sentinel slaves <master name>
: 獲取所有當前redis實例中的從節(jié)點信息 -
sentinel get-master-addr-by name <master name>
:直接獲取當前redis實例主節(jié)點的IP地址及端口
172.16.36.74:26379> sentinel get-master-addr-by-name mymaster 1) "172.16.36.72" 2) "6379"
-
sentinel reset
: 重置服務(wù)器所有狀態(tài) -
sentinel failover <master name>
: 手動實現(xiàn)故障轉(zhuǎn)移
-
-
sentinel配置實例
實驗環(huán)境說明:
172.16.36.70 : redis主節(jié)點
172.16.36.71 : redis從節(jié)點
172.16.36.72 : redis從節(jié)點
172.16.36.74 : sentinel節(jié)點1
172.16.36.75 : sentinel節(jié)點2
172.16.36.76 : sentinel節(jié)點3
####配置redis主節(jié)點
操作主機: 172.16.36.70
#vim /etc/redis.conf
bind 172.16.36.70
daemonize yes
啟動服務(wù)
#redis-server /etc/redis.conf
[root@Centos7 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 172.16.36.70:6379 *:*
####配置redis從節(jié)點
操作主機: 172.16.36.71
#vim /etc/redis.conf
bind 172.16.36.71
daemonize yes
啟動服務(wù)
#redis-server /etc/redis.conf
[root@Centos7 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 172.16.36.70:6379 *:*
配置主節(jié)點信息
[root@Centos7 ~]# redis-cli -h 172.16.36.71 -p 6379
172.16.36.71:6379> SLAVEOF 172.16.36.70 6379
OK
操作主機: 172.16.36.72
#vim /etc/redis.conf
bind 172.16.36.72
daemonize yes
啟動服務(wù)
#redis-server /etc/redis.conf
[root@Centos7 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 172.16.36.70:6379 *:*
配置主節(jié)點信息
[root@Centos7 ~]# redis-cli -h 172.16.36.71 -p 6379
172.16.36.71:6379> SLAVEOF 172.16.36.70 6379
OK
####配置sentinel節(jié)點
操作主機: 172.16.36.74
# vim /etc/redis-sentinel.conf
port 26379
dir "/tmp"
daemonize yes
sentinel monitor mymaster 172.16.36.70 6379 2
sentinel parallel-syncs mymaster 3
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
啟動服務(wù)
redis-sentinel /etc/redis-sentinel.conf
查看服務(wù)啟動狀態(tài)
users:(("master",2112,14))
[root@Centos7 ~]# ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:26379 *:*
操作主機: 172.16.36.75
# vim /etc/redis-sentinel.conf
port 26379
dir "/tmp"
daemonize yes
sentinel monitor mymaster 172.16.36.70 6379 2
sentinel parallel-syncs mymaster 3
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
啟動服務(wù)
redis-sentinel /etc/redis-sentinel.conf
查看服務(wù)啟動狀態(tài)
users:(("master",2112,14))
[root@Centos7 ~]# ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:26379 *:*
操作主機: 172.16.36.76
# vim /etc/redis-sentinel.conf
port 26379
dir "/tmp"
daemonize yes
sentinel monitor mymaster 172.16.36.70 6379 2
sentinel parallel-syncs mymaster 3
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
啟動服務(wù)
redis-sentinel /etc/redis-sentinel.conf
查看服務(wù)啟動狀態(tài)
users:(("master",2112,14))
[root@Centos7 ~]# ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:26379 *:*
查看sentinel相關(guān)的日志信息
tailf /var/log/redis/redis-sentinel.log
[32524] 25 Mar 10:05:02.290 # Sentinel runid is a44025e518b65c512340c48535df119496f7a0d8
[32524] 25 Mar 10:05:02.291 # +monitor master mymaster 172.16.36.70 6379 quorum 2
[32524] 25 Mar 10:05:32.322 # +sdown slave 172.16.36.71:6379 172.16.36.71 6379 @ mymaster 172.16.36.70 6379
[32524] 25 Mar 10:05:46.311 * +sentinel sentinel 172.16.36.76:26379 172.16.36.76 26379 @ mymaster 172.16.36.70 6379
[32524] 25 Mar 10:05:57.071 * +sentinel sentinel 172.16.36.75:26379 172.16.36.75 26379 @ mymaster 172.16.36.70 6379
[32524] 25 Mar 10:09:03.727 # +sdown master mymaster 172.16.36.70 6379
將當前的Master節(jié)點shudown,查看sentinel的相關(guān)日志信息
[32524] 25 Mar 10:09:03.747 # +new-epoch 4
[32524] 25 Mar 10:09:03.749 # +vote-for-leader 90c011868befc3047a8527886efce8f8c6f9ea34 4
[32524] 25 Mar 10:09:03.836 # +odown master mymaster 172.16.36.70 6379 #quorum 3/2
[32524] 25 Mar 10:09:03.836 # Next failover delay: I will not start a failover before Fri Mar 25 10:15:04 2016
[32524] 25 Mar 10:09:04.854 # +config-update-from sentinel 172.16.36.75:26379 172.16.36.75 26379 @ mymaster 172.16.36.70 6379
[32524] 25 Mar 10:09:04.854 # +switch-master mymaster 172.16.36.70 6379 172.16.36.72 6379
[32524] 25 Mar 10:09:04.855 * +slave slave 172.16.36.71:6379 172.16.36.71 6379 @ mymaster 172.16.36.72 6379
[32524] 25 Mar 10:09:04.856 * +slave slave 172.16.36.70:6379 172.16.36.70 6379 @ mymaster 172.16.36.72 6379
對當前主節(jié)點監(jiān)控sentinel的活躍探測信息
root@Centos7 ~]# redis-cli -h 172.16.36.72
172.16.36.72:6379> monitor
OK
1458878723.052705 [0 172.16.36.76:53255] "PING"
1458878723.402835 [0 172.16.36.75:38413] "PING"
1458878723.586806 [0 172.16.36.74:32824] "PING"
1458878723.859748 [0 172.16.36.75:38413] "PUBLISH" "__sentinel__:hello" "172.16.36.75,26379,90c011868befc3047a8527886efce8f8c6f9ea34,4,mymaster,172.16.36.72,6379,4"
1458878724.099837 [0 172.16.36.76:53255] "PING"
1458878724.152776 [0 172.16.36.76:53255] "PUBLISH" "__sentinel__:hello" "172.16.36.76,26379,21a0a795010287138b6efc636d03edcce66bcd56,4,mymaster,172.16.36.72,6379,4"
1458878724.454214 [0 172.16.36.75:38413] "PING"
1458878724.617819 [0 172.16.36.74:32824] "PING"
1458878724.693888 [0 172.16.36.74:32824] "PUBLISH" "__sentinel__:hello" "172.16.36.74,26379,a44025e518b65c512340c48535df119496f7a0d8,4,mymaster,172.16.36.72,6379,4"
使用info sentinel命令查看主從信息
172.16.36.74:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=172.16.36.72:6379,slaves=2,sentinels=3
Redis Clustering
在redis3.0版本中引入clustering功能, 是去中心化的分布式數(shù)據(jù)庫踩验,通過分片機制進行數(shù)據(jù)分布鸥诽,clustering內(nèi)的每個節(jié)點僅有數(shù)據(jù)庫一部分數(shù)據(jù)商玫,每個節(jié)點都有全局元數(shù)據(jù),通過查找元數(shù)據(jù)衙传,即可查詢到數(shù)據(jù)存放在哪臺服務(wù)器
分布式解決方案
-
Twemproxy(Twitter)
- 代理分片機制
- 優(yōu)點
- 非常穩(wěn)定撞叨,企業(yè)方案
- 缺點
- 單點故障
- 需要依賴第三方軟件盖桥,如Keeplived
- 無法平滑地橫向擴展
- 沒有后臺界面
- 代理分片機制引入更多的來回次數(shù)并提高延遲
- 單核模式自晰,無法充分利用多核沛膳,除非多實例
- Twitter官方肉串不再繼續(xù)使用
-
Codis(豌豆莢)
- 代理分片機制
- 2014年11月開源
- 基于GO以及C語言開發(fā)
- 優(yōu)點
- 非常穩(wěn)定,企業(yè)級方案
- 數(shù)據(jù)自動平衡
- 高性能
- 簡單的測試顯示較Twemproxy快一倍
- 善用多核CPU
- 簡單
- 沒有paxos類的協(xié)調(diào)機制
- 沒有主從復制
- 有后臺界面
- 缺點
- 代理分片機制引入更多的來回次數(shù)并提高延遲
- 需要第三方軟件支持協(xié)調(diào)機制
- 目前支持zookeeper及Etcd
- 不支持主從復制 俊鱼,需要另外實現(xiàn)
- Codis采用proxy方案刻像,所有必然會帶來單機性能的損失
- 經(jīng)測試,在不開Pipeline的情況下并闲,大概會損失40%左右的性能
-
Redis Cluster(官方)
- 官方實現(xiàn)
- 需要3.0或更高版本
- 優(yōu)點
- 無中心的P2P Gossip分散式模式
- 更少的來回次數(shù)并降低延遲
- 自動于多個redis節(jié)點進行分片
- 不需要第三方軟件支持協(xié)調(diào)機制
- 缺點
- 依賴于redis 3.0或更高版本
- 需要時間驗證其穩(wěn)定性
- 沒有后臺界面
- 需要智能客戶端
- redis客戶端必須支持redis cluster架構(gòu)
- 較Codis有更多的維護升級版本