1. 程式人生 > >Redis詳解(二)

Redis詳解(二)

redis sentinal redis集群 redis主從 redis事務

一、redis認證
二、redis事務
三、Connection&server相關命令
四、Redis的發布與訂閱//充當mq的功能
五、Redis持久化
六、redis復制
七、master-slave實現
八、sentinal哨兵
九、redis限制
十、redis性能測試

一、redis認證
redis認證:
vim /etc/redis.conf
requirepass redispass //密碼
[root@node1 ~]# systemctl restart redis

[root@node1 ~]# redis-cli -h 192.168.4.106
192.168.4.106:6379> select 0
(error) NOAUTH Authentication required.
192.168.4.106:6379> auth redispass
OK
192.168.4.106:6379> select 0
OK

清空數據庫
flushdb:清空當前庫
flushall:清空所有庫

二、redis事務
1.MULTI用來組裝一個事務;
2.EXEC用來執行一個事務;
3.DISCARD用來取消一個事務;
4.WATCH用來監視一些key,一旦這些key在事務執行之前被改變,則取消事務的執行。

我們來看一個MULTI和EXEC的例子:
RDBMS的事務:一組相關操作,是原子性的:滿足ACID :原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
redis的事務:可以將多個命令綁定在一起,順序執行。通過multi,exec,watch等命令實現事務功能;
在事務執行過程中,redis不會中斷當前事務去執行其他client的指令。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set ip 192.168.0.1
QUEUED
127.0.0.1:6379> set port 800 //放到隊列中
QUEUED
127.0.0.1:6379> exec //一起執行
1) OK
2) OK

watch:在事務執行過程中,施加樂觀鎖 //不支持回滾
在exec之前,監視 指定的數據key是否在 multi和exec之間發生修改操作,有變動則不予執行事務
事務中關聯的 鍵 的監視操作。
//樂觀鎖,只是看他是否被修該,一旦被修改了,就不予執行。在事務過程中仍然可以被修改

redis不支持回滾操作,這是和mysql事務最大的區別
事務有10個操作,第5個命令錯誤。redis事務會忽略第5個錯誤,執行到最後。
redis目標:簡單、高效

redis的原子性:事務隊列中的任務,要麽全部執行,要麽全都不執行
redis的一致性:在檢查入隊時的一致性,例如輸入為錯誤命令 //語法級別
redis的隔離性:單線程,在執行事務中,不會執行其他操作,但是可以接受用戶請求到queue中
redis的持久性:依賴於server是否啟用持久化功能
rdb或者aof //快照和追加到文件

示例:樂觀鎖

終端1:            
    127.0.0.1:6379> watch ip 
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set ip 10.0.0.1
    QUEUED
    127.0.0.1:6379> get ip
    QUEUED
終端2:
    127.0.0.1:6379> set ip 172.16.100.1
    OK
    127.0.0.1:6379> get ip
    "172.16.100.1"
終端1:        
    127.0.0.1:6379> exec
    (nil)  //事務執行失敗
    
redis的一致性************        
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set jsidfjd
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
redis的原子性************
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set ip 10.0.0.1
QUEUED
127.0.0.1:6379> set aa
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> exec    //因為有語法錯誤,因此都沒有執行
(error) EXECABORT Transaction discarded because of previous errors.

三、Connection&server相關命令
help @connections

    auth:
    ping: 驗證服務器是否在線
    echo “hello redis"
    quit:
    select:選擇指定的DB

help @server

    bgsave:異步存儲數據到disk
    client setname: 為連接設置名字 //只能為自己修改名字
    client getname :獲取當前客戶端的鏈接名
    client kill ip:port //kill client的一個連接
    client list :查看鏈接
    config get  //redis的多數配置都可以在運行時修改
    config set //配置file中的參數 ,可以在內存中修改
    config rewrite //在內存中修改的操作,寫入到配置文件
    
    info //服務器的所有統計數據
    info Memory //指定只看內存信息
    info Cluster //獲取指定section的內容
    config resetstat //重置info的所有數據
    
    dbsize:    限制所有的鍵的數量
    
    bgsave: //
    save:
    lastsave:獲取最近一次成功保存到disk的 timestamp
    
    monitor:實時監控接受到的請求
    shutdown [nosave/save ]:同步所有數據到disk後,關閉
    slaveof :配置主從
    slowlog:管理慢查詢日誌
    
    sync:復制功能的內建命令 //同步master
    time:獲取當前server時間


