redis--基礎以及--集羣架構

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文件來還原數據庫。

 

 

1. Redis主從同步

Redis支持主從同步。數據能夠從主服務器向任意數量的從服務器上同步,同步使用的是發佈/訂閱機制。

2. 配置主從同步

Mater Slave的模式,從Slave向Master發起SYNC命令。

能夠是1 Master 多Slave,能夠分層,Slave下能夠再接Slave,可擴展成樹狀結構。

2.1 配置Mater,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

2.2 同期狀況確認

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_ago10秒內。

2.3 Slave升級爲Master

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
......

2.4 Health Check

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.5 設置Master的寫行爲

2.8之後,能夠在設定文件中設置,Master只有當有N個Slave處於鏈接狀態時,接受寫操做

1
2
min-slaves-to-write 3
min-slaves-max-lag 10

3. Redis HA管理工具

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的動做,設定文件能夠根據具體狀況自行調整 

3.1 設定Master,Slave

參照上文設定Master,Slave,並確認Mater和2個Slave的同期狀態正常

3.2 Master上設定Sentinel

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

3.3 Slave上設定Sentinel

在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

3.4 動做確認

中止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

3.5 Sentinel命令

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 ""
生產環境
相關文章
相關標籤/搜索