精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文把Redis主從復(fù)制、哨兵、Cluster三種模式摸透

存儲 存儲軟件 Redis
Redis作為緩存的高效中間件,在我們?nèi)粘5拈_發(fā)中被頻繁的使用,今天就來說一說Redis的四種模式,分別是「單機(jī)版、主從復(fù)制、哨兵、以及集群模式」。

[[340676]]

 概述

Redis作為緩存的高效中間件,在我們?nèi)粘5拈_發(fā)中被頻繁的使用,今天就來說一說Redis的四種模式,分別是「單機(jī)版、主從復(fù)制、哨兵、以及集群模式」。

可能,在一般公司的程序員使用單機(jī)版基本都能解決問題,在Redis的官網(wǎng)給出的數(shù)據(jù)是10W QPS,這對于應(yīng)付一般的公司綽綽有余了,再不行就來個主從模式,實現(xiàn)讀寫分離,性能又大大提高。

但是,我們作為有抱負(fù)的程序員,僅限于單機(jī)版和主從模式的crud是不行的,至少也要了解「哨兵」和「集群模式」的原理,這樣面試的時候才能和面試官扯皮啊。

之前對于Redis方面也是寫了比較多的文章,如:「Redis的基本數(shù)據(jù)類型和底層的實現(xiàn)原理、事務(wù)、持久化、分布式鎖、訂閱預(yù)發(fā)布」等,可以說是比較全面的教程了,這篇講完基本就全了,我會把文章系統(tǒng)的整理成pdf,分享給大家。

先來個整理的Redis大綱,可能還有不完整的地方,若是有不完整的,可以在留言區(qū)補(bǔ)充,我后續(xù)會加進(jìn)去。

 

單機(jī)

單機(jī)版的Redis就比較簡單了,基本90%的程序員都是用過,官網(wǎng)推薦操作Redis的第三方依賴庫是Jedis,在SpringBoot項目中,引入下面依賴就可以直接使用了:

  1. <dependency> 
  2.    <groupId>redis.clients</groupId> 
  3.    <artifactId>jedis</artifactId> 
  4.    <version>${jedis.version}</version> 
  5. </dependency> 

優(yōu)點

單機(jī)版的Redis也有很多優(yōu)點,比如實現(xiàn)實現(xiàn)簡單、維護(hù)簡單、部署簡單、維護(hù)成本非常低,不需要其它額外的開支。

缺點

但是,因為是單機(jī)版的Redis所以也存在很多的問題,比如最明顯的單點故障問題,一個Redis掛了,所有的請求就會直接打在了DB上。

并且一個Redis抗并發(fā)數(shù)量也是有限的,同時要兼顧讀寫兩種請求,只要訪問量一上來,Redis就受不了了,另一方面單機(jī)版的Redis數(shù)據(jù)量存儲也是有限的,數(shù)據(jù)量一大,再重啟Redis的時候,就會非常的慢,所以局限性也是比較大的。

實操搭建

單機(jī)版的搭建教程,在網(wǎng)上有非常多的全面的教程,基本就是傻瓜式操作,特別是在本地搭建的話,基本使用yum快捷方便,幾句命令就搞定了,這里推薦一個搭建教程:https://www.cnblogs.com/ zuidongfeng/p/8032505.html。

上面這個教程講的非常的詳細(xì),環(huán)境的搭建本來是運(yùn)維的工作,但是作為程序員嘗試自己去搭建環(huán)境還是有必要的,而且搭建環(huán)境這種東西,基本就是一勞永逸,搭建一次,可能下次換電腦或者重裝虛擬機(jī)才會再次搭建。