四、Redis的發布與訂閱//充當mq的功能
發布與訂閱:發布者在訂閱者訂閱之前的發布數據默認是收取不到的
redis的發布與訂閱功能:(publish/subscribe)
生產者把信息發布在指定頻道上,訂閱者從指定的頻道去訂閱自己關註的信息即可

SUBSCRIBE:訂閱一個或多個 隊列/頻道
unsubscribe 退訂此前訂閱的頻道
psubscribe "new.i[to]" //訂閱2個頻道
psubscribe "new.*" //也可以

示例:發布與訂閱

終端1:
    127.0.0.1:6379> SUBSCRIBE news  //可以同時訂閱多個channel
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "news"
    3) (integer) 1
終端2:
    127.0.0.1:6379> PUBLISH news hello
    (integer) 1
終端1:
    1) "message"
    2) "news"  //頻道名
    3) "hello"     //內容


五、Redis持久化
redis如何實現持久化
redis默認工作在內存中
持久化
SAVE:將數據同步保存到磁盤;
BGSAVE:將數據異步保存到磁盤;
LASTSAVE:返回上次成功將數據保存到磁盤的 UNIX 時戳;
SHUNDOWN:將數據同步保存到磁盤,然後關閉服務。

持久化:RDB和AOF
RDB:snapshot,二進制格式,默認機制
按事先定制的策略,周期性的將數據保存到disk中;數據文件默認為dump.rdb
客戶端也可使用save或bgsave密令啟動快照保存機制。
save:異步方式實現,在主線程中保存快照:在save過程中,其他所有client請求都是block的
完整寫入內存數據到disk,而不是增量的同步
bgsave:異步background save,不會阻塞client請求,使用一個新的進程
AOF:append only file,把每個 寫命令 追加到文件尾部。
假如incr命令,執行100次,默認需要記錄100次
附加日誌類型的持久化存儲:問題:文件會變的越來越大,
但是redis能夠合並aof的持久化文件,bgrewriteaof 命令來實現。
例如 set count=100,直接修改aof文件,用來節約空間
127.0.0.1:6379> dir //獲取備份目錄

==============================================================================
記錄每一次寫操作至指定的文件尾部實現持久化,當redis重啟時,可重新執行文件中的命令在內存中重建數據庫
BGREWRITEAOF:aof文件重寫,
不會讀取正在使用的AOF文件,而通過將內存中的數據以命令的方式保存到臨時文件中,完成後替換原有的AOF文件來實現。

Redis在實現RDB模式時的實現方式:
redis調用fork創建一個子進程,父進程繼續處理client的請求,子進程負責將內存中的內容快照 到disk 中。
linux有COW(copy on write)機制,子進程和父進程會共享相同的物理頁面,
當父進程要寫請求時,os會為父進程創建一個副本,因此子進程所實現的保存,一定是時間點一致的數據。內核的特性。
當子進程快照寫入完成後,os會用副本覆蓋源文件。然後子進程退出
不足:一定會有一部分數據丟失,rdb保存的時間點之後的時間點會丟失

RDB:
SAVE 900 1
SAVE 300 10
SAVE 60 10000 //周期性的工作機制。
SAVE "" //關閉RDB功能

stop-writes-on-bgsave-error yes //在持久化時
rdbcompression yes //壓縮rdb文件
rdbchecksum yes//對rdb的鏡像文件進行校驗
dbfilename dump.rdb
dir /var/lib/redis

