Redis入門

??Redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步

Redis

開源、內存存儲、數據結構存儲;可用作:數據庫、緩存、消息隊列;
k/v 存儲,分布式存儲系統
數據結構:字符串、列表(數組)、hashes(關聯數組)、集合、有序集合、bitmaps、hyperloglogs、空間索引;
內建的復制、Lua scripting、LRU、事務、持久存儲、高可用(Sentinel,Redis Cluster)

REmote DIctionary Server:數據結構服務器,k/v,數據結構;
    內存存儲:in-memroy
    持久化
    主從(sentinel)
    Cluster(shard)

數據結構服務器:
    Strings, Lists, Hashs, Sets, Sorted Sets, Bitmaps, Hyperloglogs
    PUB/SUB

Redis是單進程:
    但CPU并非瓶頸;

持久化:
    snapshotting  快照持久
    AOF       僅追加文件

Replication:
    主/從
        主:rw
        從:read-only

程序環境:

配置文件:  /etc/redis.conf
主程序 :  /usr/bin/redis-server
端口  :  6379/tcp
客戶端 :  /usr/bin/redis-cli
Unit File: /usr/lib/systemd/system/redis.service
數據目錄    :/var/lib/redis #建議修改,在/etc/redis.conf文件中修改。
aof檢查工具:/usr/bin/redis-check-aof
rdb快照檢查工具:/usr/bin/redis-check-rdb
redis哨兵的配置:/etc/redis-sentinel.conf
redis哨兵(類似MHA):/usr/bin/redis-sentinel
檢查redis性能:/usr/bin/redis-benchmark
關閉redis:/usr/bin/redis-shutdown 
Unit File:/usr/lib/systemd/system/redis-sentinel.service

配置文件/etc/redis.conf

INCLUDES        包含其他文件
GENERAL         通用配置項
NETWORK         網絡配置項
SNAPSHOTTING        持久化相關配置
REPLICATION     主從同步復制相關的配置
SECURITY        安全相關配置
LIMITS          Limit相關的配置
APPEND ONLY MODE    持久化配置端,AOF
LUA SCRIPTING       lua腳本配置項
REDIS CLUSTER       redis集群配置端
SLOW LOG        SlowLog慢日志相關的配置
LATENCY MONITOR     延遲監控配置選項
EVENT NOTIFICATION  事件通知
ADVANCED CONFIG     高級配置

通用配置項:

daemonize   是否守護進程運行
supervised  是否與upstart或systemd進行交互,默認為no
loglevel    日志級別,可選:debug較詳細、verbose信息很少、notice比較詳細、warning只記錄非常重要/關鍵信息,默認notice
pidfile     pid文件
logfile     日志文件的位置 
databases:設定數據庫數量,默認為16個,每個數據庫的名字均為整數,從0開始編號,默認操作的數據庫為0;
    切換數據庫的方法:
             SELECT <dbid>

網絡配置項:

bind IP     #建議綁定本機,默認127.0.0.1
port PORT   #監聽端口
protected-mode  #是否工作于保護模式,用于避免redis實例暴露于互聯網,有兩個判斷條件,沒有指定監聽地址,沒有設置認證密碼,它將會把redis監聽到127.0.0.1的地址上。
tcp-backlog #tcp協議連接的等待隊列,默認為511。
unixsocket  #監聽的socket文件,可選項
timeout     #連接的空閑超時時長;
tcp-keepalive   #tcp連接的保持時間。

安全配置:

requirepass <PASSWORD>      #設置連接認證密碼
rename-command <COMMAND> <NEW_CMND_NAME>#修改config命令的名字,在AOF或Replication環境中,不推薦使用;

Limits相關的配置:

maxclients      #最大并發連接數,默認為10000
maxmemory <bytes>   #redis可以使用的最大內存,建議設置。
maxmemory-policy    #內存淘汰策略,策略如下。
            volatile-lru    #把設置了過期時間的key按照LRU算法進行淘汰。
            allkeys-lru #把設置了所有的key按照LRU算法進行淘汰。
            volatile-random #把設置了過期時間的key進行隨機淘汰。
            allkeys-random  #把設置了所有的key進行隨機淘汰。
            volatile-ttl    #按照Key的ttl時間進行淘汰。
            noeviction  #不啟用    
maxmemory-samples 5 #采用淘汰算法的選取的樣本數,每次淘汰選取這里設置的值,在這個值中進行運算。

SlowLog相關的配置:

slowlog-log-slower-than 10000   #單位是微秒;默認0.01秒
slowlog-max-len 128     #SlowLog記錄的日志最大條目,單位為字節;
latency-monitor-threshold 0 #設置什么時間啟用延遲監視器。0表示一直監聽。

