数据库应用——Redis详解
???????????????????????????????????????????????????????????????????????????????????? Redis詳解
一、非關(guān)系型數(shù)據(jù)庫(kù)簡(jiǎn)介
1、NoSQL(NoSQL=NotOnlySQL),意思是“不僅僅是 SQL”,是非關(guān)系型數(shù)據(jù)庫(kù)的總稱
2、為什么需要NoSQL
(1)High performance:高并發(fā)讀寫
(2)Huge Storage:海量數(shù)據(jù)的高效率存儲(chǔ)和訪問
(3)High Scalability && High Availability:高可擴(kuò)展性和高可用性
3、NoSQL數(shù)據(jù)庫(kù)的四大分類
(1)鍵值存儲(chǔ)(key-value)
(2)列存儲(chǔ)
(3)文檔數(shù)據(jù)庫(kù)
(4)圖形數(shù)據(jù)庫(kù)
二、Redis概述
1、用C語言編寫的,高性能key-walue鍵值對(duì)數(shù)據(jù)庫(kù)
2、支持鍵值數(shù)據(jù)類型:
(1)字符串類型:string
(2)散列類型:hash
(3)列表類型:list
(4)集合類型:set
(5)有序集合類型:zset
3、應(yīng)用場(chǎng)景
(1)緩存
(2)任務(wù)隊(duì)列(秒殺搶購(gòu)等)
(3)網(wǎng)站訪問統(tǒng)計(jì)
(4)數(shù)據(jù)過期處理(可精確到毫秒)
(5)應(yīng)用排行榜
(6)分布式集群架構(gòu)中的session分離
?
三、Redis安裝
1、編譯:make
2、安裝:make PREFIX=/usr/local/redis install
3、交互式安裝腳本:/安裝包/utils/install_server.sh
?? ?需輸入redis_server目錄:/usr/local/redis/bin/redis_server
4、bin文件
(1)Redis-benchmark:性能測(cè)試工具,可以在自己本地運(yùn)行,看看自己本地性能如何(服務(wù)啟動(dòng)起來后執(zhí)行)
(2)Redis-check-aof:修復(fù)有問題的AOF文件,持久化
(3)redis-check-rdb:修復(fù)有問題的dump.rdb文件
(4)Redis-sentinel:Redis集群使用,哨兵
(5)redis-server:Redis服務(wù)器啟動(dòng)命令
(6)redis-cli:客戶端,操作入口
四、Redis基本操作
1、連接
?? ?redis-cli -h 127.0.0.1 -p 6379 -a password
2、查看命令的幫助
?? ?help
3、數(shù)據(jù)庫(kù)常用命令操作
(1)set:存放數(shù)據(jù)
(2)keys:獲取符合規(guī)則的鍵值列表
(3)exists:判斷鍵值是否存在
??????? exists key:確認(rèn)一個(gè)key是否存在
(4)type:獲取 key 對(duì)應(yīng)的 value 值類型
(5)rename:對(duì)已有 key 進(jìn)行重命名(強(qiáng)制覆蓋)
(6)renamenx:對(duì)已有 key 進(jìn)行重命名,并檢測(cè)新名是否存在。
(7)dbsize:查看當(dāng)前數(shù)據(jù)庫(kù)中 key 的數(shù)目
(8)set key value:設(shè)置key和value
(9)get key:獲取key的value
(10)del key:刪除一個(gè)key
(11)type key:返回值的類
(12)keys pattern:返回滿足給定pattern的所有key
(13)random key:隨機(jī)返回key空間的一個(gè)key
(14)rename oldname newname:重命名
(15)select index:選擇第0~15中的庫(kù)
(16)move key dbindex:移動(dòng)當(dāng)前數(shù)據(jù)庫(kù)中的key到dbindex數(shù)據(jù)庫(kù)
(17)FLUSHDB:清除當(dāng)前庫(kù)數(shù)據(jù)(危險(xiǎn)命令)
(18)FLUSHALL:清除所有庫(kù)數(shù)據(jù)(危險(xiǎn)命令)
?
五、Redis事務(wù)
1、事務(wù)簡(jiǎn)介
?? ?事務(wù)提供了一種將多個(gè)命令請(qǐng)求打包,然后一次性、按順序地執(zhí)行多個(gè)命令的機(jī)制,并且在事務(wù)執(zhí)行期間,服務(wù)器不會(huì)中斷事務(wù)而去執(zhí)行其他客戶端命令。可以一次執(zhí)行多個(gè)命令,本質(zhì)是一組命令的集合。
2、Redis事務(wù)特點(diǎn)
(1)事務(wù)中的命令序列執(zhí)行的時(shí)候是原子性的,也就是說,其不會(huì)被其他客戶端的命令中斷. 這和傳統(tǒng)的數(shù)據(jù)庫(kù)的事務(wù)的屬性是類似的.
(2)Redis事務(wù)中的命令序列是原子執(zhí)行的, 但是事務(wù)中的命令序列執(zhí)行可以部分成功,
(3)不支持傳統(tǒng)數(shù)據(jù)庫(kù)中的回滾操作
(4)redis事務(wù)只保證講命令序列中操作的結(jié)果提交到內(nèi)存中,不一定永久保存,但傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)事務(wù)完成,數(shù)據(jù)永久存儲(chǔ)
3、事務(wù)創(chuàng)建
(1)multi:事務(wù)開始
(2)exec:提交事務(wù)
(3)discard:結(jié)束事務(wù)
(4)watch:執(zhí)行樂觀鎖(2.2版本以上) ?
(5)unwatch:取消樂觀鎖
4、事務(wù)實(shí)例
5、錯(cuò)誤處理
(1)入隊(duì)錯(cuò)誤
如果一個(gè)事務(wù)在入隊(duì)命令的過程中,出現(xiàn)了命令不存在,或者命令的格式不正確等情況入列時(shí)錯(cuò)誤,會(huì)終止整個(gè)事務(wù)
(2)執(zhí)行錯(cuò)誤
執(zhí)行錯(cuò)誤通常都是一些不能在入隊(duì)時(shí)被服務(wù)器發(fā)現(xiàn)的錯(cuò)誤, 這些錯(cuò)誤只會(huì)在命令實(shí)際執(zhí)行時(shí)被觸發(fā)。即使在事務(wù)的執(zhí)行過程中發(fā)生了錯(cuò)誤, 服務(wù)器也不會(huì)中斷事務(wù)的執(zhí)行, 它會(huì)繼續(xù)執(zhí)行事務(wù)中余下的其他命令, 并且已執(zhí)行的命令(包括執(zhí)行命令所產(chǎn)生的結(jié)果)不會(huì)被出錯(cuò)的命令影響
?
六、Redis數(shù)據(jù)持久化
1、持久化使用方式
(1)RDB持久化
在指定時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入指定磁盤
(2)AOF持久化
將以日志形式記錄服務(wù)器的每個(gè)操作,在啟動(dòng)時(shí)會(huì)讀取該文件來寫入數(shù)據(jù)庫(kù)
(3)無持久化
僅做緩存服務(wù)器使用
(4)同時(shí)使用RDB和AOF
2、RDB持久化
(1)優(yōu)勢(shì)
①只包含一個(gè)文件,對(duì)于壓縮備份來說很容易
②性能最大化
③如果數(shù)據(jù)集很大,啟動(dòng)效率會(huì)更高
(2)劣勢(shì)
①定時(shí)寫入機(jī)制有更大的數(shù)據(jù)丟失風(fēng)險(xiǎn)
②由于 RDB 是通過 fork 子進(jìn)程來協(xié)助完成數(shù)據(jù)持久化工作的,因此當(dāng)數(shù)據(jù)集較大時(shí),可 能會(huì)導(dǎo)致整個(gè)服務(wù)器停止服務(wù)幾百毫秒,甚至是 1 秒鐘
(3)配置
①save 900 1:每900秒至少一個(gè)變化
②save 300 10:每300秒至少10個(gè)變化
③sanve 60 10000:每60秒至少10000個(gè)變化
④dbfilename dump.rdb:保存的文件名
⑤dir ./:保存路徑
⑥r(nóng)dbcompression yes:是否壓縮
⑦rdbchecksum yes:導(dǎo)入時(shí)是否檢查
⑧stop-writes-on-bgsave-error yes:入股持久化出錯(cuò),主進(jìn)程是否停止寫入
(4)手動(dòng)持久化
①save:會(huì)阻塞當(dāng)前Redis服務(wù)器,直到持久化完成,線上應(yīng)該禁止使用
②bgsave:該觸發(fā)方式會(huì)fork一個(gè)子進(jìn)程,由子進(jìn)程負(fù)責(zé)持久化過程,因此阻塞只會(huì)發(fā)生在fork子進(jìn)程的時(shí)候
3、AOF持久化
(1)優(yōu)勢(shì)
①更高的數(shù)據(jù)安全性
總共3種同步策略:每秒同步、每次修改同步和不同步
②采用追加方式寫入日志文件,寫入過程宕機(jī)不會(huì)導(dǎo)致之前數(shù)據(jù)出問題,redis-check-aof工具來解決數(shù)據(jù)一致性的問題
③如果日志過大,Redis 可以自動(dòng)啟用 rewrite 機(jī)制
④包含格式清晰已于理解的日志文件用于記錄所有操作,也可根據(jù)該文件完成數(shù)據(jù)重建
(2)劣勢(shì)
①對(duì)于相同數(shù)量的數(shù)據(jù)集而言,AOF 文件通常要大于 RDB 文件
②AOF機(jī)制 每次發(fā)生的數(shù)據(jù)變化都會(huì)被立即記錄到磁盤中,這種方式在效率上是最低的
③恢復(fù)大數(shù)據(jù)集時(shí),速度較低
(3)配置
①appendonly yes:是否開啟AOF
②appendfilename "appendonly.aof":默認(rèn)文件名
③appendfsync everysec:每秒同步
④appendfsync always:每條命令同步
⑤appendfsync no:不處理
?
七、Redis備份與恢復(fù)
1、數(shù)據(jù)備份
(1)AOF持久化
(2)RDP持久化
(3)SAVE命令
2、數(shù)據(jù)恢復(fù)
(1)獲取備份目錄:config get dir
(2)停止redis服務(wù)
(3)拷貝備份文件到指定目錄
(4)重啟服務(wù)
八、Redis性能管理
1、如何查看redis性能
?? ?nfo命令輸出的數(shù)據(jù)可以分為10個(gè)分類,分別是:
?? ?server,clients,memory,persistence,stats,replication,cpu,commandstats,cluster,keyspace
2、內(nèi)存memory
used_memory:由 Redis 分配器分配的內(nèi)存總量,以字節(jié)(byte)為單位
used_memory_human:以人類可讀的格式返回 Redis 分配的內(nèi)存總量
used_memory_rss:從操作系統(tǒng)的角度,返回 Redis 已分配的內(nèi)存總量(俗稱常駐集大小)。這個(gè)值和 top 、 ps等命令的輸出一致。
used_memory_rss_human:以人類可讀的格式,從操作系統(tǒng)的角度,返回 Redis 已分配的內(nèi)存總量(俗稱常駐集大小)。這個(gè)值和 top 、 ps等命令的輸出一致。
used_memory_peak:redis的內(nèi)存消耗峰值(以字節(jié)為單位)
used_memory_peak_human:以人類可讀的格式返回redis的內(nèi)存消耗峰值
used_memory_peak_perc:(used_memory/ used_memory_peak) *100%
used_memory_overhead:Redis為了維護(hù)數(shù)據(jù)集的內(nèi)部機(jī)制所需的內(nèi)存開銷,包括所有客戶端輸出緩沖區(qū)、查詢緩沖區(qū)、AOF重寫緩沖區(qū)和主從復(fù)制的backlog。
used_memory_startup:Redis服務(wù)器啟動(dòng)時(shí)消耗的內(nèi)存
used_memory_dataset:used_memory—used_memory_overhead
used_memory_dataset_perc:100%*(used_memory_dataset/(used_memory—used_memory_startup))
total_system_memory:整個(gè)系統(tǒng)內(nèi)存
total_system_memory_human:以人類可讀的格式,顯示整個(gè)系統(tǒng)內(nèi)存
used_memory_lua:Lua腳本存儲(chǔ)占用的內(nèi)存
used_memory_lua_human:以人類可讀的格式,顯示Lua腳本存儲(chǔ)占用的內(nèi)存
maxmemory:Redis實(shí)例的最大內(nèi)存配置
maxmemory_human:以人類可讀的格式,顯示Redis實(shí)例的最大內(nèi)存配置
maxmemory_policy:當(dāng)達(dá)到maxmemory時(shí)的淘汰策略
mem_fragmentation_ratio:used_memory_rss/ used_memory,內(nèi)存碎片率
mem_allocator:內(nèi)存分配器
active_defrag_running:表示沒有活動(dòng)的defrag任務(wù)正在運(yùn)行,1表示有活動(dòng)的defrag任務(wù)正在運(yùn)行(defrag:表示內(nèi)存碎片整理
3、因內(nèi)存交換引起的性能問題
?? ?內(nèi)存使用率是Redis服務(wù)最關(guān)鍵的一部分。如果Redis實(shí)例的內(nèi)存使用率超過可用最大內(nèi)存 (used_memory > 可用最大內(nèi)存),那么操作系統(tǒng)開始進(jìn)行內(nèi)存與swap空間交換,把內(nèi)存中舊的或不再使用的內(nèi)容寫入硬盤上(硬盤上的這塊空間叫Swap分區(qū)),以便留出新的物理內(nèi)存給新頁(yè)或活動(dòng)頁(yè)(page)使用。
?? ?如果Redis進(jìn)程上發(fā)生內(nèi)存交換,那么Redis和依賴Redis上數(shù)據(jù)的應(yīng)用會(huì)受到嚴(yán)重的性能影響。 通過查看used_memory指標(biāo)可知道Redis正在使用的內(nèi)存情況,如果used_memory>可用最大內(nèi)存,那就說明Redis實(shí)例正在進(jìn)行內(nèi)存交換或者已經(jīng)內(nèi)存交換完畢。
4、跟蹤內(nèi)存使用率
?? ?若是在使用Redis期間沒有開啟rdb快照或aof持久化策略,那么緩存數(shù)據(jù)在Redis崩潰時(shí)就有丟失的危險(xiǎn)。因?yàn)楫?dāng)Redis內(nèi)存使用率超過可用內(nèi)存的95%時(shí),部分?jǐn)?shù)據(jù)開始在內(nèi)存與swap空間來回交換,這時(shí)就可能有丟失數(shù)據(jù)的危險(xiǎn)。
?? ?通過減少Redis的內(nèi)存占用率,來避免這樣的問題,或者使用下面的技巧來避免內(nèi)存交換發(fā)生:
(1)假如緩存數(shù)據(jù)小于4GB,就使用32位的Redis實(shí)例。因?yàn)?2位實(shí)例上的指針大小只有64位的一半,它的內(nèi)存空間占用空間會(huì)更少些。 這有一個(gè)壞處就是,假設(shè)物理內(nèi)存超過4GB,那么32位實(shí)例能使用的內(nèi)存仍然會(huì)被限制在4GB以下。 要是實(shí)例同時(shí)也共享給其他一些應(yīng)用使用的話,那可能需要更高效的64位Redis實(shí)例,這種情況下切換到32位是不可取的。 不管使用哪種方式,Redis的dump文件在32位和64位之間是互相兼容的, 因此倘若有減少占用內(nèi)存空間的需求,可以嘗試先使用32位,后面再切換到64位上。
(2)盡可能的使用Hash數(shù)據(jù)結(jié)構(gòu)。因?yàn)镽edis在儲(chǔ)存小于100個(gè)字段的Hash結(jié)構(gòu)上,其存儲(chǔ)效率是非常高的。所以在不需要集合(set)操作或list的push/pop操作的時(shí)候,盡可能的使用Hash結(jié)構(gòu)。比如,在一個(gè)web應(yīng)用程序中,需要存儲(chǔ)一個(gè)對(duì)象表示用戶信息,使用單個(gè)key表示一個(gè)用戶,其每個(gè)屬性存儲(chǔ)在Hash的字段里,這樣要比給每個(gè)屬性單獨(dú)設(shè)置一個(gè)key-value要高效的多。 通常情況下倘若有數(shù)據(jù)使用string結(jié)構(gòu),用多個(gè)key存儲(chǔ)時(shí),那么應(yīng)該轉(zhuǎn)換成單key多字段的Hash結(jié)構(gòu)。 如上述例子中介紹的Hash結(jié)構(gòu)應(yīng)包含,單個(gè)對(duì)象的屬性或者單個(gè)用戶各種各樣的資料。Hash結(jié)構(gòu)的操作命令是HSET(key, fields, value)和HGET(key, field),使用它可以存儲(chǔ)或從Hash中取出指定的字段。
(3)設(shè)置key的過期時(shí)間。一個(gè)減少內(nèi)存使用率的簡(jiǎn)單方法就是,每當(dāng)存儲(chǔ)對(duì)象時(shí)確保設(shè)置key的過期時(shí)間。倘若key在明確的時(shí)間周期內(nèi)使用或者舊key不大可能被使用時(shí),就可以用Redis過期時(shí)間命令(expire,expireat, pexpire, pexpireat)去設(shè)置過期時(shí)間,這樣Redis會(huì)在key過期時(shí)自動(dòng)刪除key。 假如你知道每秒鐘有多少個(gè)新key-value被創(chuàng)建,那可以調(diào)整key的存活時(shí)間,并指定閥值去限制Redis使用的最大內(nèi)存。
(4)回收key。在Redis配置文件中(一般叫Redis.conf),通過設(shè)置“maxmemory”屬性的值可以限制Redis最大使用的內(nèi)存,修改后重啟實(shí)例生效。 也可以使用客戶端命令config set maxmemory 去修改值,這個(gè)命令是立即生效的,但會(huì)在重啟后會(huì)失效,需要使用config rewrite命令去刷新配置文件。 若是啟用了Redis快照功能,應(yīng)該設(shè)置“maxmemory”值為系統(tǒng)可使用內(nèi)存的45%,因?yàn)榭煺諘r(shí)需要一倍的內(nèi)存來復(fù)制整個(gè)數(shù)據(jù)集,也就是說如果當(dāng)前已使用45%,在快照期間會(huì)變成95%(45%+45%+5%),其中5%是預(yù)留給其他的開銷。 如果沒開啟快照功能,maxmemory最高能設(shè)置為系統(tǒng)可用內(nèi)存的95%
①volatile-lru:使用LRU算法從已設(shè)置過期時(shí)間的數(shù)據(jù)集合中淘汰數(shù)據(jù)
②volatile-ttl:從已設(shè)置過期時(shí)間的數(shù)據(jù)集合中挑選即將過期的數(shù)據(jù)淘汰。
③volatile-random:從已設(shè)置過期時(shí)間的數(shù)據(jù)集合中隨機(jī)挑選數(shù)據(jù)淘汰。
④allkeys-lru:使用LRU算法從所有數(shù)據(jù)集合中淘汰數(shù)據(jù)。
⑤allkeys-random:從數(shù)據(jù)集合中任意選擇數(shù)據(jù)淘汰
⑥no-enviction:禁止淘汰數(shù)據(jù)。
?
九、redis安全管理
Redis被設(shè)計(jì)成僅有可信環(huán)境下的可信用戶才可以訪問。這意味著將Redis實(shí)例直接暴露在網(wǎng)絡(luò)上或者讓不可信用戶可以直接訪問Redis的tcp端口或Unix套接字,是不安全的。
1、網(wǎng)絡(luò)安全
?? ?bind 127.0.0.1:將Redis綁定在單個(gè)接口上
?? ?port 8888:修改Redis默認(rèn)端口
2、認(rèn)證特性
?? ?雖然Redis沒有嘗試去實(shí)現(xiàn)訪問控制,但是提供了一個(gè)輕量級(jí)的認(rèn)證方式,可以編輯redis.conf文件來啟用。
?? ?當(dāng)認(rèn)證授權(quán)方式啟用后,Redis將會(huì)拒絕來自沒有認(rèn)證的用戶的任何查詢。一個(gè)客戶端可以通過發(fā)送AUTH命令并帶上密碼來給自己授權(quán)。
(1)初始化redis密碼
在配置文件中有個(gè)參數(shù): requirepass? 這個(gè)就是配置redis訪問密碼的參數(shù)。(生成加密密碼:echo "qwertyuiopasdfghjklzxcvbnm" | sha256sum)
(2)使用密碼登陸redis
登陸時(shí)使用 -a選項(xiàng)加密碼
登陸到redis上使用auth 進(jìn)行密碼驗(yàn)證:
①config get requirepass:查詢密碼
②config set requirepass 密碼字符串:設(shè)置密碼
3、限制Redis文件目錄訪問權(quán)限
?? ?設(shè)置redis的主目錄權(quán)限為700;如果redis配置文件獨(dú)立于redis主目錄,權(quán)限修改為600。
?? ?對(duì)配置文件設(shè)置特殊權(quán)限 文件權(quán)限除了r、w、x外還有s、t、i、a權(quán)限
4、禁止使用root啟動(dòng)redis
?? ?為Redis服務(wù)創(chuàng)建單獨(dú)的用戶和相應(yīng)目錄
5、禁用或重命名危險(xiǎn)命令
?? ?rename-command FLUSHDB zhangsan:重命名FLUSHDB命令
?? ?rename-command FLUSHALL “”:禁用FLUSHALL命令
6、配置防火墻限制客戶端登錄
7、redis-cli監(jiān)控命令
(1)info命令是redis基本監(jiān)控
(2)查看和殺掉客戶端連接
?? ?CLIENT LIST
?? ?CLIENT KILL 127.0.0.1:58322
(3)stat命令:顯示key數(shù)量、內(nèi)存、客戶端數(shù)量、QPS情況
?? ?redis-cli --stat
(4)查看redis延遲
?? ?redis-cli --latency
(5)monitor命令會(huì)監(jiān)控當(dāng)前redis接受的命令和數(shù)據(jù)內(nèi)容,這個(gè)命令會(huì)比較消耗資源,根據(jù)官網(wǎng)的測(cè)試,QPS會(huì)下降到原先的50%,需要謹(jǐn)慎使用
?? ?redis-cli monitor
(6)使用bigkeys查找占用空間較大的key
?? ?redis-cli --bigkeys
十、Redis主從復(fù)制
1、復(fù)制原理
(1)Slave啟動(dòng)成功連接到master后會(huì)發(fā)送一個(gè)sync命令;
(2)Master接到命令啟動(dòng)后的存盤進(jìn)程,同時(shí)收集所有接收到的用于修改數(shù)據(jù)集命令,在后臺(tái)進(jìn)程執(zhí)行完畢之后,master將傳送整個(gè)數(shù)據(jù)文件到slave,以完成一次完全同步;
(3)全量復(fù)制:而slave服務(wù)在數(shù)據(jù)庫(kù)文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中;
(4)增量復(fù)制:Master繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步;
(5)但是只要是重新連接master,一次完全同步(全量復(fù)制)將被自動(dòng)執(zhí)行|
2、配置
(1)配從不配主
(2)從庫(kù)配置:slaveof [主庫(kù)IP] [主庫(kù)端口];
(3)多實(shí)例配置文件細(xì)節(jié)操作
①修改端口:port 6379
②開啟daemonize yes
③pidfile:指定pid文件
④logfile:指定log文件
⑤dbfilename:指定dump.rdb文件
(4)常用主從復(fù)制模式
①一主二仆
?? ?一個(gè)Master,兩個(gè)Slave,Slave只能讀不能寫;當(dāng)Slave與Master斷開后需要重新slave of連接才可建立之前的主從關(guān)系;Master掛掉后,Master關(guān)系依然存在,Master重啟即可恢復(fù)
②薪火相傳
?? ?上一個(gè)Slave可以是下一個(gè)Slave的Master,Slave同樣可以接收其他slaves的連接和同步請(qǐng)求,那么該slave作為了鏈條中下一個(gè)slave的Master,如此可以有效減輕Master的寫壓力。如果slave中途變更轉(zhuǎn)向,會(huì)清除之前的數(shù)據(jù),重新建立最新的
③反客為主
?? ?當(dāng)Master掛掉后,Slave可鍵入命令 slaveof no one使當(dāng)前redis停止與其他Master redis數(shù)據(jù)同步,轉(zhuǎn)成Master redis
(5)反客為主的自動(dòng)版,能夠后臺(tái)監(jiān)控Master庫(kù)是否故障,如果故障了根據(jù)投票數(shù)自動(dòng)將slave庫(kù)轉(zhuǎn)換為主庫(kù)。該模式需要使用到redis哨兵
十一、Redis哨兵
1、為什么要使用哨兵
?? ?哨兵(Sentinel)主要是為了解決在主從復(fù)制架構(gòu)中出現(xiàn)宕機(jī)的情況,主要分為兩種情況:
(1)從Redis宕機(jī)
?? ?這個(gè)相對(duì)而言比較簡(jiǎn)單,在Redis中從庫(kù)重新啟動(dòng)后會(huì)自動(dòng)加入到主從架構(gòu)中,自動(dòng)完成同步數(shù)據(jù)。在Redis2.8版本后,主從斷線后恢復(fù)的情況下實(shí)現(xiàn)增量復(fù)制。
(2)主Redis宕機(jī)
?? ?這個(gè)相對(duì)而言就會(huì)復(fù)雜一些,需要以下2步才能完成:
??? ①在從數(shù)據(jù)庫(kù)中執(zhí)行SLAVEOF NO ONE命令,斷開主從關(guān)系并且提升為主庫(kù)繼續(xù)服務(wù)
??? ②將主庫(kù)重新啟動(dòng)后,執(zhí)行SLAVEOF命令,將其設(shè)置為其他庫(kù)的從庫(kù),這時(shí)數(shù)據(jù)就能更新回來
2、Redis實(shí)現(xiàn)的sentinel哨兵機(jī)制
(1)監(jiān)控(Monitoring):
?? ?Sentinel會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)作正常
(2)提醒(Notification):
?? ?當(dāng)被監(jiān)控的某個(gè)Redis服務(wù)器出現(xiàn)問題時(shí),Sentinel可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知
(3)自動(dòng)故障遷移(Automatic failover):
?? ?當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí),Sentinel 會(huì)開始一次自動(dòng)故障遷移操作,它會(huì)將失效主服務(wù)器的其中一個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器,并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器;當(dāng)客戶端試圖連接失效的主服務(wù)器時(shí),集群也會(huì)向客戶端返回新主服務(wù)器的地址,使得集群可以使用新主服務(wù)器代替失效服務(wù)器
3、哨兵配置
(1)在Master對(duì)應(yīng)redis.conf同目錄下新建sentinel.conf文件,名字絕對(duì)不能錯(cuò)
(2)在sentinel.conf文件中填入內(nèi)容:
①sentinel monitor 被監(jiān)控?cái)?shù)據(jù)庫(kù)名字(自己起名字) ip port 1
?? ?說明:上面最后一個(gè)數(shù)字1,表示主機(jī)掛掉后slave投票看讓誰接替成為主機(jī),得票數(shù)多少后成為主機(jī)
②sentinel down-after-milliseconds mymaster 30000
?? ?指定了 Sentinel 認(rèn)為master已經(jīng)斷線所需的毫秒數(shù)
③sentinel parallel-syncs mymaster 1
?? ?指定了在執(zhí)行故障轉(zhuǎn)移時(shí), 最多可以有多少個(gè)slave同時(shí)對(duì)新的master進(jìn)行同步, 這個(gè)數(shù)字越小, 完成故障轉(zhuǎn)移所需的時(shí)間就越長(zhǎng)
④sentinel failover-timeout mymaster 180000
?? ?failover-timeout 指定故障切換允許的毫秒數(shù),超過這個(gè)時(shí)間,就認(rèn)為故障切換失敗,默認(rèn)為3分鐘
(3)啟動(dòng)sentinel
?? ?redis-sentinel /etc/redis/sentinel.conf
(4)查看狀態(tài)
?? ?info sentinel
十二、Redis集群-cluster
1、clushter簡(jiǎn)介
?? ?cluster是sentinel和主從模式的結(jié)合體,通過cluster可以實(shí)現(xiàn)主從和master重選功能,所以如果配置兩個(gè)副本三個(gè)分片的話,就需要六個(gè)Redis實(shí)例。因?yàn)镽edis的數(shù)據(jù)是根據(jù)一定規(guī)則分配到cluster的不同機(jī)器的,當(dāng)數(shù)據(jù)量過大時(shí),可以新增機(jī)器進(jìn)行擴(kuò)容。
?? ?Redis 集群實(shí)現(xiàn)了對(duì)Redis的水平擴(kuò)容,即啟動(dòng)N個(gè)redis節(jié)點(diǎn),將整個(gè)數(shù)據(jù)庫(kù)分布存儲(chǔ)在這N個(gè)節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)存儲(chǔ)總數(shù)據(jù)的1/N
2、cluster特點(diǎn)
(1)多個(gè)redis節(jié)點(diǎn)網(wǎng)絡(luò)互聯(lián),數(shù)據(jù)共享
(2)所有的節(jié)點(diǎn)都是一主一從(也可以是一主多從),其中從不提供服務(wù),僅作為備用
(3)不支持同時(shí)處理多個(gè)key(如MSET/MGET),因?yàn)閞edis需要把key均勻分布在各個(gè)節(jié)點(diǎn)上,并發(fā)量很高的情況下同時(shí)創(chuàng)建key-value會(huì)降低性能并導(dǎo)致不可預(yù)測(cè)的行為
(4)支持在線增加、刪除節(jié)點(diǎn)
(5)客戶端可以連接任何一個(gè)主節(jié)點(diǎn)進(jìn)行讀寫
3、集群配置
(1)制作6個(gè)實(shí)例,6379,6380,6381,6382,6383,6384.conf,并啟動(dòng)
?? ?cluster-enabled? yes:開啟集群
?? ?cluster-config-file nodes-6379.conf:集群的配置? 配置文件首次啟動(dòng)自動(dòng)生成6380、6881、6382
?? ?cluster-node-timeout? 15000:設(shè)定節(jié)點(diǎn)失聯(lián)時(shí)間,超過該時(shí)間(毫秒),集群自動(dòng)進(jìn)行主從切換
?? ?appendonly? yes:aof日志開啟? 有需要就開啟,它會(huì)每次寫操作都記錄一條日志
(2)創(chuàng)建集群
①搭建ruby環(huán)境
??? 1)Redis 官方提供了 redis-trib.rb 這個(gè)工具,就在解壓目錄的 src 目錄中,第三步中已將它復(fù)制到 /usr/local/bin 目錄中
??? 2)如果redis版本比較低,則需要安裝ruby:yum -y install ruby ruby-devel rubygems rpm-build
??? 3)安裝redis集群接口:gem install redis
??? ??? a.yum install centos-release-scl-rh:會(huì)在/etc/yum.repos.d/目錄下多出一個(gè)CentOS-SCLo-scl-rh.repo源
??? ??? b.yum install rh-ruby23? -y
??? ??? c.scl enable rh-ruby23 bash:必要一步
??? ??? d.ruby -v:查看安裝版本
??? ??? e.gem install redis
②創(chuàng)建集群:
1)將六個(gè)節(jié)點(diǎn)合成一個(gè)集群(組合之前,請(qǐng)確保所有redis實(shí)例啟動(dòng)后,nodes-xxxx.conf文件都生成正常)
?? ?redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
2)哈希槽
?? ?Redis 集群的數(shù)據(jù)分片 Redis 集群沒有使用一致性hash, 而是引入了 哈希槽的概念
?? ?一個(gè) Redis 集群包含 16384 個(gè)插槽(hash slot), 數(shù)據(jù)庫(kù)中的每個(gè)鍵都屬于這 16384 個(gè)插槽的其中一個(gè), 集群使用公式 CRC16(key) % 16384 來計(jì)算鍵 key 屬于哪個(gè)槽, 其中 CRC16(key) 語句用于計(jì)算鍵 key 的 CRC16 校驗(yàn)和
?? ?集群的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分hash槽,舉個(gè)例子,比如當(dāng)前集群有3個(gè)主節(jié)點(diǎn),那么:
??? ??? a.節(jié)點(diǎn) A 包含 0 到 5500號(hào)哈希槽.
??? ??? b.節(jié)點(diǎn) B 包含5501 到 11000 號(hào)哈希槽.
??? ??? c.節(jié)點(diǎn) C 包含11001 到 16384號(hào)哈希槽.
③查看測(cè)試集群
?? ?登錄redis節(jié)點(diǎn),通過 cluster nodes 命令查看集群信息。一個(gè)集群至少要有三個(gè)主節(jié)點(diǎn)。選項(xiàng) --replicas 1 表示我們希望為集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建一個(gè)從節(jié)點(diǎn)。
④集群操作
1)登錄
redis-cli -c -h 192.168.30.128 -p 6382 -a 123456:-c,使用集群方式登錄
2)查看集群信息
CLUSTER INFO:集群狀態(tài)
3)列出節(jié)點(diǎn)信息
CLUSTER NODES:列出節(jié)點(diǎn)信息這里與nodes.conf文件內(nèi)容相同
4)寫入數(shù)據(jù)
set key111 aaa
5)redis cluster集群是去中心化的,每個(gè)節(jié)點(diǎn)都是平等的,連接哪個(gè)節(jié)點(diǎn)都可以獲取和設(shè)置數(shù)據(jù)。當(dāng)然,平等指的是master節(jié)點(diǎn),因?yàn)閟lave節(jié)點(diǎn)根本不提供服務(wù),只是作為對(duì)應(yīng)master節(jié)點(diǎn)的一個(gè)備份。
6)redis集群會(huì)將每個(gè)實(shí)例單獨(dú)啟用10000偏移的集群端口,設(shè)置防火墻時(shí)下需要同時(shí)開啟此端口
⑤新加節(jié)點(diǎn)
1)復(fù)制編輯新節(jié)點(diǎn)conf文件并啟動(dòng)實(shí)例
2)進(jìn)入集群將新節(jié)點(diǎn)加入集群
?? ?CLUSTER MEET 127.0.0.1 6386
?? ?所有新加節(jié)點(diǎn)都為master節(jié)點(diǎn)
3)更換節(jié)點(diǎn)身份:登錄想要作為slave節(jié)點(diǎn)的實(shí)例將該節(jié)點(diǎn)更換為指定節(jié)點(diǎn)的slave節(jié)點(diǎn)
?? ?redis-cli -c -h 127.0.0.1 -p 6386? cluster replicate 3b9fbde7d4ef507fc5982e42d13f483ce569b2f6
十三、php使用redis
1、安裝php的redis擴(kuò)展模塊
(1)https://github.com/phpredis/phpredis/releases
(2)解包后進(jìn)入目錄
(3)/usr/local/php5/bin/phpize(可能需要安裝autoconf)
(4)./configure --with-php-config=/usr/local/php5/bin/php-config
(5)make && make install
(6)php.ini中添加
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-zts-20121212/"
extension=redis.so
(7)重啟apache
十四、redis與mysql結(jié)合實(shí)現(xiàn)數(shù)據(jù)同步
多為開發(fā)人員使用,可參考以下文檔:
https://blog.csdn.net/hanchao5272/article/details/79729576
https://blog.csdn.net/qq_32217519/article/details/71191521
https://blog.51cto.com/4925054/1910483
總結(jié)
以上是生活随笔為你收集整理的数据库应用——Redis详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winxp iso镜像u盘安装
- 下一篇: Joomla模板安装需安装范例数据库