//redis-cli> config get dir //可以獲取配置
redis在實現AOF模式時的實現方式
每一個命令發出後,直接追加到append到文件中
重建過程:redis父進程調用fork,啟動一個子進程,子進程根據內存中現有的文件的數據,在臨時文件中,寫入一個數據庫重建的命令。
父進程繼續處理client請求,client新的請求除了把命令寫入到文件中,還要把新的命令緩存起來,放到緩存隊列中,後續執行。
當子進程把快照內容寫入到新的AOF文件後,通知父進程,父進程會用新的AOF替換老的AOF文件,並把這個操作啟動之後,新收到的請求命令,追加到新的AOF文件中
默認每秒鐘fsync一次(fsync是指把緩存中的寫指令記錄到磁盤中)

1.redis主進程fork一個子進程
2.子進程根據redis內存中的數據創建數據庫重建命令序列於臨時文件中
3.父進程繼續接受客戶端請求,並且會把這些請求中的寫操作繼續追加到原來的AOF文件;額外地,這些新的寫請求還會被放置於一個緩沖隊列中
4.子進程重寫完成後通知父進程,父進程把緩沖中的命令寫到臨時文件中
5.父進程用臨時文件替換老的aof文件
AOF方式的另一個好處,我們通過一個“場景再現”來說明。某同學在操作redis時,不小心執行了FLUSHALL,導致redis內存中的數據全部被清空了,這是很悲劇的事情。不過這也不是世界末日,只要redis配置了AOF持久化方式,且AOF文件還沒有被重寫(rewrite),我們就可以用最快的速度暫停redis並編輯AOF文件,將最後一行的FLUSHALL命令刪除,然後重啟redis,就可以恢復redis的所有數據到FLUSHALL之前的狀態了。是不是很神奇,這就是AOF持久化方式的好處之一。但是如果AOF文件已經被重寫了,那就無法通過這種方法來恢復數據了。
但AOF方式也同樣存在缺陷,比如在同樣數據規模的情況下,AOF文件要比RDB文件的體積大。而且,AOF方式的恢復速度也要慢於RDB方式。
如果在追加日誌時,恰好遇到磁盤空間滿、inode滿或斷電等情況導致日誌寫入不完整,也沒有關系,redis提供了redis-check-aof工具,可以用來進行日誌修復。
appendonly no //默認是關閉的
appendfilename "appendonly.aof" //追加到哪個文件

# appendfsync always //每次收到寫請求,就執行操作
appendfsync everysec //每s一次
# appendfsync no //append的功能自行不會觸發寫操作,所有寫操作都是提交給OS,由OS自行決定如何寫。
//由內核決定如何進行寫操作
no-appendfsync-on-rewrite no //yes:表示,對重寫操作,對新寫入的操作,不做fsync,而是暫存到隊列中

auto-aof-rewrite-percentage 100 //本次重新的aof文件是上次重新文件的2倍時,執行重寫。
(當前寫入日誌文件的大小超過上一次rewrite之後的文件大小的百分之100時就是2倍時觸發Rewrite)
auto-aof-rewrite-min-size 64mb //剛開始的時候,1個1s後,4個大於1的2倍,會發起重寫操作,顯然不合理,要設置最小aof文件大小
aof-load-truncated yes //

可以同時啟動RDB和AOF,

註意:持久本身不能取代備份,還應該指定備份策略,對redis數據庫及逆行定期備份
假如同時啟用AOF和RDB
兩個同時滿足,需要重寫
bgsave和rewrite不會同時執行,redis只會讓一個執行,為了避免過大的磁盤IO,逐個執行

RDB,簡而言之,就是在不同的時間點,將redis存儲的數據生成快照並存儲到磁盤等介質上;
AOF,則是換了一個角度來實現持久化,那就是將redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,只要把這些寫指令從前到後再重復執行一遍,就可以實現數據恢復了。
其實RDB和AOF兩種方式也可以同時使用,在這種情況下,如果redis重啟的話,則會優先采用AOF方式來進行數據恢復,這是因為AOF方式的數據恢復完整度更高。
如果你沒有數據持久化的需求,也完全可以關閉RDB和AOF方式,這樣的話,redis將變成一個純內存數據庫,就像memcache一樣。

