- NoSQL
- Redis基礎(chǔ)
- Redis配置文件基礎(chǔ)
- Redis的持久化
- Redis的復(fù)制
- Redis的集群
一、NoSQL
(一)基本概念
- NoSQL:Not Only SQL,非關(guān)系型、分布式、開源、水平可擴(kuò)展的數(shù)據(jù)庫
- 特性:數(shù)據(jù)量大、數(shù)據(jù)變化非??欤〝?shù)據(jù)增長快、流量分布變化大、數(shù)據(jù)間耦合結(jié)構(gòu)變化快)、數(shù)據(jù)源很多
(二)設(shè)計(jì)原則
(1)CAP理論:
- 一個(gè)分布式系統(tǒng)不可能同時(shí)滿足C、A、P三個(gè)特性,最多可同時(shí)滿足其中兩者;對于分布式系統(tǒng)滿足分區(qū)容錯(cuò)性幾乎是必須的
- C:Consistency,多個(gè)數(shù)據(jù)節(jié)點(diǎn)上的數(shù)據(jù)一致
- A:Availablity,用戶發(fā)出請求后的有限時(shí)間范圍內(nèi)返回結(jié)果
- P:Partition tolerence,網(wǎng)絡(luò)發(fā)生分區(qū)后(network partition),服務(wù)是否依然可用
(2)BASE:BA,S,E,基于CAP演化而來
- BA:Basically Available,基本可用
- S:Soft state,軟狀態(tài)/柔性事務(wù),即狀態(tài)可以在一個(gè)時(shí)間窗口內(nèi)是不同步的
- E:Eventually consistency,最終一致性
(三)分類和主流產(chǎn)品
- Key Value / Tuple Store:鍵值存儲,DynamoDB, redis
- Wide Column Store / Column Families:列式數(shù)據(jù)庫,hbase
- Document Store:文檔數(shù)據(jù)庫,mongodb, Elastic
- Graph Databases:圖式數(shù)據(jù)庫,Neo4j
- Time Series / Streaming Databases:時(shí)間序列存儲
二、Redis基礎(chǔ)
(一)簡介:
- 開源、內(nèi)存存儲、數(shù)據(jù)結(jié)構(gòu)存儲
- 可用作:數(shù)據(jù)庫、緩存、消息隊(duì)列
- 數(shù)據(jù)結(jié)構(gòu):字符串、列表(數(shù)組)、hashes(關(guān)聯(lián)數(shù)組)、集合、有序集合、bitmaps、hyperloglogs、空間索引
(二)程序環(huán)境:
- 配置文件:/etc/redis.conf
- 主程序:/usr/bin/redis-server
- 端口:6379/tcp
- 客戶端:/usr/bin/redis-cli
- Unit File:/usr/lib/systemd/system/redis.service
- 數(shù)據(jù)目錄:/var/lib/redis
(三)客戶端的基本操作
(1)K/V 數(shù)據(jù)結(jié)構(gòu)
- key:直接ASCII字符串;
- value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs
(2)radis-cli工具的使用
交互式界面:直接輸入radis-cli進(jìn)入
幫助:輸入HELP,按Tab鍵切換value類型
數(shù)據(jù)庫:只有0-15共16個(gè)數(shù)據(jù)庫,使用
SELECT #命令切換,默認(rèn)為0數(shù)據(jù)庫

- @string
SET:新增一條鍵值對
GET:查看鍵對應(yīng)的值
EXISTS
INCR:整數(shù)值自增1
DECR:整數(shù)值自減1
SETNX:只在沒有此鍵時(shí)添加鍵值對
SETEX:添加一條鍵值對并設(shè)定過期時(shí)間
INCRBYFLOAT:按給定數(shù)值增加整數(shù)值
MGET:查看多個(gè)鍵對應(yīng)的值
MSET:新增多條鍵值對
SET:新增,GET:查詢,APPEND:添加,STRLEN:長度

SETNX:不存在時(shí)新增,INCR:自增1,INCRBY count 2:自增2,DEL:刪除