ADVANCED配置:

hash-max-ziplist-entries 512    #一個關聯數組的最大可以有多少個元素
hash-max-ziplist-value 64   #一個元素的最大值。默認為64字節。
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
client-output-buffer-limit normal 0 0 0     #常規客戶端的緩存區大小
client-output-buffer-limit slave 256mb 64mb 60  #從服務器緩存區大小
client-output-buffer-limit pubsub 32mb 8mb 60   #訂閱隊列緩存區大小
                    #3個數字表示:硬限制、軟限制、軟限制的可超時時長。
aof-rewrite-incremental-fsync yes   #AOF文件是否同步寫入磁盤。默認開啟,建議開啟

redis-cli 客戶端工具

用法:redis-cli [OPTIONS] [cmd [arg [arg ...]]]

選項

-h <hostname>   服務器主機名(默認值:127.0.0.1)。
-p <port>       服務器端口(默認值:6379)。
-s <socket>     服務器套接字(覆蓋主機名和端口)。
-a <password>   連接到服務器時要使用的密碼。
-r <repeat>     執行指定的命令N次。
-i <interval>   使用-r時,每個命令等待<interval> seconds。
                可以指定次級次,如-i 0.1。
-n <db>         數據庫號。
-x              從STDIN讀取最后一個參數。
-d <delimiter>  用于原始格式的多批量分隔符(默認值:\ n)。
-c              啟用群集模式(遵循-ASK和-MOVED重定向)。
--raw           使用原始格式進行回復(默認為STDOUT不是tty)。
--no-raw        強制格式化輸出,即使STDOUT不是tty
--csv           CSV格式輸出。
--stat          打印關于服務器的統計信息
--slave         模擬顯示從主機接收的命令的從站。
--rdb filename  將RDB轉儲從遠程服務器傳輸到本地文件。
--pipe          將原始Redis協議從stdin傳輸到服務器。
--pipe-timeout n在管道模式下,如果在發送所有數據后發生錯誤,則在n秒內收到回復。默認30
--scan          使用SCAN命令列出所有鍵。
--pattern <pat> 用于--scan來指定掃描模式。
--intrinsic-latency <sec> 運行測試來測量內部系統延遲
--eval <file>   使用Lua腳本在<file>發送EVAL命令。
--ldb           與--eval配合使用Redis Lua調試器。
--ldb-sync-mode 像--ldb一樣,但是使用同步Lua調試器,在這種模式下,服務器被阻止,腳本更改不會從服務器內存中回滾。

切換數據庫 select 切換數據庫,數據庫的名字是數字格式,不指定默認0庫,默認是系統創建了16個庫

redis:k/v

key:直接ASCII字符串;
value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs

幫助

"help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit

內鍵命令

@generic通用

Redis DEL       該命令用于在key存在是刪除 key。
Redis Dump      序列化給定key,并返回被序列化的值。
Redis EXISTS        檢查給定key是否存在。
Redis Expire        seconds為給定key設置過期時間。
Redis Expireat      EXPIREAT的作用和EXPIRE類似,都用于為key設置過期時間。不同在于EXPIREAT命令接受的時間參數是UNIX時間戳(unix timestamp)。
Redis PEXPIREAT     設置key的過期時間億以毫秒計。
Redis PEXPIREAT     設置key過期時間的時間戳(unix timestamp) 以毫秒計
Redis Keys      查找所有符合給定模式(pattern)的key 。
Redis Move      將當前數據庫的key移動到給定的數據庫 db 當中。
Redis PERSIST       移除key的過期時間,key將持久保持。
Redis Pttl      以毫秒為單位返回key的剩余的過期時間。
Redis TTL       以秒為單位,返回給定key的剩余生存時間(TTL, time to live)。
Redis RANDOMKEY     從當前數據庫中隨機返回一個 key 。
Redis Rename        修改key的名稱
Redis Renamenx      僅當newkey不存在時,將key改名為newkey 。
Redis Type      返回key所儲存的值的類型。

字符串 @String

Redis set(key, value)           給數據庫中名稱為key的string賦予值value 
                                      參數:ex過期時間,nx如果這個鍵不存在才新建