六、redis復制
特點:
一個master可以有多個slave,一個slave也可以有自己的slave
支持鏈式復制功能:
master以非阻塞方式同步數據至slave//master會繼續接受一個或多個slave的同步請求

slaveof <masterip> <masterport>
masterauth <master-password>  //主redis設置了驗證密碼的話(使用requirepass來設置)
slave-read-only yes
repl-ping-slave-period 10  //slave默認每10s向master發送ping包
repl-timeout 60  //設置ping超時時間,確保這個時限比repl-ping-slave-period的值要大,否則每次主redis都會認為從redis超時。
repl-disable-tcp-nodelay no  //主從同步時是否禁用TCP_NODELAY。開啟:主redis會使用更少的TCP包和更少的帶寬來向從redis傳輸數據。但是這可能會增加一些同步的延遲,大概會達到40毫秒左右。如果你關閉了TCP_NODELAY,那麽數據同步的延遲時間會降低,但是會消耗更多的帶寬
repl-backlog-size 1mb //同步隊列長度。隊列長度(backlog)是主redis中的一個緩沖區,在與從redis斷開連接期間,主redis會用這個緩沖區來緩存應該發給從redis的數據。這樣的話,當從redis重新連接上之後,就不必重新全量同步數據,只需要同步這部分增量數據即可。
repl-backlog-ttl 3600 //如果主redis等了一段時間之後,還是無法連接到從redis,那麽緩沖隊列中的數據將被清理掉。我們可以設置主redis要等待的時間長度。如果設置為0,則表示永遠不清理。默認是1個小時。
slave-priority 100 //redis優先級,在主redis持續工作不正常的情況,優先級高的從redis將會升級為主redis。而編號越小,優先級越高。比如一個主redis有三個從redis,優先級編號分別為10、100、25,那麽編號為10的從redis將會被首先選中升級為主redis。當優先級被設置為0時,這個從redis將永遠也不會被選中。默認的優先級為100。
min-slaves-to-write 3 //redis提供了可以讓master停止寫入的方式,如果配置了min-slaves-to-write,健康的slave的個數小於N,mater就禁止寫入。master最少得有多少個健康的slave存活才能執行寫命令。這個配置雖然不能保證N個slave都一定能接收到master的寫操作,但是能避免沒有足夠健康的slave的時候,master不能寫入來避免數據丟失。設置為0是關閉該功能。
min-slaves-max-lag 10 //#延遲小於min-slaves-max-lag秒的slave才認為是健康的slave。
slave-serve-stale-data yes    //聯系不到master之後,仍然使用過期數據
repl-diskless-sync no //當硬盤太慢的時候,啟用該值 
repl-diskless-sync-delay 5 //延遲操作時間


當從redis失去了與主redis的連接,或者主從同步正在進行中時,redis該如何處理外部發來的訪問請求呢?這裏,從redis可以有兩種選擇:
第一種選擇:如果slave-serve-stale-data設置為yes(默認),則從redis仍會繼續響應客戶端的讀寫請求。
第二種選擇:如果slave-serve-stale-data設置為no,則從redis會對客戶端的請求返回“SYNC with master in progress”,當然也有例外,當客戶端發來INFO請求和SLAVEOF請求,從redis還是會進行處理。
你可以控制一個從redis是否可以接受寫請求。將數據直接寫入從redis,一般只適用於那些生命周期非常短的數據,因為在主從同步時,這些臨時數據就會被清理掉。自從redis2.6版本之後,默認從redis為只讀。
只讀的從redis並不適合直接暴露給不可信的客戶端。為了盡量降低風險,可以使用rename-command指令來將一些可能有破壞力的命令重命名,避免外部直接調用。比如:
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

主從情況下的timeout:
1.以從redis的角度來看,當有大規模IO傳輸時。
2.以從redis的角度來看,當數據傳輸或PING時,主redis超時
3.以主redis的角度來看,在回復從redis的PING時,從redis超時

七、master-slave實現
MONITOR:實時轉儲收到的請求; //master和slave之間進行的ping-pong也可以看到
192.168.4.106 server
192.168.4.109 slave
server:
bind 0.0.0.0
service redis resart //沒有認證密碼
slave:
bind 0.0.0.0
service redis resart