- @list:數(shù)組
LPUSH:從左側(cè)新增鍵值對
RPUSH:從右側(cè)新增鍵值對
LPOP:從左側(cè)移除鍵值對
RPOP:從右側(cè)移除鍵值對
LPUSHX:僅當(dāng)list存在時(shí),從左側(cè)新增鍵值對
RPUSHX:僅當(dāng)list存在時(shí),從右側(cè)新增鍵值對
LRANGE:查看某個(gè)范圍
LINDEX:通過索引查看
LSET:通過list的索引修改元素的值
LPUSH:從左側(cè)添加,LINDEX weekdays 0:查看索引為0的元素值

LRANGE weekdays 0 4:查看索引0至4的元素值
LINSERT weekdays AFTER Tue Wed:在元素后Tue插入Wed

LPOP:左側(cè)移除,RPOP:右側(cè)移除,LLEN:list的長度

- @set:集合
SADD:集合中添加成員
SPOP:從集合中隨機(jī)刪除成員
SREM :從集合中刪除成員
SRANDMEMBER:隨機(jī)查看集合中的成員
SINTER:做交集
SUNION:做并集
SADD:添加成員,SMEMBERS:查看成員

SINTER:查看交集結(jié)果,SUNION:查看并集結(jié)果

SREM:刪除指定成員,SPOP:隨機(jī)刪除成員

- @sorted_set:有序集合
ZADD:從集合中添加成員,若存在則為更新成員的值
ZCARD:查看有序集合成員數(shù)
ZCOUNT:按照所賦予的值,輸出指定排序范圍的成員數(shù)
ZRANK:按照所賦予的值,輸出指定排序范圍的成員
ZADD:添加有序集合的成員,ZSCORE:查看成員所賦予的值

ZRANK:查看指定成員的排序,ZRANGE:查看指定排序范圍的成員,ZRANGEBYSCORE:查看指定排序范圍的成員

- @hash:關(guān)聯(lián)數(shù)組
HSET:新增包含一個(gè)鍵值對的關(guān)聯(lián)數(shù)組
HMSET:新增包含多個(gè)鍵值對的關(guān)聯(lián)數(shù)組
HGET:查看關(guān)聯(lián)數(shù)組的一個(gè)鍵值對
HMGET:查看關(guān)聯(lián)數(shù)組的多個(gè)鍵值對
HKEYS:查看關(guān)聯(lián)數(shù)組的所有鍵
HVALS:查看關(guān)聯(lián)數(shù)組的所有值
HDEL:刪除關(guān)聯(lián)數(shù)組的鍵值對
HGETALL:查看關(guān)聯(lián)數(shù)組的所有鍵和對應(yīng)的值
HMSET:在一個(gè)hash中創(chuàng)建多個(gè)鍵值對,HKEYS:查看鍵,HVALS:查看鍵對應(yīng)的值

HGETALL:查看hash的所有鍵值對,HDEL:刪除鍵值對

- @pubsub
PUBLISH:向頻道扇出一條信息
SUBSCRIBE:訂閱指定頻道
UNSUBSCRIBE:退訂指定頻道
PSUBSCRIBE:按pattern規(guī)則訂閱頻道
PUNSUBSCRIBE:按pattern規(guī)則退訂頻道
PUBLISH:扇出信息

SUBSCRIBE:訂閱并接受信息

@geo:空間索引
@server
Server相關(guān)的命令:
CLIENT GETNAME:查詢當(dāng)前連接名稱
CLIENT KILL:殺死客戶端的連接
CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
CLIENT LIST:列出客戶端連接
CLIENT PAUSE:暫停執(zhí)行客戶端指令一段時(shí)間
CLIENT PAUSE timeout
CLIENT REPLY:告訴服務(wù)器是否回應(yīng)指令
CLIENT SETNAME:設(shè)置當(dāng)前連接名稱
SHUTDOWN [NOSAVE|SAVE]:關(guān)閉服務(wù)器
CONFIG GET:查看配置參數(shù)
CONFIG RESETSTAT:重置配置參數(shù)
CONFIG REWRITE:將配置寫入配置文件,實(shí)現(xiàn)運(yùn)行時(shí)永久修改
CONFIG SET:設(shè)置配置參
數(shù)
INFO:INFO [section],服務(wù)器狀態(tài)信息查看,可分為多個(gè)secion查看
FLUSHDB:清空當(dāng)前數(shù)據(jù)庫
FLUSHALL:清空所有數(shù)據(jù)庫
CONFIG SET:實(shí)時(shí)修改配置