Redis Get               獲取指定 key 的值。
Redis Getrange              返回 key 中字符串值的子字符
Redis Getset                將給定 key 的值設為 value ,并返回 key 的舊值(old value)。
Redis Getbit                對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。
Redis Mget              獲取所有(一個或多個)給定 key 的值。
Redis Setbit                對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。
Redis Setex                 將值 value 關聯到 key ,并將 key 的過期時間設為 seconds 以秒為單位)。
Redis Setnx                 只有在 key 不存在時設置 key 的值。
Redis Setrange              用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。
Redis Strlen                返回 key 所儲存的字符串值的長度。
Redis Mset              同時設置一個或多個 key-value 對。
Redis Msetnx                同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。
Redis Psetex                這個命令和 SETEX 命令相似,但它以毫秒為單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。
Redis Incr              將 key 中儲存的數字值增一。
Redis Incrby                將 key 所儲存的值加上給定的增量值(increment) 。
Redis Incrbyfloat           將 key 所儲存的值加上給定的浮點增量值(increment) 。
Redis Decr              將 key 中儲存的數字值減一。
Redis Decrby                key 所儲存的值減去給定的減量值(decrement) 。
Redis Append                如果 key 已經存在并且是一個字符串, APPEND 命令將 value 追加到 key 原來的值的末尾。
Redis INCRBYFLOAT       基于浮點型
Redis incrby(key, integer)  名稱為key的string增加integer
Redis decrby(key, integer)  名稱為key的string減少integer
Redis append(key, value)    名稱為key的string的值附加value
Redis substr(key, start, end)   返回名稱為key的string的value的子串

Redis 哈希(Hash)

Redis Hdel      刪除一個或多個哈希表字段
Redis hexists(key, field)名稱為key的hash中是否存在鍵為field的域
Redis Hget      獲取存儲在哈希表中指定字段的值/td>
Redis hgetall(key)  返回名稱為key的hash中所有的鍵(field)及其對應的value
Redis hincrby(key,field,integer)將名稱為key的hash中field的value增加integer
Redis Hincrbyfloat  為哈希表 key 中的指定字段的浮點數值加上增量 increment 。
Redis hkeys(key)    返回名稱為key的hash中所有鍵
Redis Hlen      獲取哈希表中字段的數量
Redis Hmget         獲取所有給定字段的值
Redis Hmset         同時將多個 field-value (域-值)對設置到哈希表 key 中。
Redis Hset      將哈希表 key 中的字段 field 的值設為 value 。
Redis Hsetnx        只有在字段 field 不存在時,設置哈希表字段的值。
Redis hvals(key)    返回名稱為key的hash中所有鍵對應的value

Redis 列表 @list

Redis Blpop             移出并獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
Redis Brpop             移出并獲取列表的最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
Redis Brpoplpush            從列表中彈出一個值,將彈出的元素插入到另外一個列表中并返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
Redis Lindex                通過索引獲取列表中的元素
Redis Linsert               在列表的元素前或者后插入元素
Redis Llen              獲取列表長度
Redis lpop(key)         返回并刪除名稱為key的list中的首元素
Redis lpush(key, value)     在名稱為key的list頭添加一個值為value的 元素
Redis Lpushx                將一個或多個值插入到已存在的列表頭部
Redis lrange(key,start,end) 返回名稱為key的list中start至end之間的元素
Redis lrem(key,count,value) 刪除count個key的list中值為value的元素
Redis Lset              通過索引設置列表元素的值
Redis Ltrim                 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
Redis rpop(key)             返回并刪除名稱為key的list中的尾元素
Redis rpoplpush(srckey,dstkey)  返回并刪除名稱為srckey的list的尾元素,并將該元素添加到名稱為dstkey的list的頭部
Redis rpush(key, value)     在名稱為key的list尾添加一個值為value的元素
Redis Rpushx                為已存在的列表添加值

無序集合@set

Redis Sadd      向集合添加一個或多個成員
Redis Scard     獲取集合的成員數
Redis Sdiff         返回給定所有集合的差集
Redis Sdiffstore    返回給定所有集合的差集并存儲在 destination 中
Redis Sinter        返回給定所有集合的交集
Redis Sinterstore   返回給定所有集合的交集并存儲在 destination 中
Redis Sismember     判斷 member 元素是否是集合 key 的成員
Redis Smembers      返回集合中的所有成員
Redis Smove         將 member 元素從 source 集合移動到 destination 集合
Redis spop(key)     隨機返回并刪除名稱為key的set中一個元素
Redis Srandmember   返回集合中一個或多個隨機數
Redis srem(key,member)  刪除名稱為key的set中的元素member
Redis Sunion        返回所有給定集合的并集
Redis Sunionstore   所有給定集合的并集存儲在 destination 集合中
Redis Sscan     迭代集合中的元素

Redis 有序集合(sorted set)