[root@node2 ~]# redis-cli -h 192.168.4.109
192.168.4.109:6379> SLAVEOF 192.168.4.106 6379
OK Already connected to specified master
192.168.4.109:6379> get ip
"172.16.100.1"
192.168.4.109:6379> config get slaveof
1) "slaveof"
2) "192.168.4.106 6379"    
192.168.4.109:6379> key * //查看所有的key
    
192.168.4.109:6379> config set masterauth "redispass" //slave通過auth進行認證
    註意:可以在同一個主機上啟動多個redis,使用不同的端口接口
    如果主redis設置了驗證密碼的話(使用requirepass來設置),則在從redis的配置中要使用masterauth來設置校驗密碼,否則的話,主redis會拒絕從redis的訪問請求。
    
192.168.4.106:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.4.109,port=6379,state=online,offset=575,lag=1
master_repl_offset:589
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:588
//默認slaveof 之後,slave將變成只讀


八、sentinal哨兵
主從架構問題:主故障,從不會執行寫操作
redis引入了sentinel哨兵機制。監控整個主從架構。
[監控主機] //sentinel會在主node掛的時候,選取一個從作為主node

[master]
-----------------------
[s1] [s2] [s3]

前端代理會向sentinal發起查詢請求,獲取新的master node
萬一sentinal故障:或者sentinal聯系不到master,因此sentinal可以做集群,例如3個sentinal節點,避免誤判

sentinal只監控主的,從master獲取從的配置信息,一旦主故障,則選一個從為主
sentinal:
用於管理多個redis服務器實現HA
監控
通知
自動故障轉移

流言協議[sentinal之間接受master是否下線的消息],投票協議[決定是否執行故障遷移,以及選取哪一個為主master]

redis-server --sentinal 在啟動的時候,指定sentinal可以自己成為sentinal 服務器
redis-sentinal /path/to/file.conf //專用命令,配置文件

sentinal啟動:
1.sentinal初始化自身服務器,運行redis-server中專用於sentinal功能的代碼
2.初始化sentinal狀態,根據給定的配置文件,初始化監控的master服務器列表
3.創建連向master的連接

專用配置文件:
/etc/redis-sentinal.conf 專用配置文件
port 26379
(1)sentinel monitor mymaster 127.0.0.1 6379 2 //監控的主節點
mymaster是自己取名,master-name,可以不是主機名,隨意
2:quorum 法定票數,至少2票,才可以啟動集群
//該條目可以出現多個
(2)sentinel down-after-milliseconds mymaster 30000
master多少時間聯系不到後為 down 離線
(3)sentinel parallel-syncs mymaster 1
剛設定為新master時,允許同時多少個slave發起同步請求
(4)sentinel failover-timeout mymaster 18000
故障轉移的超時時間。在3min內不能把該slave提升為master,則故障轉移失敗
(5)logfile /var/log/redis/sentinel.log

setinal只需要知道master節點,從node,sentinal會從主node獲取的
主觀下線:一個sentinal發現master找不到了,認為其down了
客觀下線: 所有sentinal都認為該master down,
sentinal會每隔1s 探測 ping(pong)

常用命令:
sentinal masters
sentinal slaves master_name
sentinal get-master-addr-by-namne master_name
sentinal reset //清除所有狀態
sentinal failover master_name //強制故障轉移
實現:
啟動三個redis
1主,2從,1個sentinal,讓主的下線然後查看效果 //取消認證功能
[root@node1 lib]# mkdir /etc/redis
[root@node1 lib]# cp /etc/redis.conf /etc/redis
[root@node1 lib]# cd /etc/redis
[root@node1 redis]# cp redis.conf redis.conf.2
[root@node1 redis]# cp redis.conf redis.conf.3
[root@node1 redis]# mkdir -pv /redis/{db1,db2,db3}
[root@node1 redis]# chown -R redis.redis /redis/

(1)默認
    vim redis.conf 