這里也放出redis常用的redis.conf的配置項,并且附帶注釋,看我是不是很暖男:

  1. daemonize yes  // 設(shè)置后臺啟動,一般設(shè)置yes 
  2. pidfile /var/run/redis.pid // edis以守護(hù)進(jìn)程方式運(yùn)行時,redis默認(rèn)會把pid寫入/var/run/redis.pid文件 
  3. port 6379 // 默認(rèn)端口為6379 
  4. bind 127.0.0.1 //主機(jī)地址,設(shè)置0.0.0.0表示都可以訪問。127.0.0.1表示只允許本機(jī)訪問 
  5. timeout 900  // 客戶端閑置多長時間后關(guān)閉連接,如果指定為0,表示關(guān)閉該功能 
  6. logfile stdout // 日志記錄方式,默認(rèn)為標(biāo)準(zhǔn)輸出 
  7. logfile "./redis7001.log"  # 指明日志文件名 
  8. databases 16 // 設(shè)置數(shù)據(jù)庫的數(shù)量,默認(rèn)數(shù)據(jù)庫為0 
  9. save  //有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件 
  10.  Redis默認(rèn)配置文件中提供了三個條件: 
  11.  save 900 1 //900秒(15分鐘)內(nèi)有1個更改 
  12.  save 300 10 //300秒(5分鐘)內(nèi)有10個更改 
  13.  save 60 10000  // 60秒內(nèi)有10000個更改 
  14. rdbcompression yes // 指定存儲至本地數(shù)據(jù)庫時是否壓縮數(shù)據(jù) 
  15. dbfilename dump.rdb //指定本地數(shù)據(jù)庫文件名 
  16. dir ./    //指定本地數(shù)據(jù)庫存放目錄 
  17. slaveof  // 主從同步設(shè)置,設(shè)置主數(shù)據(jù)庫的ip和端口 
  18. # 如果非零,則設(shè)置SO_KEEPALIVE選項來向空閑連接的客戶端發(fā)送ACK 
  19. tcp-keepalive 60 
  20. # 默認(rèn)如果開啟RDB快照(至少一條save指令)并且最新的后臺保存失敗,Redis將會停止接受寫操作 
  21. # 這將使用戶知道數(shù)據(jù)沒有正確的持久化到硬盤,否則可能沒人注意到并且造成一些災(zāi)難 
  22. stop-writes-on-bgsave-error yes 
  23. # 默認(rèn)如果開啟RDB快照(至少一條save指令)并且最新的后臺保存失敗,Redis將會停止接受寫操作。 
  24. stop-writes-on-bgsave-error yes 
  25. # 當(dāng)導(dǎo)出到 .rdb 數(shù)據(jù)庫時是否用LZF壓縮字符串對象 
  26. rdbcompression yes 
  27. # 版本5的RDB有一個CRC64算法的校驗和放在了文件的最后。這將使文件格式更加可靠。 
  28. rdbchecksum yes 
  29. # 持久化數(shù)據(jù)庫的文件名 
  30. dbfilename dump-master.rdb 
  31. # 工作目錄 
  32. dir /usr/local/redis-4.0.8/redis_master/ 
  33. # slav服務(wù)連接master的密碼 
  34. masterauth testmaster123 
  35. # 當(dāng)一個slave失去和master的連接,或者同步正在進(jìn)行中,slave的行為可以有兩種: 
  36. #1) 如果 slave-serve-stale-data 設(shè)置為 "yes" (默認(rèn)值),slave會繼續(xù)響應(yīng)客戶端請求,可能是正常數(shù)據(jù),或者是過時了的數(shù)據(jù),也可能是還沒獲得值的空數(shù)據(jù)。 
  37. # 2) 如果 slave-serve-stale-data 設(shè)置為 "no",slave會回復(fù)"正在從master同步 
  38. # (SYNC with master in progress)"來處理各種請求,除了 INFO 和 SLAVEOF 命令。 
  39. slave-serve-stale-data yes 
  40. # 配置是否僅讀 
  41. slave-read-only yes 
  42. # 如果你選擇“yes”Redis將使用更少的TCP包和帶寬來向slaves發(fā)送數(shù)據(jù)。但是這將使數(shù)據(jù)傳輸?shù)絪lave上有延遲,Linux內(nèi)核的默認(rèn)配置會達(dá)到40毫秒 
  43. # 如果你選擇了 "no" 數(shù)據(jù)傳輸?shù)絪alve的延遲將會減少但要使用更多的帶寬 
  44. repl-disable-tcp-nodelay no 
  45. # slave的優(yōu)先級,優(yōu)先級數(shù)字小的salve會優(yōu)先考慮提升為master 
  46. slave-priority 100 
  47. # 密碼驗證 
  48. requirepass testmaster123 
  49. # redis實例最大占用內(nèi)存,一旦內(nèi)存使用達(dá)到上限,Redis會根據(jù)選定的回收策略(參見: 
  50. # maxmemmory-policy)刪除key 
  51. maxmemory 3gb 
  52. # 最大內(nèi)存策略:如果達(dá)到內(nèi)存限制了,Redis如何選擇刪除key。 
  53. # volatile-lru -> 根據(jù)LRU算法刪除帶有過期時間的key。 
  54. # allkeys-lru -> 根據(jù)LRU算法刪除任何key。 
  55. # volatile-random -> 根據(jù)過期設(shè)置來隨機(jī)刪除key, 具備過期時間的key。  
  56. # allkeys->random -> 無差別隨機(jī)刪, 任何一個key。  
  57. # volatile-ttl -> 根據(jù)最近過期時間來刪除(輔以TTL), 這是對于有過期時間的key  
  58. # noeviction -> 誰也不刪,直接在寫操作時返回錯誤。 
  59. maxmemory-policy volatile-lru 
  60. # AOF開啟 
  61. appendonly no 
  62. # aof文件名 
  63. appendfilename "appendonly.aof" 
  64. # fsync() 系統(tǒng)調(diào)用告訴操作系統(tǒng)把數(shù)據(jù)寫到磁盤上,而不是等更多的數(shù)據(jù)進(jìn)入輸出緩沖區(qū)。 
  65. # 有些操作系統(tǒng)會真的把數(shù)據(jù)馬上刷到磁盤上;有些則會盡快去嘗試這么做。 
  66. # Redis支持三種不同的模式: 
  67. no:不要立刻刷,只有在操作系統(tǒng)需要刷的時候再刷。比較快。 
  68. # always:每次寫操作都立刻寫入到aof文件。慢,但是最安全。 
  69. # everysec:每秒寫一次。折中方案。  
  70. appendfsync everysec 
  71. # 如果AOF的同步策略設(shè)置成 "always" 或者 "everysec",并且后臺的存儲進(jìn)程(后臺存儲或?qū)懭階OF 
  72. # 日志)會產(chǎn)生很多磁盤I/O開銷。某些Linux的配置下會使Redis因為 fsync()系統(tǒng)調(diào)用而阻塞很久。 
  73. # 注意,目前對這個情況還沒有完美修正,甚至不同線程的 fsync() 會阻塞我們同步的write(2)調(diào)用。 
  74. # 為了緩解這個問題,可以用下面這個選項。它可以在 BGSAVE 或 BGREWRITEAOF 處理時阻止主進(jìn)程進(jìn)行fsync()。 
  75. # 這就意味著如果有子進(jìn)程在進(jìn)行保存操作,那么Redis就處于"不可同步"的狀態(tài)。 
  76. # 這實際上是說,在最差的情況下可能會丟掉30秒鐘的日志數(shù)據(jù)。(默認(rèn)Linux設(shè)定) 
  77. # 如果你有延時問題把這個設(shè)置成"yes",否則就保持"no",這是保存持久數(shù)據(jù)的最安全的方式。 
  78. no-appendfsync-on-rewrite yes 
  79. # 自動重寫AOF文件 
  80. auto-aof-rewrite-percentage 100 
  81. auto-aof-rewrite-min-size 64mb 
  82. # AOF文件可能在尾部是不完整的(這跟system關(guān)閉有問題,尤其是mount ext4文件系統(tǒng)時 
  83. # 沒有加上data=ordered選項。只會發(fā)生在os死時,redis自己死不會不完整)。 
  84. # 那redis重啟時load進(jìn)內(nèi)存的時候就有問題了。 
  85. # 發(fā)生的時候,可以選擇redis啟動報錯,并且通知用戶和寫日志,或者load盡量多正常的數(shù)據(jù)。 
  86. # 如果aof-load-truncated是yes,會自動發(fā)布一個log給客戶端然后load(默認(rèn))。 
  87. # 如果是no,用戶必須手動redis-check-aof修復(fù)AOF文件才可以。 
  88. # 注意,如果在讀取的過程中,發(fā)現(xiàn)這個aof是損壞的,服務(wù)器也是會退出的, 
  89. # 這個選項僅僅用于當(dāng)服務(wù)器嘗試讀取更多的數(shù)據(jù)但又找不到相應(yīng)的數(shù)據(jù)時。 
  90. aof-load-truncated yes 
  91. # Lua 腳本的最大執(zhí)行時間,毫秒為單位 
  92. lua-time-limit 5000 
  93. # Redis慢查詢?nèi)罩究梢杂涗洺^指定時間的查詢 
  94. slowlog-log-slower-than 10000 
  95. # 這個長度沒有限制。只是要主要會消耗內(nèi)存。你可以通過 SLOWLOG RESET 來回收內(nèi)存。 
  96. slowlog-max-len 128 
  97. # 客戶端的輸出緩沖區(qū)的限制,可用于強(qiáng)制斷開那些因為某種原因從服務(wù)器讀取數(shù)據(jù)的速度不夠快的客戶端 
  98. client-output-buffer-limit normal 0 0 0 
  99. client-output-buffer-limit slave 256mb 64mb 60 
  100. client-output-buffer-limit pubsub 32mb 8mb 60 
  101. # 當(dāng)一個子進(jìn)程重寫AOF文件時,文件每生成32M數(shù)據(jù)會被同步 
  102. aof-rewrite-incremental-fsync yes 