CONFIG REWRITE:配置文件中自動(dòng)生成相應(yīng)配置信息

INFO:服務(wù)器狀態(tài)信息

三、Redis配置文件基礎(chǔ)
配置文件分為如下章節(jié):
INCLUDES:包含其他配置文件的路徑
NETWORK:網(wǎng)絡(luò)配置項(xiàng)
GENERAL:基本配置項(xiàng)
SNAPSHOTTING:快照持久化相關(guān)配置
REPLICATION:復(fù)制相關(guān)配置
SECURITY:安全相關(guān)配置
LIMITS:限制相關(guān)的配置
SLOW LOG:慢日志相關(guān)的配置
ADVANCED CONFIG:高級配置通用配置項(xiàng):
daemonize on
supervised no
loglevel notice:日志級別
pidfile /var/run/redis/redis.pid:pid文件路徑
logfile /var/log/redis/redis.log:日志文件路徑
databases:設(shè)定數(shù)據(jù)庫數(shù)量,默認(rèn)為16個(gè),每個(gè)數(shù)據(jù)庫的名字均為整數(shù),從0開始編號,默認(rèn)操作的數(shù)據(jù)庫為0網(wǎng)絡(luò)配置項(xiàng):
bind IP:綁定IP
port PORT:監(jiān)聽端口
protected-mode yes:安全模式
tcp-backlog 511:后援隊(duì)列長度
unixsocket:socket文件路徑
timeout:連接的空閑超時(shí)時(shí)長安全配置:
requirepass <PASSWORD>
rename-command <COMMAND> <NEW_CMND_NAME>:修改命令名稱
在AOF或Replication環(huán)境中,不推薦使用
設(shè)置密碼后,在redis-cli中使用AUTH password命令驗(yàn)證密碼