bind 0.0.0.0
port 6379
logfile /var/log/redis/redis.log
pidfile /var/run/redis/redis.pid
daemonize yes //能夠在後臺運行
protected-mode no
(2)vim redis.conf.2
port 6380
bind 0.0.0.0
pidfile /var/run/redis/redis2.pid
logfile /var/log/redis/redis2.log    
dir /redis/db2
daemonize yes
protected-mode no
    
(3)    vim redis.conf.3
port 6381
bind 0.0.0.0
pidfile /var/run/redis/redis3.pid
logfile /var/log/redis/redis3.log    
dir /redis/db3
daemonize yes
protected-mode no
    
[root@node1 redis]# redis-server /etc/redis/redis.conf
[root@node1 redis]# redis-server /etc/redis/redis.conf.2
[root@node1 redis]# redis-server /etc/redis/redis.conf.3    
[root@node1 redis]# ss -tunl |grep -E "6379|6380|6381"
tcp    LISTEN     0      128       *:6379                  *:*                  
tcp    LISTEN     0      128       *:6380                  *:*                  
tcp    LISTEN     0      128       *:6381                  *:*       
    
6379為主,其他都是從


三個終端:
1.6379
[root@node2 ~]# redis-cli -h 192.168.4.106 -p 6379
192.168.4.106:6379> config set requirepass masterpass
192.168.4.106:6379> config set masterauth mastermaster
//在mater上set 添加新值,slave會立即看到

2.6380
[root@node2 ~]# redis-cli -h 192.168.4.106 -p 6380
192.168.4.106:6380> slaveof 192.168.4.106 6379
192.168.4.106:6380> config set masterauth masterpas //和master的requirepass一致
192.168.4.106:6380> keys *
1) "port"
2) "ip"
3) "mm"
4) "kk"
5) "nn"

3.6381
[root@node2 ~]# redis-cli -h 192.168.4.106 -p 6381
192.168.4.106:6381> slaveof 192.168.4.106 6379
192.168.4.106:6381> config set masterauth masterpass
192.168.4.106:6381> info Replication
192.168.4.106:6380> keys *

啟動sentinal配置,只啟動一個sentinal
192.168.4.109:
[root@node2 ~]# cp /etc/redis-sentinel.conf /etc/redis/
[root@node2 ~]# cd /etc/redis/
[root@node2 redis]# vim redis-sentinel.conf
1.port :當前Sentinel服務運行的端口
2.dir : Sentinel服務運行時使用的臨時文件夾
3.sentinel monitor master001 192.168.110.101 6379 2:Sentinel去監視一個名為master001的主redis實例,這個主實例的IP地址為本機地址192.168.110.101,端口號為6379,而將這個主實例判斷為失效至少需要2個 Sentinel進程的同意,只要同意Sentinel的數量不達標,自動failover就不會執行
4.sentinel down-after-milliseconds master001 30000:指定了Sentinel認為Redis實例已經失效所需的毫秒數。當實例超過該時間沒有返回PING,或者直接返回錯誤,那麽Sentinel將這個實例標記為主觀下線。只有一個 Sentinel進程將實例標記為主觀下線並不一定會引起實例的自動故障遷移:只有在足夠數量的Sentinel都將一個實例標記為主觀下線之後,實例才會被標記為客觀下線,這時自動故障遷移才會執行
5.sentinel parallel-syncs master001 1:指定了在執行故障轉移時,最多可以有多少個從Redis實例在同步新的主實例,在從Redis實例較多的情況下這個數字越小,同步的時間越長,完成故障轉移所需的時間就越長
6.sentinel failover-timeout master001 180000:如果在該時間(ms)內未能完成failover操作,則認為該failover失敗
7.sentinel notification-script <master-name> <script-path>:指定sentinel檢測到該監控的redis實例指向的實例異常時,調用的報警腳本。該配置項可選,但是很常用