由于,單機(jī)版的Redis在并發(fā)量比較大的時候,并且需要較高性能和可靠性的時候,單機(jī)版基本就不適合了,于是就出現(xiàn)了「主從模式」。

主從模式

原理

主從的原理還算是比較簡單的,一主多從,「主數(shù)據(jù)庫(master)可以讀也可以寫(read/write),從數(shù)據(jù)庫僅讀(only read)」。

但是,主從模式一般實現(xiàn)「讀寫分離」,「主數(shù)據(jù)庫僅寫(only write)」,減輕主數(shù)據(jù)庫的壓力,下面一張圖搞懂主從模式的原理:

 

主從模式原理就是那么簡單,那他執(zhí)行的過程(工作機(jī)制)又是怎么樣的呢?再來一張圖:

當(dāng)開啟主從模式的時候,他的具體工作機(jī)制如下:

 

當(dāng)slave啟動后會向master發(fā)送SYNC命令,master節(jié)點收到從數(shù)據(jù)庫的命令后通過bgsave保存快照(「RDB持久化」),并且期間的執(zhí)行的些命令會被緩存起來。

然后master會將保存的快照發(fā)送給slave,并且繼續(xù)緩存期間的寫命令。

slave收到主數(shù)據(jù)庫發(fā)送過來的快照就會加載到自己的數(shù)據(jù)庫中。

最后master講緩存的命令同步給slave,slave收到命令后執(zhí)行一遍,這樣master與slave數(shù)據(jù)就保持一致了。

優(yōu)點

之所以運(yùn)用主從,是因為主從一定程度上解決了單機(jī)版并發(fā)量大,導(dǎo)致請求延遲或者redis宕機(jī)服務(wù)停止的問題。

從數(shù)據(jù)庫分擔(dān)主數(shù)據(jù)庫的讀壓力,若是主數(shù)據(jù)庫是只寫模式,那么實現(xiàn)讀寫分離,主數(shù)據(jù)庫就沒有了讀壓力了。

另一方面解決了單機(jī)版單點故障的問題,若是主數(shù)據(jù)庫掛了,那么從數(shù)據(jù)庫可以隨時頂上來,綜上來說,主從模式一定程度上提高了系統(tǒng)的可用性和性能,是實現(xiàn)哨兵和集群的基礎(chǔ)。

主從同步以異步方式進(jìn)行同步,期間Redis仍然可以響應(yīng)客戶端提交的查詢和更新的請求。

缺點

主從模式好是好,他也有自己的缺點,比如數(shù)據(jù)的一致性問題,假如主數(shù)據(jù)庫寫操作完成,那么他的數(shù)據(jù)會被復(fù)制到從數(shù)據(jù)庫,若是還沒有即使復(fù)制到從數(shù)據(jù)庫,讀請求又來了,此時讀取的數(shù)據(jù)就不是最新的數(shù)據(jù)。

若是從主同步的過程網(wǎng)絡(luò)出故障了,導(dǎo)致主從同步失敗,也會出現(xiàn)問題數(shù)據(jù)一致性的問題。

主從模式不具備自動容錯和恢復(fù)的功能,一旦主數(shù)據(jù)庫,從節(jié)點晉升為主數(shù)據(jù)庫的過程需要人為操作,維護(hù)的成本就會升高,并且主節(jié)點的寫能力、存儲能力都會受到限制。

實操搭建

下面的我們來實操搭建一下主從模式,主從模式的搭建還是比較簡單的,我這里一臺centos 7虛擬機(jī),使用開啟redis多實例的方法搭建主從。

redis中開啟多實例的方法,首先創(chuàng)建一個文件夾,用于存放redis集群的配置文件:

  1. mkdir redis 

然后粘貼復(fù)制redis.conf配置文件:

  1. cp /root/redis-4.0.6/redis.conf /root/redis/redis-6379.conf 
  2. cp /root/redis-4.0.6/redis.conf /root/redis/redis-6380.conf 
  3. cp /root/redis-4.0.6/redis.conf /root/redis/redis-6381.conf 

復(fù)制三份配置文件,一主兩從,6379端口作為主數(shù)據(jù)庫(master),6380、6381作為從數(shù)據(jù)庫(slave)。

首先是配置主數(shù)據(jù)庫的配置文件:vi redis-6379.conf:

  1. bind 0.0.0.0 # 注釋掉或配置成0.0.0.0表示任意IP均可訪問。 
  2. protected-mode no # 關(guān)閉保護(hù)模式,使用密碼訪問。 
  3. port 6379  # 設(shè)置端口,6380、6381依次為6380、6381。 
  4. timeout 30 # 客戶端連接空閑多久后斷開連接,單位秒,0表示禁用 
  5. daemonize yes # 在后臺運(yùn)行 
  6. pidfile /var/run/redis_6379.pid  # pid進(jìn)程文件名,6380、6381依次為redis_6380.pid、redis_6381.pid 
  7. logfile /root/reids/log/6379.log # 日志文件,6380、6381依次為6380.log、6381.log 
  8. save 900 1 # 900s內(nèi)至少一次寫操作則執(zhí)行bgsave進(jìn)行RDB持久化 
  9. save 300 10 
  10. save 60 10000  
  11. rdbcompression yes #是否對RDB文件進(jìn)行壓縮,建議設(shè)置為no,以(磁盤)空間換(CPU)時間 
  12. dbfilename dump.rdb # RDB文件名稱 
  13. dir /root/redis/datas # RDB文件保存路徑,AOF文件也保存在這里 
  14. appendonly yes # 表示使用AOF增量持久化的方式 
  15. appendfsync everysec # 可選值 always, everysec,no,建議設(shè)置為everysec 
  16. requirepass 123456 # 設(shè)置密碼 

然后,就是修改從數(shù)據(jù)庫的配置文件,在從數(shù)據(jù)庫的配置文件中加入以下的配置信息:

  1. slaveof 127.0.0.1 6379 # 配置master的ip,port 
  2. masterauth 123456 # 配置訪問master的密碼 
  3. slaveof-serve-stale-data no  

接下來就是啟動三個redis實例,啟動的命令,先cd到redis的src目錄下,然后執(zhí)行:

  1. ./redis-server /root/redis/6379.conf 
  2. ./redis-server /root/redis/6380.conf 
  3. ./redis-server /root/redis/6381.conf 