-
Limits相關(guān)的配置:
maxclients 10000:并發(fā)客戶端連接數(shù)
maxmemory <bytes>:最大內(nèi)存使用容量,超出時(shí)按照maxmemory-policy設(shè)置的策略刪除鍵值
maxmemory-policy noeviction:淘汰策略volatile-lru:從接近過期時(shí)間的鍵值中采用LRU算法淘汰 allkeys-lru:從所有鍵值中采用LRU算法淘汰 volatile-random:從接近過期時(shí)間的鍵值中隨機(jī)淘汰 allkeys-random:從全部鍵值中隨機(jī)淘汰 volatile-ttl:從最接近過期時(shí)間的鍵值開始淘汰 noeviction:不刪除鍵值,寫操作直接報(bào)錯(cuò)maxmemory-samples 5: 淘汰算法運(yùn)行時(shí)的采樣樣本數(shù)
SlowLog相關(guān)的配置:
slowlog-log-slower-than 10000:超過多少時(shí)間被記錄進(jìn)慢查詢?nèi)罩荆瑔挝皇俏⒚?br> slowlog-max-len 128:慢查詢?nèi)罩咀畲髼l目Advanced配置:
hash-max-ziplist-entries 512:設(shè)置ziplist的鍵數(shù)量最大值
hash-max-ziplist-value 64:每個(gè)值的最大空間
client-output-buffer-limit normal 0 0 0:普通客戶端輸出緩沖限制
client-output-buffer-limit slave 256mb 64mb 60:從服務(wù)器客戶端輸出緩沖限制
client-output-buffer-limit pubsub 32mb 8mb 60:隊(duì)列客戶端輸出緩沖限制
三個(gè)值的說明:<hard-limit> <soft-limit> <soft-limit seconds>,一般情況不能超過<soft-limit>,任何情況絕對不能超過<hard-limit>,超過<soft-limit>的部分在<soft-limit seconds>的寬限期后將被刪除
四、Redis的持久化
(一)持久化的兩種方式
RDB:snapshotting,二進(jìn)制格式
按事先定制的策略,周期性地將數(shù)據(jù)從內(nèi)存同步至磁盤
數(shù)據(jù)文件默認(rèn)為dump.rdb
客戶端顯式使用SAVE或BGSAVE命令來手動(dòng)啟動(dòng)快照保存機(jī)制
SAVE:同步,即在主線程中保存快照,此時(shí)會阻塞所有客戶端請求
BGSAVE:異步,后臺執(zhí)行AOF:Append Only File, fsync
記錄每次寫操作至指定的文件尾部實(shí)現(xiàn)的持久化
當(dāng)redis重啟時(shí),可通過重新執(zhí)行文件中的命令在內(nèi)存中重建出數(shù)據(jù)庫
BGREWRITEAOF:AOF文件重寫,后臺執(zhí)行
不會讀取正在使用AOF文件,而是通過將內(nèi)存中的數(shù)據(jù)以命令的方式保存至臨時(shí)文件中,完成之后替換原來的AOF文件RDB模式效率更高,AOF模式時(shí)間精度更高
(二)RDB相關(guān)的配置:
-
save <seconds> <changes>
save 900 1 save 300 10 save 60 10000表示:三個(gè)策略滿足其中任意一個(gè)均會觸發(fā)SNAPSHOTTING操作,即:
900s內(nèi)至少有一個(gè)key有變化
300s內(nèi)至少有10個(gè)key有變化
60s內(nèi)至少有1W個(gè)key發(fā)生變化 stop-writes-on-bgsave-error yes
dump操作出現(xiàn)錯(cuò)誤時(shí),是否禁止新的寫入操作請求,默認(rèn)yesrdbcompression yes:復(fù)制時(shí)是否支持壓縮,默認(rèn)yes
rdbchecksum yes:復(fù)制時(shí)是否檢驗(yàn)完整性,默認(rèn)yes
dbfilename dump.rdb:指定rdb文件名
dir /var/lib/redis:rdb文件的存儲路徑
(三)AOF相關(guān)的配置
appendonly no:是否打開AOF模式,默認(rèn)no
appendfilename "appendonly.aof":指定rof文件名
appendfsync:AOF同步模式,支持三種模式
no:不執(zhí)行主動(dòng)同步操作,而是OS進(jìn)行
everysec:每秒一次
always:每語句一次no-appendfsync-on-rewrite no
是否在后臺執(zhí)行aof重寫期間不調(diào)用fsync,默認(rèn)為no,表示調(diào)用auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
上述兩個(gè)條件同時(shí)滿足時(shí),方會觸發(fā)重寫AOF,即
與上次aof文件大小相比,其增長量超過100%,且大小不少于64MBaof-load-truncated yes
(四)其他
注意:持久機(jī)制本身不能取代備份;應(yīng)該制訂備份策略,對redis庫定期備份;
RDB與AOF同時(shí)啟用:
BGSAVE和BGREWRITEAOF不會同時(shí)進(jìn)行
Redis服務(wù)器啟動(dòng)時(shí)用持久化的數(shù)據(jù)文件恢復(fù)數(shù)據(jù),會優(yōu)先使用AOF
五、Redis的復(fù)制
(一)特點(diǎn):
- 一個(gè)Master可以有多個(gè)Slave主機(jī),支持鏈?zhǔn)綇?fù)制
- Master以非阻塞方式同步數(shù)據(jù)至Slave主機(jī)
(二)方法一:配置slave節(jié)點(diǎn)
- redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>:指明主節(jié)點(diǎn)的IP和端口
- redis-cli> CONFIG SET masterauth <PASSWORD>:主節(jié)點(diǎn)密碼認(rèn)證
(三)方法二:配置參數(shù)
(1)必須配置的參數(shù)
- slaveof
- masterauth
(2)其他視情況配置的參數(shù)
slave-serve-stale-data yes:從節(jié)點(diǎn)是否使用過時(shí)的數(shù)據(jù)提供服務(wù),默認(rèn)yes
slave-read-only yes:從節(jié)點(diǎn)是否只讀,默認(rèn)yes
-
repl-diskless-sync no:是否使用無盤方式復(fù)制,由以下三種模式
no, Disk-backed, Diskless- 新的從節(jié)點(diǎn)或某較長時(shí)間未能與主節(jié)點(diǎn)進(jìn)行同步的從節(jié)點(diǎn)重新與主節(jié)點(diǎn)通信,需要做"full synchronization",此時(shí)其同步方式有兩種style:
- Disk-backend:主節(jié)點(diǎn)新創(chuàng)建快照文件于磁盤中,而后將其發(fā)送給從節(jié)點(diǎn)
- Diskless:主節(jié)點(diǎn)新創(chuàng)建快照后直接通過網(wǎng)絡(luò)套接字文件發(fā)送給從節(jié)點(diǎn)
repl-diskless-sync-delay 5
當(dāng)使用Diskless模式時(shí),為了實(shí)現(xiàn)并行復(fù)制,通常需要在復(fù)制啟動(dòng)前延遲一個(gè)時(shí)間段,默認(rèn)5srepl-ping-slave-period 10:從節(jié)點(diǎn)向主節(jié)點(diǎn)發(fā)送ping的間隔,默認(rèn)10s
repl-timeout 60:復(fù)制超時(shí)時(shí)間,默認(rèn)60s
repl-disable-tcp-nodelay no:是否禁用tcp延遲發(fā)送,默認(rèn)不禁用
repl-backlog-size 1mb:消息隊(duì)列長度
slave-priority 100
復(fù)制集群中,主節(jié)點(diǎn)故障時(shí),sentinel應(yīng)用場景中的主節(jié)點(diǎn)選舉時(shí)使用的優(yōu)先級
數(shù)字越小優(yōu)先級越高,但0表示不參與選舉min-slaves-to-write 3
主節(jié)點(diǎn)僅允許其能夠通信的從節(jié)點(diǎn)數(shù)量大于等于此處的值時(shí)接受寫操作min-slaves-max-lag 10
從節(jié)點(diǎn)延遲時(shí)長超出此處指定的時(shí)長時(shí),主節(jié)點(diǎn)會拒絕寫入操作
(四)實(shí)驗(yàn)1:實(shí)現(xiàn)Redis的復(fù)制
- 實(shí)驗(yàn)環(huán)境:
主節(jié)點(diǎn)IP:192.168.136.230
從節(jié)點(diǎn)1的IP:192.168.136.130
從節(jié)點(diǎn)2的IP:192.168.136.131
(1)編輯主從節(jié)點(diǎn)的配置文件,修改監(jiān)聽IP,配置密碼認(rèn)證
vim /etc/redis.conf
bind 0.0.0.0
requirepass centos
(2)編輯從節(jié)點(diǎn)1的配置文件
slaveof 192.168.136.230 6379 // 指向主節(jié)點(diǎn)的IP和端口
masterauth centos // 主節(jié)點(diǎn)的認(rèn)證密碼
(3)通過redis-cli命令配置從節(jié)點(diǎn)2的設(shè)置
redis-cli -h 192.168.136.131
192.168.136.131:6379> AUTH centos
192.168.136.131:6379> SLAVEOF 192.168.136.230 6379 // 指向主節(jié)點(diǎn)的IP和端口
192.168.136.131:6379> CONFIG SET masterauth centos // 主節(jié)點(diǎn)的認(rèn)證密碼
192.168.136.131:6379> CONFIG GET masterauth
192.168.136.131:6379> CONFIG GET slave-read-only
192.168.136.131:6379> CONFIG REWRITE // 寫入配置文件
(4)啟動(dòng)主次節(jié)點(diǎn)的服務(wù),測試配置
主節(jié)點(diǎn)上查看連接的從節(jié)點(diǎn):127.0.0.1:6379> CLIENT LIST