Redis Zadd      向有序集合添加一個或多個成員,或者更新已存在成員的分數
Redis Zcard     獲取有序集合的成員數
Redis Zcount        計算在有序集合中指定區間分數的成員數
Redis Zincrby       有序集合中對指定成員的分數加上增量 increment
Redis Zinterstore   計算給定的一個或多個有序集的交集并將結果集存儲在新的有序集合 key 中
Redis Zlexcount     在有序集合中計算指定字典區間內成員數量
Redis Zrange        顯示指定索引范圍內的數據,索引自動分配,索引從0開始,但是顯示時從1開始。
Redis Zrangebylex   通過字典區間返回有序集合的成員
Redis Zrangebyscore     通過分數返回有序集合指定區間內的成員
Redis Zrank         返回有序集合中指定成員的索引
Redis Zrem      移除有序集合中的一個或多個成員
Redis Zremrangebylex    移除有序集合中給定的字典區間的所有成員
Redis Zremrangebyrank   移除有序集合中給定的排名區間的所有成員
Redis Zremrangebyscore  移除有序集合中給定的分數區間的所有成員
Redis Zrevrange     返回有序集中指定區間內的成員,通過索引,分數從高到底
Redis Zrevrangebyscore  返回有序集中指定分數區間內的成員,分數從高到低排序
Redis Zrevrank      返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
Redis Zscore        返回有序集中,成員的分數值
Redis Zunionstore   計算給定的一個或多個有序集的并集,并存儲在新的 key 中
Redis Zscan         迭代有序集合中的元素(包括元素成員和元素分值)

Redis HyperLogLog

Redis Pfadd         添加指定元素到 HyperLogLog 中。
Redis Pfcount       返回給定 HyperLogLog 的基數估算值。
Redis Pgmerge       將多個 HyperLogLog 合并為一個 HyperLogLog

Redis 發布訂閱 @pubsub

Redis Psubscribe    訂閱一個或多個符合給定模式的頻道。
Redis Pubsub        查看訂閱與發布系統狀態。
Redis Publish       將信息發送到指定的頻道。
Redis Punsubscribe  指示客戶端退訂所有給定模式。
Redis Subscribe     訂閱給定的一個或多個頻道的信息。例如 subscribe msg chat_room
Redis Unsubscribe   指示客戶端退訂給定的頻道。
Redis pubsub channels   列出當前的活躍頻道 例如PUBSUB CHANNELS news.i*
Redis pubsub numsub 返回給定頻道的訂閱者數量 例如PUBSUB NUMSUB news.it news.internet news.sport news.music
Redis pubsub numpat 返回客戶端訂閱的所有模式的數量總和       

Redis 事務 @transactions

Redis Discard       取消事務,放棄執行事務塊內的所有命令。
Redis Exec      執行所有事務塊內的命令。
Redis Multi         標記一個事務塊的開始。
Redis Unwatch       取消 WATCH 命令對所有 key 的監視。
Redis Watch         監視一個(或多個)key ,如果在事務執行之前這個(或這些)key被其他命令所改動,那么事務將被打斷。

Redis 腳本

Redis Eval      執行 Lua 腳本。
Redis Evalsha       執行 Lua 腳本。
Redis Script Exists     查看指定的腳本是否已經被保存在緩存當中。
Redis Script Flush  從腳本緩存中移除所有腳本。
Redis Script kill   殺死當前正在運行的 Lua 腳本。
Redis Script Load   將腳本 script 添加到腳本緩存中,但并不立即執行這個腳本。

Redis 連接

Redis Auth      驗證密碼是否正確
Redis Echo      打印字符串
Redis Ping      查看服務是否運行
Redis Quit      關閉當前連接
Redis Select        切換到指定的數據庫

Redis 服務器 @server

Redis Bgrewriteaof  異步執行一個 AOF(AppendOnly File) 文件重寫操作
Redis Bgsave        在后臺異步保存當前數據庫的數據到磁盤
Redis Client Kill   關閉客戶端連接
Redis Client List   獲取連接到服務器的客戶端連接列表
Redis Client Getname    獲取連接的名稱
Redis Client Pause  在指定時間內終止運行來自客戶端的命令
Redis Client Setname    設置當前連接的名稱
Redis Cluster Slots     獲取集群節點的映射數組
Redis Command       獲取 Redis 命令詳情數組
Redis Command Count     獲取 Redis 命令總數
Redis Command Getkeys   獲取給定命令的所有鍵
Redis Time      返回當前服務器時間
Redis Command Info  獲取指定 Redis 命令描述的數組
Redis Config Get    獲取指定配置參數的值
Redis Config Resetstat  重置 INFO 命令中的某些統計數據
Redis Dbsize        返回當前數據庫的 key 的數量
Redis Debug Object  獲取 key 的調試信息
Redis Debug Segfault    讓 Redis 服務崩潰
Redis Flushall      刪除所有數據庫的所有key
Redis Flushdb       刪除當前數據庫的所有key
Redis Info      獲取Redis服務器的各種信息和統計數值
Redis Lastsave      返回最近一次 Redis 成功將數據保存到磁盤上的時間,以 UNIX 時間戳格式表示
Redis Monitor       實時打印出 Redis 服務器接收到的命令
Redis Role      返回主從實例所屬的角色
Redis save      將數據同步保存到磁盤
Redis bgsave        將數據異步保存到磁盤
Redis Shutdown      將數據集同步保存到磁盤,然后關閉服務器
Redis Slaveof       將當前服務器轉變為指定服務器的從屬服務器(slave server)
Redis Showlog       管理 redis 的慢日志
Redis Sync      用于復制功能(replication)的內部命令
Redis lastsave      返回上次成功將數據保存到磁盤的Unix時戳
Redis config resetstat重置info命令中的某些統計數據
Redis config get    獲取配置文件信息
Redis config set    動態地調整Redis服務器的配置(configuration)而無須重啟,可以修改的配置參數可以使用命令 CONFIG GET * 來列出
Redis config rewrite    Redis服務器時所指定的 redis.conf 文件進行改寫