通過命令ps -aux | grep redis,查看啟動的redis進(jìn)程:

如上圖所示,表示啟動成功,下面就開始進(jìn)入測試階段。

 

測試

我這里使用SecureCRT作為redis連接的客戶端,同時啟動三個SecureCRT,分別連接redis1的三個實例,啟動時指定端口以及密碼:

  1. ./redis-cli -p 6379 -a 123456 

啟動后,在master(6379),輸入:set name 'ldc',在slave中通過get name,可以查看:


數(shù)據(jù)同步成功,這有幾個坑一個是redis.conf中沒有設(shè)置對bind,會導(dǎo)致非本機(jī)的ip被過濾掉,一般配置0.0.0.0就可以了。

 

另一個是沒有配置密碼requirepass 123456,會導(dǎo)致IO一直連接異常,這個是我遇到的坑,后面配置密碼后就成功了。

還有,就是查看redis的啟動日志可以發(fā)現(xiàn)有兩個warning,雖然不影響搭建主從同步,看著挺煩人的,但是有些人會遇到,有些人不會遇到。

但是,我這個人比較有強(qiáng)迫癥,百度也是有解決方案的,這里就不講了,交給你們自己解決,這里只是告訴你有這個問題,有些人看都不看日志的,看到啟動成功就認(rèn)為萬事大吉了,也不看日志,這習(xí)慣并不好。

 

哨兵模式

原理

哨兵模式是主從的升級版,因為主從的出現(xiàn)故障后,不會自動恢復(fù),需要人為干預(yù),這就很蛋疼啊。

在主從的基礎(chǔ)上,實現(xiàn)哨兵模式就是為了監(jiān)控主從的運(yùn)行狀況,對主從的健壯進(jìn)行監(jiān)控,就好像哨兵一樣,只要有異常就發(fā)出警告,對異常狀況進(jìn)行處理。

所以,總的概括來說,哨兵模式有以下的優(yōu)點(功能點):

 

  • 「監(jiān)控」:監(jiān)控master和slave是否正常運(yùn)行,以及哨兵之間也會相互監(jiān)控
  • 「自動故障恢復(fù)」:當(dāng)master出現(xiàn)故障的時候,會自動選舉一個slave作為master頂上去。

哨兵模式的監(jiān)控配置信息,是通過配置從數(shù)據(jù)庫的sentinel monitor 來指定的,比如:

  1. // mymaster 表示給master數(shù)據(jù)庫定義了一個名字,后面的是master的ip和端口,1表示至少需要一個Sentinel進(jìn)程同意才能將master判斷為失效,如果不滿足這個條件,則自動故障轉(zhuǎn)移(failover)不會執(zhí)行 
  2. sentinel monitor mymaster 127.0.0.1 6379 1 

節(jié)點通信

當(dāng)然還有其它的配置信息,其它配置信息,在環(huán)境搭建的時候再說。當(dāng)哨兵啟動后,會與master建立一條連接,用于訂閱master的_sentinel_:hello頻道。

該頻道用于獲取監(jiān)控該master的其它哨兵的信息。并且還會建立一條定時向master發(fā)送INFO命令獲取master信息的連接。

「當(dāng)哨兵與master建立連接后,定期會向(10秒一次)master和slave發(fā)送INFO命令,若是master被標(biāo)記為主觀下線,頻率就會變?yōu)?秒一次。」

并且,定期向_sentinel_:hello頻道發(fā)送自己的信息,以便其它的哨兵能夠訂閱獲取自己的信息,發(fā)送的內(nèi)容包含「哨兵的ip和端口、運(yùn)行id、配置版本、master名字、master的ip端口還有master的配置版本」等信息。

以及,「定期的向master、slave和其它哨兵發(fā)送PING命令(每秒一次),以便檢測對象是否存活」,若是對方接收到了PING命令,無故障情況下,會回復(fù)PONG命令。

所以,哨兵通過建立這兩條連接、通過定期發(fā)送INFO、PING命令來實現(xiàn)哨兵與哨兵、哨兵與master之間的通信。

這里涉及到一些概念需要理解,INFO、PING、PONG等命令,后面還會有MEET、FAIL命令,以及主觀下線,當(dāng)然還會有客觀下線,這里主要說一下這幾個概念的理解:

INFO:該命令可以獲取主從數(shù)據(jù)庫的最新信息,可以實現(xiàn)新結(jié)點的發(fā)現(xiàn)

PING:該命令被使用最頻繁,該命令封裝了自身節(jié)點和其它節(jié)點的狀態(tài)數(shù)據(jù)。

PONG:當(dāng)節(jié)點收到MEET和PING,會回復(fù)PONG命令,也把自己的狀態(tài)發(fā)送給對方。

MEET:該命令在新結(jié)點加入集群的時候,會向老節(jié)點發(fā)送該命令,表示自己是個新人

FAIL:當(dāng)節(jié)點下線,會向集群中廣播該消息。

上線和下線

當(dāng)哨兵與master相同之后就會定期一直保持聯(lián)系,若是某一時刻哨兵發(fā)送的PING在指定時間內(nèi)沒有收到回復(fù)(sentinel down-after-milliseconds master-name milliseconds 配置),那么發(fā)送PING命令的哨兵就會認(rèn)為該master「主觀下線」(Subjectively Down)。

因為有可能是哨兵與該master之間的網(wǎng)絡(luò)問題造成的,而不是master本身的原因,所以哨兵同時會詢問其它的哨兵是否也認(rèn)為該master下線,若是認(rèn)為該節(jié)點下線的哨兵達(dá)到一定的數(shù)量(「前面的quorum字段配置」),就會認(rèn)為該節(jié)點「客觀下線」(Objectively Down)。

若是沒有足夠數(shù)量的sentinel同意該master下線,則該master客觀下線的標(biāo)識會被移除;若是master重新向哨兵的PING命令回復(fù)了客觀下線的標(biāo)識也會被移除。

選舉算法

當(dāng)master被認(rèn)為客觀下線后,又是怎么進(jìn)行故障恢復(fù)的呢?原來哨兵中首先選舉出一個老大哨兵來進(jìn)行故障恢復(fù),選舉老大哨兵的算法叫做「Raft算法」:

  1. 發(fā)現(xiàn)master下線的哨兵(sentinelA)會向其它的哨兵發(fā)送命令進(jìn)行拉票,要求選擇自己為哨兵大佬。
  2. 若是目標(biāo)哨兵沒有選擇其它的哨兵,就會選擇該哨兵(sentinelA)為大佬。
  3. 若是選擇sentinelA的哨兵超過半數(shù)(半數(shù)原則),該大佬非sentinelA莫屬。
  4. 如果有多個哨兵同時競選,并且可能存在票數(shù)一致的情況,就會等待下次的一個隨機(jī)時間再次發(fā)起競選請求,進(jìn)行新的一輪投票,直到大佬被選出來。