主節(jié)點(diǎn)查看Replication章節(jié)的信息,可以看到從節(jié)點(diǎn)的相關(guān)信息

從節(jié)點(diǎn)1查看Replication章節(jié)的信息,可以看到主節(jié)點(diǎn)IP和當(dāng)前連接狀態(tài)

從節(jié)點(diǎn)2查看Replication章節(jié)的信息,可以看到主節(jié)點(diǎn)IP和當(dāng)前連接狀態(tài)

主節(jié)點(diǎn)查看所有鍵

從節(jié)點(diǎn)1查看所有鍵,成功同步

從節(jié)點(diǎn)2查看所有鍵,成功同步

(五)sentinel
(1)sentinel簡介
- 主要完成三個(gè)功能:監(jiān)控、通知、自動(dòng)故障轉(zhuǎn)移
- 選舉:流言協(xié)議(向網(wǎng)絡(luò)內(nèi)多臺主機(jī)確認(rèn)主節(jié)點(diǎn)是否宕機(jī))、投票協(xié)議(少數(shù)服從多數(shù))
(2)配置項(xiàng)
配置文件:/etc/redis.conf
port 26379:默認(rèn)監(jiān)聽端口,26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
主節(jié)點(diǎn)IP和端口
<quorum>:表示sentinel集群的quorum機(jī)制,即至少有quorum個(gè)sentinel節(jié)點(diǎn)同時(shí)判定主節(jié)點(diǎn)故障時(shí),才認(rèn)為其是真的故障
s_down: subjectively down,主觀宕機(jī),單個(gè)sentinel服務(wù)器獨(dú)自判定主節(jié)點(diǎn)是否宕機(jī)
o_down: objectively down,客觀宕機(jī),多個(gè)sentinel服務(wù)器投票決定主節(jié)點(diǎn)是否宕機(jī)sentinel auth-pass <master-name> <password> :主節(jié)點(diǎn)認(rèn)證
sentinel down-after-milliseconds <master-name> <milliseconds>
監(jiān)控到指定的集群的主節(jié)點(diǎn)異常狀態(tài)持續(xù)多久方才將標(biāo)記為“故障”sentinel parallel-syncs <master-name> <numslaves>
指在failover過程中,能夠被sentinel并行配置的從節(jié)點(diǎn)的數(shù)量;sentinel failover-timeout <master-name> <milliseconds>
sentinel必須在此指定的時(shí)長內(nèi)完成故障轉(zhuǎn)移操作,否則,將視為故障轉(zhuǎn)移操作失敗sentinel notification-script <master-name> <script-path>
通知腳本,此腳本被自動(dòng)傳遞多個(gè)參數(shù)
(3)命令行選項(xiàng)
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
SENTINEL masters:查看主節(jié)點(diǎn)
SENTINEL slaves <MASTER_NAME>:查看指定主節(jié)點(diǎn)的從節(jié)點(diǎn)
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>
(六)實(shí)驗(yàn)2:實(shí)現(xiàn)sentinel監(jiān)控主機(jī)狀態(tài),當(dāng)主節(jié)點(diǎn)發(fā)生故障時(shí)自動(dòng)轉(zhuǎn)移
- 實(shí)驗(yàn)環(huán)境:
繼承實(shí)驗(yàn)1的主從節(jié)點(diǎn)環(huán)境,為減少實(shí)驗(yàn)系統(tǒng)開銷,主節(jié)點(diǎn)、從節(jié)點(diǎn)1、從節(jié)點(diǎn)2共三臺主機(jī)全部兼任sentinel服務(wù)器
根據(jù)quorum機(jī)制,只有大于過半數(shù)的節(jié)點(diǎn)認(rèn)定主節(jié)點(diǎn)宕機(jī)才會視作主機(jī)宕機(jī),故quorum值為2
(1)編輯三臺主機(jī)的sentinel配置文件
vim /etc/redis-sentinel.conf
bind 0.0.0.0
sentinel monitor mymaster 192.168.136.230 6379 2
sentinel auth-pass mymaster centos
sentinel down-after-milliseconds mymaster 30000
(2)啟動(dòng)redis-sentinel服務(wù),并測試
systemctl start redis-sentinel
登錄sentinel服務(wù)器
redis-cli -h 192.168.136.230 -p 26379
SENTINEL masters // 查詢主節(jié)點(diǎn)信息
SENTINEL slaves mymaster // 查詢從節(jié)點(diǎn)信息
SENTINEL masters,查詢主節(jié)點(diǎn)信息,當(dāng)前為192.168.136.230,符合預(yù)期

