久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

發布時間:2025/3/8 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Redis的集群方案大致有三種:1)redis cluster集群方案;2)master/slave主從方案;3)哨兵模式來進行主從替換以及故障恢復。

一、sentinel哨兵模式介紹
Sentinel(哨兵)是用于監控redis集群中Master狀態的工具,是Redis 的高可用性解決方案,sentinel哨兵模式已經被集成在redis2.4之后的版本中。sentinel是redis高可用的解決方案,sentinel系統可以監視一個或者多個redis master服務,以及這些master服務的所有從服務;當某個master服務下線時,自動將該master下的某個從服務升級為master服務替代已下線的master服務繼續處理請求。

sentinel可以讓redis實現主從復制,當一個集群中的master失效之后,sentinel可以選舉出一個新的master用于自動接替master的工作,集群中的其他redis服務器自動指向新的master同步數據。一般建議sentinel采取奇數臺,防止某一臺sentinel無法連接到master導致誤切換。其結構如下:

Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis做Master-slave的高可用方案時,假如master宕機了,Redis本身(包括它的很多客戶端)都沒有實現自動進行主備切換,而Redis-sentinel本身也是一個獨立運行的進程,它能監控多個master-slave集群,發現master宕機后能進行自動切換。Sentinel由一個或多個Sentinel 實例 組成的Sentinel 系統可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,并在被監視的主服務器進入下線狀態時,自動將下線主服務器屬下的某個從服務器升級為新的主服務器。

例如下圖所示:

在Server1 掉線后:

升級Server2 為新的主服務器:

Sentinel版本
Sentinel當前最新的穩定版本稱為Sentinel 2(與之前的Sentinel 1區分開來)。隨著redis2.8的安裝包一起發行。安裝完Redis2.8后,可以在redis2.8/src/里面找到Redis-sentinel的啟動程序。
強烈建議:如果你使用的是redis2.6(sentinel版本為sentinel 1),你最好應該使用redis2.8版本的sentinel 2,因為sentinel 1有很多的Bug,已經被官方棄用,所以強烈建議使用redis2.8以及sentinel 2。

Sentinel狀態持久化
snetinel的狀態會被持久化地寫入sentinel的配置文件中。每次當收到一個新的配置時,或者新創建一個配置時,配置會被持久化到硬盤中,并帶上配置的版本戳。這意味著,可以安全的停止和重啟sentinel進程。

Sentinel作用:?
1)Master狀態檢測?
2)如果Master異常,則會進行Master-Slave切換,將其中一個Slave作為Master,將之前的Master作為Slave。?
3)Master-Slave切換后,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換。

Sentinel工作方式(每個Sentinel實例都執行的定時任務)
1)每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發送一個PING命令。
2)如果一個實例(instance)距離最后一次有效回復PING命令的時間超過 own-after-milliseconds 選項所指定的值,則這個實例會被Sentinel標記為主觀下線。?
3)如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。?
4)當有足夠數量的Sentinel(大于等于配置文件指定的值)在指定的時間范圍內確認Master的確進入了主觀下線狀態,則Master會被標記為客觀下線。
5)在一般情況下,每個Sentinel 會以每10秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令。
6)當Master被Sentinel標記為客觀下線時,Sentinel 向下線的 Master 的所有Slave發送 INFO命令的頻率會從10秒一次改為每秒一次。?
7)若沒有足夠數量的Sentinel同意Master已經下線,Master的客觀下線狀態就會被移除。 若 Master重新向Sentinel 的PING命令返回有效回復,Master的主觀下線狀態就會被移除。

三個定時任務
sentinel在內部有3個定時任務
1)每10秒每個sentinel會對master和slave執行info命令,這個任務達到兩個目的:
a)發現slave節點
b)確認主從關系
2)每2秒每個sentinel通過master節點的channel交換信息(pub/sub)。master節點上有一個發布訂閱的頻道(__sentinel__:hello)。sentinel節點通過__sentinel__:hello頻道進行信息交換(對節點的"看法"和自身的信息),達成共識。
3)每1秒每個sentinel對其他sentinel和redis節點執行ping操作(相互監控),這個其實是一個心跳檢測,是失敗判定的依據。

主觀下線
所謂主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個Sentinel實例對服務器做出的下線判斷,即單個sentinel認為某個服務下線(有可能是接收不到訂閱,之間的網絡不通等等原因)。
主觀下線就是說如果服務器在down-after-milliseconds給定的毫秒數之內, 沒有返回 Sentinel 發送的 PING 命令的回復, 或者返回一個錯誤, 那么 Sentinel 將這個服務器標記為主觀下線(SDOWN )。
sentinel會以每秒一次的頻率向所有與其建立了命令連接的實例(master,從服務,其他sentinel)發ping命令,通過判斷ping回復是有效回復,還是無效回復來判斷實例時候在線(對該sentinel來說是“主觀在線”)。
sentinel配置文件中的down-after-milliseconds設置了判斷主觀下線的時間長度,如果實例在down-after-milliseconds毫秒內,返回的都是無效回復,那么sentinel回認為該實例已(主觀)下線,修改其flags狀態為SRI_S_DOWN。如果多個sentinel監視一個服務,有可能存在多個sentinel的down-after-milliseconds配置不同,這個在實際生產中要注意。

客觀下線
客觀下線(Objectively Down, 簡稱 ODOWN)指的是多個 Sentinel 實例在對同一個服務器做出 SDOWN 判斷, 并且通過 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服務器下線判斷,然后開啟failover。
客觀下線就是說只有在足夠數量的 Sentinel 都將一個服務器標記為主觀下線之后, 服務器才會被標記為客觀下線(ODOWN)。
只有當master被認定為客觀下線時,才會發生故障遷移。
當sentinel監視的某個服務主觀下線后,sentinel會詢問其它監視該服務的sentinel,看它們是否也認為該服務主觀下線,接收到足夠數量(這個值可以配置)的sentinel判斷為主觀下線,既任務該服務客觀下線,并對其做故障轉移操作。
sentinel通過發送 SENTINEL is-master-down-by-addr ip port current_epoch runid,(ip:主觀下線的服務id,port:主觀下線的服務端口,current_epoch:sentinel的紀元,runid:*表示檢測服務下線狀態,如果是sentinel 運行id,表示用來選舉領頭sentinel)來詢問其它sentinel是否同意服務下線。
一個sentinel接收另一個sentinel發來的is-master-down-by-addr后,提取參數,根據ip和端口,檢測該服務時候在該sentinel主觀下線,并且回復is-master-down-by-addr,回復包含三個參數:down_state(1表示已下線,0表示未下線),leader_runid(領頭sentinal id),leader_epoch(領頭sentinel紀元)。
sentinel接收到回復后,根據配置設置的下線最小數量,達到這個值,既認為該服務客觀下線。
客觀下線條件只適用于主服務器: 對于任何其他類型的 Redis 實例, Sentinel 在將它們判斷為下線前不需要進行協商, 所以從服務器或者其他 Sentinel 永遠不會達到客觀下線條件。只要一個 Sentinel 發現某個主服務器進入了客觀下線狀態, 這個 Sentinel 就可能會被其他 Sentinel 推選出, 并對失效的主服務器執行自動故障遷移操作。

在redis-sentinel的conf文件里有這么兩個配置:
1)sentinel monitor

四個參數含義:
masterName這個是對某個master+slave組合的一個區分標識(一套sentinel是可以監聽多套master+slave這樣的組合的)。
ip 和 port 就是master節點的 ip 和 端口號。
quorum這個參數是進行客觀下線的一個依據,意思是至少有 quorum 個sentinel主觀的認為這個master有故障,才會對這個master進行下線以及故障轉移。因為有的時候,某個sentinel節點可能因為自身網絡原因,導致無法連接master,而此時master并沒有出現故障,所以這就需要多個sentinel都一致認為該master有問題,才可以進行下一步操作,這就保證了公平性和高可用。

2)sentinel down-after-milliseconds
這個配置其實就是進行主觀下線的一個依據,masterName這個參數不用說了,timeout是一個毫秒值,表示:如果這臺sentinel超過timeout這個時間都無法連通master包括slave(slave不需要客觀下線,因為不需要故障轉移)的話,就會主觀認為該master已經下線(實際下線需要客觀下線的判斷通過才會下線)

那么,多個sentinel之間是如何達到共識的呢?
這就是依賴于前面說的第二個定時任務,某個sentinel先將master節點進行一個主觀下線,然后會將這個判定通過sentinel is-master-down-by-addr這個命令問對應的節點是否也同樣認為該addr的master節點要做客觀下線。最后當達成這一共識的sentinel個數達到前面說的quorum設置的這個值時,就會對該master節點下線進行故障轉移。quorum的值一般設置為sentinel個數的二分之一加1,例如3個sentinel就設置2。

主觀下線(SDOWN)和客觀下線(ODOWN)的更多細節
sentinel對于不可用有兩種不同的看法,一個叫主觀不可用(SDOWN),另外一個叫客觀不可用(ODOWN)。SDOWN是sentinel自己主觀上檢測到的關于master的狀態,ODOWN需要一定數量的sentinel達成一致意見才能認為一個master客觀上已經宕掉,各個sentinel之間通過命令SENTINEL is_master_down_by_addr來獲得其它sentinel對master的檢測結果。
從sentinel的角度來看,如果發送了PING心跳后,在一定時間內沒有收到合法的回復,就達到了SDOWN的條件。這個時間在配置中通過is-master-down-after-milliseconds參數配置。
當sentinel發送PING后,以下回復之一都被認為是合法的:
PING replied with +PONG.
PING replied with -LOADING error.
PING replied with -MASTERDOWN error.
其它任何回復(或者根本沒有回復)都是不合法的。

從SDOWN切換到ODOWN不需要任何一致性算法,只需要一個gossip協議:如果一個sentinel收到了足夠多的sentinel發來消息告訴它某個master已經down掉了,SDOWN狀態就會變成ODOWN狀態。如果之后master可用了,這個狀態就會相應地被清理掉。
正如之前已經解釋過了,真正進行failover需要一個授權的過程,但是所有的failover都開始于一個ODOWN狀態。
ODOWN狀態只適用于master,對于不是master的redis節點sentinel之間不需要任何協商,slaves和sentinel不會有ODOWN狀態。

配置版本號
為什么要先獲得大多數sentinel的認可時才能真正去執行failover呢?
當一個sentinel被授權后,它將會獲得宕掉的master的一份最新配置版本號,當failover執行結束以后,這個版本號將會被用于最新的配置。因為大多數sentinel都已經知道該版本號已經被要執行failover的sentinel拿走了,所以其他的sentinel都不能再去使用這個版本號。這意味著,每次failover都會附帶有一個獨一無二的版本號。我們將會看到這樣做的重要性。而且,sentinel集群都遵守一個規則:如果sentinel A推薦sentinel B去執行failover,B會等待一段時間后,自行再次去對同一個master執行failover,這個等待的時間是通過failover-timeout配置項去配置的。從這個規則可以看出,sentinel集群中的sentinel不會再同一時刻并發去failover同一個master,第一個進行failover的sentinel如果失敗了,另外一個將會在一定時間內進行重新進行failover,以此類推。
redis sentinel保證了活躍性:如果大多數sentinel能夠互相通信,最終將會有一個被授權去進行failover.
redis sentinel也保證了安全性:每個試圖去failover同一個master的sentinel都會得到一個獨一無二的版本號。

配置傳播
一旦一個sentinel成功地對一個master進行了failover,它將會把關于master的最新配置通過廣播形式通知其它sentinel,其它的sentinel則更新對應master的配置。
一個faiover要想被成功實行,sentinel必須能夠向選為master的slave發送SLAVEOF NO ONE命令,然后能夠通過INFO命令看到新master的配置信息。
當將一個slave選舉為master并發送SLAVEOF NO ONE后,即使其它的slave還沒針對新master重新配置自己,failover也被認為是成功了的,然后所有sentinels將會發布新的配置信息。
新配在集群中相互傳播的方式,就是為什么我們需要當一個sentinel進行failover時必須被授權一個版本號的原因。
每個sentinel使用##發布/訂閱##的方式持續地傳播master的配置版本信息,配置傳播的##發布/訂閱##管道是:__sentinel__:hello。
因為每一個配置都有一個版本號,所以以版本號最大的那個為標準。

舉個例子:
假設有一個名為mymaster的地址為192.168.10.202:6379。一開始,集群中所有的sentinel都知道這個地址,于是為mymaster的配置打上版本號1。一段時候后mymaster死了,有一個sentinel被授權用版本號2對其進行failover。如果failover成功了,假設地址改為了192.168.10.202:9000,此時配置的版本號為2,進行failover的sentinel會將新配置廣播給其他的sentinel,由于其他sentinel維護的版本號為1,發現新配置的版本號為2時,版本號變大了,說明配置更新了,于是就會采用最新的版本號為2的配置。
這意味著sentinel集群保證了第二種活躍性:一個能夠互相通信的sentinel集群最終會采用版本號最高且相同的配置。

sentinel的"仲裁會"
前面我們談到,當一個master被sentinel集群監控時,需要為它指定一個參數,這個參數指定了當需要判決master為不可用,并且進行failover時,所需要的sentinel數量,可以稱這個參數為票數

不過,當failover主備切換真正被觸發后,failover并不會馬上進行,還需要sentinel中的大多數sentinel授權后才可以進行failover。
當ODOWN時,failover被觸發。failover一旦被觸發,嘗試去進行failover的sentinel會去獲得“大多數”sentinel的授權(如果票數比大多數還要大的時候,則詢問更多的sentinel)
這個區別看起來很微妙,但是很容易理解和使用。例如,集群中有5個sentinel,票數被設置為2,當2個sentinel認為一個master已經不可用了以后,將會觸發failover,但是,進行failover的那個sentinel必須先獲得至少3個sentinel的授權才可以實行failover。
如果票數被設置為5,要達到ODOWN狀態,必須所有5個sentinel都主觀認為master為不可用,要進行failover,那么得獲得所有5個sentinel的授權。

選舉領頭sentinel(即領導者選舉)
一個redis服務被判斷為客觀下線時,多個監視該服務的sentinel協商,選舉一個領頭sentinel,對該redis服務進行故障轉移操作。選舉領頭sentinel遵循以下規則:
1)所有的sentinel都有公平被選舉成領頭的資格。
2)所有的sentinel都有且只有一次將某個sentinel選舉成領頭的機會(在一輪選舉中),一旦選舉某個sentinel為領頭,不能更改。
3)sentinel設置領頭sentinel是先到先得,一旦當前sentinel設置了領頭sentinel,以后要求設置sentinel為領頭請求都會被拒絕。
4)每個發現服務客觀下線的sentinel,都會要求其他sentinel將自己設置成領頭。
5)當一個sentinel(源sentinel)向另一個sentinel(目sentinel)發送is-master-down-by-addr ip port current_epoch runid命令的時候,runid參數不是*,而是sentinel運行id,就表示源sentinel要求目標sentinel選舉其為領頭。
6)源sentinel會檢查目標sentinel對其要求設置成領頭的回復,如果回復的leader_runid和leader_epoch為源sentinel,表示目標sentinel同意將源sentinel設置成領頭。
7)如果某個sentinel被半數以上的sentinel設置成領頭,那么該sentinel既為領頭。
8)如果在限定時間內,沒有選舉出領頭sentinel,暫定一段時間,再選舉。

為什么要選領導者?
簡單來說,就是因為只能有一個sentinel節點去完成故障轉移。
sentinel is-master-down-by-addr這個命令有兩個作用,一是確認下線判定,二是進行領導者選舉。
選舉過程:
1)每個做主觀下線的sentinel節點向其他sentinel節點發送上面那條命令,要求將它設置為領導者。
2)收到命令的sentinel節點如果還沒有同意過其他的sentinel發送的命令(還未投過票),那么就會同意,否則拒絕。
3)如果該sentinel節點發現自己的票數已經過半且達到了quorum的值,就會成為領導者
4)如果這個過程出現多個sentinel成為領導者,則會等待一段時間重新選舉。

Redis Sentinel的主從切換方案
Redis 2.8版開始正式提供名為Sentinel的主從切換方案,通俗的來講,Sentinel可以用來管理多個Redis服務器實例,可以實現一個功能上實現HA的集群,Sentinel主要負責三個方面的任務
1)監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
2)提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
3)自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級為新的主服務器, 并讓失效主服務器的其他從服務器改為復制新的主服務器; 當客戶端試圖連接失效的主服務器時, 集群也會向客戶端返回新主服務器的地址, 使得集群可以使用新主服務器代替失效服務器。

Redis Sentinel 是一個分布式系統, 可以在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossip protocols)來接收關于主服務器是否下線的信息, 并使用投票協議(agreement protocols)來決定是否執行自動故障遷移, 以及選擇哪個從服務器作為新的主服務器。
一個簡單的主從結構加sentinel集群的架構圖如下:

上圖是一主一從節點,加上兩個部署了sentinel的集群,sentinel集群之間會互相通信,溝通交流redis節點的狀態,做出相應的判斷并進行處理,這里的主觀下線狀態和客觀下線狀態是比較重要的狀態,它們決定了是否進行故障轉移
可以 通過訂閱指定的頻道信息,當服務器出現故障得時候通知管理員
客戶端可以將 Sentinel 看作是一個只提供了訂閱功能的 Redis 服務器,你不可以使用 PUBLISH 命令向這個服務器發送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通過訂閱給定的頻道來獲取相應的事件提醒。 一個頻道能夠接收和這個頻道的名字相同的事件。 比如說, 名為 +sdown 的頻道就可以接收所有實例進入主觀下線(SDOWN)狀態的事件。

個人認為,Sentinel實現的最主要的一個功能就是能做到自動故障遷移,即當某一個master掛了的時候,可以自動的將某一個slave提升為新的master,且原master的所有slave也都自動的將自己的master改為新提升的master,這樣我們的程序的可用性大大提高了。只要redis安裝完成,Sentinel就安裝完成了,Sentinel集成在redis里了。

Sentinel支持集群(可以部署在多臺機器上,也可以在一臺物理機上通過多端口實現偽集群部署)
很顯然,只使用單個sentinel進程來監控redis集群是不可靠的,當sentinel進程宕掉后(sentinel本身也有單點問題,single-point-of-failure)整個集群系統將無法按照預期的方式運行。所以有必要將sentinel集群,這樣有幾個好處:
1)即使有一些sentinel進程宕掉了,依然可以進行redis集群的主備切換;
2)如果只有一個sentinel進程,如果這個進程運行出錯,或者是網絡堵塞,那么將無法實現redis集群的主備切換(單點問題);
3)如果有多個sentinel,redis的客戶端可以隨意地連接任意一個sentinel來獲得關于redis集群中的信息。

sentinel集群注意事項
1)只有Sentinel 集群中大多數服務器認定master主觀下線時master才會被認定為客觀下線,才可以進行故障遷移,也就是說,即使不管我們在sentinel monitor中設置的數是多少,就算是滿足了該值,只要達不到大多數,就不會發生故障遷移。
2)官方建議sentinel至少部署三臺,且分布在不同機器。這里主要考慮到sentinel的可用性,假如我們只部署了兩臺sentinel,且quorum設置為1,也可以實現自動故障遷移,但假如其中一臺sentinel掛了,就永遠不會觸發自動故障遷移,因為永遠達不到大多數sentinel認定master主觀下線了。
3)sentinel monitor配置中的master IP盡量不要寫127.0.0.1或localhost,因為客戶端,如jedis獲取master是根據這個獲取的,若這樣配置,jedis獲取的ip則是127.0.0.1,這樣就可能導致程序連接不上master
4)當sentinel 啟動后會自動的修改sentinel.conf文件,如已發現的master的slave信息,和集群中其它sentinel 的信息等,這樣即使重啟sentinel也能保持原來的狀態。注意,當集群服務器調整時,如更換sentinel的機器,或者新配置一個sentinel,請不要直接復制原來運行過得sentinel配置文件,因為其里面自動生成了以上說的那些信息,我們應該復制一個新的配置文件或者把自動生成的信息給刪掉。
5)當發生故障遷移的時候,master的變更記錄與slave更換master的修改會自動同步到redis的配置文件,這樣即使重啟redis也能保持變更后的狀態。