清空數據庫:

FLUSHDB:Remove all keys from the current database      清空當前數據庫;
         FLUSHALL:Remove all keys from all databases   清空所有數據庫;

配置參數可運行是修改,redis可以把內存中的設置覆蓋到配置文件。

Redis的持久化:Redis是工作在內存中的。

RDB:snapshotting(快照),

二進制格式;按事先定制的策略,周期性地將數據從內存同步至磁盤;數據文件默認為dump.rdb;Redis默認使用。

客戶端也可以顯式使用SAVE或BGSAVE命令來手動啟動快照保存機制;
    SAVE  :同步,即在主線程中保存快照,此時會阻塞所有客戶端請求;
    GSAVE:異步,Redis啟動一個子進程在后臺中創建快照保存數據;

配置RDB:

[root@centos7.3 ~]#vim /etc/redis.conf        #編輯配置文件,找到 SNAPSHOTTING 配置段

save 900 1      #在900秒內有1個key發生變化,就進行快照。
save 300 10     #在300秒內有10個key發生變化,就進行快照。
save 60 10000       #在60秒內有10000個key發生變化,就進行快照。

三個策略滿足其中任意一個均會觸發SNAPSHOTTING操作;900s內至少有一個key有變化,300s內至少有10個key有變化,60s內至少有1W個key發生變化;

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文件重寫;將同一個Key的多個可合并的指令進行合并重寫。
不會讀取正在使用AOF文件,而是通過將內存中的數據以命令的方式保存至臨時文件中,完成之后替換原來的AOF文件;

AOF相關的配置

[root@centos7.3 ~]#vim /etc/redis.conf      #編輯配置文件的APPEND ONLY MODE配置段

appendonly no                       #是否啟用AOF功能
appendfilename "appendonly.aof"         #AOF文件路徑,默認在相對路徑下,redis的工作目錄
appendfsync                     #從內存同步到磁盤的規則,可選參數如下
                    no      #redis不執行主動同步操作,而內核決定何時進行同步;
                    everysec    #每秒一次;
                    always      #每語句一次;
no-appendfsync-on-rewrite no            #是否在后臺執行aof文件重寫期間不調用fsync進行同步,默認為no,表示調用;
auto-aof-rewrite-percentage 100         #觸發AOF文件的規則
auto-aof-rewrite-min-size 64mb
    #上述兩個條件同時滿足時,方會觸發重寫AOF;與上次aof文件大小相比,其增長量超過100%,且大小不少于64MB; 

aof-load-truncated yes              #是否允許在服務崩潰再啟動后清除AOF文件。

注意:AOF文件在Redis重啟后會清理原來的AOF文件。持久機制本身不能取代備份,應該制訂備份策略,對redis庫定期備份。

RDB與AOF同時啟用:

        (1) BGSAVE和BGREWRITEAOF不會同時進行;
        (2) Redis服務器啟動時用持久化的數據文件恢復數據,會優先使用AOF;

主從復制:

特點:

一個Master可以有多個slave主機,支持鏈式復制;
Master以非阻塞方式同步數據至slave主機;

配置環境

主服務器:192.168.166.130
從服務器1:192.168.166.132
從服務器2:192.168.166.133
[root@CentOS7.3 ~]#vim /etc/redis.conf 
bind 192.168.166.130          #改為可對外提供服務的IP地址
# requirepass admin123  #設置一個連接密碼
[root@CentOS7.3 ~]#systemctl start redis
[root@CentOS7.3 ~]#ss -ntl
State       Recv-Q Send-Q      Local Address:Port                     Peer Address:Port              
LISTEN      0      128       192.168.166.130:6379                                *:*                  
LISTEN      0      128                     *:111                                 *:*                  
LISTEN      0      128                     *:22                                  *:*                 
LISTEN      0      128                    :::22                                 :::*                  
LISTEN      0      128                   ::1:631                                :::*    