選出大佬哨兵后,大佬哨兵就會對故障進(jìn)行自動回復(fù),從slave中選出一名slave作為主數(shù)據(jù)庫,選舉的規(guī)則如下所示:

  1. 所有的slave中slave-priority優(yōu)先級最高的會被選中。
  2. 若是優(yōu)先級相同,會選擇偏移量最大的,因為偏移量記錄著數(shù)據(jù)的復(fù)制的增量,越大表示數(shù)據(jù)越完整。
  3. 若是以上兩者都相同,選擇ID最小的。

通過以上的層層篩選最終實現(xiàn)故障恢復(fù),當(dāng)選的slave晉升為master,其它的slave會向新的master復(fù)制數(shù)據(jù),若是down掉的master重新上線,會被當(dāng)作slave角色運(yùn)行。

優(yōu)點

哨兵模式是主從模式的升級版,所以在系統(tǒng)層面提高了系統(tǒng)的可用性和性能、穩(wěn)定性。當(dāng)master宕機(jī)的時候,能夠自動進(jìn)行故障恢復(fù),需不要人為的干預(yù)。

哨兵與哨兵之間、哨兵與master之間能夠進(jìn)行及時的監(jiān)控,心跳檢測,及時發(fā)現(xiàn)系統(tǒng)的問題,這都是彌補(bǔ)了主從的缺點。

缺點

哨兵一主多從的模式同樣也會遇到寫的瓶頸,已經(jīng)存儲瓶頸,若是master宕機(jī)了,故障恢復(fù)的時間比較長,寫的業(yè)務(wù)就會受到影響。

增加了哨兵也增加了系統(tǒng)的復(fù)雜度,需要同時維護(hù)哨兵模式。

實操搭建

最后,我們進(jìn)行一下哨兵模式的搭建,配置哨兵模式還是比較簡單的,在上面配置的主從模式的基礎(chǔ)上,同時創(chuàng)建一個文件夾用于存放三個哨兵的配置文件:

  1. mkdir /root/redis-4.0.6/sentinel.conf  /root/redis/sentinel/sentinel1.conf  
  2. mkdir /root/redis-4.0.6/sentinel.conf  /root/redis/sentinel/sentinel2.conf  
  3. mkdir /root/redis-4.0.6/sentinel.conf  /root/redis/sentinel/sentinel3.conf  

分別在這三個文件中添加如下配置:

  1. daemonize yes # 在后臺運(yùn)行 
  2. sentinel monitor mymaster 127.0.0.1 6379 1 # 給master起一個名字mymaster,并且配置master的ip和端口 
  3. sentinel auth-pass mymaster 123456 # master的密碼 
  4. port 26379 #另外兩個配置36379,46379端口 
  5. sentinel down-after-milliseconds mymaster 3000 # 3s未回復(fù)PING就認(rèn)為master主觀下線 
  6. sentinel parallel-syncs mymaster 2  # 執(zhí)行故障轉(zhuǎn)移時,最多可以有2個slave實例在同步新的master實例 
  7. sentinel failover-timeout mymaster 100000 # 如果在10s內(nèi)未能完成故障轉(zhuǎn)移操作認(rèn)為故障轉(zhuǎn)移失敗 

配置完后分別啟動三臺哨兵:

  1. ./redis-server sentinel1.conf --sentinel 
  2. ./redis-server sentinel2.conf --sentinel 
  3. ./redis-server sentinel3.conf --sentinel 

然后通過:ps -aux|grep redis進(jìn)行查看:

可以看到三臺redis實例以及三個哨兵都已經(jīng)正常啟動,現(xiàn)登陸6379,通過INFO Repliaction查看master信息:


當(dāng)前master為6379,然后我們來測試一下哨兵的自動故障恢復(fù),直接kill掉6379進(jìn)程,然后通過登陸6380再次查看master的信息:

可以看到當(dāng)前的6380角色是master,并且6380可讀可寫,而不是只讀模式,這說明我們的哨兵是起作用了,搭建成功,感興趣的可以自行搭建,也有可能你會踩一堆的坑。

 

Cluster模式

最后,Cluster是真正的集群模式了,哨兵解決和主從不能自動故障恢復(fù)的問題,但是同時也存在難以擴(kuò)容以及單機(jī)存儲、讀寫能力受限的問題,并且集群之前都是一臺redis都是全量的數(shù)據(jù),這樣所有的redis都冗余一份,就會大大消耗內(nèi)存空間。

集群模式實現(xiàn)了Redis數(shù)據(jù)的分布式存儲,實現(xiàn)數(shù)據(jù)的分片,每個redis節(jié)點存儲不同的內(nèi)容,并且解決了在線的節(jié)點收縮(下線)和擴(kuò)容(上線)問題。

集群模式真正意義上實現(xiàn)了系統(tǒng)的高可用和高性能,但是集群同時進(jìn)一步使系統(tǒng)變得越來越復(fù)雜,接下來我們來詳細(xì)的了解集群的運(yùn)作原理。

數(shù)據(jù)分區(qū)原理

集群的原理圖還是很好理解的,在Redis集群中采用的是虛擬槽分區(qū)算法,會把redis集群分成16384 個槽(0 -16383)。

比如:下圖所示三個master,會把0 -16383范圍的槽可能分成三部分(0-5000)、(5001-11000)、(11001-16383)分別數(shù)據(jù)三個緩存節(jié)點的槽范圍。

當(dāng)客戶端請求過來,會首先通過對key進(jìn)行CRC16 校驗并對 16384 取模(CRC16(key)%16383)計算出key所在的槽,然后再到對應(yīng)的槽上進(jìn)行取數(shù)據(jù)或者存數(shù)據(jù),這樣就實現(xiàn)了數(shù)據(jù)的訪問更新。

 

之所以進(jìn)行分槽存儲,是將一整堆的數(shù)據(jù)進(jìn)行分片,防止單臺的redis數(shù)據(jù)量過大,影響性能的問題。

節(jié)點通信

節(jié)點之間實現(xiàn)了將數(shù)據(jù)進(jìn)行分片存儲,那么節(jié)點之間又是怎么通信的呢?這個和前面哨兵模式講的命令基本一樣。

首先新上線的節(jié)點,會通過 Gossip 協(xié)議向老成員發(fā)送Meet消息,表示自己是新加入的成員。

老成員收到Meet消息后,在沒有故障的情況下會恢復(fù)PONG消息,表示歡迎新結(jié)點的加入,除了第一次發(fā)送Meet消息后,之后都會發(fā)送定期PING消息,實現(xiàn)節(jié)點之間的通信。

 