每個 Sentinel 都需要定期執行的任務
每個 Sentinel 以每秒鐘一次的頻率向它所知的主服務器、從服務器以及其他 Sentinel 實例發送一個 PING 命令。
如果一個實例(instance)距離最后一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那么這個實例會被 Sentinel 標記為主觀下線。 一個有效回復可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
如果一個主服務器被標記為主觀下線, 那么正在監視這個主服務器的所有 Sentinel 要以每秒一次的頻率確認主服務器的確進入了主觀下線狀態。
如果一個主服務器被標記為主觀下線, 并且有足夠數量的 Sentinel (至少要達到配置文件指定的數量)在指定的時間范圍內同意這一判斷, 那么這個主服務器被標記為客觀下線。
在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有主服務器和從服務器發送 INFO 命令。 當一個主服務器被 Sentinel 標記為客觀下線時, Sentinel 向下線主服務器的所有從服務器發送 INFO 命令的頻率會從 10 秒一次改為每秒一次。
當沒有足夠數量的 Sentinel 同意主服務器已經下線, 主服務器的客觀下線狀態就會被移除。 當主服務器重新向 Sentinel 的PING 命令返回有效回復時, 主服務器的主管下線狀態就會被移除。

Sentinel之間和Slaves之間的自動發現機制
雖然sentinel集群中各個sentinel都互相連接彼此來檢查對方的可用性以及互相發送消息。但是你不用在任何一個sentinel配置任何其它的sentinel的節點。因為sentinel利用了master的發布/訂閱機制去自動發現其它也監控了統一master的sentinel節點。
通過向名為__sentinel__:hello的管道中發送消息來實現。
同樣,你也不需要在sentinel中配置某個master的所有slave的地址,sentinel會通過詢問master來得到這些slave的地址的。
每個sentinel通過向每個master和slave的發布/訂閱頻道__sentinel__:hello每秒發送一次消息,來宣布它的存在。
每個sentinel也訂閱了每個master和slave的頻道__sentinel__:hello的內容,來發現未知的sentinel,當檢測到了新的sentinel,則將其加入到自身維護的master監控列表中。
每個sentinel發送的消息中也包含了其當前維護的最新的master配置。如果某個sentinel發現
自己的配置版本低于接收到的配置版本,則會用新的配置更新自己的master配置。
在為一個master添加一個新的sentinel前,sentinel總是檢查是否已經有sentinel與新的sentinel的進程號或者是地址是一樣的。如果是那樣,這個sentinel將會被刪除,而把新的sentinel添加上去。

sentinel和redis身份驗證
當一個master配置為需要密碼才能連接時,客戶端和slave在連接時都需要提供密碼。
master通過requirepass設置自身的密碼,不提供密碼無法連接到這個master。
slave通過masterauth來設置訪問master時的密碼。
但是當使用了sentinel時,由于一個master可能會變成一個slave,一個slave也可能會變成master,所以需要同時設置上述兩個配置項。

Sentinel API
在默認情況下, Sentinel 使用 TCP 端口 26379 (普通 Redis 服務器使用的是 6379 )。Sentinel 接受 Redis 協議格式的命令請求, 所以你可以使用 redis-cli 或者任何其他 Redis 客戶端來與 Sentinel 進行通訊。有兩種方式可以和 Sentinel 進行通訊:
1)是通過直接發送命令來查詢被監視 Redis 服務器的當前狀態, 以及 Sentinel 所知道的關于其他 Sentinel 的信息, 諸如此類。
2)是使用發布與訂閱功能, 通過接收 Sentinel 發送的通知: 當執行故障轉移操作, 或者某個被監視的服務器被判斷為主觀下線或者客觀下線時, Sentinel 就會發送相應的信息。

Sentinel命令(即登錄到sentinel節點后執行的命令,比如執行"redis-cli -h 192.168.10.203 -p 26379"命令后,才可以執行下面命令)
PING?:返回 PONG 。
SENTINEL masters?:列出所有被監視的主服務器,以及這些主服務器的當前狀態;
SENTINEL slaves ?:列出給定主服務器的所有從服務器,以及這些從服務器的當前狀態;
SENTINEL get-master-addr-by-name ?: 返回給定名字的主服務器的 IP 地址和端口號。 如果這個主服務器正在執行故障轉移操作, 或者針對這個主服務器的故障轉移操作已經完成, 那么這個命令返回新的主服務器的 IP 地址和端口號;
SENTINEL reset ?: 重置所有名字和給定模式 pattern 相匹配的主服務器。 pattern 參數是一個 Glob 風格的模式。 重置操作清楚主服務器目前的所有狀態, 包括正在執行中的故障轉移, 并移除目前已經發現和關聯的, 主服務器的所有從服務器和 Sentinel ;
SENTINEL failover ?: 當主服務器失效時, 在不詢問其他 Sentinel 意見的情況下, 強制開始一次自動故障遷移。?(不過發起故障轉移的 Sentinel 會向其他 Sentinel 發送一個新的配置,其他 Sentinel 會根據這個配置進行相應的更新)

SENTINEL MONITOR ?這個命令告訴sentinel去監聽一個新的master
SENTINEL REMOVE ?命令sentinel放棄對某個master的監聽
SENTINEL SET ?這個命令很像Redis的CONFIG SET命令,用來改變指定master的配置。支持多個。例如以下實例:SENTINEL SET objects-cache-master down-after-milliseconds 1000
只要是配置文件中存在的配置項,都可以用SENTINEL SET命令來設置。這個還可以用來設置master的屬性,比如說quorum(票數),而不需要先刪除master,再重新添加master。例如:SENTINEL SET objects-cache-master quorum 5

客戶端可以通過SENTINEL get-master-addr-by-name 獲取當前的主服務器IP地址和端口號,以及SENTINEL slaves 獲取所有的Slaves信息。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

[root@redis-master ~]# redis-cli -h 192.168.10.202 -p 6379 INFO|grep role

role:slave

[root@redis-master ~]# redis-cli -h 192.168.10.203 -p 6379 INFO|grep role

role:slave

[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 6379 INFO|grep role

role:master

登錄任意一個節點的sentinel,進行相關命令的操作(下面命令例子中的redisMaster是sentinel監控redis主從狀態時定義的master名稱)

1)sentinel masters?? 羅列所有sentinel 監視相關的master

[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379

192.168.10.205:26379> sentinel masters

2)sentinel master masterName?? 列出一個master相關的的信息

[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379

192.168.10.205:26379> sentinel master redisMaster

3)sentinel slaves masterName?? 列出一個master相應的slave組相關的數據

[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379

192.168.10.205:26379> sentinel slaves redisMaster

4)sentinel sentinels masterName?? 列出master相關的sentinels組其他相關的信息

[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379

192.168.10.205:26379> sentinel sentinels redisMaster

5)sentinel get-master-addr-by-name masterName?? 獲取master-name相關的 ip addr 的信息

[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379

192.168.10.205:26379> sentinel get-master-addr-by-name redisMaster

1)?"192.168.10.205"

2)?"6379"

增加或刪除Sentinel
由于有sentinel自動發現機制,所以添加一個sentinel到你的集群中非常容易,你所需要做的只是監控到某個Master上,然后新添加的sentinel就能獲得其他sentinel的信息以及master所有的slaves。
如果你需要添加多個sentinel,建議你一個接著一個添加,這樣可以預防網絡隔離帶來的問題。你可以每個30秒添加一個sentinel。最后你可以用SENTINEL MASTER mastername來檢查一下是否所有的sentinel都已經監控到了master。
刪除一個sentinel顯得有點復雜:因為sentinel永遠不會刪除一個已經存在過的sentinel,即使它已經與組織失去聯系很久了。
要想刪除一個sentinel,應該遵循如下步驟:
1)停止所要刪除的sentinel
2)發送一個SENTINEL RESET * 命令給所有其它的sentinel實例,如果你想要重置指定master上面的sentinel,只需要把*號改為特定的名字,注意,需要一個接一個發,每次發送的間隔不低于30秒。
3)檢查一下所有的sentinels是否都有一致的當前sentinel數。使用SENTINEL MASTER mastername 來查詢。

刪除舊master或者不可達slave
sentinel永遠會記錄好一個Master的slaves,即使slave已經與組織失聯好久了。這是很有用的,因為sentinel集群必須有能力把一個恢復可用的slave進行重新配置。
并且,failover后,失效的master將會被標記為新master的一個slave,這樣的話,當它變得可用時,就會從新master上復制數據。
然后,有時候你想要永久地刪除掉一個slave(有可能它曾經是個master),你只需要發送一個SENTINEL RESET master命令給所有的sentinels,它們將會更新列表里能夠正確地復制master數據的slave。

發布與訂閱信息(sentinel的日志文件里可以看到這些信息)
客戶端可以將 Sentinel 看作是一個只提供了訂閱功能的 Redis 服務器: 你不可以使用 PUBLISH 命令向這個服務器發送信息, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通過訂閱給定的頻道來獲取相應的事件提醒。

一個頻道能夠接收和這個頻道的名字相同的事件。 比如說, 名為 +sdown 的頻道就可以接收所有實例進入主觀下線(SDOWN)狀態的事件。

通過執行 "PSUBSCRIBE * "命令可以接收所有事件信息(即訂閱所有消息)。

以下列出的是客戶端可以通過訂閱來獲得的頻道和信息的格式: 第一個英文單詞是頻道/事件的名字, 其余的是數據的格式。

注意, 當格式中包含 instance details 字樣時, 表示頻道所返回的信息中包含了以下用于識別目標實例的內容.

以下是所有可以收到的消息的消息格式,如果你訂閱了所有消息的話。第一個單詞是頻道的名字,其它是數據的格式。
注意:以下的instance details的格式是:
@
如果這個redis實例是一個master,那么@之后的消息就不會顯示。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

+reset-master -- 當master被重置時.

????+slave -- 當檢測到一個slave并添加進slave列表時.

????+failover-state-reconf-slaves -- Failover狀態變為reconf-slaves狀態時

????+failover-detected -- 當failover發生時

????+slave-reconf-sent -- sentinel發送SLAVEOF命令把它重新配置時

????+slave-reconf-inprog -- slave被重新配置為另外一個master的slave,但數據復制還未發生時。

????+slave-reconf-done? -- slave被重新配置為另外一個master的slave并且數據復制已經與master同步時。

????-dup-sentinel -- 刪除指定master上的冗余sentinel時 (當一個sentinel重新啟動時,可能會發生這個事件).

????+sentinel -- 當master增加了一個sentinel時。

????+sdown -- 進入SDOWN狀態時;

????-sdown -- 離開SDOWN狀態時。

????+odown -- 進入ODOWN狀態時。

????-odown -- 離開ODOWN狀態時。

????+new-epoch -- 當前配置版本被更新時。

????+try-failover -- 達到failover條件,正等待其他sentinel的選舉。

????+elected-leader -- 被選舉為去執行failover的時候。

????+failover-state-select-slave -- 開始要選擇一個slave當選新master時。

????no-good-slave -- 沒有合適的slave來擔當新master

????selected-slave -- 找到了一個適合的slave來擔當新master

????failover-state-send-slaveof-noone -- 當把選擇為新master的slave的身份進行切換的時候。

????failover-end-for-timeout -- failover由于超時而失敗時。

????failover-end -- failover成功完成時。

????switch-master -- 當master的地址發生變化時。通常這是客戶端最感興趣的消息了。

????+tilt -- 進入Tilt模式。

????-tilt -- 退出Tilt模式。

可以看出,使用Sentinel命令和發布訂閱兩種機制就能很好的實現和客戶端的集成整合:
使用get-master-addr-by-name和slaves指令可以獲取當前的Master和Slaves的地址和信息;而當發生故障轉移時,即Master發生切換,可以通過訂閱的+switch-master事件獲得最新的Master信息。

sentinel.conf中的notification-script
在sentinel.conf中可以配置多個sentinel notification-script , 如sentinel notification-script mymaster ./check.sh
這個是在群集failover時會觸發執行指定的腳本。腳本的執行結果若為1,即稍后重試(最大重試次數為10);若為2,則執行結束。并且腳本最大執行時間為60秒,超時會被終止執行。

目前會存在該腳本被執行多次的問題,網上查找資料獲得的解釋是:腳本分為兩個級別, SENTINEL_LEADER 和 SENTINEL_OBSERVER ,前者僅由領頭 Sentinel 執行(一個 Sentinel),而后者由監視同一個 master 的所有 Sentinel 執行(多個 Sentinel)。

無failover時的配置糾正
即使當前沒有failover正在進行,sentinel依然會使用當前配置去設置監控的master。特別是:
1)根據最新配置確認為slaves的節點卻聲稱自己是master(上文例子中被網絡隔離后的的redis3),這時它們會被重新配置為當前master的slave。
2)如果slaves連接了一個錯誤的master,將會被改正過來,連接到正確的master。

Slave選舉與優先級
當一個sentinel準備好了要進行failover,并且收到了其他sentinel的授權,那么就需要選舉出一個合適的slave來做為新的master。

slave的選舉主要會評估slave的以下幾個方面:
1)與master斷開連接的次數
2)Slave的優先級
3)數據復制的下標(用來評估slave當前擁有多少master的數據)
4)進程ID

如果一個slave與master失去聯系超過10次,并且每次都超過了配置的最大失聯時間(down-after-milliseconds),如果sentinel在進行failover時發現slave失聯,那么這個slave就會被sentinel認為不適合用來做新master的。
更嚴格的定義是,如果一個slave持續斷開連接的時間超過
(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state
就會被認為失去選舉資格。

符合上述條件的slave才會被列入master候選人列表,并根據以下順序來進行排序:
1)sentinel首先會根據slaves的優先級來進行排序,優先級越小排名越靠前。
2)如果優先級相同,則查看復制的下標,哪個從master接收的復制數據多,哪個就靠前。
3)如果優先級和下標都相同,就選擇進程ID較小的那個。

一個redis無論是master還是slave,都必須在配置中指定一個slave優先級。要注意到master也是有可能通過failover變成slave的。
如果一個redis的slave優先級配置為0,那么它將永遠不會被選為master。但是它依然會從master哪里復制數據。

故障轉移
所謂故障轉移就是當master宕機,選一個合適的slave來晉升為master的操作,redis-sentinel會自動完成這個,不需要我們手動來實現。

一次故障轉移操作大致分為以下流程:
發現主服務器已經進入客觀下線狀態。
對我們的當前集群進行自增, 并嘗試在這個集群中當選。
如果當選失敗, 那么在設定的故障遷移超時時間的兩倍之后, 重新嘗試當選。 如果當選成功, 那么執行以下步驟:
選出一個從服務器,并將它升級為主服務器。
向被選中的從服務器發送 SLAVEOF NO ONE 命令,讓它轉變為主服務器。
通過發布與訂閱功能, 將更新后的配置傳播給所有其他 Sentinel , 其他 Sentinel 對它們自己的配置進行更新。
向已下線主服務器的從服務器發送 SLAVEOF 命令, 讓它們去復制新的主服務器。
當所有從服務器都已經開始復制新的主服務器時, 領頭 Sentinel 終止這次故障遷移操作。
每當一個 Redis 實例被重新配置(reconfigured) —— 無論是被設置成主服務器、從服務器、又或者被設置成其他主服務器的從服務器 —— Sentinel 都會向被重新配置的實例發送一個 CONFIG REWRITE 命令, 從而確保這些配置會持久化在硬盤里。

Sentinel 使用以下規則來選擇新的主服務器:
在失效主服務器屬下的從服務器當中, 那些被標記為主觀下線、已斷線、或者最后一次回復 PING 命令的時間大于五秒鐘的從服務器都會被淘汰。
在失效主服務器屬下的從服務器當中, 那些與失效主服務器連接斷開的時長超過 down-after 選項指定的時長十倍的從服務器都會被淘汰。
在經歷了以上兩輪淘汰之后剩下來的從服務器中, 我們選出復制偏移量(replication offset)最大的那個從服務器作為新的主服務器; 如果復制偏移量不可用, 或者從服務器的復制偏移量相同, 那么帶有最小運行 ID 的那個從服務器成為新的主服務器。

Sentinel 自動故障遷移的一致性特質
Sentinel 自動故障遷移使用 Raft 算法來選舉領頭(leader) Sentinel , 從而確保在一個給定的紀元(epoch)里, 只有一個領頭產生。

這表示在同一個紀元中, 不會有兩個 Sentinel 同時被選中為領頭, 并且各個 Sentinel 在同一個紀元中只會對一個領頭進行投票。

更高的配置紀元總是優于較低的紀元, 因此每個 Sentinel 都會主動使用更新的紀元來代替自己的配置。

簡單來說, 可以將 Sentinel 配置看作是一個帶有版本號的狀態。 一個狀態會以最后寫入者勝出(last-write-wins)的方式(也即是,最新的配置總是勝出)傳播至所有其他 Sentinel 。

舉個例子, 當出現網絡分割(network partitions)時, 一個 Sentinel 可能會包含了較舊的配置, 而當這個 Sentinel 接到其他 Sentinel 發來的版本更新的配置時, Sentinel 就會對自己的配置進行更新。

如果要在網絡分割出現的情況下仍然保持一致性, 那么應該使用 min-slaves-to-write 選項, 讓主服務器在連接的從實例少于給定數量時停止執行寫操作, 與此同時, 應該在每個運行 Redis 主服務器或從服務器的機器上運行 Redis Sentinel 進程。

Sentinel 狀態的持久化
Sentinel 的狀態會被持久化在 Sentinel 配置文件里面。每當 Sentinel 接收到一個新的配置, 或者當領頭 Sentinel 為主服務器創建一個新的配置時, 這個配置會與配置紀元一起被保存到磁盤里面。這意味著停止和重啟 Sentinel 進程都是安全的。

Sentinel 在非故障遷移的情況下對實例進行重新配置
即使沒有自動故障遷移操作在進行, Sentinel 總會嘗試將當前的配置設置到被監視的實例上面。 特別是:

根據當前的配置, 如果一個從服務器被宣告為主服務器, 那么它會代替原有的主服務器, 成為新的主服務器, 并且成為原有主服務器的所有從服務器的復制對象。
那些連接了錯誤主服務器的從服務器會被重新配置, 使得這些從服務器會去復制正確的主服務器。
不過, 在以上這些條件滿足之后, Sentinel 在對實例進行重新配置之前仍然會等待一段足夠長的時間, 確保可以接收到其他 Sentinel 發來的配置更新, 從而避免自身因為保存了過期的配置而對實例進行了不必要的重新配置。

總結來說,故障轉移分為三個步驟:

1)從下線的主服務的所有從服務里面挑選一個從服務,將其轉成主服務
sentinel狀態數據結構中保存了主服務的所有從服務信息,領頭sentinel按照如下的規則從從服務列表中挑選出新的主服務;
刪除列表中處于下線狀態的從服務;
刪除最近5秒沒有回復過領頭sentinel info信息的從服務;
刪除與已下線的主服務斷開連接時間超過 down-after-milliseconds*10毫秒的從服務,這樣就能保留從的數據比較新(沒有過早的與主斷開連接);
領頭sentinel從剩下的從列表中選擇優先級高的,如果優先級一樣,選擇偏移量最大的(偏移量大說明復制的數據比較新),如果偏移量一樣,選擇運行id最小的從服務。