把另外的兩臺從服務器也做同樣的修改,這里就不予演示了。

配置從服務器

第一臺

[root@centos7.3-1 ~]#redis-cli -h 192.168.166.132 -a test1
192.168.166.132:6379> SLAVEOF 192.168.166.130 6379           #指定主服務器地址IP和端口
OK
192.168.166.132:6379> CONFIG SET masterauth admin123         #指定主服務器的認證密碼
OK

主服務器

[root@CentOS7.3 ~]#redis-cli -h 192.168.166.130 -a admin123
192.168.166.130:6379> info replication          #查看從服務器的狀態
# Replication
role:master
connected_slaves:1                              #slave節點的數量
slave0:ip=192.168.166.132,port=6379,state=online,offset=997,lag=1   #slave節點的信息
master_repl_offset:997
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:996
192.168.166.130:6379> SET name master       #創建一個key,鍵名name,值為master
OK

第二臺

192.168.166.132:6379> get name          #查看name
"master"                                #值為master

通過修改配置文件進行配置

[root@centos7.3-2 ~]#vim /etc/redis.conf      #修改配置文件,找到 REPLICATION配置段 

slaveof 192.168.166.130 6379            #添加maste的IP地址和端口
masterauth admin123                     #添加認證密碼

再次查看主服務器

192.168.166.130:6379> info replication
# Replication
role:master
connected_slaves:2                  #slave節點數變成了2臺
slave0:ip=192.168.166.132,port=6379,state=online,offset=2523,lag=1
slave1:ip=192.168.166.133,port=6379,state=online,offset=2523,lag=1  #第二臺slave節點的信息
master_repl_offset:2523
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:2522

主從服務其他配置

slave-serve-stale-data yes      #是否使用不新鮮的內容給用戶提供服務
slave-read-only yes             #從節點是否為只讀
repl-diskless-sync no           #復制策略,參數:no, Disk-backed, Diskless,參數信息如下
        #新的從節點或某較長時間未能與主節點進行同步的從節點重新與主節點通信,需要做“full synchronization",此時其同步方式有兩種style:
            Disk-backend:主節點新創建快照文件于磁盤中,而后將其發送給從節點;
            Diskless:主節點新創建快照后直接通過網絡套接字文件發送給從節點;為了實現并行復制,通常需要在復制啟動前延遲一個時間段;

repl-diskless-sync-delay 5  #復制啟動前延遲一個時間段
repl-ping-slave-period 10   #探測的間隔時間
repl-timeout 60                 #從節點的超時時間
repl-disable-tcp-nodelay no #是否禁止tcp-nodelay,tcp-nodelay表示等數據累計到一定大小再傳輸。
repl-backlog-size 1mb       #復制的后援隊列的長度
repl-backlog-ttl 3600       
slave-priority 100              #復制集群中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高
                                #但0表示不參與選舉,但是可以投票; 
min-slaves-to-write 3           #主節點僅允許其能夠通信的從節點數量大于等于此處的值時接受寫操作;
min-slaves-max-lag 10           #從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;
slave-announce-ip 5.5.5.5   #從服務器宣告自己的ip地址
slave-announce-port 1234    #端口

sentinel:

主要完成三個功能:監控、通知、自動故障轉移

當主節點故障后使用流言協議、投票協議來選舉新的master節點,sentinel最少需要3個節點。

配置文件:/etc/redis-sentinel.conf

程序文件:/usr/bin/redis-sentinel

默認端口:26379

配置環境:使用4臺主機,一臺主3臺從,在4臺主機上面都配置sentinel,4臺服務器的redis連接密碼需要配置為相同的。

配置項:

bind                    #sentinel綁定的地址
port 26379              #sentinel服務的端口
dir /tmp                #sentinel存放臨時文件的目錄
sentinel monitor <master-name> <ip> <redis-port> <quorum>       #指定主節點
sentinel auth-pass <master-name> <password>                     #指定認證密碼
        #<quorum>表示sentinel集群的quorum機制,即至少有quorum個sentinel節點同時判定主節點故障時,才認為其真的故障;

sentinel down-after-milliseconds <master-name> <milliseconds>       #監控到指定的集群的主節點異常狀態持續多久方才將標記為“故障”;
sentinel parallel-syncs <master-name> <numslaves>                   #指在failover過程中,能夠被sentinel并行配置的從節點的數量;
sentinel failover-timeout <master-name> <milliseconds>  #默認為3分鐘,單位為毫秒
        #sentinel必須在此指定的時長內完成故障轉移操作,否則,將視為故障轉移操作失敗
