一.redis介紹
(1)概念:屬于非關系型存儲數據庫——基于kv(鍵值存儲)的開源的內存存儲,數據庫結構存儲。經常被用作數據庫,消息隊列和緩存。
下載可去官網www.redis.io 或是epel源進行下載
搜狗截圖20171116091316.png
主程序/usr/bin/redis-server
監聽端口:6379/tcp
客戶端:/usr/bin/redis-cli
數據目錄:/var/lib/redis
(2)支持的數據結構
字符串、列表(數組)、hashes(關聯數組)、集合、有序集合、bitmaps、hyperloglogs、空間索引
(3)redis特點
內建的復制、Lua scripting、LRU、事務、持久存儲、高可用(Sentinel,Redis Cluster)
(4)redis:k/v
基于kv鍵值存儲,進入客戶端redis-cli
搜狗截圖20171116092655.png
通過select命令來選擇數據庫,不能超過15(15為數據庫編號,是第16個數據庫)
常用命令
使用help進行查詢幫助,Help @generic(通用命令),@string
@list,@set,@hash,@pubsub,@sorted_set
下面選擇幾個常用的命令演示以加深印象
1.@string
主要應用:增,刪,改,查
搜狗截圖20171116094054.png
使用get來查看mykey的內容
如果想要在mykey增加內容就是用append命令來實現
搜狗截圖20171116094417.png
注意在使用set命令創建key時如果想要設置過期時間可以在后面加入EX 加時間(時間以秒為單位),這樣就是代表經過多長時間該內容就會消失
搜狗截圖20171116095107.png
在后面加入NX代表只創建不存在的key,如果之前存在就不創建,如果不在后面加入NX,那么創建相同的key,就會把之前的內容覆蓋
搜狗截圖20171116095651.pngincr和decr使用
set count 0
搜狗截圖20171116100922.png查看鍵值長度
搜狗截圖20171116100205.png
2.help @list
使用lpush 命令創建key
搜狗截圖20171116103627.pnglindex,lrange
搜狗截圖20171116104209.pnglinsert
搜狗截圖20171116104359.pngrpop和lpop
搜狗截圖20171116104644.png- llen——查看列表長度
- lrem——刪除命令,lrem week 1 thu
搜狗截圖20171116105039.png- lset
搜狗截圖20171116105328.png
3.help @hash
hget
hget who(key) name(field) tom(values)
搜狗截圖20171116110223.pnghmget
搜狗截圖20171116110545.png
搜狗截圖20171116110611.pnghstrlen和hgetall
搜狗截圖20171116110756.pnghdel
搜狗截圖20171116110839.png
4.help @set——主要應用于集合的交差并補
設置
sadd animals dog elephant fox horse monkey cat wolf
sadd jiaqin egg chicken dog pig cat duck fish
使用smembers animals和smembers jianqin來查看
搜狗截圖20171116111825.png
srem——刪除key中的內容
搜狗截圖20171116112351.png
*sinter sdiff sunion
搜狗截圖20171116112614.png
搜狗截圖20171116112730.png
5.help @sorted_set——通過評分機制來劃分
- zadd employees1 1 tom 3 jerry 4 hadern 5 bush 7 obama
9 sanpang 10 zhangzhe- zscore key zrank
搜狗截圖20171116113735.png
*zrangebyscore
搜狗截圖20171116113852.png- ZUNIONSTORE——并集存儲
- ZINTERSTORE——交集存儲
- ZREM ——刪除
6.help @pubsub——發布訂閱隊列
常用命令:publish——扇出(將內容發給訂閱該頻道的用戶),后來的用戶無法接收到,因為該內容扇出
subscribe——訂閱具體頻道
搜狗截圖20171116115022.png
在另一個終端上
搜狗截圖20171116115154.png
再開啟一個終端
搜狗截圖20171116115324.png
- UNSUBSCRIBE——取消訂閱
二.配置與使用redis
配置文件——/etc/redis.conf
搜狗截圖20171116142250.png
(1).基本配置項
daemonize, supervised, pidfile
搜狗截圖20171116155110.png
loglevel,logfile
搜狗截圖20171116155208.png
databases,select 0-15來選擇數據庫
搜狗截圖20171116155326.png
(2).網絡配置項
bind IP
搜狗截圖20171116155901.png
port PORT
默認為6379,一般情況下也不建議修改端口
protected-mode
搜狗截圖20171116160156.png
tcp-backlog
unixsocket
timeout:連接的空閑超時時長;
默認設置為0,不設定空閑超時時間
(3).持久化相關配置
Redis的持久化:
RDB:snapshotting, 二進制格式;按事先定制的策略,周期性地將數據從內存同步至磁盤;數據文件默認為dump.rdb;
客戶端顯式使用SAVE或BGSAVE命令來手動啟動快照保存機制;
SAVE:同步,即在主線程中保存快照,此時會阻塞所有客戶端請求;
BG(backgroud)SAVE:異步;一般采用bg
yum 安裝默認開啟rdb持久連接
搜狗截圖20171116170425.png
特點:效率高,但是同步內容不夠精確
stop-writes-on-bgsave-error yes
dump操作出現錯誤時,是否禁止新的寫入操作請求;
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb:指定rdb文件名
dir /var/lib/redis:rdb文件的存儲路徑- AOF:Append Only File, fsync
記錄每次寫操作至指定的文件尾部實現的持久化;當redis重啟時,可通過重新執行文件中的命令在內存中重建出數據庫;
BGREWRITEAOF:AOF文件重寫;
不會讀取正在使用AOF文件,而是通過將內存中的數據以命令的方式保存至臨時文件中,完成之后替換原來的AOF文件;
該方式更精準但是效率不高,能實現時間點還原
搜狗截圖20171116170858.png
注意:aof和rdb不能同時開啟,會影響負載和io性能
no-appendfsync-on-rewrite no
是否在后臺執行aof重寫期間不調用fsync,默認為no,表示調用;
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
上述兩個條件同時滿足時,方會觸發重寫AOF;與上次aof文件大小相比,其增長量超過100%,且大小不少于64MB;
aof-load-truncated yes- Redis服務器啟動時用持久化的數據文件恢復數據,會優先使用AOF
(4).安全相關配置
搜狗截圖20171116160617.png
設施密碼后再次登錄就要輸入密碼
搜狗截圖20171116160915.png
或者使用redis-cli -a magedu來進行登錄
搜狗截圖20171116161206.png
rename-command
一般是對config命令來進行重命名操作,因為config命令功能強大,如果有其他用戶連入,會對redis數據庫造成威脅
在AOF或Replication環境中,但不推薦使用
搜狗截圖20171116161842.png
體現出config的危險性
config set maxclients 10002
OK
127.0.0.1:6379[15]> config get maxclients
- "maxclients"
"10002"
127.0.0.1:6379[15]> config rewrite
OK
搜狗截圖20171116163833.png
(5).Limit相關的配置
maxclients
默認設置最大值為10000
maxmemory <bytes>
maxmemory-policy noeviction
搜狗截圖20171116162256.png
淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
maxmemory-samples 5
淘汰算法運行時的采樣樣本數;
(6).SlowLog相關的配置
slowlog-log-slower-than 10000
單位是微秒;
slowlog-max-len 128
SlowLog記錄的日志最大條目;
(7).Advanced配置
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
設置ziplist的鍵數量最大值,每個值的最大空間;
client-output-buffer-limit normal 0 0 0:
client-output-buffer-limit slave 256mb(最大不超過) 64mb(一般不超過的最大內存) 60(超過64,小于256緩存時間)
client-output-buffer-limit pubsub 32mb 8mb 60
<hard-limit>——硬限制
<soft-limit>——軟限制
<soft-limit seconds>——軟限制時間限制
(8)redis-cli命令:
Server相關的命令:
CLIENT GETNAME
CLIENT KILL
CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
搜狗截圖20171116164416.png
CLIENT LIST
CLIENT PAUSE
CLIENT PAUSE timeout
CLIENT REPLY
CLIENT SETNAME:Set the current connection name
SHUTDOWN [NOSAVE|SAVE]
搜狗截圖20171116164504.png
搜狗截圖20171116164627.png
配置參數可運行時修改:
CONFIG GET
CONFIG RESETSTAT
CONFIG REWRITE
CONFIG SET
INFO:服務器狀態信息查看;分為多個secion;
INFO [section]
搜狗截圖20171116165028.png
搜狗截圖20171116165137.png
config resetstat搜狗截圖20171116165325.png
三.redis主從復制
(1)特點
一個Master可以有多個slave主機,支持鏈式復制;
Master以非阻塞方式同步數據至slave主機;
(2)相關配置
slaveof——在從節點上設置對應的主節點的地址與端口號
masterauth ——進行密碼驗證,與主節點密碼相同
slave-serve-stale-data yes——是否允許過期的數據來影響客戶端的請求
slave-read-only yes——只允許從節點讀
*repl-diskless-sync no——需不需要啟用無磁盤的復制
新的從節點或某較長時間未能與主節點進行同步的從節點重新與主節點通信,需要做“full synchronization",此時其同步方式有兩種style:
Disk-backend:主節點新創建快照文件于磁盤中,而后將其發送給從節點;
Diskless:主節占新創建快照后直接通過網絡套接字文件發送給從節點;為了實現并行復制,通常需要在復制啟動前延遲一個時間段;
repl-diskless-sync-delay 5
repl-ping-slave-period 10
*repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 1mb
*slave-priority 100
復制集群中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高,但0表示不參與選舉;
min-slaves-to-write 3:主節點僅允許其能夠通信的從節點數量大于等于此處的值時接受寫操作;
min-slaves-max-lag 10:從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;
示例:配置三臺虛擬機,其中172.18.254.242最為主節點172.18.25.62和172.18.250.89作為從節點
在主節點上vim /etc/redis.conf
bind 0.0.0.0
requirepass magedu
在172.18.250.89上
vim /etc/redis.conf
bind 0.0.0.0
slaveof 172.18.254.242 6379
masterauth magedu
requirepass magedu
修改完成后重啟登錄
redis-cli -h 172.18.250.89
auth magedu
搜狗截圖20171116210030.png
在主節點上執行client list搜狗截圖20171116210120.png
從節點連接成功,此時在主節點設置一些命令來驗證
select 15
set key whokey "why are you my honey"
get whokey
搜狗截圖20171116210320.png
在從節點上select 15
執行get whokey顯示
搜狗截圖20171116210521.png
再另一個從節點上使用redis-cli 中命令來實現主從復制
首先vim /etc/redis.conf
requirepass magedu
bind 0.0.0.0
redis-cli
搜狗截圖20171116210848.png
在主節點上
搜狗截圖20171116210956.png
連接成功
搜狗截圖20171116211214.png
執行config rewrite 將修改內容存入配置文件
(3)sentinel
1.主要完成三個功能:監控、通知、自動故障轉移
選舉:流言協議、投票協議
流言協議:當主節點無法自己主觀判斷時需要詢問其他從節點是否down,當其他從節點都一致認為主節點down就是真的down
投票協議:當with quorum>2時,代表主機down,當quorum<=2時,投票協議作廢。quorum屬于sentinel集群的機制
搜狗截圖20171116211611.png
2.配置項:
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>
<quorum>表示sentinel集群的quorum機制,即至少有quorum個sentinel節點同時判定主節點故障時,才認為其真的故障;
搜狗截圖20171116211914.png
s_down: subjectively down——主觀down,只要自己認為down就是down
o_down: objectively down——客觀down,根據投票協議來設定
sentinel down-after-milliseconds <master-name> <milliseconds>
監控到指定的集群的主節點異常狀態持續多久方才將標記為“故障”;
sentinel parallel-syncs <master-name> <numslaves>
指在failover過程中,能夠被sentinel并行配置的從節點的數量;
sentinel failover-timeout <master-name> <milliseconds>
sentinel必須在此指定的時長內完成故障轉移操作,否則,將視為故障轉移操作失敗;
sentinel notification-script <master-name> <script-path>
通知腳本,此腳本被自動傳遞多個參數;
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters
SENTINEL slaves <MASTER_NAME>
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>
通過實際操作來驗證
在主節點上:vim /etc/redis-sentinel.conf
注意該配置文件中沒有bind這一項需要手動添加
bind 0.0.0.0
sentinel monitor mymaster 172.18.254.242 6379 2——主節點ip地址和端口,并且定義了qorum >3/2
sentinl auth-pass mymaster magedu——驗證密碼
sentinel down-after-milliseconds mymaster 5000——當主機down后設置五秒后為down機狀態
sentinel parallel-syncs mymaster 3——故障轉移過程中從節點的數量
sentinel failover-timeout mymaster 60000——故障轉移連接時間超過60秒就是失敗
配置完成后將配置文件復制給另外兩個節點
scp /etc/redis-sentinel.conf 172.18.250.89:/etc/
scp /etc/redis-sentinel.conf 172.18.250.223:/etc/
復制成功后分別執行systemctl start redis-sentinel
執行ss -ntl發現26379端口打開
在主節點上執行redis-cli -h 172.18.254.242 -p 26379
-a magedu
執行 sentinel masters——查看主節點信息
搜狗截圖20171116215103.png
執行sentinel slaves mymaster
此時將主節點的redis關閉,來查看
發現主節點地址發生變化,而主節點的變換機制在未設定的情況下是根據ip地址大小來確定,也可以通過設置slave-priority
100來設置優先級,數字越小優先級越高
修復機制vim /etc/redis.conf
slaveof 172.18.250.89 6379
masterauth magedu
repl-diskless-sync no
配置完成后開啟服務
再次進行查看發現
原來的主節點狀態變為slave
SENTINEL get-master-addr-by-name <MASTER_NAME>
手動觸發故障轉移
SENTINEL get-master-addr-by-name mymaster會看見新的主節點的地址
三.cluster設置
(1).redis的集群:redis集群會在所有的redis節點上分配槽點,槽點總數為16384,范圍是0-16383
這樣每個節點上都會被分配相應的槽點,這樣redis數據庫的數據就就會被分配到這些節點上,每個節點都會存有一部分數據。當客戶創建一個鍵值時,就會對鍵值進行hash運算,將計算結果對16384進行運算取模,結果范圍在0-16383,那么該鍵值如果和某個節點的取模后的數值對應上,那么數據就會存儲在此,下次用戶想要查詢時就會找到對應的節點才會找到對應的數據
(2) 集群相關的配置
cluster-enabled 是否開啟集群配置
cluster-config-file 集群節點集群信息配置文件,每個節點都有一個,由redis生成和更新,配置時避免名稱沖突
cluster-node-timeout 集群節點互連超時的閥值,單位毫秒
cluster-slave-validity-factor 進行故障轉移時,salve會 申請成為master。有時slave會和master失聯很久導致數據較舊,這樣的slave不應該成為master。這個配置用來判斷slave是否和master失聯時間過長
cluster-require-full-coverage yes:如果任何一個節點故障了,并且沒有設置從節點,導致槽不完整了,還能否接受客戶端的請求,此配置是要求有完整的槽才能接受請求,因此設置為yes
(3) 配置過程:
設置配置文件,啟用集群功能;
啟動redis后為每個節點分配slots;
CLUSTER ADDSLOTS
注意:每個slot要獨立創建;
設定集群成員關系;
CLUSTE MEET
(4)測試
三個主機不是主從關系
關掉redis-sentinel
在172.18.254.242上
vim /etc/redis.conf
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-require-full-coverage yes
cluster-node-timeout 15000
配置完成
(5)在172.18.254.242上
分配給每個節點槽點
echo [16384/3]
5461
echo [5461*2]
10922
redis-cli -a magedu cluster addlots {0..5461}
redis-cli -a magedu -h 172.18.250.89 cluster addlots {5462..10922}
redis-cli -a magedu -h 172.18.250.223 cluster asslots {10923..16383}
(6)完成集群會面
redis-cli -a magedu -h 172.18.254.242
cluster meet 172.18.250.89 6379
cluster meet 172.18.250.223 6379
使用cluster info 來查看結果
顯示槽位為16384
(7)設置鍵值
在172.18.254.242上
redis-cli -a magedu
set hellokey "hi,friends"
get kellokey
顯示 “hi,friend”
set mykey "hi,yourfriends"
提示用戶要在172.18.250.89的節點上操作,所以在172.18.250.89的主機上
redis-cli -a magedu
set mykey "hi,yourfriends"
顯示ok
set whoeverkey "no,who are you"
提示用戶要在172.18.250.223的主機上執行該操作
所以在172.18.250.223上
redis-cli -a magedu
set whoeverkey "no,who are you"
顯示ok
這就實現了redis的集群復制