2)已下線主服務的所有從服務改為復制新的主服務
挑選出新的主服務之后,領頭sentinel 向原主服務的從服務發送 slaveof 新主服務 的命令,復制新master。

3)將已下線的主服務設置成新的主服務的從服務,當其回復正常時,復制新的主服務,變成新的主服務的從服務
同理,當已下線的服務重新上線時,sentinel會向其發送slaveof命令,讓其成為新主的從。

溫馨提示:還可以向任意sentinel發生sentinel failover 進行手動故障轉移,這樣就不需要經過上述主客觀和選舉的過程。

sentinel.conf文件配置參數解釋

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

1)sentinel monitor mymaster 192.168.10.202 6379 2

Sentine監聽的maste地址,第一個參數是給master起的名字,第二個參數為master IP,第三個為master端口,第四個為當該master掛了的時候,若想將該master判為失效,

在Sentine集群中必須至少2個Sentine同意才行,只要該數量不達標,則就不會發生故障遷移。也就是說只要有2個sentinel認為master下線,就認為該master客觀下線,

啟動failover并選舉產生新的master。通常最后一個參數不能多于啟動的sentinel實例數。

這個配置是sentinel需要監控的master/slaver信息,格式為sentinel monitor ?

其中應該小于集群中slave的個數,當失效的節點數超過了,則認為整個體系結構失效

不過要注意, 無論你設置要多少個 Sentinel 同意才能判斷一個服務器失效, 一個 Sentinel 都需要獲得系統中多數(majority) Sentinel 的支持, 才能發起一次自動故障遷移,

并預留一個給定的配置紀元 (configuration Epoch ,一個配置紀元就是一個新主服務器配置的版本號)。

??

換句話說, 在只有少數(minority) Sentinel 進程正常運作的情況下, Sentinel 是不能執行自動故障遷移的。

-----------------------------------------------------------------------------------------------

2)sentinel down-after-milliseconds mymaster 30000

表示master被當前sentinel實例認定為失效的間隔時間。

master在多長時間內一直沒有給Sentine返回有效信息,則認定該master主觀下線。也就是說如果多久沒聯系上redis-servevr,認為這個redis-server進入到失效(SDOWN)狀態。

??

如果服務器在給定的毫秒數之內, 沒有返回 Sentinel 發送的 PING 命令的回復, 或者返回一個錯誤, 那么 Sentinel 將這個服務器標記為主觀下線(subjectively down,簡稱 SDOWN )。

不過只有一個 Sentinel 將服務器標記為主觀下線并不一定會引起服務器的自動故障遷移: 只有在足夠數量的 Sentinel 都將一個服務器標記為主觀下線之后, 服務器才會被標記為客觀下線

(objectively down, 簡稱 ODOWN ), 這時自動故障遷移才會執行。

將服務器標記為客觀下線所需的 Sentinel 數量由對主服務器的配置決定。

-----------------------------------------------------------------------------------------------

3)sentinel parallel-syncs mymaster 2

當在執行故障轉移時,設置幾個slave同時進行切換master,該值越大,則可能就有越多的slave在切換master時不可用,可以將該值設置為1,即一個一個來,這樣在某個

slave進行切換master同步數據時,其余的slave還能正常工作,以此保證每次只有一個從服務器處于不能處理命令請求的狀態。

??

parallel-syncs 選項指定了在執行故障轉移時, 最多可以有多少個從服務器同時對新的主服務器進行同步, 這個數字越小, 完成故障轉移所需的時間就越長。

??

如果從服務器被設置為允許使用過期數據集(參見對 redis.conf 文件中對 slave-serve-stale-data 選項的說明), 那么你可能不希望所有從服務器都在同一時間向新的主服務器發送同步請求,

因為盡管復制過程的絕大部分步驟都不會阻塞從服務器, 但從服務器在載入主服務器發來的 RDB 文件時, 仍然會造成從服務器在一段時間內不能處理命令請求: 如果全部從服務器一起對新的主

服務器進行同步, 那么就可能會造成所有從服務器在短時間內全部不可用的情況出現。

當新master產生時,同時進行"slaveof"到新master并進行"SYNC"的slave個數。?

默認為1,建議保持默認值?

在salve執行salveof與同步時,將會終止客戶端請求。?

此值較大,意味著"集群"終止客戶端請求的時間總和和較大。?

此值較小,意味著"集群"在故障轉移期間,多個salve向客戶端提供服務時仍然使用舊數據。?

-----------------------------------------------------------------------------------------------

4)sentinel can-failover mymaster?yes

在sentinel檢測到O_DOWN后,是否對這臺redis啟動failover機制

-----------------------------------------------------------------------------------------------

5)sentinel auth-pass mymaster 20180408

設置sentinel連接的master和slave的密碼,這個需要和redis.conf文件中設置的密碼一樣

-----------------------------------------------------------------------------------------------

6)sentinel failover-timeout mymaster 180000

failover過期時間,當failover開始后,在此時間內仍然沒有觸發任何failover操作,當前sentinel將會認為此次failoer失敗。?

執行故障遷移超時時間,即在指定時間內沒有大多數的sentinel 反饋master下線,該故障遷移計劃則失效

-----------------------------------------------------------------------------------------------

7)sentinel config-epoch mymaster 0

選項指定了在執行故障轉移時, 最多可以有多少個從服務器同時對新的主服務器進行同步。這個數字越小, 完成故障轉移所需的時間就越長。

-----------------------------------------------------------------------------------------------

8)sentinel notification-script mymaster?/var/redis/notify.sh

當failover時,可以指定一個"通知"腳本用來告知當前集群的情況。

腳本被允許執行的最大時間為60秒,如果超時,腳本將會被終止(KILL)

-----------------------------------------------------------------------------------------------

9)sentinel leader-epoch mymaster 0

同時一時間最多0個slave可同時更新配置,建議數字不要太大,以免影響正常對外提供服務。

基于以上細節知識梳理,總結出sentinel的工作原理

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

首先要能理解SDOWN和ODOWN這兩個詞的含義,上面已經詳細介紹了它們倆。在此再提一下:

SDOWN:subjectively down,直接翻譯的為"主觀"失效,即當前sentinel實例認為某個redis服務為"不可用"狀態.

ODOWN:objectively down,直接翻譯為"客觀"失效,即多個sentinel實例都認為master處于"SDOWN"狀態,那么此時master將處于ODOWN,ODOWN可以簡單理解為master已經被集群確定

為"不可用",將會開啟failover.

SDOWN適合于master和slave,但是ODOWN只會使用于master;當slave失效超過"down-after-milliseconds"后,那么所有sentinel實例都會將其標記為"SDOWN"。

1) SDOWN與ODOWN轉換過程:

每個sentinel實例在啟動后,都會和已知的slaves/master以及其他sentinels建立TCP連接,并周期性發送PING(默認為1秒)

在交互中,如果redis-server無法在"down-after-milliseconds"時間內響應或者響應錯誤信息,都會被認為此redis-server處于SDOWN狀態。

如果SDOWN的server為master,那么此時sentinel實例將會向其他sentinel間歇性(一秒)發送"is-master-down-by-addr "指令并獲取響應信息,如果足夠多的

sentinel實例檢測到master處于SDOWN,那么此時當前sentinel實例標記master為ODOWN...其他sentinel實例做同樣的交互操作。

配置項"sentinel monitor ",如果檢測到master處于SDOWN狀態的slave個數達到,那么此時此sentinel實例將會認為

master處于ODOWN。每個sentinel實例將會間歇性(10秒)向master和slaves發送"INFO"指令,如果master失效且沒有新master選出時,每1秒發送一次"INFO";"INFO"的主要目的就是

獲取并確認當前集群環境中slaves和master的存活情況。

經過上述過程后,所有的sentinel對master失效達成一致后,開始failover.

2) Sentinel與slaves"自動發現"機制:

在sentinel的配置文件中(local-sentinel.conf),都指定了port,此port就是sentinel實例偵聽其他sentinel實例建立鏈接的端口.在集群穩定后,最終會每個sentinel實例之間都

會建立一個tcp鏈接,此鏈接中發送"PING"以及類似于"is-master-down-by-addr"指令集,可用用來檢測其他sentinel實例的有效性以及"ODOWN"和"failover"過程中信息的交互.

在sentinel之間建立連接之前,sentinel將會盡力和配置文件中指定的master建立連接.sentinel與master的連接中的通信主要是基于pub/sub來發布和接收信息,發布的信息內容包

括當前sentinel實例的偵聽端口:

+sentinel sentinel 127.0.0.1:26579 127.0.0.1 26579 ....?

發布的主題名稱為"__sentinel__:hello";同時sentinel實例也是"訂閱"此主題,以獲得其他sentinel實例的信息.由此可見,環境首次構建時,在默認master存活的情況下,所有的

sentinel實例可以通過pub/sub即可獲得所有的sentinel信息,此后每個sentinel實例即可以根據+sentinel信息中的"ip+port"和其他sentinel逐個建立tcp連接即可.不過需要提醒

的是,每個sentinel實例均會間歇性(5秒)向"__sentinel__:hello"主題中發布自己的ip+port,目的就是讓后續加入集群的sentinel實例也能或得到自己的信息。

根據上文,我們知道在master有效的情況下,即可通過"INFO"指令獲得當前master中已有的slave列表;此后任何slave加入集群,master都會向"主題中"發布"+slave 127.0.0.1:6579 ..",

那么所有的sentinel也將立即獲得slave信息,并和slave建立鏈接并通過PING檢測其存活性.

補充一下,每個sentinel實例都會保存其他sentinel實例的列表以及現存的master/slaves列表,各自的列表中不會有重復的信息(不可能出現多個tcp連接),對于sentinel將使用ip+port

做唯一性標記,

對于master/slaver將使用runid做唯一性標記,其中redis-server的runid在每次啟動時都不同.

3) Leader選舉:

其實在sentinels故障轉移中,仍然需要一個"Leader"來調度整個過程:master的選舉以及slave的重配置和同步。當集群中有多個sentinel實例時,如何選舉其中一個sentinel為leader呢?

在配置文件中"can-failover""quorum"參數,以及"is-master-down-by-addr"指令配合來完成整個過程。

A)?"can-failover"用來表明當前sentinel是否可以參與"failover"過程,如果為"YES"則表明它將有能力參與"Leader"的選舉,否則它將作為"Observer",observer參與leader選舉投票但

不能被選舉;

B)?"quorum"不僅用來控制master ODOWN狀態確認,同時還用來選舉leader時最小"贊同票"數;

C)?"is-master-down-by-addr",它可以用來檢測"ip + port"的master是否已經處于SDOWN狀態,不過此指令不僅能夠獲得master是否處于SDOWN,同時它還額外的返回當前sentinel

本地"投票選舉"的Leader信息(runid);

每個sentinel實例都持有其他的sentinels信息,在Leader選舉過程中(當為leader的sentinel實例失效時,有可能master server并沒失效,注意分開理解),sentinel實例將從所有的

sentinels集合中去除"can-failover = no"和狀態為SDOWN的sentinels,在剩余的sentinels列表中按照runid按照"字典"順序排序后,取出runid最小的sentinel實例,并將它"投票選舉"

為Leader,并在其他sentinel發送的"is-master-down-by-addr"指令時將推選的runid追加到響應中。每個sentinel實例都會檢測"is-master-down-by-addr"的響應結果,如果"投票選舉"的

leader為自己,且狀態正常的sentinels實例中,"贊同者"的自己的sentinel個數不小于(>=) 50% + 1,且不小與,那么此sentinel就會認為選舉成功且leader為自己。

在sentinel.conf文件中,我們期望有足夠多的sentinel實例配置"can-failover yes",這樣能夠確保當leader失效時,能夠選舉某個sentinel為leader,以便進行failover。如果leader無法產生,

比如較少的sentinels實例有效,那么failover過程將無法繼續.

4) failover過程:

在Leader觸發failover之前,首先wait數秒(隨即0~5),以便讓其他sentinel實例準備和調整(有可能多個leader??),如果一切正常,那么leader就需要開始將一個salve提升為master,此slave

必須為狀態良好(不能處于SDOWN/ODOWN狀態)且權重值最低(redis.conf中)的,當master身份被確認后,開始failover

A)"+failover-triggered": Leader開始進行failover,此后緊跟著"+failover-state-wait-start",wait數秒。

B)"+failover-state-select-slave": Leader開始查找合適的slave

C)"+selected-slave": 已經找到合適的slave

D)?"+failover-state-sen-slaveof-noone": Leader向slave發送"slaveof no one"指令,此時slave已經完成角色轉換,此slave即為master

E)?"+failover-state-wait-promotition": 等待其他sentinel確認slave

F)"+promoted-slave":確認成功

G)"+failover-state-reconf-slaves": 開始對slaves進行reconfig操作。

H)"+slave-reconf-sent":向指定的slave發送"slaveof"指令,告知此slave跟隨新的master

I)"+slave-reconf-inprog": 此slave正在執行slaveof + SYNC過程,如過slave收到"+slave-reconf-sent"之后將會執行slaveof操作。

J)"+slave-reconf-done": 此slave同步完成,此后leader可以繼續下一個slave的reconfig操作。循環G)

K)"+failover-end": 故障轉移結束

L)"+switch-master":故障轉移成功后,各個sentinel實例開始監控新的master。

二、redis sentinel 主從切換(failover)的容災環境部署記錄

redis主從復制簡單來說:
A)Redis的復制功能是支持多個數據庫之間的數據同步。一類是主數據庫(master)一類是從數據庫(slave),主數據庫可以進行讀寫操作,當發生寫操作的時候自動將數據同步到從數據庫,而從數據庫一般是只讀的,并接收主數據庫同步過來的數據,一個主數據庫可以有多個從數據庫,而一個從數據庫只能有一個主數據庫。
B)通過redis的復制功能可以很好的實現數據庫的讀寫分離,提高服務器的負載能力。主數據庫主要進行寫操作,而從數據庫負責讀操作。

Redis主從復制流程簡圖

redis主從復制的大致過程:
1)當一個從數據庫啟動時,會向主數據庫發送sync命令,
2)主數據庫接收到sync命令后會開始在后臺保存快照(執行rdb操作),并將保存期間接收到的命令緩存起來
3)當快照完成后,redis會將快照文件和所有緩存的命令發送給從數據庫。
4)從數據庫收到后,會載入快照文件并執行收到的緩存的命令。

注意:redis2.8之前的版本:當主從數據庫同步的時候從數據庫因為網絡原因斷開重連后會重新執行上述操作,不支持斷點續傳。redis2.8之后支持斷點續傳。

0)Redis主從結構支持一主多從+n個sentinel模式,信息如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

192.168.10.202?? redis-master??? redis(6379)、sentinel(26379)

192.168.10.203?? redis-slave01?? redis(6379)、sentinel(26379)

192.168.10.205?? redis-slave02?? redis(6379)、sentinel(26379)?

??

關閉三個節點機器的iptables和selinux(所有節點機器上都要操作)

[root@redis-master ~]# /etc/init.d/iptables stop

[root@redis-master ~]# vim /etc/sysconfig/selinux

......

SELINUX=disabled

[root@redis-master ~]# setenforce 0

[root@redis-master ~]# getenforce

Permissive

??

注意:本案例采用1主2從+3 sentinel的集群模式,所有從節點的配置都一樣。

a)redis服務器上各自存在一個Sentinel,監控本機redis的運行情況,并通知給閉路環上其它的redis節點;
b)當master發生異常(例如:宕機和斷電等)導致不可運行時,Sentinel將通知給其它節點,而剩余節點上的Sentinel將重新選舉出新的master,而原來的master重新恢復正常后,則一直扮演slave角色;
c)規定整個架構體系中,master提供讀寫服務,而slave只提供讀取服務。

1)redis一鍵安裝(三個節點上都要操作)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

[root@redis-master ~]# cd /usr/local/src/

[root@redis-master src]# vim install_redis.sh

#!/usr/bin/env bash

# It's Used to be install redis.

# Created on 2018/04/08 11:18.

# @author: wangshibo.

# Version: 1.0

???

function?install_redis () {

#################################################################################################

????????cd?/usr/local/src

????????if?[ ! -f?" redis-4.0.1.tar.gz"?];?then

???????????wget http://download.redis.io/releases/redis-4.0.1.tar.gz

????????fi

????????cd?/usr/local/src

????????tar?-zxvf?/usr/local/src/redis-4.0.1.tar.gz

????????cd?redis-4.0.1

????????make?PREFIX=/usr/local/redis?install

????????mkdir?-p?/usr/local/redis/{etc,var}

????????rsync?-avz redis.conf??/usr/local/redis/etc/

????????sed?-i?'s@pidfile.*@pidfile /var/run/redis-server.pid@'?/usr/local/redis/etc/redis.conf

????????sed?-i?"s@logfile.*@logfile /usr/local/redis/var/redis.log@"?/usr/local/redis/etc/redis.conf

????????sed?-i?"s@^dir.*@dir /usr/local/redis/var@"?/usr/local/redis/etc/redis.conf

????????sed?-i?'s/daemonize no/daemonize yes/g'?/usr/local/redis/etc/redis.conf

????????sed?-i?'s/^# bind 127.0.0.1/bind 0.0.0.0/g'?/usr/local/redis/etc/redis.conf

?#################################################################################################

}

???

install_redis

[root@redis-master src]# chmod 755 install_redis.sh

[root@redis-master src]# sh -x install_redis.sh

2)redis啟停腳本(三個節點上都要操作)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

[root@redis-master src]# vim /etc/init.d/redis-server

#!/bin/bash

#

# redis - this script starts and stops the redis-server daemon

#

# chkconfig:?? - 85 15

# description:? Redis is a persistent key-value database

# processname: redis-server

# config:????? /usr/local/redis/etc/redis.conf

# config:????? /etc/sysconfig/redis

# pidfile:???? /usr/local/redis/var/redis-server.pid

??

# Source function library.

.?/etc/rc.d/init.d/functions

??

# Source networking configuration.

.?/etc/sysconfig/network

??

# Check that networking is up.

[?"$NETWORKING"?=?"no"?] &&?exit?0

??

redis="/usr/local/redis/bin/redis-server"

prog=$(basename?$redis)

??

REDIS_CONF_FILE="/usr/local/redis/etc/redis.conf"

??

[ -f?/etc/sysconfig/redis?] && .?/etc/sysconfig/redis

??

lockfile=/var/lock/subsys/redis-server

??

start() {

????[ -x $redis ] ||?exit?5

????[ -f $REDIS_CONF_FILE ] ||?exit?6

????echo?-n $"Starting $prog: "

????daemon $redis $REDIS_CONF_FILE

????retval=$?

????echo

????[ $retval -eq?0 ] &&?touch?$lockfile

????return?$retval

}

??

stop() {

????echo?-n $"Stopping $prog: "

????killproc $prog

????retval=$?

????echo

????[ $retval -eq?0 ] &&?rm?-f $lockfile

????return?$retval

}

??

restart() {

????stop

????start

}

??

reload() {

????echo?-n $"Reloading $prog: "

????killproc $redis -HUP

????RETVAL=$?

????echo

}

??

force_reload() {

????restart

}

??

rh_status() {

????status $prog

}

??

rh_status_q() {

????rh_status >/dev/null?2>&1

}

??

case?"$1"?in

????start)

????????rh_status_q &&?exit?0

????????$1

????????;;

????stop)

????????rh_status_q ||?exit?0

????????$1

????????;;

????restart)