sentinel notification-script <master-name> <script-path>            #通知腳本,此腳本被自動傳遞多個參數;
logfile /var/log/redis/sentinel.log             #日志

配置示例

[root@centos7.3 ~]#vim /etc/redis-sentinel.conf 
bind 192.168.166.130
port 26379

dir /tmp
sentinel monitor mymaster 192.168.166.130 6379 3
sentinel auth-pass  mymaster admin123
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 3
sentinel failover-timeout mymaster 60000



[root@CentOS7.3 ~]#systemctl start redis-sentinel.service 
[root@CentOS7.3 ~]#ss -ntl
State       Recv-Q Send-Q      Local Address:Port                     Peer Address:Port              
LISTEN      0      128             127.0.0.1:26379                               *:*                  
LISTEN      0      128       192.168.166.130:6379                                *:*                  
LISTEN      0      128                     *:22                                  *:*                  
LISTEN      0      128                    :::22                                 :::*
其他的幾臺服務器配置同樣的內容
注:在sentinel中要配置bind指定地址或認證密碼,防止觸發安全機制。

設置從服務器

[root@centos7.3-1 ~]#redis-cli -a admin123          
127.0.0.1:6379> SLAVEOF 192.168.166.130 6379            #設置主服務器的地址和端口
OK
127.0.0.1:6379> CONFIG SET masterauth admin123          #設置主服務器的認證密碼
OK

其他兩臺做同樣的設置
[root@CentOS7.3 ~]#tail -f /var/log/redis/sentinel.log      #查看主服務器的sentinel日志
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

3157:X 20 Sep 21:02:29.987 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3157:X 20 Sep 21:02:29.988 # Sentinel ID is b3fa8d852c0bfdd699ebb4b33e56ed4f2d17bf7e
3157:X 20 Sep 21:02:29.988 # +monitor master mymaster 192.168.166.130 6379 quorum 3
3157:X 20 Sep 21:05:40.725 * +slave slave 192.168.166.132:6379 192.168.166.132 6379 @ mymaster 192.168.166.130 6379
3157:X 20 Sep 21:05:45.763 # +sdown slave 192.168.166.132:6379 192.168.166.132 6379 @ mymaster 192.168.166.130 6379
3157:X 20 Sep 21:06:00.833 * +slave slave 192.168.166.136:6379 192.168.166.136 6379 @ mymaster 192.168.166.130 6379
3157:X 20 Sep 21:06:00.835 * +slave slave 192.168.166.133:6379 192.168.166.133 6379 @ mymaster 192.168.166.130 6379
3157:X 20 Sep 21:06:05.841 # +sdown slave 192.168.166.136:6379 192.168.166.136 6379 @ mymaster 192.168.166.130 6379
3157:X 20 Sep 21:06:05.841 # +sdown slave 192.168.166.133:6379 192.168.166.133 6379 @ mymaster 192.168.166.130 6379
# 三臺從服務器全部被識別上線
[root@CentOS7.3 ~]#redis-cli -p 26379           #登陸主服務器的sentinel
127.0.0.1:26379> sentinel masters               #查看主節點的信息
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.166.130"                        #主節點的IP
    5) "port"
    6) "6379"                                   #主節點的服務端口
    7) "runid"
    8) "29c83931b3c6c71cc7dc084878b4beef5f9dd308"
    9) "flags"
   10) "master"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "1000"
   19) "last-ping-reply"
   20) "1000"
   21) "down-after-milliseconds"
   22) "5000"
   23) "info-refresh"
   24) "3141"
   25) "role-reported"
   26) "master"
   27) "role-reported-time"
   28) "746198"
   29) "config-epoch"
   30) "0"
   31) "num-slaves"
   32) "3"
   33) "num-other-sentinels"
   34) "0"
   35) "quorum"
   36) "3"
   37) "failover-timeout"
   38) "60000"
   39) "parallel-syncs"
   40) "3"
127.0.0.1:26379> sentinel slaves mymaster           #查看從節點的信息
1)  1) "name"
    2) "192.168.166.136:6379"                       #第一臺節點
    3) "ip"
    4) "192.168.166.136"
    5) "port"
    6) "6379"
    7) "runid"
    8) ""
    9) "flags"
   10) "s_down,slave,disconnected"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "568371"
   17) "last-ok-ping-reply"
   18) "568371"
   19) "last-ping-reply"
   20) "568371"
   21) "s-down-time"
   22) "563363"
   23) "down-after-milliseconds"
   24) "5000"
   25) "info-refresh"
   26) "1505913329204"
   27) "role-reported"
   28) "slave"
   29) "role-reported-time"
   30) "568371"
   31) "master-link-down-time"
   32) "0"
   33) "master-link-status"
   34) "err"
   35) "master-host"
   36) "?"
   37) "master-port"
   38) "0"
   39) "slave-priority"
   40) "100"
   41) "slave-repl-offset"
   42) "0"