SENTINEL slaves mymaster,查詢從節(jié)點(diǎn)信息,當(dāng)前為192.168.136.130和192.168.136.131,符合預(yù)期


(3)關(guān)閉主節(jié)點(diǎn)的redis服務(wù),造成宕機(jī)狀況,測試故障轉(zhuǎn)移功能
systemctl stop redis // 192.168.136.230主機(jī)上操作
redis-cli -h 192.168.136.131 -p 26379
SENTINEL masters // 查詢主節(jié)點(diǎn)信息
SENTINEL slaves mymaster // 查詢從節(jié)點(diǎn)信息
192.168.136.130已經(jīng)變?yōu)橹鞴?jié)點(diǎn)

192.168.136.230已經(jīng)降為從節(jié)點(diǎn),由于宕機(jī)目前不可用

192.168.136.131仍舊保持從節(jié)點(diǎn)的身份

(4)修復(fù)主機(jī)192.168.136.230,并重新上線
vim /etc/redis.conf
slaveof 192.168.136.130 6379 // 設(shè)置為新的主節(jié)點(diǎn)IP
masterauth centos
systemctl start redis
成功上線

六、Redis的集群
(一)redis的集群技術(shù):
Twitter:twemproxy,Twitter已經(jīng)不再使用
豌豆莢:codis
原生:redis cluster
(二)redis cluster集群相關(guān)的配置:
- cluster-enabled
是否開啟集群配置 - cluster-config-file
集群節(jié)點(diǎn)集群信息配置文件,每個(gè)節(jié)點(diǎn)都有一個(gè),由redis生成和更新,配置時(shí)避免名稱沖突 - cluster-node-timeout
集群節(jié)點(diǎn)互連超時(shí)的閾值,單位毫秒 - cluster-slave-validity-factor
進(jìn)行故障轉(zhuǎn)移時(shí),salve會申請成為master。有時(shí)slave會和master失聯(lián)很久導(dǎo)致數(shù)據(jù)較舊,這樣的slave不應(yīng)該成為master。這個(gè)配置用來判斷slave是否和master失聯(lián)時(shí)間過長。
(三)實(shí)驗(yàn)3:實(shí)現(xiàn)redis集群
- 提示:注意關(guān)閉之前實(shí)驗(yàn)的sentinel服務(wù),將主從節(jié)點(diǎn)的相關(guān)配置恢復(fù),然后重啟redis服務(wù)
(1)設(shè)置配置文件,啟用集群功能
vim /etc/redia.conf // 每個(gè)節(jié)點(diǎn)都要如此設(shè)置
cluster-enabled yes
cluster-config-file nodes-6379.conf
systemctl restart redis
(2)啟動(dòng)redis后為每個(gè)節(jié)點(diǎn)分配slots
systemctl restart redis
redis-cli -h 192.168.136.230 -a centos CLUSTER ADDSLOTS {0..5461}
redis-cli -h 192.168.136.130 -a centos CLUSTER ADDSLOTS {5462..10923}
redis-cli -h 192.168.136.131 -a centos CLUSTER ADDSLOTS {10924..16383}
注意:每個(gè)slot要獨(dú)立創(chuàng)建;可用范圍是0-16383,共16384個(gè)
使用CLUSTER INFO查看集群信息,可以看到已經(jīng)分配相應(yīng)數(shù)量的slot,但是集群狀態(tài)還是fail