????????$1

????????;;

????reload)

????????rh_status_q ||?exit?7

????????$1

????????;;

????force-reload)

????????force_reload

????????;;

????status)

????????rh_status

????????;;

????condrestart|try-restart)

????????rh_status_q ||?exit?0

????????????;;

????*)

????????echo?$"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"

????????exit?2

esac

執行權限

[root@redis-master src]# chmod 755 /etc/init.d/redis-server

3)redis-sentinel啟停腳本示例(三個節點上都要操作)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

[root@redis-master src]# vim /etc/init.d/redis-sentinel

#!/bin/bash

#

# redis-sentinel - this script starts and stops the redis-server sentinel daemon

#

# chkconfig:?? - 85 15

# description:? Redis sentinel

# processname: redis-server

# config:????? /usr/local/redis/etc/sentinel.conf

# config:????? /etc/sysconfig/redis

# pidfile:???? /usr/local/redis/var/redis-sentinel.pid

??

# Source function library.

.?/etc/rc.d/init.d/functions

??

# Source networking configuration.

.?/etc/sysconfig/network

??

# Check that networking is up.

[?"$NETWORKING"?=?"no"?] &&?exit?0

??

redis="/usr/local/redis/bin/redis-sentinel"

prog=$(basename?$redis)

??

REDIS_CONF_FILE="/usr/local/redis/etc/sentinel.conf"

??

[ -f?/etc/sysconfig/redis?] && .?/etc/sysconfig/redis

??

lockfile=/var/lock/subsys/redis-sentinel

??

start() {

????[ -x $redis ] ||?exit?5

????[ -f $REDIS_CONF_FILE ] ||?exit?6

????echo?-n $"Starting $prog: "

????daemon $redis $REDIS_CONF_FILE --sentinel

????retval=$?

????echo

????[ $retval -eq?0 ] &&?touch?$lockfile

????return?$retval

}

??

stop() {

????echo?-n $"Stopping $prog: "

????killproc $prog

????retval=$?

????echo

????[ $retval -eq?0 ] &&?rm?-f $lockfile

????return?$retval

}

??

restart() {

????stop

????start

}

??

reload() {

????echo?-n $"Reloading $prog: "

????killproc $redis -HUP

????RETVAL=$?

????echo

}

??

force_reload() {

????restart

}

??

rh_status() {

????status $prog

}

??

rh_status_q() {

????rh_status >/dev/null?2>&1

}

??

case?"$1"?in

????start)

????????rh_status_q &&?exit?0

????????$1

????????;;

????stop)

????????rh_status_q ||?exit?0

????????$1

????????;;

????restart)

????????$1

????????;;

????reload)

????????rh_status_q ||?exit?7

????????$1

????????;;

????force-reload)

????????force_reload

????????;;

????status)

????????rh_status

????????;;

????condrestart|try-restart)

????????rh_status_q ||?exit?0

????????????;;

????*)

????????echo?$"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"

????????exit?2

esac

執行權限:

[root@redis-master src]# chmod 755 /etc/init.d/redis-sentinel

4)配置redis.conf

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

a)編輯redis-master主節點的redis.conf文件

[root@redis-master src]# mkdir -p /usr/local/redis/data/redis

[root@redis-master src]# cp /usr/local/redis/etc/redis.conf /usr/local/redis/etc/redis.conf.bak

[root@redis-master src]# vim /usr/local/redis/etc/redis.conf

bind 0.0.0.0

daemonize?yes

pidfile?"/usr/local/redis/var/redis-server.pid"

port 6379

tcp-backlog 128

timeout 0

tcp-keepalive 0

loglevel notice

logfile?"/usr/local/redis/var/redis-server.log"

databases 16

save 900 1??

save 300 10

save 60 10000

stop-writes-on-bgsave-error?yes

rdbcompression?yes

rdbchecksum?yes

dbfilename dump.rdb

dir?"/usr/local/redis/data/redis"

#masterauth "20180408"??????????????????????? #master設置密碼保護,即slave連接master時的密碼

#requirepass "20180408"?????????????????????? #設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH 命令提供密碼,默認關閉

slave-serve-stale-data?yes

slave-read-only?yes

repl-diskless-sync?no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

appendonly?yes????????????????????????????????#打開aof持久化

appendfilename?"appendonly.aof"

appendfsync everysec??????????????????????????# 每秒一次aof寫

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

注意:

上面配置中masterauth和requirepass表示設置密碼保護,如果設置了密碼,則連接redis后需要執行"auth 20180408"密碼后才能操作其他命令。這里我不設置密碼。

b)編輯redis-slave01和redis-slave02兩個從節點的redis.conf文件

[root@redis-slave01 src]# mkdir -p /usr/local/redis/data/redis

[root@redis-slave01 src]# cp /usr/local/redis/etc/redis.conf /usr/local/redis/etc/redis.conf.bak

[root@redis-slave01 src]# vim /usr/local/redis/etc/redis.conf

bind 0.0.0.0

daemonize?yes

pidfile?"/usr/local/redis/var/redis-server.pid"

port 6379

tcp-backlog 128

timeout 0

tcp-keepalive 0

loglevel notice

logfile?"/usr/local/redis/var/redis-server.log"

databases 16

save 900 1??

save 300 10

save 60 10000

stop-writes-on-bgsave-error?yes

rdbcompression?yes

rdbchecksum?yes

dbfilename dump.rdb

dir?"/usr/local/redis/data/redis"

#masterauth "20180408"???????????????

#requirepass "20180408"??????

slaveof 192.168.10.202 6379??????????????????#相對主redis配置,多添加了此行???????

slave-serve-stale-data?yes

slave-read-only?yes??????????????????????????#從節點只讀,不能寫入

repl-diskless-sync?no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

appendonly?yes???????????????????????????

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

5)配置sentinel.conf(這個默認沒有,需要自建)。三個節點的配置一樣。

1

2

3

4

5

6

7

8

9

10

11

12

[root@redis-master src]# mkdir -p /usr/local/redis/data/sentinel

[root@redis-master src]# vim /usr/local/redis/etc/sentinel.conf

port 26379

pidfile?"/usr/local/redis/var/redis-sentinel.pid"

dir?"/usr/local/redis/data/sentinel"

daemonize?yes

protected-mode no

logfile?"/usr/local/redis/var/redis-sentinel.log"

sentinel monitor redisMaster 192.168.10.202 6379 2?

sentinel down-after-milliseconds redisMaster 10000?

sentinel parallel-syncs redisMaster 1

sentinel failover-timeout redisMaster 60000?

6)啟動redis和sentinel(三個節點都要操作)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

設置系統變量

[root@redis-slave02 src]# vim /etc/profile

.......

export?PATH=$PATH:/usr/local/redis/bin

[root@redis-slave02 src]# source /etc/profile

啟動redis和sentinel

[root@redis-master src]# /etc/init.d/redis-server start

Starting redis-server:???????????????????????????????????? [? OK? ]

[root@redis-master src]# /etc/init.d/redis-sentinel start

Starting redis-sentinel:?????????????????????????????????? [? OK? ]

[root@redis-master src]# lsof -i:6379

COMMAND??? PID USER?? FD?? TYPE? DEVICE SIZE/OFF?NODE NAME

redis-ser 2297 root??? 6u? IPv4 7819726????? 0t0? TCP *:6379 (LISTEN)

redis-ser 2297 root??? 8u? IPv4 7819778????? 0t0? TCP 192.168.10.202:6379->192.168.10.202:56226 (ESTABLISHED)

redis-ser 2297 root??? 9u? IPv4 7819780????? 0t0? TCP 192.168.10.202:6379->192.168.10.202:56228 (ESTABLISHED)

redis-sen 2315 root??? 8u? IPv4 7819777????? 0t0? TCP 192.168.10.202:56226->192.168.10.202:6379 (ESTABLISHED)

redis-sen 2315 root??? 9u? IPv4 7819779????? 0t0? TCP 192.168.10.202:56228->192.168.10.202:6379 (ESTABLISHED)

[root@redis-master src]# lsof -i:26379

COMMAND??? PID USER?? FD?? TYPE? DEVICE SIZE/OFF?NODE NAME

redis-sen 2315 root??? 6u? IPv6 7819772????? 0t0? TCP *:26379 (LISTEN)

redis-sen 2315 root??? 7u? IPv4 7819773????? 0t0? TCP *:26379 (LISTEN)

7)查看redis和sentinel信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

1)查看三個節點的redis的主從關系

[root@redis-master src]# redis-cli -h 192.168.10.202 -p 6379 INFO|grep role

role:master

[root@redis-master src]# redis-cli -h 192.168.10.203 -p 6379 INFO|grep role

role:slave

[root@redis-master src]# redis-cli -h 192.168.10.205 -p 6379 INFO|grep role

role:slave

??

從上面信息可以看出,192.168.10.202是master,192.168.10.203和192.168.10.205是slave

??

2)查看Master節點信息:

[root@redis-master src]# redis-cli -h 192.168.10.202 -p 6379 info Replication

# Replication

role:master

connected_slaves:2

slave0:ip=192.168.10.203,port=6379,state=online,offset=61480,lag=0

slave1:ip=192.168.10.205,port=6379,state=online,offset=61480,lag=0

master_replid:96a1fd63d0ad9e7903851a82382e32d690667bcc

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:61626

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:61626

??

從上面信息看出,此時192.168.10.202的角色為master,有兩個slave(203和205)被連接成功.

??

此時打開master的sentinel.conf,在末尾可看到如下自動寫入的內容:

[root@redis-master src]# cat /usr/local/redis/etc/sentinel.conf

port 26379

pidfile?"/usr/local/redis/var/redis-sentinel.pid"

dir?"/usr/local/redis/data/sentinel"

daemonize?yes

protected-mode no

logfile?"/usr/local/redis/var/redis-sentinel.log"

sentinel myid c165761901b5ea3cd2d622bbf13f4c99eb73c1bc

sentinel monitor redisMaster 192.168.10.202 6379 2

sentinel down-after-milliseconds redisMaster 10000

sentinel failover-timeout redisMaster 60000

# Generated by CONFIG REWRITE

sentinel config-epoch redisMaster 0

sentinel leader-epoch redisMaster 0

sentinel known-slave redisMaster 192.168.10.203 6379

sentinel known-slave redisMaster 192.168.10.205 6379

sentinel known-sentinel redisMaster 192.168.10.205 26379 cc25d5f0e37803e888732d63deae3761c9f91e1d

sentinel known-sentinel redisMaster 192.168.10.203 26379 e1505ffc65f787871febfde2f27b762f70cddd71

sentinel current-epoch 0

??

[root@redis-master ~]# redis-cli -h 192.168.10.205 -p 26379 info Sentinel

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

sentinel_simulate_failure_flags:0

master0:name=redisMaster,status=ok,address=192.168.10.202:6379,slaves=2,sentinels=3

3)查看Slave節點信息:

??

先查看salve01節點信息

[root@redis-slave01 src]# redis-cli -h 192.168.10.203 -p 6379 info Replication

# Replication

role:slave

master_host:192.168.10.202

master_port:6379

master_link_status:up

master_last_io_seconds_ago:0

master_sync_in_progress:0

slave_repl_offset:96744

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:96a1fd63d0ad9e7903851a82382e32d690667bcc

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:96744

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:96744

??

此時192.168.10.203的角色為slave,它們所屬的master為220。

此時打開slave的sentinel.conf,在末尾可看到如下自動寫入的內容:

[root@redis-slave01 src]# cat /usr/local/redis/etc/sentinel.conf

port 26379

pidfile?"/usr/local/redis/var/redis-sentinel.pid"

dir?"/usr/local/redis/data/sentinel"

daemonize?yes

protected-mode no

logfile?"/usr/local/redis/var/redis-sentinel.log"

sentinel myid e1505ffc65f787871febfde2f27b762f70cddd71

sentinel monitor redisMaster 192.168.10.202 6379 2

sentinel down-after-milliseconds redisMaster 10000

sentinel failover-timeout redisMaster 60000

# Generated by CONFIG REWRITE

sentinel config-epoch redisMaster 0

sentinel leader-epoch redisMaster 0

sentinel known-slave redisMaster 192.168.10.203 6379

sentinel known-slave redisMaster 192.168.10.205 6379

sentinel known-sentinel redisMaster 192.168.10.205 26379 cc25d5f0e37803e888732d63deae3761c9f91e1d

sentinel known-sentinel redisMaster 192.168.10.202 26379 c165761901b5ea3cd2d622bbf13f4c99eb73c1bc

sentinel current-epoch 0

[root@redis-slave01 ~]# redis-cli -h 192.168.10.203 -p 26379 info Sentinel

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

sentinel_simulate_failure_flags:0

master0:name=redisMaster,status=ok,address=192.168.10.202:6379,slaves=2,sentinels=3

同樣查看slave02節點的信息

[root@redis-slave02 src]# redis-cli -h 192.168.10.205 -p 6379 info Replication

# Replication

role:slave

master_host:192.168.10.202

master_port:6379

master_link_status:up

master_last_io_seconds_ago:0

master_sync_in_progress:0

slave_repl_offset:99678

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:96a1fd63d0ad9e7903851a82382e32d690667bcc

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:99678

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:170

repl_backlog_histlen:99509

??

[root@redis-slave02 src]# cat /usr/local/redis/etc/sentinel.conf

port 26379

pidfile?"/usr/local/redis/var/redis-sentinel.pid"

dir?"/usr/local/redis/data/sentinel"

daemonize?yes

protected-mode no

logfile?"/usr/local/redis/var/redis-sentinel.log"

sentinel myid cc25d5f0e37803e888732d63deae3761c9f91e1d

sentinel monitor redisMaster 192.168.10.202 6379 2

sentinel down-after-milliseconds redisMaster 10000

sentinel failover-timeout redisMaster 60000

# Generated by CONFIG REWRITE

sentinel config-epoch redisMaster 0

sentinel leader-epoch redisMaster 0

sentinel known-slave redisMaster 192.168.10.205 6379

sentinel known-slave redisMaster 192.168.10.203 6379

sentinel known-sentinel redisMaster 192.168.10.203 26379 e1505ffc65f787871febfde2f27b762f70cddd71

sentinel known-sentinel redisMaster 192.168.10.202 26379 c165761901b5ea3cd2d622bbf13f4c99eb73c1bc

sentinel current-epoch 0

[root@redis-slave02 ~]# redis-cli -h 192.168.10.205 -p 26379 info Sentinel

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

sentinel_simulate_failure_flags:0

master0:name=redisMaster,status=ok,address=192.168.10.202:6379,slaves=2,sentinels=3

8)客戶端寫入測試數據

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

客戶端連接master節點,寫入一條數據

[root@redis-master src]# redis-cli? -h 192.168.10.202 -p 6379

192.168.10.202:6379>?set?name kevin;

OK

192.168.10.202:6379> get name;

"kevin";

然后客戶端再連接任意slave節點,通過get獲取上面的那條數據

[root@redis-master src]# redis-cli? -h 192.168.10.203 -p 6379

192.168.10.203:6379> get name

"kevin;"

192.168.10.203:6379>?set?name grace;

(error) READONLY You can't write against a?read?only slave.

192.168.10.203:6379>

[root@redis-master src]# redis-cli? -h 192.168.10.205 -p 6379

192.168.10.205:6379> get name

"kevin;"

192.168.10.205:6379>?set?name grace;

(error) READONLY You can't write against a?read?only slave.

192.168.10.205:6379>

由上面測試信息可知,master節點可以寫入,可以讀取;而slave節點默認只能讀取,不能寫入!這就實現了主從復制,讀寫分離了!

9)模擬故障(通過sentinel實現主從切換,sentinel也要部署多臺,即集群模式,防止單臺sentinel掛掉情況)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

1)關掉任意一個slave節點(比如關閉掉slave01節點),所有節點的sentinel都可以檢測到,出現如下示例信息:

[root@redis-master src]# redis-cli? -h 192.168.10.203 -p 6379

192.168.10.203:6379> get name

"kevin;"

192.168.10.203:6379>?set?name grace;

(error) READONLY You can't write against a?read?only slave.

192.168.10.203:6379>?shutdown?????????????????????????????

not connected>

說明:shutdown命令表示關閉redis

從上可看出203被sentinel檢測到已處于關閉狀態,此時再來查看剩余節點的主從信息,它們的角色不會發生變化,只是master上的connected_slaves變為了1。

[root@redis-master src]# redis-cli? -h 192.168.10.202 -p 6379 info replication

# Replication

role:master

connected_slaves:1

slave0:ip=192.168.10.205,port=6379,state=online,offset=219376,lag=1

master_replid:96a1fd63d0ad9e7903851a82382e32d690667bcc

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:219376

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:219376

查看sentinel日志(任意節點上查看),發現203節點已經進入"+sdown"狀態

[root@redis-master src]# tail -f /usr/local/redis/var/redis-sentinel.log

2315:X 08 May 18:49:51.429 * Increased maximum number of?open?files to 10032 (it was originally?set?to 1024).

2315:X 08 May 18:49:51.431 * Running mode=sentinel, port=26379.

2315:X 08 May 18:49:51.431?# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

2315:X 08 May 18:49:51.463?# Sentinel ID is c165761901b5ea3cd2d622bbf13f4c99eb73c1bc

2315:X 08 May 18:49:51.463?# +monitor master redisMaster 192.168.10.202 6379 quorum 2

2315:X 08 May 18:50:11.544 * +slave slave 192.168.10.203:6379 192.168.10.203 6379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 18:50:11.574 * +slave slave 192.168.10.205:6379 192.168.10.205 6379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 18:50:15.088 * +sentinel sentinel e1505ffc65f787871febfde2f27b762f70cddd71 192.168.10.203 26379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 18:50:16.075 * +sentinel sentinel cc25d5f0e37803e888732d63deae3761c9f91e1d 192.168.10.205 26379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 19:06:07.669?# +sdown slave 192.168.10.203:6379 192.168.10.203 6379 @ redisMaster 192.168.10.202 6379

然后重啟上面被關閉的slave節點(即192.168.10.203),所有節點的sentinel都可以檢測到,可看出221又被sentinel檢測到已處于可用狀態,此時再來查看節點的主從信息,

它們的角色仍然不會發生變化,master上的connected_slaves又變為了2

[root@redis-slave01 src]# /etc/init.d/redis-server restart

Stopping redis-server:???????????????????????????????????? [FAILED]

Starting redis-server:???????????????????????????????????? [? OK? ]

[root@redis-slave01 src]# /etc/init.d/redis-server restart

Stopping redis-server:???????????????????????????????????? [? OK? ]

Starting redis-server:???????????????????????????????????? [? OK? ]

[root@redis-master src]# redis-cli? -h 192.168.10.202 -p 6379 info replication

# Replication

role:master

connected_slaves:2

slave0:ip=192.168.10.205,port=6379,state=online,offset=268216,lag=0

slave1:ip=192.168.10.203,port=6379,state=online,offset=268070,lag=1

master_replid:96a1fd63d0ad9e7903851a82382e32d690667bcc

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:268216

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:268216

查看sentinel日志(任意節點上查看),發現203節點已經進入"-sdown"狀態

[root@redis-master src]# tail -f /usr/local/redis/var/redis-sentinel.log

2315:X 08 May 18:49:51.429 * Increased maximum number of?open?files to 10032 (it was originally?set?to 1024).

2315:X 08 May 18:49:51.431 * Running mode=sentinel, port=26379.

2315:X 08 May 18:49:51.431?# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

2315:X 08 May 18:49:51.463?# Sentinel ID is c165761901b5ea3cd2d622bbf13f4c99eb73c1bc

2315:X 08 May 18:49:51.463?# +monitor master redisMaster 192.168.10.202 6379 quorum 2