通信的過程中會為每一個通信的節(jié)點開通一條tcp通道,之后就是定時任務(wù),不斷的向其它節(jié)點發(fā)送PING消息,這樣做的目的就是為了了解節(jié)點之間的元數(shù)據(jù)存儲情況,以及健康狀況,以便即使發(fā)現(xiàn)問題。

數(shù)據(jù)請求

上面說到了槽信息,在Redis的底層維護(hù)了unsigned char myslots[CLUSTER_SLOTS/8] 一個數(shù)組存放每個節(jié)點的槽信息。

因為他是一個二進(jìn)制數(shù)組,只有存儲0和1值,如下圖所示:

 

這樣數(shù)組只表示自己是否存儲對應(yīng)的槽數(shù)據(jù),若是1表示存在該數(shù)據(jù),0表示不存在該數(shù)據(jù),這樣查詢的效率就會非常的高,類似于布隆過濾器,二進(jìn)制存儲。

比如:集群節(jié)點1負(fù)責(zé)存儲0-5000的槽數(shù)據(jù),但是此時只有0、1、2存儲有數(shù)據(jù),其它的槽還沒有存數(shù)據(jù),所以0、1、2對應(yīng)的值為1。

并且,每個redis底層還維護(hù)了一個clusterNode數(shù)組,大小也是16384,用于儲存負(fù)責(zé)對應(yīng)槽的節(jié)點的ip、端口等信息,這樣每一個節(jié)點就維護(hù)了其它節(jié)點的元數(shù)據(jù)信息,便于及時的找到對應(yīng)的節(jié)點。

當(dāng)新結(jié)點加入或者節(jié)點收縮,通過PING命令通信,及時的更新自己clusterNode數(shù)組中的元數(shù)據(jù)信息,這樣有請求過來也就能及時的找到對應(yīng)的節(jié)點。

有兩種其它的情況就是,若是請求過來發(fā)現(xiàn),數(shù)據(jù)發(fā)生了遷移,比如新節(jié)點加入,會使舊的緩存節(jié)點數(shù)據(jù)遷移到新結(jié)點。

 

請求過來發(fā)現(xiàn)舊節(jié)點已經(jīng)發(fā)生了數(shù)據(jù)遷移并且數(shù)據(jù)被遷移到新結(jié)點,由于每個節(jié)點都有clusterNode信息,通過該信息的ip和端口。此時舊節(jié)點就會向客戶端發(fā)一個MOVED 的重定向請求,表示數(shù)據(jù)已經(jīng)遷移到新結(jié)點上,你要訪問這個新結(jié)點的ip和端口就能拿到數(shù)據(jù),這樣就能重新獲取到數(shù)據(jù)。

倘若正在發(fā)正數(shù)據(jù)遷移呢?舊節(jié)點就會向客戶端發(fā)送一個ASK 重定向請求,并返回給客戶端遷移的目標(biāo)節(jié)點的ip和端口,這樣也能獲取到數(shù)據(jù)。

擴(kuò)容和收縮

擴(kuò)容和收縮也就是節(jié)點的上線和下線,可能節(jié)點發(fā)生故障了,故障自動回復(fù)的過程(節(jié)點收縮)。

節(jié)點的收縮和擴(kuò)容時,會重新計算每一個節(jié)點負(fù)責(zé)的槽范圍,并發(fā)根據(jù)虛擬槽算法,將對應(yīng)的數(shù)據(jù)更新到對應(yīng)的節(jié)點。

還有前面的講的新加入的節(jié)點會首先發(fā)送Meet消息,詳細(xì)可以查看前面講的內(nèi)容,基本一樣的模式。

以及發(fā)生故障后,哨兵老大節(jié)點的選舉,master節(jié)點的重新選舉,slave怎樣晉升為master節(jié)點,可以查看前面哨兵模式選舉過程。

優(yōu)點

集群模式是一個無中心的架構(gòu)模式,將數(shù)據(jù)進(jìn)行分片,分布到對應(yīng)的槽中,每個節(jié)點存儲不同的數(shù)據(jù)內(nèi)容,通過路由能夠找到對應(yīng)的節(jié)點負(fù)責(zé)存儲的槽,能夠?qū)崿F(xiàn)高效率的查詢。

并且集群模式增加了橫向和縱向的擴(kuò)展能力,實現(xiàn)節(jié)點加入和收縮,集群模式是哨兵的升級版,哨兵的優(yōu)點集群都有。

缺點

緩存的最大問題就是帶來數(shù)據(jù)一致性問題,在平衡數(shù)據(jù)一致性的問題時,兼顧性能與業(yè)務(wù)要求,大多數(shù)都是以最終一致性的方案進(jìn)行解決,而不是強(qiáng)一致性。

并且集群模式帶來節(jié)點數(shù)量的劇增,一個集群模式最少要6臺機(jī),因為要滿足半數(shù)原則的選舉方式,所以也帶來了架構(gòu)的復(fù)雜性。

slave只充當(dāng)冷備,并不能緩解master的讀的壓力。

實操搭建

集群模式的部署比較簡單,只要在redis.conf加入下面的配置信息即可:

  1. port 6379# 本示例6個節(jié)點端口分別為6379、6380、6381、6382、6383、6384 
  2. daemonize yes # r后臺運(yùn)行  
  3. pidfile /var/run/redis_6379.pid # 分別對應(yīng)6379、6380、6381、6382、6383、6384 
  4. cluster-enabled yes # 開啟集群模式  
  5. masterauth 123456# 如果設(shè)置了密碼,需要指定master密碼 
  6. cluster-config-file nodes_6379.conf # 集群的配置文件,同樣對應(yīng)6379、6380、6381、6382、6383、6384六個節(jié)點 
  7. cluster-node-timeout 10000 # 請求超時時間 

同時開啟這六個實例,通過下面的命令將這六個實例以集群的方式運(yùn)行

  1. ./redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381  127.0.0.1:6382  127.0.0.1:6383  127.0.0.1:6384  -a 123456 

本文轉(zhuǎn)載自微信公眾號「非科班的科班」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系非科班的科班公眾號。

 

責(zé)任編輯:武曉燕 來源: 非科班的科班
相關(guān)推薦

2023-02-27 07:33:14

MySQL數(shù)據(jù)庫服務(wù)器

2023-03-15 08:30:37

2020-11-24 10:13:02

Redis集群數(shù)據(jù)庫

2021-01-11 14:45:35

Redis數(shù)據(jù)庫命令

2023-07-31 21:56:54

哨兵系統(tǒng)redis

2023-09-24 14:32:15

2022-11-06 21:31:11

云原生Sentinel集群模式

2025-10-09 09:28:50