(3)設(shè)定集群成員關(guān)系
redis-cli -h 192.168.136.230 -a centos
CLUSTER MEET 192.168.136.130 6379
CLUSTER MEET 192.168.136.131 6379
CLUSTER INFO
再次使用CLUSTER INFO查看集群信息,集群狀態(tài)已經(jīng)ok狀態(tài)

(4)測試集群功能
redis-cli -h 192.168.136.230 -a centos
192.168.136.230:6379> SET testkey1 hi
OK
192.168.136.230:6379> SET testkey2 hello
(error) MOVED 14758 192.168.136.131:6379
// 返回結(jié)果要求到192.168.136.131的節(jié)點(diǎn)執(zhí)行操作
redis-cli -h 192.168.136.131 -a centos
192.168.136.131:6379> SET testkey2 hello
OK
192.168.136.131:6379> SET testkey3 sayhello
(error) MOVED 10631 192.168.136.130:6379
192.168.136.230成功存儲testkey1鍵值對,但是節(jié)點(diǎn)要求去192.168.136.131存儲testkey2鍵值對

192.168.136.131成功存儲testkey2鍵值對,但是節(jié)點(diǎn)要求去192.168.136.130存儲testkey3鍵值對

注意:當(dāng)對redis cluster中的某個(gè)節(jié)點(diǎn)寫數(shù)據(jù)時(shí),可能會要求存儲至其他節(jié)點(diǎn)。即可以向任意一個(gè)節(jié)點(diǎn)發(fā)起請求,節(jié)點(diǎn)可能會接收請求,也可能返回去其他節(jié)點(diǎn)完成操作的結(jié)果。故實(shí)際使用中,redis cluster需要與智能客戶端協(xié)同發(fā)揮功能。