Redis簡介:node
Redis是一款開源的、高性能的鍵-值存儲(key-value store)。它常被稱做是一款數據結構服務器(data structure server)。mysql
Redis的鍵值能夠包括字符串(strings)類型,同時它還包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等數據類型。 對於這些數據類型,你能夠執行原子操做。例如:對字符串進行附加操做(append);遞增哈希中的值;向列表中增長元素;計算集合的交集、並集與差集等。git
爲了得到優異的性能,Redis採用了內存中(in-memory)數據集(dataset)的方式。同時,Redis支持數據的持久化,你能夠每隔一段時間將數據集轉存到磁盤上(snapshot),或者在日誌尾部追加每一條操做命令(append only file,aof)。redis
Redis一樣支持主從複製(master-slave replication),而且具備很是快速的非阻塞首次同步( non-blocking first synchronization)、網絡斷開自動重連等功能。同時Redis還具備其它一些特性,其中包括簡單的事物支持、發佈訂閱 ( pub/sub)、管道(pipeline)和虛擬內存(vm)等 。
Redis具備豐富的客戶端,支持現階段流行的大多數編程語言。算法
1.Redis安裝流程sql
wget http://download.redis.io/releases/redis-4.0.10.tar.gz tar -xvf redis-4.0.10.tar.gz cd redis-4.0.10 make make install nohup redis-server & 注:redis-server默認啓動端口是6379,沒有密碼 若是不使用默認配置文件,啓動時能夠加上配置文件 nohup redis-server /redis-2.8.17/redis.conf & redis-cli -p ###進入redis##指定端口
1.2.Redis 客戶端驗證數據庫
127.0.0.1:6379> ping PONG ##設置鍵值 127.0.0.1:6379> set var "hello word" OK ##獲取鍵值 127.0.0.1:6379> get var "hello word" ##刪除鍵值 127.0.0.1:6379> del var ##設定有效期 127.0.0.1:6379> setex var 10 "hello word" ##用EXPIRE key s 設定過時時間 毫秒用PEXPIRE 127.0.0.1:6379> EXPIRE test11 300 ###用TTL key 查看過時時間 毫秒用PTTL 127.0.0.1:6379> TTL test11 ###用PERSIST key 取消過時時間 127.0.0.1:6379> PERSIST test11
序號 Redis keys命令及描述 1 DEL key 該命令用於在 key 存在是刪除 key。 2 DUMP key 序列化給定 key ,並返回被序列化的值。 3 EXISTS key 檢查給定 key 是否存在。 4 EXPIRE key seconds 爲給定 key 設置過時時間。 5 EXPIREAT key timestamp EXPIREAT 的做用和 EXPIRE 相似,都用於爲 key 設置過時時間。 不一樣在於 EXPIREAT 命令接受的時間參數是 UNIX 時間戳(unix timestamp)。 6 PEXPIRE key milliseconds 設置 key 的過時時間億以毫秒計。 7 PEXPIREAT key milliseconds-timestamp 設置 key 過時時間的時間戳(unix timestamp) 以毫秒計 8 KEYS pattern 查找全部符合給定模式( pattern)的 key 。例如keys * 返回全部的key 9 MOVE key db 將當前數據庫的 key 移動到給定的數據庫 db 當中。 10 PERSIST key 移除 key 的過時時間,key 將持久保持。 11 PTTL key 以毫秒爲單位返回 key 的剩餘的過時時間。 12 TTL key 以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)。 13 RANDOMKEY 從當前數據庫中隨機返回一個 key 。 14 RENAME key newkey 修改 key 的名稱 15 RENAMENX key newkey 僅當 newkey 不存在時,將 key 更名爲 newkey 。 16 TYPE key 返回 key 所儲存的值的類型。
1.3.Redis關閉程序編程
redis-cli shutdown systemctl stop redis ####若是yum安裝的用啓動程序關閉 注:若是設置上密碼後,單純的redis-cli是關不掉的,必須加上ip、port、passwd redis-cli -h host -p port -a passwd shutdown
1.4.退出客戶端api
localhost:6379> QUIT
1.5.設立密碼,並訪問鏈接
緩存
打開redis.conf找到requirepass,去掉默認,修改 requirepass test111 nohup redis-server /data/ops/app/redis-4.0.10/redis.conf & ##指定配置文件 redis-cli -h 127.0.0.1 -p 6379 -a test111 ##當設置密碼後就得這樣輸入
auth test111
OK 若是想遠程機子訪問這個redis須要改配置文件redis.conf protected-mode no ##改成no #bind 127.0.0.1 ###註釋只本地訪問 ###改完重啓redis後就能夠訪問了 # redis-cli -h 10.240.17.103 -p 6379 -a test111 ##遠程訪問
1.6.查看redis數據統計信息
1.5 查看redis數據庫統計信息 在cli下執行info 相關含義: Mrds:6379> info # Server redis_version:2.8.19 ###redis版本號 redis_git_sha1:00000000 ###git SHA1 redis_git_dirty:0 ###git dirty flag redis_build_id:78796c63e58b72dc redis_mode:standalone ###redis運行模式 os:Linux 2.6.32-431.el6.x86_64 x86_64 ###os版本號 arch_bits:64 ###64位架構 multiplexing_api:epoll ###調用epoll算法 gcc_version:4.4.7 ###gcc版本號 process_id:25899 ###服務器進程PID run_id:eae356ac1098c13b68f2b00fd7e1c9f93b1c6a2c ###Redis的隨機標識符(用於sentinel和集羣) tcp_port:6379 ###Redis監聽的端口號 uptime_in_seconds:6419 ###Redis運行時長(s爲單位) uptime_in_days:0 ###Redis運行時長(天爲單位) hz:10 lru_clock:10737922 ###以分鐘爲單位的自增時鐘,用於LRU管理 config_file:/etc/redis/redis.conf ###redis配置文件 # Clients connected_clients:1 ###已鏈接客戶端的數量(不包括經過從屬服務器鏈接的客戶端) client_longest_output_list:0 ###當前鏈接的客戶端中最長的輸出列表 client_biggest_input_buf:0 ###當前鏈接的客戶端中最大的輸出緩存 blocked_clients:0 ###正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端的數量 需監控 # Memory used_memory:2281560 ###由 Redis 分配器分配的內存總量,以字節(byte)爲單位 used_memory_human:2.18M ###以更友好的格式輸出redis佔用的內存 used_memory_rss:2699264 ###從操做系統的角度,返回 Redis 已分配的內存總量(俗稱常駐集大小)。這個值和 top 、 ps 等命令的輸出一致 used_memory_peak:22141272 ### Redis 的內存消耗峯值(以字節爲單位) used_memory_peak_human:21.12M ###以更友好的格式輸出redis峯值內存佔用 used_memory_lua:35840 ###LUA引擎所使用的內存大小 mem_fragmentation_ratio:1.18 ###used_memory_rss 和 used_memory 之間的比率 mem_allocator:jemalloc-3.6.0 ###在理想狀況下, used_memory_rss 的值應該只比 used_memory 稍微高一點兒。當 rss > used ,且二者的值相差較大時,表示存在(內部或外部的)內存碎片。內存碎片的比率能夠經過 mem_fragmentation_ratio 的值看出。 當 used > rss 時,表示 Redis 的部份內存被操做系統換出到交換空間了,在這種狀況下,操做可能會產生明顯的延遲。 # Persistence loading:0 ###記錄服務器是否正在載入持久化文件 rdb_changes_since_last_save:0 ###距離最近一次成功建立持久化文件以後,通過了多少秒 rdb_bgsave_in_progress:0 ###記錄了服務器是否正在建立 RDB 文件 rdb_last_save_time:1420023749 ###最近一次成功建立 RDB 文件的 UNIX 時間戳 rdb_last_bgsave_status:ok ###最近一次建立 RDB 文件的結果是成功仍是失敗 rdb_last_bgsave_time_sec:0 ###最近一次建立 RDB 文件耗費的秒數 rdb_current_bgsave_time_sec:-1 ###若是服務器正在建立 RDB 文件,那麼這個域記錄的就是當前的建立操做已經耗費的秒數 aof_enabled:1 ###AOF 是否處於打開狀態 aof_rewrite_in_progress:0 ###服務器是否正在建立 AOF 文件 aof_rewrite_scheduled:0 ###RDB 文件建立完畢以後,是否須要執行預定的 AOF 重寫操做 aof_last_rewrite_time_sec:-1 ###最近一次建立 AOF 文件耗費的時長 aof_current_rewrite_time_sec:-1 ###若是服務器正在建立 AOF 文件,那麼這個域記錄的就是當前的建立操做已經耗費的秒數 aof_last_bgrewrite_status:ok ###最近一次建立 AOF 文件的結果是成功仍是失敗 aof_last_write_status:ok aof_current_size:176265 ###AOF 文件目前的大小 aof_base_size:176265 ###服務器啓動時或者 AOF 重寫最近一次執行以後,AOF 文件的大小 aof_pending_rewrite:0 ###是否有 AOF 重寫操做在等待 RDB 文件建立完畢以後執行 aof_buffer_length:0 ###AOF 緩衝區的大小 aof_rewrite_buffer_length:0 ###AOF 重寫緩衝區的大小 aof_pending_bio_fsync:0 ###後臺 I/O 隊列裏面,等待執行的 fsync 調用數量 aof_delayed_fsync:0 ###被延遲的 fsync 調用數量 # Stats total_connections_received:8466 ###服務器已接受的鏈接請求數量 total_commands_processed:900668 ###服務器已執行的命令數量 instantaneous_ops_per_sec:1 ###服務器每秒鐘執行的命令數量 total_net_input_bytes:82724170 total_net_output_bytes:39509080 instantaneous_input_kbps:0.07 instantaneous_output_kbps:0.02 rejected_connections:0 ###由於最大客戶端數量限制而被拒絕的鏈接請求數量 sync_full:2 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 ###由於過時而被自動刪除的數據庫鍵數量 evicted_keys:0 ###由於最大內存容量限制而被驅逐(evict)的鍵數量。 keyspace_hits:0 ###查找數據庫鍵成功的次數。 keyspace_misses:500000 ###查找數據庫鍵失敗的次數。 pubsub_channels:0 ###目前被訂閱的頻道數量 pubsub_patterns:0 ###目前被訂閱的模式數量 latest_fork_usec:402 ###最近一次 fork() 操做耗費的毫秒數 # Replication role:master ###若是當前服務器沒有在複製任何其餘服務器,那麼這個域的值就是 master ;不然的話,這個域的值就是 slave 。注意,在建立複製鏈的時候,一個從服務器也多是另外一個服務器的主服務器 connected_slaves:2 ###2個slaves slave0:ip=192.168.65.130,port=6379,state=online,offset=1639,lag=1 slave1:ip=192.168.65.129,port=6379,state=online,offset=1639,lag=0 master_repl_offset:1639 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:1638 # CPU used_cpu_sys:41.87 ###Redis 服務器耗費的系統 CPU used_cpu_user:17.82 ###Redis 服務器耗費的用戶 CPU used_cpu_sys_children:0.01 ###後臺進程耗費的系統 CPU used_cpu_user_children:0.01 ###後臺進程耗費的用戶 CPU # Keyspace db0:keys=3101,expires=0,avg_ttl=0 ###keyspace 部分記錄了數據庫相關的統計信息,好比數據庫的鍵數量、數據庫已經被刪除的過時鍵數量等。對於每一個數據庫,這個部分都會添加一行如下格式的信息
1.7 其餘命令
##查看記錄數 127.0.0.1:6379> dbsize ##查看全部KEY 127.0.0.1:6379> KEYS * ##列出全部客戶端鏈接 127.0.0.1:6379> CLIENT LIST ##關閉ip:port的客戶端 127.0.0.1:6379> CLIENT KILL 127.0.0.1:11902 ##清空全部數據庫的全部key 127.0.0.1:6379> FLUSHALL ##清空當前數據庫中全部key 127.0.0.1:6379> FLUSHDB ##返回最後一次成功保存數據到磁盤的時間,以UNIX時間戳格式表示 127.0.0.1:6379> LASTSAVE ##返回當前服務器時間,以UNIX時間戳格式表示 127.0.0.1:6379> TIME ##鏈接到其餘數據庫(默認數據庫是0) 127.0.0.1:6379> SELECT 1 ##將當前數據庫的 key 移動到指定的數據庫 127.0.0.1:6379> MOVE test2 1
1.8./etc/redis.conf
daemonize no 是否之後臺daemon方式運行 timeout 0 請求超時時間 maxclients 10000 最大鏈接數 maxmemory <bytes> 最大內存 maxmemory-policy volatile-lru 達到最大內存時的LRU驅逐策略 maxmemory-samples 3 隨機抽取n個key執行LRU hash-max-ziplist-entries 512 Map內部不超過多少個成員時會採用線性緊湊格式存儲 hash-max-ziplist-value 64 Map內成員值長度不超過多少字節會採用線性緊湊格式存儲 相似的還有,list-max-ziplist-entries 512,list-max-ziplist-value 64等等 slowlog-log-slower-than 10000 slow log計入時間,microseconds(1000000) slowlog-max-len 128 slow log計入條數
查看最大鏈接數 127.0.0.1:6379> config get maxclients 1) "maxclients" 2) "10000" 運行過程當中調整參數 127.0.0.1:6379> config set maxclients 10001
2.數據持久化
衆所周知,redis是內存數據庫,它把數據存儲在內存中,這樣在加快讀取速度的同時也對數據安全性產生了新的問題,即當redis所在服務器發生宕機後,redis數據庫裏的全部數據將會所有丟失。
爲了解決這個問題,redis提供了持久化功能——RDB和AOF。通俗的講就是將內存中的數據寫入硬盤中。
1、持久化之全量寫入:RDB
more redis.conf save 900 1 save 300 10 save 60 10000 dbfilename "dump.rdb" #持久化文件名稱 dir "/data/dbs/redis/6381" #持久化數據文件存放的路徑
上面是redis配置文件裏默認的RDB持久化設置,前三行都是對觸發RDB的一個條件,例如第一行的意思是每900秒鐘裏redis數據庫有一條數據被修改則觸發RDB,依次類推;只要有一條知足就會調用BGSAVE進行RDB持久化。第四行dbfilename指定了把內存裏的數據庫寫入本地文件的名稱,該文件是進行壓縮後的二進制文件,經過該文件能夠把數據庫還原到生成該文件時數據庫的狀態。第五行dir指定了RDB文件存放的目錄。
配置文件修改須要重啓redis服務,咱們還能夠在命令行裏進行配置,即時生效,服務器重啓後需從新配置
bin/redis-cli 127.0.0.1:6379> CONFIG GET save #查看redis持久化配置 1) "save" 2) "900 1 300 10 60 10000" 127.0.0.1:6379> CONFIG SET save "21600 1000" #修改redis持久化配置 OK
而RDB持久化也分兩種:SAVE和BGSAVE
SAVE是阻塞式的RDB持久化,當執行這個命令時redis的主進程把內存裏的數據庫狀態寫入到RDB文件(即上面的dump.rdb)中,直到該文件建立完畢的這段時間內redis將不能處理任何命令請求。
BGSAVE屬於非阻塞式的持久化,它會建立一個子進程專門去把內存中的數據庫狀態寫入RDB文件裏,同時主進程還能夠處理來自客戶端的命令請求。但子進程基本是複製的父進程,這等於兩個相同大小的redis進程在系統上運行,會形成內存使用率的大幅增長。
(本人在生產中就碰到過這問題,redis自己內存使用率就60%,總的內存使用率在百分之七八十左右,持久化的時候立馬飆到百分之一百三十多,告警郵件是天天幾十封/(ㄒoㄒ)/~~ 最後根據需求選擇了AOF持久化)
2、持久化之增量寫入:AOF
與RDB的保存整個redis數據庫狀態不一樣,AOF是經過保存對redis服務端的寫命令(如set、sadd、rpush)來記錄數據庫狀態的,即保存你對redis數據庫的寫操做,如下就是AOF文件的內容
1 [redis@iZ]$ more appendonly.aof 2 *2 3 $6 4 SELECT 5 $1 6 0 7 *3 8 $3 9 SET 10 $47 11 DEV_USER_LEGAL_F9683BE0E27F1A06C0CB869CEC7E3B22 12 $11 13 ¬ 14 *3 15 $3 16 SET 17 $47
先讓咱們看看如何配置AOF
1 [redis@iZ]$ more ~/redis/conf/redis.conf 2 dir "/data/dbs/redis/6381" #AOF文件存放目錄 3 appendonly yes #開啓AOF持久化,默認關閉 4 appendfilename "appendonly.aof" #AOF文件名稱(默認) 5 appendfsync no #AOF持久化策略 6 auto-aof-rewrite-percentage 100 #觸發AOF文件重寫的條件(默認) 7 auto-aof-rewrite-min-size 64mb #觸發AOF文件重寫的條件(默認)
要弄明白上面幾個配置就得從AOF的實現去理解,AOF的持久化是經過命令追加、文件寫入和文件同步三個步驟實現的。當reids開啓AOF後,服務端每執行一次寫操做(如set、sadd、rpush)就會把該條命令追加到一個單獨的AOF緩衝區的末尾,這就是命令追加;而後把AOF緩衝區的內容寫入AOF文件裏。看上去第二步就已經完成AOF持久化了那第三步是幹什麼的呢?這就須要從系統的文件寫入機制提及:通常咱們如今所使用的操做系統,爲了提升文件的寫入效率,都會有一個寫入策略,即當你往硬盤寫入數據時,操做系統不是實時的將數據寫入硬盤,而是先把數據暫時的保存在一個內存緩衝區裏,等到這個內存緩衝區的空間被填滿或者是超過了設定的時限後纔會真正的把緩衝區內的數據寫入硬盤中。也就是說當redis進行到第二步文件寫入的時候,從用戶的角度看是已經把AOF緩衝區裏的數據寫入到AOF文件了,但對系統而言只不過是把AOF緩衝區的內容放到了另外一個內存緩衝區裏而已,以後redis還須要進行文件同步把該內存緩衝區裏的數據真正寫入硬盤上纔算是完成了一次持久化。而什麼時候進行文件同步則是根據配置的appendfsync來進行:
appendfsync有三個選項:always、everysec和no:
一、選擇always的時候服務器會在每執行一個事件就把AOF緩衝區的內容強制性的寫入硬盤上的AOF文件裏,能夠當作你每執行一個redis寫入命令就往AOF文件裏記錄這條命令,這保證了數據持久化的完整性,但效率是最慢的,卻也是最安全的;
二、配置成everysec的話服務端每執行一次寫操做(如set、sadd、rpush)也會把該條命令追加到一個單獨的AOF緩衝區的末尾,並將AOF緩衝區寫入AOF文件,而後每隔一秒纔會進行一次文件同步把內存緩衝區裏的AOF緩存數據真正寫入AOF文件裏,這個模式兼顧了效率的同時也保證了數據的完整性,即便在服務器宕機也只會丟失一秒內對redis數據庫作的修改;
三、將appendfsync配置成no則意味redis數據庫裏的數據就算丟失你也能夠接受,它也會把每條寫命令追加到AOF緩衝區的末尾,而後寫入文件,但何時進行文件同步真正把數據寫入AOF文件裏則由系統自身決定,即當內存緩衝區的空間被填滿或者是超過了設定的時限後系統自動同步。這種模式下效率是最快的,但對數據來講也是最不安全的,若是redis裏的數據都是從後臺數據庫如mysql中取出來的,屬於隨時能夠找回或者不重要的數據,那麼能夠考慮設置成這種模式。
相比RDB每次持久化都會內存翻倍,AOF持久化除了在第一次啓用時會新開一個子進程建立AOF文件會大幅度消耗內存外,以後的每次持久化對內存使用都很小。但AOF也有一個不可忽視的問題:AOF文件過大。你對redis數據庫的每一次寫操做都會讓AOF文件裏增長一條數據,長此以往這個文件會造成一個龐然大物。還好的是redis提出了AOF重寫的機制,即咱們上面配置的auto-aof-rewrite-percentage和auto-aof-rewrite-min-size。AOF重寫機制這裏暫不細述,以後本人會另開博文對此解釋,有興趣的同窗能夠看看。咱們只要知道AOF重寫既是從新建立一個精簡化的AOF文件,裏面去掉了多餘的冗餘命令,並對原AOF文件進行覆蓋。這保證了AOF文件大小處於讓人能夠接受的地步。而上面的auto-aof-rewrite-percentage和auto-aof-rewrite-min-size配置觸發AOF重寫的條件。
Redis 會記錄上次重寫後AOF文件的文件大小,而當前AOF文件大小跟上次重寫後AOF文件大小的百分比超過auto-aof-rewrite-percentage設置的值,同時當前AOF文件大小也超過auto-aof-rewrite-min-size設置的最小值,則會觸發AOF文件重寫。以上面的配置爲例,當如今的AOF文件大於64mb同時也大於上次重寫AOF後的文件大小,則該文件就會被AOF重寫。
最後須要注意的是,若是redis開啓了AOF持久化功能,那麼當redis服務重啓時會優先使用AOF文件來還原數據庫。
Redis支持主從同步。數據能夠從主服務器向任意數量的從服務器上同步,同步使用的是發佈/訂閱機制。
Mater Slave的模式,從Slave向Master發起SYNC命令。
能夠是1 Master 多Slave,能夠分層,Slave下能夠再接Slave,可擴展成樹狀結構。
配置很是簡單,只需在slave的設定文件中指定master的ip和port
Master: test166
修改設定文件,服務綁定到ip上
1
2
|
# vi /etc/redis.conf
bind 10.86.255.166
|
重啓Redis
# systemctl restart redis
1
|
# less /etc/redis.conf
|
Slave: test167
修改設定文件,指定Master
1
2
3
|
slaveof <masterip> <masterport> 指定master的ip和port
masterauth <master-password> master有驗證的狀況下
slave-
read
-only
yes
設置slave爲只讀模式
|
也能夠用命令行設定:
1
2
|
redis 127.0.0.1:9999> slaveof localhost 6379
OK
|
Master:
1
2
3
4
5
6
|
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.86.255.167,port=6379,state=online,offset=309,lag=1
……
|
Slave:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.86.255.166
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:365
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
|
同期正常時:
master_link_status:up
master_repl_offset和slave_repl_offset相等,
master_last_io_seconds_ago在10秒內。
Master不可用的狀況下,中止Master,將Slave的設定無效化後,Slave升級爲Master
1
2
3
4
5
6
7
|
redis 127.0.0.1:9999> SLAVEOF NO ONE
OK
redis 127.0.0.1:9999> info
......
role:master
......
|
Slave按照repl-ping-slave-period的間隔(默認10秒),向Master發送ping。
若是主從間的連接中斷後,再次鏈接的時候,2.8之前按照full sync再同期。2.8之後,由於有backlog的設定,backlog存在master的內存裏,從新鏈接以前,若是redis沒有重啓,而且offset在backlog保存的範圍內,能夠實現從斷開地方同期,不符合這個條件,仍是full sync
用monitor命令,能夠看到slave在發送ping
1
2
3
|
127.0.0.1:6379> monitor
OK
1448515184.249169 [0 10.86.255.166:6379]
"PING"
|
2.8之後,能夠在設定文件中設置,Master只有當有N個Slave處於鏈接狀態時,接受寫操做
1
2
|
min-slaves-to-write 3
min-slaves-max-lag 10
|
redis-sentinel 能監視同期的狀態,發現Master down的時候,會進行failover,將Slave升級爲Master,啓動後會自動更新sentinel設定文件,發生failover時,會自動修改sentinel和redis的設定文件
環境:
Master: 10.86.255.167 :6379 sentinel:26379
Slave1: 10.86.255.166 :6379 sentinel:26379
Slave2: 10.86.255.167 :7379 sentinel:36379
Sentinel的設定文件在/etc/redis-sentinel.conf,對failover的動做等能夠進行一些定義,本次主要驗證Sentinel的動做,設定文件能夠根據具體狀況自行調整
參照上文設定Master,Slave,並確認Mater和2個Slave的同期狀態正常
1
2
3
|
# vi /etc/redis-sentinel.conf
daemonize
yes
sentinel monitor mymaster <master ip> 6379 2
|
啓動sentinel
1
2
3
|
# redis-sentinel /etc/redis-sentinel.conf
或
# redis-server /etc/redis-sentinel.conf --sentinel
|
確認
1
2
|
# redis-cli -p 26379
127.0.0.1:26379> INFO sentinel
|
確認Master信息
1
|
127.0.0.1:26379> sentinel masters
|
確認Slave信息
1
|
127.0.0.1:26379> sentinel slaves mymaster
|
在slave1上設定sentinel
1
2
3
|
# vi /etc/redis-sentinel.conf
daemonize
yes
sentinel monitor mymaster <master ip> 6379 2
|
啓動slave1
1
|
# redis-sentinel /etc/redis-sentinel.conf
|
在slave2上設定sentinel
1
2
3
4
|
# less /etc/redis-sentinel_36379.conf
daemonize
yes
port 36379
sentinel monitor mymaster <master ip> 6379 2
|
啓動slave2
1
|
# redis-sentinel /etc/redis-sentinel_36379.conf
|
中止Master
1
|
127.0.0.1:6379> SHUTDOWN
|
確認日誌發生fail over
1
|
# tail /var/log/redis/sentinel.log
|
確認Slave2變成Master,Slave1是Slave
1
|
test167:7379> info replication
|
1
|
test166:6379> info replication
|
啓動剛纔停掉的Master,確認變爲Slave
1
|
10.86.255.167:6379> info replication
|
1
2
3
4
5
6
|
127.0.0.1:26379> sentinel masters
127.0.0.1:26379> sentinel slaves mymaster
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
127.0.0.1:26379> SENTINEL reset mymaster
127.0.0.1:26379> SENTINEL failover mymaster
127.0.0.1:26379> SENTINEL flushconfig mymaster
|
daemonize yes pidfile /data/ops/app/redis-2.8.17_yunping_6381/redis.pid port 6381 tcp-backlog 20000 timeout 0 tcp-keepalive 0 loglevel notice logfile "/data/ops/app/redis-2.8.17_yunping_6381/redis.log" databases 16 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir ./ slave-serve-stale-data yes slave-read-only yes repl-disable-tcp-nodelay no slave-priority 100 maxmemory 2GB appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes rename-command CONFIG "" rename-command EVAL ""