2315:X 08 May 18:50:11.544 * +slave slave 192.168.10.203:6379 192.168.10.203 6379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 18:50:11.574 * +slave slave 192.168.10.205:6379 192.168.10.205 6379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 18:50:15.088 * +sentinel sentinel e1505ffc65f787871febfde2f27b762f70cddd71 192.168.10.203 26379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 18:50:16.075 * +sentinel sentinel cc25d5f0e37803e888732d63deae3761c9f91e1d 192.168.10.205 26379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 19:06:07.669?# +sdown slave 192.168.10.203:6379 192.168.10.203 6379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 19:10:14.965 * +reboot slave 192.168.10.203:6379 192.168.10.203 6379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 19:10:15.020?# -sdown slave 192.168.10.203:6379 192.168.10.203 6379 @ redisMaster 192.168.10.202 6379

=======================================================================================================

2)關掉master節點(即192.168.10.202),待所有節點的sentinel都檢測到后(稍等一會,2-3秒鐘時間),再來查看兩個Slave節點的主從信息,發現其中一個節點的角色通過選舉后會成為

master節點了!

[root@redis-master src]# redis-cli? -h 192.168.10.202 -p 6379

192.168.10.202:6379>?shutdown

not connected>

查看sentinel日志(任意節點上查看),發現202節點已經進入"+sdown"狀態

[root@redis-master src]# tail -f /usr/local/redis/var/redis-sentinel.log

2315:X 08 May 19:17:03.722?# +failover-state-reconf-slaves master redisMaster 192.168.10.202 6379

2315:X 08 May 19:17:03.760 * +slave-reconf-sent slave 192.168.10.203:6379 192.168.10.203 6379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 19:17:04.015 * +slave-reconf-inprog slave 192.168.10.203:6379 192.168.10.203 6379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 19:17:04.459?# -odown master redisMaster 192.168.10.202 6379

2315:X 08 May 19:17:05.047 * +slave-reconf-done?slave 192.168.10.203:6379 192.168.10.203 6379 @ redisMaster 192.168.10.202 6379

2315:X 08 May 19:17:05.131?# +failover-end master redisMaster 192.168.10.202 6379

2315:X 08 May 19:17:05.131?# +switch-master redisMaster 192.168.10.202 6379 192.168.10.205 6379

2315:X 08 May 19:17:05.131 * +slave slave 192.168.10.203:6379 192.168.10.203 6379 @ redisMaster 192.168.10.205 6379

2315:X 08 May 19:17:05.131 * +slave slave 192.168.10.202:6379 192.168.10.202 6379 @ redisMaster 192.168.10.205 6379

2315:X 08 May 19:17:15.170?# +sdown slave 192.168.10.202:6379 192.168.10.202 6379 @ redisMaster 192.168.10.205 6379

[root@redis-slave01 src]# redis-cli -h 192.168.10.203 -p 6379 INFO|grep role

role:slave

[root@redis-slave01 src]# redis-cli -h 192.168.10.205 -p 6379 INFO|grep role?????

role:master

[root@redis-slave01 src]# redis-cli? -h 192.168.10.205 -p 6379 info replication

# Replication

role:master

connected_slaves:1

slave0:ip=192.168.10.203,port=6379,state=online,offset=348860,lag=1

master_replid:a51f87958cea0b1e8fe2c83542ca6cebace53bf7

master_replid2:96a1fd63d0ad9e7903851a82382e32d690667bcc

master_repl_offset:349152

second_repl_offset:342824

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:170

repl_backlog_histlen:348983

[root@redis-slave01 src]# redis-cli? -h 192.168.10.203 -p 6379 info replication

# Replication

role:slave

master_host:192.168.10.205

master_port:6379

master_link_status:up

master_last_io_seconds_ago:0

master_sync_in_progress:0

slave_repl_offset:347546

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:a51f87958cea0b1e8fe2c83542ca6cebace53bf7

master_replid2:96a1fd63d0ad9e7903851a82382e32d690667bcc

master_repl_offset:347546

second_repl_offset:342824

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:283207

repl_backlog_histlen:64340

由上可知,當master節點(即192.168.10.202)的redis關閉后,slave02節點(即192.168.10.205)變成了新的master節點,而slave01(即192.168.10.203)成為

了slave02的從節點!

192.168.10.205節點此時被選舉為master,此時打開的205節點的redis.conf文件,slaveof配置項已被自動刪除了。

而203從節點的redis.conf文件中slaveof配置項的值被自動修改為192.168.10.205 6379。

[root@redis-slave02 src]# cat /usr/local/redis/etc/redis.conf|grep slaveof

[root@redis-slave01 src]# cat /usr/local/redis/etc/redis.conf|grep slaveof

slaveof 192.168.10.205 6379

在這個新master上(即192.168.10.205)執行諸如set這樣的寫入操作將被成功執行

[root@redis-slave01 src]# redis-cli? -h 192.168.10.205 -p 6379

192.168.10.205:6379>?set?name beijing;

OK

[root@redis-master src]# redis-cli? -h 192.168.10.203 -p 6379

192.168.10.203:6379> get name

"beijing;"

192.168.10.203:6379>?set?name tianjin;

(error) READONLY You can't write against a?read?only slave.

192.168.10.203:6379>

重啟192.168.10.202節點的redis,待所有節點的sentinel都檢測到后,再來查看所有節點的主從信息,此時192.168.10.205節點的master角色不會被重新搶占,

而192.168.10.202節點的角色會從原來的master變為了slave。

[root@redis-master src]# /etc/init.d/redis-server restart

Stopping redis-server:???????????????????????????????????? [FAILED]

Starting redis-server:???????????????????????????????????? [? OK? ]

[root@redis-master src]# /etc/init.d/redis-server restart

Stopping redis-server:???????????????????????????????????? [? OK? ]

Starting redis-server:???????????????????????????????????? [? OK? ]

[root@redis-master src]# redis-cli -h 192.168.10.202 -p 6379 INFO|grep role

role:slave

[root@redis-master src]# redis-cli -h 192.168.10.203 -p 6379 INFO|grep role

role:slave

[root@redis-master src]# redis-cli -h 192.168.10.205 -p 6379 INFO|grep role

role:master

[root@redis-master src]# redis-cli? -h 192.168.10.205 -p 6379 info replication

# Replication

role:master

connected_slaves:2

slave0:ip=192.168.10.203,port=6379,state=online,offset=545410,lag=1

slave1:ip=192.168.10.202,port=6379,state=online,offset=545410,lag=1

master_replid:a51f87958cea0b1e8fe2c83542ca6cebace53bf7

master_replid2:96a1fd63d0ad9e7903851a82382e32d690667bcc

master_repl_offset:545556

second_repl_offset:342824

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:170

repl_backlog_histlen:545387

[root@redis-master src]# redis-cli? -h 192.168.10.202 -p 6379

192.168.10.202:6379> get name

"beijing;"

此時登錄192.168.10.202節點的redis,執行"get name"得到的值為beijing,而不是原來的kevin,因為192.168.10.202節點的redis重啟后會自動從新的master中同步

數據。此時打開192.168.10.202節點的redis.conf文件,會在末尾找到如下信息:

[root@redis-master src]# cat /usr/local/redis/etc/redis.conf|grep slaveof

slaveof 192.168.10.205 6379

到此,已經驗證出了redis sentinel可以自行實現主從的故障切換了!

10)客戶端如何連接redis sentinel?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

客戶端配置連接的是sentinel信息,比如連接sentinel.conf文件中定義的master名稱。在sentinel監聽時,當master節點掛了,它會在slave節點中自動選舉出新

的master節點,而當掛了的老master節點重新恢復后就會成為新的slave節點。對于客戶端來說,redis主從切換后它不需要修改連接配置。

下面列出幾個客戶端連接redis sentinel的例子

1)java客戶端在jedis中使用redis sentinel哨兵方式連接

<?xml version="1.0"?encoding="UTF-8"?>

"http://www.springframework.org/schema/beans">

????id="jedisPoolConfig"?class="redis.clients.jedis.JedisPoolConfig">

?????????"maxTotal"?value="1000"/>

?????????"maxIdle"?value="10"/>

?????????"minIdle"?value="1"/>

?????????"maxWaitMillis"?value="30000"/>

?????????"testOnBorrow"?value="true"/>

?????????"testOnReturn"?value="true"/>

?????????"testWhileIdle"?value="true"/>

????</bean>

????id="cacheService"?class="sentinel.CacheServiceImpl"?destroy-method="destroy">

????????"jedisSentinlePool">

????????????"redis.clients.jedis.JedisSentinelPool">

?????????????????"0"?value="mymaster"?/>

?????????????????"1">

?????????????????????<set>

?????????????????????????192.168.10.202:26379</value>

?????????????????????????192.168.10.203:26379</value>

?????????????????????????192.168.10.205:26379</value>

?????????????????????</set>

?????????????????</constructor-arg>

?????????????????"2"?ref="jedisPoolConfig"?/>

????????????</bean>

????????</property>

????</bean>

</beans>

2)python連接redis sentinel集群(需要安裝python redis客戶端,即執行"pip install redis")

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import?redis

from redis.sentinel?import?Sentinel

# 連接哨兵服務器(主機名也可以用域名)

sentinel = Sentinel([('192.168.10.202', 26379),

?????????????????????('192.168.10.203', 26379),

?????????????????????('192.168.10.205', 26379)

?????????????],

????????????????????socket_timeout=0.5)

# 獲取主服務器地址

master = sentinel.discover_master('mymaster')

print(master)

# 輸出:('192.168.10.202', 26379)

# 獲取從服務器地址

slave = sentinel.discover_slaves('mymaster')

print(slave)

# 輸出:[('192.168.10.203', 26379), ('192.168.10.205', 26379), ('172.31.0.5', 26379)]

# 獲取主服務器進行寫入

master = sentinel.master_for('mymaster', socket_timeout=0.5, password='redis_auth_pass', db=15)

w_ret = master.set('foo',?'bar')

# 輸出:True

# # 獲取從服務器進行讀取(默認是round-roubin)

slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password='redis_auth_pass', db=15)

r_ret = slave.get('foo')

print(r_ret)

# # 輸出:bar

3)Java客戶端連接Redis(單sentinel).

下面例子中好的redisMaster和20180408是在sentinel.conf中定義的master名稱和連接密碼

package com.hiifit.cloudplatform.gaia.test;

import?java.util.HashSet;

import?java.util.Set;

import?redis.clients.jedis.Jedis;

import?redis.clients.jedis.JedisSentinelPool;

public class RedisSentinelTest {

????@SuppressWarnings("deprecation")

????public static void main(String[] args) {

????????Set sentinels = new HashSet();

????????String hostAndPort1 =?"192.168.10.205:26379";

????????sentinels.add(hostAndPort1);

????????String clusterName =?"redisMaster";

????????String password =?"20180408";

????????JedisSentinelPool redisSentinelJedisPool = new JedisSentinelPool(clusterName,sentinels,password);

????????Jedis jedis = null;

????????try {

????????????jedis = redisSentinelJedisPool.getResource();

????????????jedis.set("key",?"value");

????????} catch (Exception e) {

????????????e.printStackTrace();

????????} finally {

????????????redisSentinelJedisPool.returnBrokenResource(jedis);

????????}

????????redisSentinelJedisPool.close();

????}

}

總結