2)  1) "name"
    2) "192.168.166.133:6379"                       #第二臺節點
    3) "ip"
    4) "192.168.166.133"
    5) "port"
    6) "6379"
    7) "runid"
    8) ""
    9) "flags"
   10) "s_down,slave,disconnected"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "568369"
   17) "last-ok-ping-reply"
   18) "568369"
   19) "last-ping-reply"
   20) "568369"
   21) "s-down-time"
   22) "563363"
   23) "down-after-milliseconds"
   24) "5000"
   25) "info-refresh"
   26) "1505913329204"
   27) "role-reported"
   28) "slave"
   29) "role-reported-time"
   30) "568369"
   31) "master-link-down-time"
   32) "0"
   33) "master-link-status"
   34) "err"
   35) "master-host"
   36) "?"
   37) "master-port"
   38) "0"
   39) "slave-priority"
   40) "100"
   41) "slave-repl-offset"
   42) "0"
3)  1) "name"
    2) "192.168.166.132:6379"                   #第三臺節點
    3) "ip"
    4) "192.168.166.132"
    5) "port"
    6) "6379"
    7) "runid"
    8) ""
    9) "flags"
   10) "s_down,slave,disconnected"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "588479"
   17) "last-ok-ping-reply"
   18) "588479"
   19) "last-ping-reply"
   20) "588479"
   21) "s-down-time"
   22) "583441"
   23) "down-after-milliseconds"
   24) "5000"
   25) "info-refresh"
   26) "1505913329204"
   27) "role-reported"
   28) "slave"
   29) "role-reported-time"
   30) "588479"
   31) "master-link-down-time"
   32) "0"
   33) "master-link-status"
   34) "err"
   35) "master-host"
   36) "?"
   37) "master-port"
   38) "0"
   39) "slave-priority"
   40) "100"
   41) "slave-repl-offset"
   42) "0"
127.0.0.1:26379> sentinel get-master-addr-by-name  mymaster     #這條命令可以查看當前誰是主節點
1) "192.168.166.130"
2) "6379"

在主節點上面創建要一個鍵,然后在從節點上面查看有沒有同步

[root@CentOS7.3 ~]#redis-cli -h 192.168.166.130 -a admin123
192.168.166.130:6379> set test1 master
OK
[root@centos7.3-1 ~]#redis-cli -h 192.168.166.132 -a admin123
192.168.166.132:6379> get test1
"master"
[root@centos7.3-2 ~]#redis-cli  -h 192.168.166.133 -a admin123
192.168.166.133:6379> get  test1
"master
[root@centos7.3-2 etc]#redis-cli  -h 192.168.166.136 -a admin123
192.168.166.136:6379> get test1
"master"

切換主節點

192.168.166.130:26379> sentinel failover mymaster             #使failover命令并指定主節點的名稱  
OK
192.168.166.130:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.166.136"                    #主節點已經切換為192.168.166.136
2) "6379"

模擬故障

[root@centos7.3-2 etc]#systemctl stop redis             #關閉192.168.166.136的redis服務
[root@centos7.3-2 etc]#redis-cli -h 192.168.166.136 -p 26379
192.168.166.136:26379> sentinel get-master-addr-by-name mymaster        #查看當前主節點
1) "192.168.166.133"                #主節點已經切換
2) "6379"

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.1 資料 ,最好的入門小冊子,可以先于一切文檔之前看,免費。 作者Antirez的博客,Antirez維護的R...
    JefferyLcm閱讀 17,120評論 1 51
  • Redis雜談 Redis是近年來發展迅速的內存數據庫,網上也已經有多Redis的文章。但不管是英文還是中文,多數...
    迷失于重逢閱讀 1,605評論 0 14
  • 本文將從Redis的基本特性入手,通過講述Redis的數據結構和主要命令對Redis的基本能力進行直觀介紹。之后概...
    kelgon閱讀 61,281評論 23 625
  • 你可記得那些日子的艷陽?你可記得教官英武的臉龐?你可記得當初的抱怨?你可記得萬事大吉的瞬間? 我只說我,像經歷了一...
    逸黎閱讀 230評論 0 5
  • 這是選擇23:30睡,07:30起的第18/100,上圖: 照常12:31睡,23點開始看《風雨哈佛路》,主要因為...
    澤陽9閱讀 259評論 1 1