2022-02-06 10:58:37

Redis主從模式

2024-11-11 07:05:00

Redis哨兵模式主從復(fù)制

2023-11-27 13:18:00

Redis數(shù)據(jù)不丟失

2019-11-28 09:33:08

Redis架構(gòu)互聯(lián)網(wǎng)

2023-04-27 07:52:56

Redis集群模式

2024-12-09 00:00:09

2023-03-19 22:38:12

邏輯復(fù)制PostgreSQL

2023-03-19 11:53:27

2023-12-25 08:02:09

2020-04-21 10:37:41

Apply數(shù)據(jù)參數(shù)

2022-03-01 20:41:00

機(jī)器學(xué)習(xí)特征人工智能

2021-06-21 11:24:52

Redis內(nèi)存數(shù)據(jù)庫數(shù)據(jù)結(jié)構(gòu)
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲国产精品三区| 欧美另类网站| 青青草国产在线观看| 日韩中文字幕视频网| 狠狠久久五月精品中文字幕| 日韩动漫在线观看| 精品人妻一区二区三区三区四区| 亚洲精品欧美| 日韩中文在线中文网在线观看| 日本中文字幕在线不卡| 欧美电影免费观看高清完整| 亚洲欧美国产三级| 久久国产精品一区二区三区| 在线免费看av的网站| 亚洲激情综合| 久久色免费在线视频| 国产精品无码永久免费不卡| 玖玖精品在线| 亚洲一二三四在线| 超碰免费在线公开| 欧美日韩视频精品二区| 国产一区二区美女| 国产精品对白刺激| 国产区在线观看视频| 亚洲电影在线一区二区三区| 亚洲色图狂野欧美| 动漫美女无遮挡免费| 日韩黄色碟片| 欧洲视频一区二区| 免费无码av片在线观看| 97天天综合网| 亚洲欧美激情小说另类| 在线观看欧美一区| 国产私拍精品| 久久久久久久久蜜桃| 国产精品免费一区二区三区观看| 国产又色又爽又黄又免费| 美女被久久久| 2019国产精品自在线拍国产不卡| 妺妺窝人体色www聚色窝仙踪| 国产精品福利在线观看播放| 夜夜嗨av色一区二区不卡| 天天插天天射天天干| 成人爽a毛片| 精品国产乱码久久久久久老虎| 亚洲精品在线网址| www.成人| 欧美一区二区三区在线观看视频| 亚洲免费黄色网| 成人18视频在线观看| 色哟哟亚洲精品| 一本久道综合色婷婷五月| 在线最新版中文在线| 午夜精品久久久久久久| 久久av综合网| 爱搞国产精品| 欧美午夜www高清视频| 无罩大乳的熟妇正在播放| h片在线观看视频免费免费| 亚洲第一福利视频在线| 婷婷五月综合缴情在线视频| 91超碰在线免费| 欧美日韩国产丝袜美女| 99精品视频在线看| 你懂得影院夜精品a| 欧美制服丝袜第一页| 国产野外作爱视频播放| 免费成人黄色网| 欧美一区二区三区爱爱| 性一交一黄一片| 欧美中文一区| 国产一区二区三区直播精品电影| youjizz亚洲女人| 一区二区三区四区日韩| 国外成人在线播放| 天天爽夜夜爽人人爽| 理论电影国产精品| 5566中文字幕一区二区| 天堂中文网在线| 国产欧美一区二区三区在线老狼 | 动漫av一区二区三区| 成人精品免费网站| 青青成人在线| 欧美videos极品另类| 亚洲一区二区三区三| 97在线播放视频| 成人激情久久| 亚洲精品久久久久国产| 欧美老女人性生活视频| 中文字幕人成人乱码| 91高潮在线观看| 国产孕妇孕交大片孕| 91免费版在线看| 青春草在线视频免费观看| 大桥未久在线播放| 欧美性大战xxxxx久久久| 苍井空张开腿实干12次| 国产一区二区精品福利地址| 欧美老妇交乱视频| 国产精品久久久久久人| 国产在线精品一区二区不卡了| 黄色99视频| 日本中文字幕电影在线免费观看 | 日韩黄色一级视频| 国产精品888| 亚洲电影免费| 久草在线中文最新视频| 7777女厕盗摄久久久| 久久丫精品国产亚洲av不卡| 91成人精品视频| 国产成人精品日本亚洲专区61| 国产a级免费视频| 中文字幕精品在线不卡| 亚洲美免无码中文字幕在线| 91成人精品观看| 亚洲色图激情小说| 国产精品久久久久久99| 国产福利一区二区三区视频在线| 神马影院我不卡午夜| 日韩激情电影| 精品日韩成人av| 午夜精品久久久久99蜜桃最新版| 亚洲男女自偷自拍| 国产成人免费观看| caoporm免费视频在线| 欧美色涩在线第一页| 久久人人妻人人人人妻性色av| 中文在线日韩| 国产一区二区香蕉| av在线天堂播放| 色婷婷一区二区三区四区| 免费看毛片的网站| 欧美日韩影院| 91精品国产一区二区三区动漫| 69久久精品| 欧美网站一区二区| 精品人妻一区二区三区四区| 性欧美xxxx大乳国产app| 国产精品久久波多野结衣| 高潮毛片在线观看| 欧美麻豆精品久久久久久| 卡一卡二卡三在线观看| 视频一区欧美日韩| 日本在线播放不卡| 电影天堂国产精品| 中文字幕亚洲欧美日韩高清| 国产精品无码粉嫩小泬| 欧美激情一二三区| 最新中文字幕2018| 99精品一区| 91热福利电影| 日本动漫理论片在线观看网站| 91精品久久久久久久99蜜桃| 国产美女久久久久久| 狠狠色丁香久久婷婷综合_中| 在线看成人av电影| 成人免费91| 久久99热精品| 天天干天天爱天天操| 欧美日韩中文字幕在线| 欧美一区二区三区成人精品| 久久性色av| 日本最新一区二区三区视频观看| 精品无人乱码一区二区三区| 色哟哟入口国产精品| 国产熟女一区二区三区四区| 亚洲综合区在线| 一本色道综合久久欧美日韩精品 | 日av在线播放中文不卡| 国产一区二区影视| 欧美另类高清zo欧美| 欧美三级日本三级| 99riav久久精品riav| 少妇性l交大片| 中文精品久久| 欧美精品一区二区三区四区五区| 成人深夜福利| 欧美另类在线观看| 三级在线播放| 欧美夫妻性生活| 国产午夜视频在线| 国产片一区二区| 日本精品一二三区| 久久久久久久高潮| eeuss中文| 杨幂一区二区三区免费看视频| 国产拍精品一二三| xxxx在线视频| 中文字幕日韩精品有码视频| 精品人妻一区二区三区浪潮在线| 日韩欧美在线视频| 2025国产精品自拍| 久久色.com| 国产sm在线观看| 日韩电影在线一区| 国产成人在线小视频| 国产亚洲一区二区三区不卡| 99精品国产高清一区二区| 成人午夜视屏| 欧美精品在线视频观看| 噜噜噜在线观看播放视频| 日韩视频一区二区| 激情网站在线观看| 精品福利免费观看| 9999热视频| 欧美国产综合一区二区| 看全色黄大色黄女片18| 久久精品国产亚洲aⅴ| 日韩黄色片视频| 国语自产精品视频在线看8查询8| 亚洲国产精品www| 性欧美lx╳lx╳| 99在线首页视频| 日本午夜免费一区二区| 热久久99这里有精品| 欧美人与牲禽动交com| 日韩中文字幕精品| 亚洲色偷精品一区二区三区| 日韩女优毛片在线| 夜夜躁狠狠躁日日躁av| 日韩欧美精品中文字幕| 日操夜操天天操| 亚洲精品免费视频| 三级黄色录像视频| 国产日韩欧美综合在线| 可以直接看的无码av| 成人av网站免费观看| 自拍视频第一页| 国产一区二区中文字幕| 在线观看日本一区二区| 久久蜜桃资源一区二区老牛| 九色在线视频观看| 日韩午夜在线电影| 全黄性性激高免费视频| 国产一区二区三区四区三区四| 国产又爽又黄ai换脸| 999视频精品| 正在播放91九色| 99国产**精品****| 在线视频不卡国产| 97精品在线| 三上悠亚免费在线观看| 亚洲电影影音先锋| 在线观看av的网址| 欧美另类亚洲| 久久亚洲精品无码va白人极品| 午夜精品久久99蜜桃的功能介绍| 日本高清xxxx| 欧美日韩亚洲三区| 欧美精品自拍视频| 国产精品入口66mio| 日韩av在线综合| 老司机精品导航| 国产精品视频黄色| 另类专区欧美蜜桃臀第一页| 男人午夜视频在线观看| 国产精品资源网| 东京热av一区| 91网站黄www| 日本乱子伦xxxx| 国产精品美女久久久久av爽李琼 | 欧美体内谢she精2性欧美| 黄色在线观看国产| 在线观看日韩毛片| 国产精品久久久久久久成人午夜| 51久久夜色精品国产麻豆| 91精品国产综合久| 日韩精品一区二区三区中文不卡| 国模无码一区二区三区| 亚洲美女性视频| 69xxxx欧美| 久久人人爽人人爽人人片av高清| 在线毛片观看| 国产欧美日韩视频| 伊人精品综合| 欧洲在线视频一区| 亚洲国产一成人久久精品| 久久精品无码中文字幕| 久久精品午夜| 在线观看一区二区三区视频| 久久久国产综合精品女国产盗摄| 日本伦理一区二区三区| 一级淫片免费看| 久久久久久久久久久网| 91丨九色丨尤物| 天天干天天操天天拍| 一区二区三区在线视频播放| 欧美videossex极品| 欧美三级在线播放| 亚洲国产日韩在线观看| 亚洲欧美国产另类| 成年人网站在线| 国产99久久精品一区二区| 国产精品国产亚洲精品| 久久伊人一区| 欧美精品二区| 午夜激情福利在线| 国产白丝网站精品污在线入口| 欧美黄色一级生活片| 亚洲综合精品久久| 中文字幕日本人妻久久久免费| 欧美videos大乳护士334| www日韩tube| 69av视频在线播放| 秋霞影院一区| 亚洲精品欧洲精品| 亚洲综合国产激情另类一区| 亚洲成人福利视频| 国产精品久久久久久一区二区三区 | 99re在线精品| 午夜国产福利一区二区| 欧美性受xxxx黑人xyx| 午夜国产在线观看| 欧美精品在线极品| 日韩黄色在线| 亚洲精品一品区二品区三品区| 亚洲人成免费| 国产成人精品一区二区三区在线观看| 欧美激情在线一区二区三区| 一级片中文字幕| 欧美精品一区二区在线播放| 麻豆传媒在线免费看| 国产精品久久久久久久一区探花| 欧美挤奶吃奶水xxxxx| 996这里只有精品| 国产又黄又大久久| 亚洲精品天堂网| 在线精品视频一区二区| 免费播放片a高清在线观看| 国内精品久久久久久久| 91成人精品在线| 91九色国产ts另类人妖| 国产一区二区三区观看| 99自拍视频在线| 这里只有精品视频在线观看| 日本高清在线观看wwwww色| 国产精品青青在线观看爽香蕉| 久久综合影院| 免费看a级黄色片| 欧美经典一区二区| 一区二区乱子伦在线播放| 亚洲无av在线中文字幕| 国模视频一区| 性欧美精品一区二区三区在线播放 | 欧美ab在线视频| 中文字幕第22页| 亚洲人成小说网站色在线| h狠狠躁死你h高h| 欧美大成色www永久网站婷| 精品国产亚洲一区二区三区大结局| 中文字幕日韩精品久久| 韩国精品久久久| 久艹视频在线观看| 欧美精品一区二区在线播放| 欧美一级鲁丝片| 日本精品免费| 看电视剧不卡顿的网站| 久草福利资源在线| 欧美一二三四在线| 91资源在线观看| 欧美日韩三区四区| 六月丁香婷婷色狠狠久久| 成人免费黄色小视频| 精品黑人一区二区三区久久| 国产粉嫩在线观看| 欧美极品一区二区| 男人的j进女人的j一区| 国产suv精品一区二区68| 精品日韩一区二区三区免费视频| 妞干网免费在线视频| 日韩中文字幕一区| 国产一区二区影院| 久久高清无码视频| 亚洲男人av电影| 日韩毛片网站| 亚洲国产精品无码av| 久久久久久99久久久精品网站| 中文字幕+乱码+中文| 久久69精品久久久久久久电影好| 麻豆成人入口| 一区二区三区视频网| 亚洲综合色区另类av| 激情在线视频| 97伦理在线四区| 国产精品尤物| 国产探花在线免费观看| 亚洲美女av网站| 成人污污视频| 日韩精品一区二区三区色欲av| 国产精品国产三级国产aⅴ入口| 亚洲乱码国产乱码精品精软件| 日本午夜人人精品| 在线中文字幕亚洲| 中文字幕 自拍| 日韩精品一区二区三区视频在线观看| 欧美xoxoxo| 日韩精品久久一区二区| 日本一区二区高清| 天堂国产一区二区三区| 91亚洲永久免费精品|