以上是生活随笔為你收集整理的Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产精品igao视频网 | 久久zyz资源站无码中文动漫 | 亚洲一区二区三区国产精华液 | 老熟妇仑乱视频一区二区 | 亚洲国产精品久久久天堂 | 中文字幕+乱码+中文字幕一区 | 成人免费无码大片a毛片 | 性色av无码免费一区二区三区 | 无码人妻丰满熟妇区五十路百度 | 国内精品人妻无码久久久影院 | 日本乱人伦片中文三区 | 日韩亚洲欧美中文高清在线 | 日本高清一区免费中文视频 | 国产莉萝无码av在线播放 | 又色又爽又黄的美女裸体网站 | 亚洲精品www久久久 | 丰满少妇人妻久久久久久 | 麻豆国产人妻欲求不满 | 久久亚洲a片com人成 | 国产成人综合在线女婷五月99播放 | 国产猛烈高潮尖叫视频免费 | 无码av免费一区二区三区试看 | 美女毛片一区二区三区四区 | 四虎永久在线精品免费网址 | 日韩无套无码精品 | 午夜时刻免费入口 | 亚洲精品www久久久 | 特黄特色大片免费播放器图片 | 精品偷拍一区二区三区在线看 | 亚洲欧洲日本综合aⅴ在线 | 97久久国产亚洲精品超碰热 | 西西人体www44rt大胆高清 | 又黄又爽又色的视频 | 久久99精品久久久久久 | 波多野结衣av在线观看 | 2020最新国产自产精品 | 亚洲一区二区三区偷拍女厕 | 亚洲精品一区二区三区在线 | 国产亲子乱弄免费视频 | 成熟妇人a片免费看网站 | 日韩av无码一区二区三区 | 欧美xxxxx精品 | 丰满肥臀大屁股熟妇激情视频 | 欧美刺激性大交 | 久久国产自偷自偷免费一区调 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲一区二区三区无码久久 | 国产在线精品一区二区三区直播 | 东京一本一道一二三区 | 欧美一区二区三区视频在线观看 | 三上悠亚人妻中文字幕在线 | 中文字幕日韩精品一区二区三区 | 一本久久a久久精品vr综合 | 久久99精品国产麻豆 | 欧美熟妇另类久久久久久多毛 | 骚片av蜜桃精品一区 | 午夜男女很黄的视频 | 国产激情艳情在线看视频 | 久久精品无码一区二区三区 | 偷窥村妇洗澡毛毛多 | 国产人妻大战黑人第1集 | 午夜福利试看120秒体验区 | 亚洲狠狠色丁香婷婷综合 | 在线精品亚洲一区二区 | 日产精品高潮呻吟av久久 | 久久久久久九九精品久 | 亚洲成a人片在线观看无码 | 天海翼激烈高潮到腰振不止 | 久久久久人妻一区精品色欧美 | 西西人体www44rt大胆高清 | 天天做天天爱天天爽综合网 | 国产精品久久久一区二区三区 | 美女毛片一区二区三区四区 | 久久伊人色av天堂九九小黄鸭 | 人妻天天爽夜夜爽一区二区 | 国产人成高清在线视频99最全资源 | 色综合久久88色综合天天 | 国产成人无码a区在线观看视频app | 日本一卡2卡3卡四卡精品网站 | 最新国产乱人伦偷精品免费网站 | 亚洲精品欧美二区三区中文字幕 | 欧美国产日产一区二区 | 国内揄拍国内精品人妻 | 色婷婷综合激情综在线播放 | 国产免费无码一区二区视频 | 无码一区二区三区在线 | 俺去俺来也在线www色官网 | 好男人www社区 | 亚洲爆乳无码专区 | 亚洲va欧美va天堂v国产综合 | 牲欲强的熟妇农村老妇女 | 久久99精品国产.久久久久 | 国产亚洲人成在线播放 | 日韩精品成人一区二区三区 | 波多野结衣乳巨码无在线观看 | 国产亚洲精品久久久闺蜜 | 日日摸天天摸爽爽狠狠97 | 国产精品国产三级国产专播 | 色综合天天综合狠狠爱 | 丰满少妇熟乱xxxxx视频 | 色综合久久网 | 在线观看欧美一区二区三区 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲综合另类小说色区 | 国产精品久久久一区二区三区 | 伊人久久大香线蕉午夜 | 婷婷五月综合缴情在线视频 | 亚洲欧美日韩成人高清在线一区 | 久久综合网欧美色妞网 | 国产无遮挡又黄又爽免费视频 | 国产精品久久久久无码av色戒 | 老熟女重囗味hdxx69 | 一本久久伊人热热精品中文字幕 | 国产一区二区三区精品视频 | 三上悠亚人妻中文字幕在线 | 国产成人无码区免费内射一片色欲 | 97人妻精品一区二区三区 | 欧美一区二区三区视频在线观看 | 亚洲乱码中文字幕在线 | av无码久久久久不卡免费网站 | 国产成人综合在线女婷五月99播放 | 成人欧美一区二区三区 | 欧洲熟妇精品视频 | 荫蒂被男人添的好舒服爽免费视频 | 色一情一乱一伦一视频免费看 | 婷婷色婷婷开心五月四房播播 | 久久久久久a亚洲欧洲av冫 | 亚洲 欧美 激情 小说 另类 | 久久人人爽人人爽人人片av高清 | 亚洲成a人片在线观看无码 | 蜜桃无码一区二区三区 | 成人片黄网站色大片免费观看 | 国产在热线精品视频 | aa片在线观看视频在线播放 | 精品久久久久久人妻无码中文字幕 | 天天爽夜夜爽夜夜爽 | 少妇性俱乐部纵欲狂欢电影 | 国产另类ts人妖一区二区 | 国产真人无遮挡作爱免费视频 | 亚洲日韩一区二区三区 | 国产人妻精品一区二区三区 | 国产无遮挡吃胸膜奶免费看 | 精品成在人线av无码免费看 | 成人精品视频一区二区 | 麻豆av传媒蜜桃天美传媒 | 波多野结衣aⅴ在线 | 亚洲综合无码一区二区三区 | 日日碰狠狠丁香久燥 | 国产区女主播在线观看 | 一本久道久久综合婷婷五月 | 精品乱码久久久久久久 | 国产绳艺sm调教室论坛 | 中文无码伦av中文字幕 | 日日摸天天摸爽爽狠狠97 | 国产欧美亚洲精品a | 亚洲 a v无 码免 费 成 人 a v | 国产精品久久久久无码av色戒 | 亚洲人成网站免费播放 | 亚洲精品综合一区二区三区在线 | 野外少妇愉情中文字幕 | 无码帝国www无码专区色综合 | 一区二区传媒有限公司 | 无码免费一区二区三区 | 亚无码乱人伦一区二区 | 无码毛片视频一区二区本码 | 日韩av激情在线观看 | 免费观看黄网站 | 呦交小u女精品视频 | 丰满人妻被黑人猛烈进入 | 国内少妇偷人精品视频 | 天堂亚洲免费视频 | 久久综合九色综合欧美狠狠 | 狠狠色色综合网站 | 日本一区二区三区免费播放 | 国产黄在线观看免费观看不卡 | 动漫av网站免费观看 | 狠狠色丁香久久婷婷综合五月 | 免费国产黄网站在线观看 | 国内揄拍国内精品人妻 | 装睡被陌生人摸出水好爽 | 色综合久久中文娱乐网 | 亚洲乱码中文字幕在线 | 夜夜高潮次次欢爽av女 | 国内综合精品午夜久久资源 | 日本精品久久久久中文字幕 | 久激情内射婷内射蜜桃人妖 | 中文字幕无线码免费人妻 | 四十如虎的丰满熟妇啪啪 | 国产免费观看黄av片 | 国内精品久久久久久中文字幕 | 中国女人内谢69xxxxxa片 | 四虎影视成人永久免费观看视频 | 亚洲综合在线一区二区三区 | 国产精品无码一区二区桃花视频 | 欧洲精品码一区二区三区免费看 | 又大又黄又粗又爽的免费视频 | 亚洲一区二区三区在线观看网站 | 国产精品va在线观看无码 | 欧美黑人性暴力猛交喷水 | 中国大陆精品视频xxxx | 人人妻人人澡人人爽人人精品浪潮 | 高清不卡一区二区三区 | 超碰97人人做人人爱少妇 | 亚洲一区二区三区香蕉 | 鲁鲁鲁爽爽爽在线视频观看 | 97色伦图片97综合影院 | 精品少妇爆乳无码av无码专区 | 东京热一精品无码av | 成人无码视频在线观看网站 | 麻豆国产丝袜白领秘书在线观看 | 性欧美videos高清精品 | 麻花豆传媒剧国产免费mv在线 | 欧美老妇与禽交 | 欧美亚洲国产一区二区三区 | 东京一本一道一二三区 | 少妇无码av无码专区在线观看 | 好爽又高潮了毛片免费下载 | 国产成人久久精品流白浆 | 在线观看欧美一区二区三区 | 日韩欧美中文字幕公布 | 人人妻人人澡人人爽人人精品浪潮 | 国内少妇偷人精品视频 | 学生妹亚洲一区二区 | 国产99久久精品一区二区 | 精品久久久久久人妻无码中文字幕 | 久久精品国产一区二区三区 | 亚洲精品国产精品乱码不卡 | 国产精品永久免费视频 | 少妇人妻大乳在线视频 | 人人超人人超碰超国产 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产猛烈高潮尖叫视频免费 | 久久综合狠狠综合久久综合88 | 免费人成网站视频在线观看 | 天天躁夜夜躁狠狠是什么心态 | 水蜜桃亚洲一二三四在线 | 夜夜躁日日躁狠狠久久av | 国产日产欧产精品精品app | 伊人久久大香线焦av综合影院 | 国产麻豆精品精东影业av网站 | 一本久久伊人热热精品中文字幕 | 在教室伦流澡到高潮hnp视频 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 亚无码乱人伦一区二区 | 国产欧美亚洲精品a | 亚洲欧美国产精品久久 | 国产午夜福利亚洲第一 | 亚洲一区二区三区 | 成人免费无码大片a毛片 | 国模大胆一区二区三区 | 55夜色66夜色国产精品视频 | 少妇高潮一区二区三区99 | 国产内射爽爽大片视频社区在线 | 国产精品对白交换视频 | 中文精品久久久久人妻不卡 | 国产97在线 | 亚洲 | 水蜜桃亚洲一二三四在线 | 18禁止看的免费污网站 | 国产精品无码永久免费888 | 无码毛片视频一区二区本码 | 欧美喷潮久久久xxxxx | 中文字幕亚洲情99在线 | 国产成人无码午夜视频在线观看 | 少妇一晚三次一区二区三区 | 色综合久久中文娱乐网 | 精品欧洲av无码一区二区三区 | 国产麻豆精品一区二区三区v视界 | 亚洲精品中文字幕久久久久 | 国产在线一区二区三区四区五区 | 久久精品成人欧美大片 | www一区二区www免费 | 欧洲美熟女乱又伦 | 无码毛片视频一区二区本码 | 国产精品igao视频网 | 波多野结衣 黑人 | 天堂无码人妻精品一区二区三区 | 中国女人内谢69xxxxxa片 | 亚洲日韩av一区二区三区中文 | 麻豆果冻传媒2021精品传媒一区下载 | 人妻无码αv中文字幕久久琪琪布 | 98国产精品综合一区二区三区 | 亚洲大尺度无码无码专区 | 精品夜夜澡人妻无码av蜜桃 | 又大又紧又粉嫩18p少妇 | 国产热a欧美热a在线视频 | 日日干夜夜干 | 成年美女黄网站色大免费视频 | 宝宝好涨水快流出来免费视频 | 亚洲成a人片在线观看无码3d | 国产精品手机免费 | 女人色极品影院 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 色综合久久网 | 午夜无码区在线观看 | 亚洲精品久久久久久久久久久 | 色综合久久88色综合天天 | 51国偷自产一区二区三区 | 精品无码国产自产拍在线观看蜜 | 性色欲网站人妻丰满中文久久不卡 | 久久综合给久久狠狠97色 | 欧美精品在线观看 | 高清国产亚洲精品自在久久 | 国产真实乱对白精彩久久 | 成人欧美一区二区三区 | 黑人巨大精品欧美一区二区 | 老熟妇仑乱视频一区二区 | 国产亚洲欧美日韩亚洲中文色 | 激情五月综合色婷婷一区二区 | аⅴ资源天堂资源库在线 | 动漫av网站免费观看 | 熟妇女人妻丰满少妇中文字幕 | a国产一区二区免费入口 | www成人国产高清内射 | 在线a亚洲视频播放在线观看 | 色欲av亚洲一区无码少妇 | 精品人妻av区 | 免费无码的av片在线观看 | 在线精品亚洲一区二区 | 99久久精品午夜一区二区 | 精品偷拍一区二区三区在线看 | 亚洲国产一区二区三区在线观看 | 午夜精品一区二区三区在线观看 | 国产农村妇女高潮大叫 | 无套内射视频囯产 | 久久亚洲a片com人成 | 色欲久久久天天天综合网精品 | 成人欧美一区二区三区黑人免费 | 欧美性生交活xxxxxdddd | 国产精品资源一区二区 | 最近的中文字幕在线看视频 | 国产人成高清在线视频99最全资源 | 国产免费久久精品国产传媒 | 女人被爽到呻吟gif动态图视看 | 一个人看的www免费视频在线观看 | 亚洲成av人综合在线观看 | 在线成人www免费观看视频 | 国产两女互慰高潮视频在线观看 | 国产精品久免费的黄网站 | 国产真人无遮挡作爱免费视频 | 国产激情无码一区二区app | 无码人妻少妇伦在线电影 | ass日本丰满熟妇pics | 国产美女精品一区二区三区 | 亚洲综合伊人久久大杳蕉 | 国产人妻人伦精品1国产丝袜 | 久激情内射婷内射蜜桃人妖 | 正在播放老肥熟妇露脸 | 欧洲精品码一区二区三区免费看 | 无码人妻精品一区二区三区不卡 | 欧美xxxxx精品 | 中文字幕av无码一区二区三区电影 | 超碰97人人射妻 | 999久久久国产精品消防器材 | 国产色在线 | 国产 | 成人免费视频在线观看 | 色诱久久久久综合网ywww | 久久人人97超碰a片精品 | 一本久道高清无码视频 | 国内精品一区二区三区不卡 | 国产人成高清在线视频99最全资源 | 最近的中文字幕在线看视频 | 亚洲精品无码国产 | 内射后入在线观看一区 | 亚洲成av人综合在线观看 | 国产内射老熟女aaaa | 国产绳艺sm调教室论坛 | 野外少妇愉情中文字幕 | 欧美国产日韩亚洲中文 | 麻豆人妻少妇精品无码专区 | 成人免费视频在线观看 | 中文字幕av日韩精品一区二区 | 天堂а√在线中文在线 | 亚拍精品一区二区三区探花 | 性欧美大战久久久久久久 | 少妇无码一区二区二三区 | 国内丰满熟女出轨videos | 少妇性荡欲午夜性开放视频剧场 | 亚洲精品一区二区三区婷婷月 | 久久久久人妻一区精品色欧美 | 亚洲欧美精品伊人久久 | 精品偷拍一区二区三区在线看 | 一本色道婷婷久久欧美 | 99riav国产精品视频 | 无码帝国www无码专区色综合 | 亚洲の无码国产の无码影院 | 国产乱人伦av在线无码 | 麻豆国产人妻欲求不满谁演的 | 亚洲乱码日产精品bd | 无码吃奶揉捏奶头高潮视频 | 扒开双腿吃奶呻吟做受视频 | 88国产精品欧美一区二区三区 | 久久久精品人妻久久影视 | 中文字幕无码av波多野吉衣 | 两性色午夜免费视频 | 日本又色又爽又黄的a片18禁 | 精品国产国产综合精品 | 两性色午夜视频免费播放 | 亚洲国产精品美女久久久久 | 免费中文字幕日韩欧美 | 男女爱爱好爽视频免费看 | 国产精品二区一区二区aⅴ污介绍 | 亚洲中文字幕乱码av波多ji | 国产亚洲精品久久久久久久久动漫 | 98国产精品综合一区二区三区 | 东京热无码av男人的天堂 | 清纯唯美经典一区二区 | 性色av无码免费一区二区三区 | 国产亚洲精品久久久久久久 | 男女下面进入的视频免费午夜 | 免费网站看v片在线18禁无码 | 久久久久久久女国产乱让韩 | 亚洲热妇无码av在线播放 | 午夜福利一区二区三区在线观看 | 亚洲另类伦春色综合小说 | 亚洲日韩av片在线观看 | 在线成人www免费观看视频 | 正在播放东北夫妻内射 | 午夜精品一区二区三区的区别 | 午夜精品久久久内射近拍高清 | 国精品人妻无码一区二区三区蜜柚 | 在线播放免费人成毛片乱码 | 亚洲精品国产品国语在线观看 | 久久久精品成人免费观看 | 精品成在人线av无码免费看 | 国产午夜亚洲精品不卡下载 | 色综合久久久无码中文字幕 | 国产精品亚洲专区无码不卡 | 欧美人与牲动交xxxx | 香港三级日本三级妇三级 | 伊人色综合久久天天小片 | 老头边吃奶边弄进去呻吟 | 成人aaa片一区国产精品 | 免费观看的无遮挡av | 人人妻人人澡人人爽欧美一区九九 | 大肉大捧一进一出视频出来呀 | 亚洲精品午夜国产va久久成人 | 国产在线精品一区二区高清不卡 | 性啪啪chinese东北女人 | 成人无码视频在线观看网站 | 精品一区二区三区波多野结衣 | www国产亚洲精品久久网站 | 青青草原综合久久大伊人精品 | 夜精品a片一区二区三区无码白浆 | 日本丰满熟妇videos | 国产av无码专区亚洲awww | 激情综合激情五月俺也去 | 久久99精品国产麻豆蜜芽 | 成人一在线视频日韩国产 | 亚洲乱亚洲乱妇50p | 老司机亚洲精品影院无码 | 国产激情无码一区二区app | 思思久久99热只有频精品66 | 午夜不卡av免费 一本久久a久久精品vr综合 | 亚洲一区二区三区含羞草 | 国产深夜福利视频在线 | 少妇无码av无码专区在线观看 | 免费乱码人妻系列无码专区 | 天堂亚洲2017在线观看 | 国产国语老龄妇女a片 | 无码人妻久久一区二区三区不卡 | 欧美人与物videos另类 | 18无码粉嫩小泬无套在线观看 | 欧美第一黄网免费网站 | 99久久99久久免费精品蜜桃 | 国产精品毛片一区二区 | 国产成人无码av在线影院 | 中文字幕 亚洲精品 第1页 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲 激情 小说 另类 欧美 | а√天堂www在线天堂小说 | 精品国产青草久久久久福利 | 色婷婷av一区二区三区之红樱桃 | 色老头在线一区二区三区 | 中文精品久久久久人妻不卡 | 国产乱人偷精品人妻a片 | 精品无人区无码乱码毛片国产 | 日本成熟视频免费视频 | 国产免费久久精品国产传媒 | 中文字幕无码热在线视频 | 成人精品一区二区三区中文字幕 | 国产精品久久久久9999小说 | 成人一在线视频日韩国产 | 亚洲国产精品美女久久久久 | 国产亚洲精品久久久久久 | 图片区 小说区 区 亚洲五月 | 丰满少妇熟乱xxxxx视频 | 丝袜 中出 制服 人妻 美腿 | 大肉大捧一进一出好爽视频 | 一个人看的视频www在线 | 亚洲一区二区三区香蕉 | 日韩精品乱码av一区二区 | 正在播放老肥熟妇露脸 | 欧美一区二区三区视频在线观看 | 少妇性l交大片欧洲热妇乱xxx | 奇米影视888欧美在线观看 | 中文字幕无线码免费人妻 | 亚洲毛片av日韩av无码 | 99精品久久毛片a片 | 午夜精品一区二区三区在线观看 | 欧美老人巨大xxxx做受 | 国产精品怡红院永久免费 | 国产麻豆精品一区二区三区v视界 | 少妇高潮一区二区三区99 | 天堂在线观看www | 狂野欧美性猛xxxx乱大交 | 久久精品国产一区二区三区肥胖 | 免费人成网站视频在线观看 | 亚洲精品一区二区三区婷婷月 | yw尤物av无码国产在线观看 | 国产精品高潮呻吟av久久4虎 | 国产一区二区不卡老阿姨 | 亚洲精品成人福利网站 | 婷婷综合久久中文字幕蜜桃三电影 | 天海翼激烈高潮到腰振不止 | 色爱情人网站 | 精品国产一区二区三区av 性色 | 永久免费观看国产裸体美女 | 国产精品-区区久久久狼 | 国产小呦泬泬99精品 | 国产9 9在线 | 中文 | 国产熟妇高潮叫床视频播放 | 亚洲熟妇色xxxxx欧美老妇 | 日韩少妇白浆无码系列 | 午夜性刺激在线视频免费 | 国产另类ts人妖一区二区 | 亚洲精品久久久久久久久久久 | 国产精品va在线观看无码 | 99久久婷婷国产综合精品青草免费 | 色婷婷香蕉在线一区二区 | 亚洲精品一区二区三区在线观看 | 丰满少妇熟乱xxxxx视频 | 中文精品久久久久人妻不卡 | av无码不卡在线观看免费 | 樱花草在线社区www | 丰满岳乱妇在线观看中字无码 | 国产性生大片免费观看性 | 一个人免费观看的www视频 | 无码乱肉视频免费大全合集 | 永久免费观看美女裸体的网站 | 亚洲日韩一区二区 | 亚洲精品鲁一鲁一区二区三区 | 蜜桃臀无码内射一区二区三区 | 欧美人与善在线com | 国产精华av午夜在线观看 | 国产后入清纯学生妹 | 伊人久久大香线焦av综合影院 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品人人爽人人做我的可爱 | 欧美喷潮久久久xxxxx | 久久午夜无码鲁丝片午夜精品 | 欧美乱妇无乱码大黄a片 | 综合网日日天干夜夜久久 | 国产av剧情md精品麻豆 | 国产偷自视频区视频 | 四虎4hu永久免费 | 性色av无码免费一区二区三区 | 亚洲精品一区二区三区大桥未久 | 亚洲色欲色欲欲www在线 | 一二三四在线观看免费视频 | 亚洲中文字幕av在天堂 | 亚拍精品一区二区三区探花 | 免费观看激色视频网站 | 亚洲欧洲中文日韩av乱码 | 亚洲第一无码av无码专区 | 极品尤物被啪到呻吟喷水 | 丰满少妇人妻久久久久久 | 久久熟妇人妻午夜寂寞影院 | 少妇厨房愉情理9仑片视频 | 国产情侣作爱视频免费观看 | 一个人看的www免费视频在线观看 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲小说春色综合另类 | 熟妇女人妻丰满少妇中文字幕 | 成 人 网 站国产免费观看 | 免费看男女做好爽好硬视频 | 人妻无码久久精品人妻 | 中文字幕无码免费久久9一区9 | 亚洲欧洲无卡二区视頻 | 成人无码视频免费播放 | 丰满护士巨好爽好大乳 | 奇米影视888欧美在线观看 | 无套内谢老熟女 | 亚洲国产精品毛片av不卡在线 | 日韩在线不卡免费视频一区 | 欧美三级a做爰在线观看 | 人妻与老人中文字幕 | 国产一区二区三区影院 | 无遮挡啪啪摇乳动态图 | 精品人妻av区 | 亚洲狠狠色丁香婷婷综合 | 一本无码人妻在中文字幕免费 | 日本一区二区三区免费高清 | 97色伦图片97综合影院 | 免费看男女做好爽好硬视频 | 成人试看120秒体验区 | 人人妻人人藻人人爽欧美一区 | 性欧美牲交xxxxx视频 | 男人的天堂2018无码 | 色一情一乱一伦一区二区三欧美 | 无码精品国产va在线观看dvd | 夜夜高潮次次欢爽av女 | 中文无码伦av中文字幕 | 中文字幕 亚洲精品 第1页 | 亚洲a无码综合a国产av中文 | 日本欧美一区二区三区乱码 | 精品一区二区三区无码免费视频 | 最新版天堂资源中文官网 | 国产欧美精品一区二区三区 | 亚洲国产av精品一区二区蜜芽 | 精品一区二区不卡无码av | 小鲜肉自慰网站xnxx | 久久天天躁狠狠躁夜夜免费观看 | 在教室伦流澡到高潮hnp视频 | 国产午夜视频在线观看 | 成人精品一区二区三区中文字幕 | 天海翼激烈高潮到腰振不止 | 精品一区二区三区波多野结衣 | 国产 精品 自在自线 | 野外少妇愉情中文字幕 | 中文精品久久久久人妻不卡 | 丁香花在线影院观看在线播放 | 婷婷六月久久综合丁香 | 亚洲欧洲中文日韩av乱码 | 欧洲精品码一区二区三区免费看 | 欧美一区二区三区视频在线观看 | 婷婷五月综合缴情在线视频 | 国产在热线精品视频 | 蜜桃无码一区二区三区 | 欧美人与动性行为视频 | 亚洲一区av无码专区在线观看 | 色综合久久网 | 午夜性刺激在线视频免费 | 澳门永久av免费网站 | 人人爽人人澡人人人妻 | 少妇厨房愉情理9仑片视频 | 成人无码精品一区二区三区 | 久久亚洲中文字幕无码 | 国产卡一卡二卡三 | v一区无码内射国产 | 正在播放东北夫妻内射 | 国产激情一区二区三区 | 熟女体下毛毛黑森林 | 成人女人看片免费视频放人 | 久久国产精品偷任你爽任你 | 国产av久久久久精东av | 国产精品久久久久久久9999 | 欧美精品国产综合久久 | 国产偷抇久久精品a片69 | 国产69精品久久久久app下载 | 久久天天躁狠狠躁夜夜免费观看 | 国产福利视频一区二区 | 大胆欧美熟妇xx | 国产成人无码a区在线观看视频app | 奇米影视888欧美在线观看 | 国产乱码精品一品二品 | 国产美女精品一区二区三区 | 国产美女极度色诱视频www | 色一情一乱一伦 | 久久久久久九九精品久 | 免费网站看v片在线18禁无码 | 爱做久久久久久 | 人妻少妇精品视频专区 | 国产精品资源一区二区 | 十八禁视频网站在线观看 | 国产凸凹视频一区二区 | 中文字幕无码日韩欧毛 | 国产9 9在线 | 中文 | 欧美三级不卡在线观看 | 欧美激情内射喷水高潮 | yw尤物av无码国产在线观看 | 波多野42部无码喷潮在线 | 无码av中文字幕免费放 | 97无码免费人妻超级碰碰夜夜 | 76少妇精品导航 | 亚洲国产综合无码一区 | 色狠狠av一区二区三区 | 国内揄拍国内精品少妇国语 | 领导边摸边吃奶边做爽在线观看 | 国产精品高潮呻吟av久久 | 三上悠亚人妻中文字幕在线 | 1000部夫妻午夜免费 | 成在人线av无码免观看麻豆 | 97久久精品无码一区二区 | 狠狠躁日日躁夜夜躁2020 | 无码国产色欲xxxxx视频 | 国产午夜亚洲精品不卡下载 | 97夜夜澡人人双人人人喊 | 两性色午夜视频免费播放 | 无套内谢的新婚少妇国语播放 | 日本肉体xxxx裸交 | 综合人妻久久一区二区精品 | 国产日产欧产精品精品app | 丰满肥臀大屁股熟妇激情视频 | 欧美猛少妇色xxxxx | 国产真人无遮挡作爱免费视频 | 中文字幕 人妻熟女 | 日本精品人妻无码77777 天堂一区人妻无码 | 人人妻在人人 | 国产精品亚洲а∨无码播放麻豆 | 三上悠亚人妻中文字幕在线 | 欧美国产亚洲日韩在线二区 | 麻豆国产丝袜白领秘书在线观看 | 中文字幕乱码人妻无码久久 | 久久国产精品_国产精品 | 成人性做爰aaa片免费看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲精品一区二区三区婷婷月 | 国产成人人人97超碰超爽8 | 精品人妻av区 | 国产无遮挡又黄又爽又色 | 免费人成网站视频在线观看 | 最近免费中文字幕中文高清百度 | 欧洲欧美人成视频在线 | 国产黄在线观看免费观看不卡 | 色综合久久久无码网中文 | 波多野结衣高清一区二区三区 | 色欲人妻aaaaaaa无码 | 亚洲小说图区综合在线 | 水蜜桃色314在线观看 | 亚洲日韩中文字幕在线播放 | 88国产精品欧美一区二区三区 | 国产真实伦对白全集 | 亚洲精品欧美二区三区中文字幕 | 亚洲gv猛男gv无码男同 | 亚洲aⅴ无码成人网站国产app | 天天躁夜夜躁狠狠是什么心态 | 最近中文2019字幕第二页 | 国产精品人人爽人人做我的可爱 | 九九在线中文字幕无码 | 人人澡人人透人人爽 | 国产精品视频免费播放 | 亚洲中文字幕无码中字 | 夜先锋av资源网站 | 日韩精品久久久肉伦网站 | 人妻少妇被猛烈进入中文字幕 | 日韩人妻无码一区二区三区久久99 | 亚洲国产欧美在线成人 | 久久99精品久久久久婷婷 | 蜜桃视频韩日免费播放 | 日本丰满熟妇videos | 亚洲精品综合五月久久小说 | 成人试看120秒体验区 | 一本久道久久综合婷婷五月 | 国产精品无码一区二区三区不卡 | 图片小说视频一区二区 | 成人av无码一区二区三区 | 国产精品美女久久久久av爽李琼 | 国产国语老龄妇女a片 | 99久久精品午夜一区二区 | 六月丁香婷婷色狠狠久久 | 国产成人精品必看 | 中文字幕无线码 | 高清国产亚洲精品自在久久 | 爽爽影院免费观看 | 麻豆md0077饥渴少妇 | 99久久无码一区人妻 | 国产suv精品一区二区五 | 精品偷自拍另类在线观看 | 欧美午夜特黄aaaaaa片 | 九九热爱视频精品 | 中文字幕人妻丝袜二区 | 一本一道久久综合久久 | 学生妹亚洲一区二区 | 欧美 日韩 人妻 高清 中文 | 亚洲精品成人福利网站 | 日日摸天天摸爽爽狠狠97 | 两性色午夜免费视频 | 综合激情五月综合激情五月激情1 | 少妇高潮喷潮久久久影院 | 日韩精品久久久肉伦网站 | 久久99精品国产麻豆 | 狠狠亚洲超碰狼人久久 | 亚洲国产精品美女久久久久 | 亚洲 a v无 码免 费 成 人 a v | 在线亚洲高清揄拍自拍一品区 | 疯狂三人交性欧美 | 狠狠色噜噜狠狠狠狠7777米奇 | 少妇无码一区二区二三区 | 色一情一乱一伦 | 少妇久久久久久人妻无码 | 天堂在线观看www | 色综合久久久无码网中文 | 55夜色66夜色国产精品视频 | 国产精品-区区久久久狼 | 国产又粗又硬又大爽黄老大爷视 | 国产免费久久精品国产传媒 | 久久午夜夜伦鲁鲁片无码免费 | 国产性生交xxxxx无码 | 欧美一区二区三区视频在线观看 | 99视频精品全部免费免费观看 | 国产精品99爱免费视频 | 国产精品久久福利网站 | 国产另类ts人妖一区二区 | 99在线 | 亚洲 | 人人妻人人澡人人爽精品欧美 | 一本色道婷婷久久欧美 | 少女韩国电视剧在线观看完整 | 国产无遮挡又黄又爽免费视频 | 国产亚洲视频中文字幕97精品 | 牲欲强的熟妇农村老妇女视频 | 日韩精品无码一本二本三本色 | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美喷潮久久久xxxxx | 成人精品视频一区二区三区尤物 | 永久免费精品精品永久-夜色 | 永久免费精品精品永久-夜色 | 99久久精品日本一区二区免费 | 国产69精品久久久久app下载 | 福利一区二区三区视频在线观看 | 理论片87福利理论电影 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲а∨天堂久久精品2021 | 国产精品99久久精品爆乳 | 国产99久久精品一区二区 | 牲交欧美兽交欧美 | 成人三级无码视频在线观看 | 亚洲男女内射在线播放 | 无码精品人妻一区二区三区av | 亚洲国产一区二区三区在线观看 | 在线播放免费人成毛片乱码 | 国产综合在线观看 | 纯爱无遮挡h肉动漫在线播放 | 国产av人人夜夜澡人人爽麻豆 | 无码毛片视频一区二区本码 | 久久国产精品_国产精品 | 四虎影视成人永久免费观看视频 | 久久久精品成人免费观看 | 一本久久a久久精品vr综合 | www国产亚洲精品久久网站 | 国精品人妻无码一区二区三区蜜柚 | 激情爆乳一区二区三区 | 亚洲自偷精品视频自拍 | 国产小呦泬泬99精品 | 欧美激情综合亚洲一二区 | 在线看片无码永久免费视频 | 成人精品一区二区三区中文字幕 | 精品少妇爆乳无码av无码专区 | 女人被男人爽到呻吟的视频 | 又湿又紧又大又爽a视频国产 | 红桃av一区二区三区在线无码av | 日本一区二区更新不卡 | 撕开奶罩揉吮奶头视频 | 风流少妇按摩来高潮 | 国产亲子乱弄免费视频 | 国产办公室秘书无码精品99 | 国产 浪潮av性色四虎 | 99视频精品全部免费免费观看 | 亚洲无人区午夜福利码高清完整版 | 一个人看的www免费视频在线观看 | 国产人成高清在线视频99最全资源 | 婷婷综合久久中文字幕蜜桃三电影 | 搡女人真爽免费视频大全 | 国产九九九九九九九a片 | 黑人巨大精品欧美一区二区 | 亚洲综合另类小说色区 | 精品无人国产偷自产在线 | 99久久婷婷国产综合精品青草免费 | 麻花豆传媒剧国产免费mv在线 | 亚洲中文字幕无码中字 | 亚洲国产精品无码久久久久高潮 | 国产精品永久免费视频 | 国产内射爽爽大片视频社区在线 | 国产综合久久久久鬼色 | 国产欧美精品一区二区三区 | 99精品视频在线观看免费 | 欧美熟妇另类久久久久久不卡 | 成人无码视频在线观看网站 | 日本熟妇大屁股人妻 | 1000部啪啪未满十八勿入下载 | 未满成年国产在线观看 | 国产精品va在线观看无码 | 少妇被黑人到高潮喷出白浆 | 午夜性刺激在线视频免费 | 亚洲精品一区二区三区婷婷月 | 久久精品国产亚洲精品 | 人妻少妇精品无码专区动漫 | 国内精品人妻无码久久久影院蜜桃 | 性生交片免费无码看人 | 久久综合九色综合欧美狠狠 | 国产精品福利视频导航 | 国产人妻久久精品二区三区老狼 | 国产成人无码a区在线观看视频app | 亚洲中文字幕无码中文字在线 | 亚洲国产精品成人久久蜜臀 | 麻豆国产人妻欲求不满谁演的 | 国内精品九九久久久精品 | 欧美日韩一区二区综合 | 国产香蕉尹人综合在线观看 | 国产情侣作爱视频免费观看 | 2019nv天堂香蕉在线观看 | 日日摸夜夜摸狠狠摸婷婷 | 麻豆国产人妻欲求不满谁演的 | 老熟妇乱子伦牲交视频 | 亚洲熟妇自偷自拍另类 | 丰满少妇女裸体bbw | 国产亚av手机在线观看 | 国产麻豆精品精东影业av网站 | 国产精品久久久一区二区三区 | 中文无码伦av中文字幕 | 国产小呦泬泬99精品 | 亚洲精品一区二区三区四区五区 | 最近的中文字幕在线看视频 | 久久国产自偷自偷免费一区调 | 国产精品无码一区二区三区不卡 | 亚洲精品久久久久avwww潮水 | 中文字幕人妻无码一区二区三区 | 久热国产vs视频在线观看 | 无码福利日韩神码福利片 | 少妇邻居内射在线 | 久久国语露脸国产精品电影 | 久久 国产 尿 小便 嘘嘘 | 精品偷拍一区二区三区在线看 | 搡女人真爽免费视频大全 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲色欲久久久综合网东京热 | 四虎国产精品一区二区 | 乱人伦人妻中文字幕无码久久网 | 国产精品内射视频免费 | 欧美人妻一区二区三区 | 成人无码视频在线观看网站 | 国产成人精品视频ⅴa片软件竹菊 | 久久99精品国产麻豆蜜芽 | 中国女人内谢69xxxxxa片 | 亚洲精品欧美二区三区中文字幕 | 西西人体www44rt大胆高清 | 亚洲乱码国产乱码精品精 | 国产在线一区二区三区四区五区 | 国产无遮挡又黄又爽免费视频 | 国产亚洲精品久久久闺蜜 | 夜精品a片一区二区三区无码白浆 | www国产亚洲精品久久久日本 | 女高中生第一次破苞av | 国产精品久久久午夜夜伦鲁鲁 | 亚洲精品一区二区三区大桥未久 | 精品乱码久久久久久久 | 国产熟妇另类久久久久 | 性色欲网站人妻丰满中文久久不卡 | 激情爆乳一区二区三区 | 狠狠cao日日穞夜夜穞av | 国产激情无码一区二区app | 中文毛片无遮挡高清免费 | 免费网站看v片在线18禁无码 | 白嫩日本少妇做爰 | 丰腴饱满的极品熟妇 | 国产精品va在线播放 | 亚洲中文字幕在线观看 | 人人澡人摸人人添 | 在线播放无码字幕亚洲 | 国产激情艳情在线看视频 | 久久久亚洲欧洲日产国码αv | 麻豆av传媒蜜桃天美传媒 | 人妻与老人中文字幕 | 国产激情精品一区二区三区 | 内射老妇bbwx0c0ck | 在线精品亚洲一区二区 | aⅴ亚洲 日韩 色 图网站 播放 | 亚洲精品成人av在线 | 内射老妇bbwx0c0ck | 天海翼激烈高潮到腰振不止 | 亚洲精品国产a久久久久久 | 人人澡人人透人人爽 | 亚洲色欲久久久综合网东京热 | 久久久久久a亚洲欧洲av冫 | 自拍偷自拍亚洲精品被多人伦好爽 | 在线精品国产一区二区三区 | 国产绳艺sm调教室论坛 | 精品国产麻豆免费人成网站 | 人人妻人人澡人人爽精品欧美 | 久久久久免费精品国产 | 欧美日韩久久久精品a片 | 色综合久久久无码中文字幕 | 日日摸日日碰夜夜爽av | 国产精品无码mv在线观看 | 亚洲中文字幕无码中文字在线 | 久久伊人色av天堂九九小黄鸭 | 日日天干夜夜狠狠爱 | 欧美国产日产一区二区 | 99久久久国产精品无码免费 | 在线精品国产一区二区三区 | 国产97色在线 | 免 | 18禁黄网站男男禁片免费观看 | 最新版天堂资源中文官网 | 最新国产麻豆aⅴ精品无码 | 国产精品亚洲五月天高清 | 久久99精品国产麻豆蜜芽 | 国产午夜无码精品免费看 | 亚洲精品综合一区二区三区在线 | 丰满岳乱妇在线观看中字无码 | 国产免费观看黄av片 | 乱人伦中文视频在线观看 | 两性色午夜视频免费播放 | 中文字幕+乱码+中文字幕一区 | 国产精品久久久久久久9999 | 亚洲自偷自拍另类第1页 | 免费网站看v片在线18禁无码 | 天海翼激烈高潮到腰振不止 | 国产成人一区二区三区别 | 精品国产一区二区三区四区在线看 | 成年美女黄网站色大免费全看 | 国内精品久久毛片一区二区 | 好屌草这里只有精品 | 丰满人妻一区二区三区免费视频 | 亚洲精品久久久久avwww潮水 | 国产成人一区二区三区别 | www国产精品内射老师 | 国产精品亚洲а∨无码播放麻豆 | 国内精品九九久久久精品 | 性做久久久久久久久 | 欧美 亚洲 国产 另类 | 欧美性生交xxxxx久久久 | 国产av人人夜夜澡人人爽麻豆 | 国产亚洲人成a在线v网站 | 乱码av麻豆丝袜熟女系列 | 国产高潮视频在线观看 | 国产熟妇高潮叫床视频播放 | 精品国产一区av天美传媒 | 欧美 日韩 亚洲 在线 | 亚洲精品国产品国语在线观看 | 久久精品中文字幕大胸 | 欧美变态另类xxxx | 国产乱人偷精品人妻a片 | 内射老妇bbwx0c0ck | 国产成人久久精品流白浆 | 欧美国产日韩亚洲中文 | 亚洲国产成人av在线观看 | 黑人巨大精品欧美一区二区 | 欧洲极品少妇 | 精品一二三区久久aaa片 | 欧美熟妇另类久久久久久不卡 | 精品无人国产偷自产在线 | 综合人妻久久一区二区精品 | 俄罗斯老熟妇色xxxx | 在线看片无码永久免费视频 | 人妻少妇精品视频专区 | 四十如虎的丰满熟妇啪啪 | 一区二区传媒有限公司 | 国产一区二区三区精品视频 | 成人无码视频免费播放 | 女人高潮内射99精品 | 亚洲国产精品无码久久久久高潮 | 国产黄在线观看免费观看不卡 | av无码不卡在线观看免费 | 性色av无码免费一区二区三区 | 漂亮人妻洗澡被公强 日日躁 | 搡女人真爽免费视频大全 | 久久熟妇人妻午夜寂寞影院 | 久久精品无码一区二区三区 | 亚洲区小说区激情区图片区 | 精品无码国产自产拍在线观看蜜 | 午夜福利试看120秒体验区 | 夜先锋av资源网站 | 中文字幕无线码免费人妻 | 精品国产福利一区二区 | 国产黄在线观看免费观看不卡 | 欧洲vodafone精品性 | 最新版天堂资源中文官网 | 亚洲国产综合无码一区 | 高潮毛片无遮挡高清免费 | 成人免费无码大片a毛片 | 成人影院yy111111在线观看 | 成人免费视频视频在线观看 免费 | 欧美人与禽猛交狂配 | 窝窝午夜理论片影院 | 成人亚洲精品久久久久软件 | 51国偷自产一区二区三区 | 亚洲欧洲日本无在线码 | 国产精品无码mv在线观看 | 奇米影视7777久久精品 | 中文字幕 亚洲精品 第1页 | 人人爽人人澡人人高潮 | 成熟女人特级毛片www免费 | 男人和女人高潮免费网站 | 久久久国产精品无码免费专区 | 大肉大捧一进一出好爽视频 | 国产内射老熟女aaaa | √天堂资源地址中文在线 | 色婷婷欧美在线播放内射 | 精品国产av色一区二区深夜久久 | 中文精品无码中文字幕无码专区 | 日韩少妇内射免费播放 | 领导边摸边吃奶边做爽在线观看 | 女人被男人躁得好爽免费视频 | 撕开奶罩揉吮奶头视频 | 国产人妻人伦精品1国产丝袜 | 亚洲欧洲日本综合aⅴ在线 | 小sao货水好多真紧h无码视频 | aⅴ在线视频男人的天堂 | 99riav国产精品视频 | 亚洲精品www久久久 | 国产超碰人人爽人人做人人添 | 永久免费观看国产裸体美女 | 国产乱子伦视频在线播放 | 国产精品自产拍在线观看 | 99国产欧美久久久精品 | 无码国模国产在线观看 | 东京热无码av男人的天堂 | 高清不卡一区二区三区 | 玩弄少妇高潮ⅹxxxyw | 国产精品久久国产三级国 | 免费无码肉片在线观看 | 一本精品99久久精品77 | 日本熟妇乱子伦xxxx | 亚洲熟女一区二区三区 | 亲嘴扒胸摸屁股激烈网站 | 国产人妻精品一区二区三区 | 激情亚洲一区国产精品 | 奇米影视7777久久精品人人爽 | 精品久久久无码人妻字幂 | 国产无遮挡又黄又爽又色 | 精品成在人线av无码免费看 | 久久久久99精品国产片 | 荫蒂被男人添的好舒服爽免费视频 | 国产精品.xx视频.xxtv | 免费国产成人高清在线观看网站 | 日韩亚洲欧美精品综合 | 国产精品美女久久久网av | 55夜色66夜色国产精品视频 | 久久97精品久久久久久久不卡 | 亚洲精品一区国产 | 妺妺窝人体色www在线小说 | 久久综合给合久久狠狠狠97色 | 国产精品久久久一区二区三区 | 亚洲一区二区三区四区 | 久久伊人色av天堂九九小黄鸭 | 东京一本一道一二三区 | 亚洲天堂2017无码 | 六月丁香婷婷色狠狠久久 | 日本乱偷人妻中文字幕 | 日本护士xxxxhd少妇 | 日韩 欧美 动漫 国产 制服 | 午夜丰满少妇性开放视频 | 在线看片无码永久免费视频 | 欧美怡红院免费全部视频 | 国产人成高清在线视频99最全资源 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲区欧美区综合区自拍区 | 国产无遮挡又黄又爽又色 | 乱人伦人妻中文字幕无码久久网 | 日本一卡2卡3卡四卡精品网站 | 欧美第一黄网免费网站 | 激情亚洲一区国产精品 | 色综合久久久无码网中文 | 日本护士毛茸茸高潮 | 少妇邻居内射在线 | 狠狠噜狠狠狠狠丁香五月 | 精品久久久久久亚洲精品 | 丰满肥臀大屁股熟妇激情视频 | av无码不卡在线观看免费 | 色欲人妻aaaaaaa无码 | 国产av无码专区亚洲awww | 狂野欧美性猛xxxx乱大交 | 青青青手机频在线观看 | 无码人妻黑人中文字幕 | 精品人妻人人做人人爽夜夜爽 | 97精品国产97久久久久久免费 | 久久综合给合久久狠狠狠97色 | 久久久久人妻一区精品色欧美 | 国产熟妇另类久久久久 | 日本精品人妻无码免费大全 | 亚洲国产日韩a在线播放 | 国产香蕉尹人视频在线 | 在线a亚洲视频播放在线观看 | 亚洲日韩av一区二区三区中文 | 日产精品高潮呻吟av久久 | 亚洲国产一区二区三区在线观看 | 日韩人妻系列无码专区 | 动漫av一区二区在线观看 | 狠狠亚洲超碰狼人久久 | 亚洲国产精品成人久久蜜臀 | 亚洲国产高清在线观看视频 | 青青草原综合久久大伊人精品 | 国产激情无码一区二区app | 国产免费久久久久久无码 | 日本爽爽爽爽爽爽在线观看免 | 日本护士毛茸茸高潮 | 久久人人97超碰a片精品 | 中文字幕日韩精品一区二区三区 | 久久亚洲精品成人无码 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产绳艺sm调教室论坛 | 青春草在线视频免费观看 | 色婷婷综合激情综在线播放 | 好男人www社区 | 影音先锋中文字幕无码 | 国产精品久久久久久无码 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 好男人www社区 | 亚洲中文字幕无码中文字在线 | 亚洲aⅴ无码成人网站国产app | 黑人巨大精品欧美黑寡妇 | 麻豆精品国产精华精华液好用吗 | 鲁大师影院在线观看 | 精品无码av一区二区三区 | 97精品人妻一区二区三区香蕉 | 久久久久久久人妻无码中文字幕爆 | 欧美刺激性大交 | 免费无码一区二区三区蜜桃大 | 特级做a爰片毛片免费69 | 亚洲精品一区国产 | 狠狠噜狠狠狠狠丁香五月 | 中文字幕无码免费久久99 | 丰满肥臀大屁股熟妇激情视频 | 色欲人妻aaaaaaa无码 | 久久人人爽人人爽人人片av高清 | 国产在线精品一区二区高清不卡 | 国产午夜视频在线观看 | 伊人久久大香线蕉午夜 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 人妻中文无码久热丝袜 | 日日碰狠狠躁久久躁蜜桃 | 伊人色综合久久天天小片 | 国产高清不卡无码视频 | 国产成人无码a区在线观看视频app | 国产又爽又猛又粗的视频a片 | 高潮毛片无遮挡高清免费视频 | 老熟妇仑乱视频一区二区 | 在线观看国产一区二区三区 | 成人免费视频在线观看 | 欧美精品免费观看二区 | 婷婷色婷婷开心五月四房播播 | 18禁黄网站男男禁片免费观看 | 亚洲人成网站免费播放 | 亚洲国产欧美日韩精品一区二区三区 | 国产精品无码mv在线观看 | 国内少妇偷人精品视频免费 | 成 人 免费观看网站 | a国产一区二区免费入口 | 亚洲国产精品一区二区第一页 | 成人片黄网站色大片免费观看 | 久久精品国产99精品亚洲 | 欧美国产日产一区二区 | 久精品国产欧美亚洲色aⅴ大片 | 久久久成人毛片无码 | 欧美人与善在线com | 在线 国产 欧美 亚洲 天堂 | 欧美人与禽zoz0性伦交 | 亚洲色大成网站www国产 | 日本熟妇人妻xxxxx人hd | 少妇邻居内射在线 | 国产在线无码精品电影网 | 人妻aⅴ无码一区二区三区 | 玩弄人妻少妇500系列视频 | 国产亚洲人成a在线v网站 | 国产婷婷色一区二区三区在线 | 日日鲁鲁鲁夜夜爽爽狠狠 | 欧美人与禽猛交狂配 | 两性色午夜免费视频 | 强伦人妻一区二区三区视频18 | 久久久无码中文字幕久... | 精品国产国产综合精品 | 在线播放无码字幕亚洲 | 麻豆蜜桃av蜜臀av色欲av | 色 综合 欧美 亚洲 国产 | 自拍偷自拍亚洲精品10p | 丝袜人妻一区二区三区 | 亚洲国产成人av在线观看 | 免费网站看v片在线18禁无码 | 亚洲一区二区三区无码久久 | 一本色道久久综合亚洲精品不卡 | 国产亚洲欧美在线专区 | a在线观看免费网站大全 | 欧美老妇交乱视频在线观看 | 亚洲国产精品一区二区美利坚 | 日韩亚洲欧美中文高清在线 | 久久97精品久久久久久久不卡 | 人妻中文无码久热丝袜 | av小次郎收藏 | 激情人妻另类人妻伦 | 久久久久国色av免费观看性色 | 色偷偷人人澡人人爽人人模 | 国产精品自产拍在线观看 | 国产色在线 | 国产 | 强开小婷嫩苞又嫩又紧视频 | 欧美黑人巨大xxxxx | 精品国产一区av天美传媒 | 国产激情无码一区二区app | 蜜桃av抽搐高潮一区二区 | 婷婷六月久久综合丁香 | 亚洲精品久久久久久一区二区 | 夜夜影院未满十八勿进 | 日本熟妇大屁股人妻 | 97夜夜澡人人双人人人喊 | 精品无码国产自产拍在线观看蜜 | 国产激情艳情在线看视频 | 精品人妻中文字幕有码在线 | 日本又色又爽又黄的a片18禁 | 国产成人无码午夜视频在线观看 | 乱人伦中文视频在线观看 | 欧美日韩人成综合在线播放 | 免费观看的无遮挡av | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲 高清 成人 动漫 | 精品无码一区二区三区的天堂 | 国产偷自视频区视频 | 欧美日韩一区二区综合 | 午夜精品一区二区三区的区别 | 乱中年女人伦av三区 | 亚洲伊人久久精品影院 | 特黄特色大片免费播放器图片 | 日韩精品成人一区二区三区 | 精品厕所偷拍各类美女tp嘘嘘 | 无码人妻出轨黑人中文字幕 | 亚洲日韩av片在线观看 | 嫩b人妻精品一区二区三区 | 国产农村妇女高潮大叫 | 2019午夜福利不卡片在线 | 日韩欧美成人免费观看 | 丝袜美腿亚洲一区二区 | 精品无码国产自产拍在线观看蜜 | 麻豆果冻传媒2021精品传媒一区下载 | 久久国语露脸国产精品电影 | 女人被爽到呻吟gif动态图视看 | 国产成人综合美国十次 | 丝袜 中出 制服 人妻 美腿 | 女人高潮内射99精品 | 少妇人妻大乳在线视频 | a国产一区二区免费入口 | 日韩成人一区二区三区在线观看 | 久久久久亚洲精品中文字幕 | 偷窥村妇洗澡毛毛多 | 人人妻人人澡人人爽人人精品 | 欧美成人高清在线播放 | 性欧美牲交在线视频 | 欧美熟妇另类久久久久久多毛 | 无套内谢的新婚少妇国语播放 | 国产精品视频免费播放 | 亚洲の无码国产の无码步美 | 久久久av男人的天堂 | 日韩精品成人一区二区三区 | 少妇被黑人到高潮喷出白浆 | 欧美肥老太牲交大战 | 麻豆国产人妻欲求不满谁演的 | 亚无码乱人伦一区二区 | 欧美成人免费全部网站 | 久久无码中文字幕免费影院蜜桃 | 国产乡下妇女做爰 | 国产一区二区三区四区五区加勒比 | 亚拍精品一区二区三区探花 | 一本久久伊人热热精品中文字幕 | 国产精品毛多多水多 | 少妇被粗大的猛进出69影院 | 女人和拘做爰正片视频 | 日本一卡二卡不卡视频查询 | 97人妻精品一区二区三区 | 人妻少妇精品视频专区 | 丁香啪啪综合成人亚洲 | 无码人妻丰满熟妇区五十路百度 | 国产精品亚洲综合色区韩国 | 亚洲国产精品无码久久久久高潮 | 无码人妻丰满熟妇区毛片18 | 日韩精品无码一区二区中文字幕 | 国产尤物精品视频 | 老头边吃奶边弄进去呻吟 | 亚洲国产精品成人久久蜜臀 | 国产绳艺sm调教室论坛 | 国产成人综合色在线观看网站 | 在线а√天堂中文官网 | 久久久亚洲欧洲日产国码αv | 小sao货水好多真紧h无码视频 | 最近的中文字幕在线看视频 | 成熟人妻av无码专区 | 永久黄网站色视频免费直播 | 天堂无码人妻精品一区二区三区 | 国内综合精品午夜久久资源 | 国内精品人妻无码久久久影院 | 国产特级毛片aaaaaa高潮流水 | 久久国产劲爆∧v内射 | 国产 浪潮av性色四虎 | 国产97人人超碰caoprom | 亚洲热妇无码av在线播放 | 宝宝好涨水快流出来免费视频 | 无遮挡国产高潮视频免费观看 | 国产偷自视频区视频 | 九一九色国产 | 久久精品无码一区二区三区 | 精品乱子伦一区二区三区 | 熟妇女人妻丰满少妇中文字幕 | 日日摸日日碰夜夜爽av | 无码人妻黑人中文字幕 | 国产精品永久免费视频 | 小sao货水好多真紧h无码视频 | 黑人巨大精品欧美黑寡妇 | 影音先锋中文字幕无码 | 任你躁在线精品免费 | 波多野结衣 黑人 | 亚洲国产午夜精品理论片 | 久久久久久久久888 | 奇米影视7777久久精品人人爽 | 久久国产精品萌白酱免费 | 强伦人妻一区二区三区视频18 | 无套内谢的新婚少妇国语播放 | 黑人玩弄人妻中文在线 | 亚洲一区二区三区无码久久 | 好爽又高潮了毛片免费下载 | 国内老熟妇对白xxxxhd | 日日鲁鲁鲁夜夜爽爽狠狠 | 亚洲一区二区三区含羞草 | 无码av免费一区二区三区试看 | 四虎影视成人永久免费观看视频 | 女人被男人躁得好爽免费视频 | 日韩无码专区 | 97夜夜澡人人爽人人喊中国片 | 最新国产乱人伦偷精品免费网站 | 国产高潮视频在线观看 | 欧美自拍另类欧美综合图片区 | 亚洲精品国产精品乱码不卡 | 亚洲国产精品成人久久蜜臀 | 国产精品久久久一区二区三区 | 成人欧美一区二区三区黑人免费 | 成 人 网 站国产免费观看 | 国内丰满熟女出轨videos | 三级4级全黄60分钟 | 日韩欧美中文字幕在线三区 | 亚洲色大成网站www国产 | 亚洲一区二区三区四区 | 97久久国产亚洲精品超碰热 | 亚洲综合精品香蕉久久网 | 内射爽无广熟女亚洲 | 亚洲爆乳精品无码一区二区三区 | 日韩精品无码一本二本三本色 | 国内精品久久毛片一区二区 | 99精品国产综合久久久久五月天 | 免费观看又污又黄的网站 | 中文字幕中文有码在线 | 亚洲aⅴ无码成人网站国产app | 国产亚洲精品久久久闺蜜 | 少妇高潮一区二区三区99 | 中文字幕+乱码+中文字幕一区 | 奇米影视7777久久精品 | 久久99精品久久久久久 | 激情国产av做激情国产爱 | 欧美freesex黑人又粗又大 | 未满成年国产在线观看 | 免费无码一区二区三区蜜桃大 | 久久久久av无码免费网 | 欧美日韩精品 | 日韩无码专区 | 欧美激情综合亚洲一二区 | 国产成人无码av在线影院 | 少妇性l交大片欧洲热妇乱xxx | 久久久久成人精品免费播放动漫 | 国产精品18久久久久久麻辣 | 色婷婷av一区二区三区之红樱桃 | 欧美精品无码一区二区三区 | 国产成人精品一区二区在线小狼 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 精品国产精品久久一区免费式 | 亚洲精品国产精品乱码不卡 | 人人妻人人澡人人爽精品欧美 | 性生交大片免费看女人按摩摩 | 国内老熟妇对白xxxxhd | 一本色道久久综合狠狠躁 | 日本一卡二卡不卡视频查询 | 无人区乱码一区二区三区 | 乱中年女人伦av三区 | 国产办公室秘书无码精品99 | 国产精品久久久久久亚洲毛片 | 亚洲一区二区三区播放 | 国产人妻人伦精品1国产丝袜 | 18精品久久久无码午夜福利 | 欧美freesex黑人又粗又大 | 国产高潮视频在线观看 | 沈阳熟女露脸对白视频 | 又紧又大又爽精品一区二区 | 初尝人妻少妇中文字幕 | 亚洲中文字幕久久无码 | 亚洲成av人片天堂网无码】 | 88国产精品欧美一区二区三区 | 天堂а√在线中文在线 | 一二三四社区在线中文视频 | 国产成人综合色在线观看网站 | 国产欧美熟妇另类久久久 | 国产午夜视频在线观看 | 免费观看的无遮挡av | 精品无人区无码乱码毛片国产 | 国产xxx69麻豆国语对白 | 亚洲精品成人福利网站 | 欧美兽交xxxx×视频 | 欧美成人免费全部网站 | 在线а√天堂中文官网 | 天天燥日日燥 | 久久 国产 尿 小便 嘘嘘 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 日本高清一区免费中文视频 | 日韩成人一区二区三区在线观看 | 国产农村妇女高潮大叫 | 欧美猛少妇色xxxxx | 亚洲另类伦春色综合小说 | 国产97色在线 | 免 | 婷婷综合久久中文字幕蜜桃三电影 | 国产女主播喷水视频在线观看 | 正在播放东北夫妻内射 | 捆绑白丝粉色jk震动捧喷白浆 | 天天做天天爱天天爽综合网 | 欧洲美熟女乱又伦 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久天天躁夜夜躁狠狠 | 亚洲精品一区二区三区在线观看 | 亚洲大尺度无码无码专区 | 久久人人爽人人人人片 | 小鲜肉自慰网站xnxx | 中文字幕无码热在线视频 | 牲欲强的熟妇农村老妇女 | 成人免费视频视频在线观看 免费 | 18精品久久久无码午夜福利 | 亚洲国产欧美在线成人 | 国产情侣作爱视频免费观看 | 国产在线无码精品电影网 | 国精产品一品二品国精品69xx | 国产肉丝袜在线观看 | 国产亲子乱弄免费视频 | 天天爽夜夜爽夜夜爽 | 夫妻免费无码v看片 | 婷婷色婷婷开心五月四房播播 | 无码成人精品区在线观看 | 老子影院午夜伦不卡 | 亚洲国产精品无码久久久久高潮 | 久久久精品456亚洲影院 | 久久精品视频在线看15 | 99久久精品无码一区二区毛片 | 丰满诱人的人妻3 | 国产精品第一国产精品 | 日韩在线不卡免费视频一区 | аⅴ资源天堂资源库在线 | 超碰97人人做人人爱少妇 | 午夜理论片yy44880影院 | 宝宝好涨水快流出来免费视频 | 婷婷色婷婷开心五月四房播播 | 日本一区二区更新不卡 | 女人被男人爽到呻吟的视频 | 99久久婷婷国产综合精品青草免费 | 亚洲精品一区二区三区在线观看 | 国产亚洲日韩欧美另类第八页 | 性欧美牲交xxxxx视频 | 午夜精品久久久久久久久 | 香港三级日本三级妇三级 | 在线观看国产午夜福利片 | 精品亚洲成av人在线观看 | 亚洲综合精品香蕉久久网 | 久久久av男人的天堂 | 国产成人一区二区三区别 | 亚洲精品一区二区三区大桥未久 | 亚洲欧美日韩综合久久久 | 日本xxxx色视频在线观看免费 | 日本精品少妇一区二区三区 | 亚洲成av人影院在线观看 | 精品久久久无码中文字幕 | 亚欧洲精品在线视频免费观看 | 精品偷拍一区二区三区在线看 | 性色欲网站人妻丰满中文久久不卡 | 国内精品人妻无码久久久影院 | 欧美黑人乱大交 | 女人被爽到呻吟gif动态图视看 | 久久99国产综合精品 | 国产精品怡红院永久免费 | 精品久久8x国产免费观看 | 一区二区三区高清视频一 | 久久久婷婷五月亚洲97号色 | 日本精品人妻无码免费大全 | 欧美日韩一区二区综合 | 东京热无码av男人的天堂 | 亚洲午夜无码久久 | 国产明星裸体无码xxxx视频 | 中文字幕av无码一区二区三区电影 | 亚洲gv猛男gv无码男同 | 麻豆国产97在线 | 欧洲 | 色老头在线一区二区三区 | 精品成在人线av无码免费看 | 精品亚洲韩国一区二区三区 | 帮老师解开蕾丝奶罩吸乳网站 | 999久久久国产精品消防器材 | 欧美 丝袜 自拍 制服 另类 | 水蜜桃亚洲一二三四在线 | 亚洲人亚洲人成电影网站色 | 一本加勒比波多野结衣 | 在线视频网站www色 | 国产精品久久福利网站 | 国产精品美女久久久 | 成人一在线视频日韩国产 | 中文字幕无码乱人伦 | 扒开双腿吃奶呻吟做受视频 | 狠狠色噜噜狠狠狠7777奇米 | 中文字幕日韩精品一区二区三区 | 黑人粗大猛烈进出高潮视频 | 老熟女重囗味hdxx69 | 日日干夜夜干 | 国产艳妇av在线观看果冻传媒 | 午夜肉伦伦影院 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产精品人妻一区二区三区四 | 国产无遮挡又黄又爽又色 | 亚洲国产精品成人久久蜜臀 | 影音先锋中文字幕无码 | 久久久久国色av免费观看性色 | 午夜福利不卡在线视频 | 精品国产一区二区三区av 性色 | 一本色道婷婷久久欧美 | 亚洲阿v天堂在线 | 日韩av激情在线观看 | 97资源共享在线视频 | 无码一区二区三区在线 | 国产精品无码久久av | 88国产精品欧美一区二区三区 | 亚洲码国产精品高潮在线 | 久久精品国产99久久6动漫 | 久久国产精品精品国产色婷婷 | 亚洲男人av香蕉爽爽爽爽 | 日本熟妇大屁股人妻 | 又粗又大又硬毛片免费看 | 久久久婷婷五月亚洲97号色 | 国产精品.xx视频.xxtv | 国产在线aaa片一区二区99 | 在线а√天堂中文官网 | 国产色xx群视频射精 | 国产av无码专区亚洲a∨毛片 | 无码播放一区二区三区 | 国产精品久久久av久久久 | 中文字幕无码免费久久9一区9 | 蜜桃视频韩日免费播放 | 成人av无码一区二区三区 | 天天躁夜夜躁狠狠是什么心态 | 强伦人妻一区二区三区视频18 | 亚洲精品国产第一综合99久久 | 色五月五月丁香亚洲综合网 | 亚洲人亚洲人成电影网站色 | 免费乱码人妻系列无码专区 | 亚洲无人区一区二区三区 | 国产精品人人爽人人做我的可爱 | 国产极品美女高潮无套在线观看 | 色综合久久中文娱乐网 | 性开放的女人aaa片 | 女人色极品影院 | 日日橹狠狠爱欧美视频 | 99久久精品国产一区二区蜜芽 | 久久www免费人成人片 | 国产精品久久精品三级 | 中文亚洲成a人片在线观看 | 国产免费久久精品国产传媒 | 日韩av无码中文无码电影 | 最近中文2019字幕第二页 | 国产内射老熟女aaaa | 国内精品久久毛片一区二区 | 国精品人妻无码一区二区三区蜜柚 | 无码人妻出轨黑人中文字幕 | 精品厕所偷拍各类美女tp嘘嘘 | 波多野结衣aⅴ在线 | 久久久久久久女国产乱让韩 | 国产人妻精品一区二区三区不卡 | 成熟女人特级毛片www免费 | 国产艳妇av在线观看果冻传媒 | 特黄特色大片免费播放器图片 | 国产口爆吞精在线视频 | 人人爽人人爽人人片av亚洲 | 大肉大捧一进一出视频出来呀 | 性欧美牲交在线视频 | 日日橹狠狠爱欧美视频 | 国产xxx69麻豆国语对白 | 日韩少妇内射免费播放 | 天天摸天天透天天添 | 少妇厨房愉情理9仑片视频 | 亚洲欧洲日本综合aⅴ在线 | 人人爽人人澡人人高潮 | 中文字幕av伊人av无码av | 无人区乱码一区二区三区 | 国产真人无遮挡作爱免费视频 | 无码帝国www无码专区色综合 | 动漫av一区二区在线观看 | 久久久亚洲欧洲日产国码αv | 97se亚洲精品一区 | 四虎影视成人永久免费观看视频 | 97精品国产97久久久久久免费 | 白嫩日本少妇做爰 | 男人扒开女人内裤强吻桶进去 | 少妇人妻大乳在线视频 | 九一九色国产 | 宝宝好涨水快流出来免费视频 |