[root@node2 redis]# egrep -v "^#|^$" redis-sentinel.conf
sentinel monitor mymaster 192.168.4.106 6380 1 //有1個哨兵認為其故障,就確定故障
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 18000
sentinel auth-pass mymaster redispass
logfile "/var/log/redis/sentinel.log"
protected-mode no
daemonize yes
sentinel auth-pass mymaster redispass //密碼,沒有密碼,因此沒有使用
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 192.168.2.103 6380
sentinel known-slave mymaster 192.168.2.103 6381 //生成的

[root@node2 redis]# redis-sentinel /etc/redis/redis-sentinel.conf
[root@node2 ~]# redis-cli -h 192.168.4.109 -p 26379
sentinel masters //查看master所在的node
sentinel slaves mymaster //查看從s

kill 主node進程 6379
info //查看新的master 變為 6380
sentinel master //可以看到
在 6381上
info replication //查看master
重新啟動master //6379

26379:info 端口仍然為6380
sentinel slaves mymaster //原主依然為從

九、redis限制
maxclients 10000 //如果達到了此限制,redis會拒絕新請求,並發出“max number of clients reached”回應。
maxmemory <bytes> //一旦到達內存使用上限,redis將會試圖移除內部數據,移除規則可以通過maxmemory-policy來指定。
如果你的redis是主redis(說明你的redis有從redis),那麽在設置內存使用上限時,需要在系統中留出一些內存空間給同步隊列緩存,只有在你設置的是“不移除”的情況下,才不用考慮這個因素。
對於內存移除規則來說,redis提供了多達6種的移除規則。他們是:
1.volatile-lru:使用LRU算法移除過期集合中的key
2.allkeys-lru:使用LRU算法移除key
3.volatile-random:在過期集合中移除隨機的key
4.allkeys-random:移除隨機的key
5.volatile-ttl:移除那些TTL值最小的key,即那些最近才過期的key。
6.noeviction:不進行移除。針對寫操作,只是返回錯誤信息。
無論使用上述哪一種移除規則,如果沒有合適的key可以移除的話,redis都會針對寫請求返回錯誤信息。

LRU算法和最小TTL算法都並非是精確的算法,而是估算值。所以你可以設置樣本的大小。假如redis默認會檢查三個key並選擇其中LRU的那個,那麽你可以改變這個key樣本的數量。
maxmemory-samples 3

info memory: //實際占用內存
    used_memory:13490096 //數據占用了多少內存(字節)
    used_memory_human:12.87M //數據占用了多少內存(帶單位的,可讀性好)
    used_memory_rss:13490096  //redis占用了多少內存,常駐內存集
    used_memory_peak:15301192 //占用內存的峰值(字節)
    used_memory_peak_human:14.59M //占用內存的峰值(帶單位的,可讀性好)
    used_memory_lua:31744  //lua引擎所占用的內存大小(字節)
    mem_fragmentation_ratio:1.00  //內存碎片率
    mem_allocator:libc //redis內存分配器版本,在編譯時指定的。有libc、jemalloc、tcmalloc這3種。

十、redis性能測試
redis-benchmark [option] [option value]
$ redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000
100個並發連接,100000個請求,檢測host為localhost 端口為6379的redis服務器性能

-h      指定服務器主機名        127.0.0.1
-p      指定服務器端口  6379
-s      指定服務器 socket
-c      指定並發連接數  50
-n      指定請求數      10000
-d      以字節的形式指定 SET/GET 值的數據大小   2
-k      1=keep alive 0=reconnect        1
-r      SET/GET/INCR 使用隨機 key, SADD 使用隨機值
-P      通過管道傳輸 <numreq> 請求      1
-q      強制退出 redis。僅顯示 query/sec 值
--csv   以 CSV 格式輸出
-l      生成循環,永久執行測試
-t      僅運行以逗號分隔的測試命令列表。
-I      Idle 模式。僅打開 N 個 idle 連接並等待。

參考:
https://piaosanlang.gitbooks.io/redis/content/happy/section2.html
https://www.cnblogs.com/wyy123/p/6078593.html
https://yq.aliyun.com/articles/226052
http://www.cnblogs.com/hjfeng1988/p/6144352.html
http://chong-zh.iteye.com/blog/2175166

Redis詳解(二)