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

一次教科書級別的Redis高可用架構設計實踐

開發 架構 Redis
本文主要介紹了 Qunar Redis 高可用架構設計原理、安全機制及集群自動化運維方面的內容。

 一、高可用架構設計原理

1、概述

Qunar Redis 集群是一個分布式的高可用架構,整個架構主要由以下幾個重要部分組成:

  •  Redis Server 節點:每個節點有一主一從兩個實例,多個節點組成一份完整的集群數據,其中每個節點只有主庫對外提供服務,從庫僅僅用于節點高可用、數據持久化及定時備份。
  •  Zookeeper 集群:由五個 zk 節點組成,Redis 集群配置變更后,通知客戶端進行重連。
  •  Redis Sentinel 集群:由五個 Sentinel 節點組成,用于 Reids Server 節點的高可用,主從切換、故障轉移、配置更新等。
  •  配置中心集群:由五個 MySQL 節點組成的 PXC 集群,用于存儲 Redis 集群的分片信息,即每個節點的 Master 實例信息及分配 key 的一致性 hash 值范圍。
  •  應用程序客戶端:監聽 zk 變化,在配置中心獲取 Redis 實例信息進行連接。

2、架構原理圖

3、客戶端實現

1)當客戶端根據 Redis 集群的 namespace 建立連接時,會先從 zk 中查找/config_addr 節點, 該節點下存放的是配置中心集群的實例信息,從中隨機選擇一個數據庫實例進行連接。

2)在配置中心的特定庫表中,根據 Redis 的 namespace 查詢集群的節點的連接配置,然后建立 Redis 連接。

3)客戶端建立 Redis 連接后,會啟動了兩個線程:

  •  一個用于監聽 zk 的地址的變化。每個 Redis 集群在 zk 中都會有一個/redis/namespace 的節點 ,如果集群配置發生變化,哨兵會通知 zk 更新此節點的值,客戶端感知到 zk 配置變化, 將會去配置中心獲取新的連接配置,重新建立連接。
  •  一個用于輪詢配置中心的連接配置。為了防止 zk 通知失敗,客戶端會通過這個線程,每隔 10s 去輪詢配置中心的配置信息,如果發現配置中心的配置和本地緩存的不一樣,就會使用配置中心的配置建立新的連接。

客戶端與其他組件的關系示意圖如下:

4、數據分片方法

開發人員提交 Redis 集群申請工單信息后,DBA 會依據工單中的內存大小、QPS 大小等幾項主要的數據,規劃集群分片節點數量為 N,所有節點平均分配 0~4294967295 范圍內的值,即共有 2 的 32 次方個 key 的值,某一個 key 使用 murmurhash2 算法計算哈希值后,只會落在集群的一個節點上。

分片節點示意圖如下:

分片節點信息在配置中心的存儲信息如下:

5、架構特點

Quanr Redis 高可用架構具有以下特點:

  •  實現自己的 Redis 客戶端,客戶端不再訪問 Sentinel, Sentinel 只負責高可用。
  •  通過 ZK 集群和配置中心來實現配置的集中管理。
  •  將端口視作一種資源,即集群的一個節點的主從實例使用一個端口,下線的集群端口可復用。
  •  弱化了哨兵機器的地位, 降低了哨兵和集群之間直接的耦合度。
  •  減少了哨兵機器的使用量, 目前只使用了 5 臺哨兵機器組成集群。
  •  客戶端使用 namespace 訪問集群, 將端口和 namespace 對應,namespace 和業務部門對應,方便 DBA 管理和運維,對應用透明。

6、架構局限性

Quanr Redis 高可用架構具有以下局限性:

  •  支持的客戶端比較少。目前客戶端僅支持 Java 和 Python。
  •  不支持快速水平擴容。當集群內存不足時可以快速擴大各個節點實例的內存大小,以此來增加整個集群大小,但單個實例的內存大小也有一定的限度,不能無限擴展。當需要增加集群節點個數時,由于各個節點的一致性哈希范圍發生了變化,所有的 key 需要重新分配,對于比較大的集群,過程比較繁瑣和耗時。
  •  整個架構依賴的組件比較多。雖然架構中的 zookeeper、配置中心、Sentinel 等都是多節點的高可用集群,但依賴的組件越多,發生故障的可能性也越大,運維難度和工作量也會隨著增加,無疑對運維人員有更高的要求。
  •  部分 Redis 原生功能無法使用。由于客戶端的限制,部分 Redis 原生功能無法使用,如不支持事務、Lua 腳本等。

二、安全機制

Redis 被設計成僅供可信環境下的可信用戶才可以訪問,并沒有最大化的去優化安全方面,而是盡量可能的去優化高性能和易用性,因此 Redis 沒有類似關系型數據庫那樣嚴格的權限控制,因此將 Redis 實例直接暴露在網絡上或者讓不可信的用戶直接訪問 Redis 的 TCP 端口,是非常危險的行為。

為了提高 Redis 使用的安全性,去哪兒網使用的 Redis Server 是在官方 Redis 4.0.14 版本上進行了部分的源代碼改造,增加了一個白名單參數 trustedip,屏蔽了部分高危指令,除了 trustedip 中配置的 IP 之外,任何其他客戶端連接都無法執行這些高危指令,同時為了提高 Redis 的性能,對主從實例進行了差異性配置。

1、clientcipher和IP白名單

Qunar Redis 客戶端并沒有直接通過 TCP 方式去連接 Redis 實例,而是首先要通過集群 namespace 和該集群唯一的 clientcipher 的驗證,然后從配置中心獲取真正的連接信息后,才可以連接 Redis 實例。同時白名單機制對客戶端請求中的高危指令進行過濾,避免對線上 Redis 執行不合理的操作,進一步加強了其安全性。

  •  客戶端使用 namespace 和 clientcipher 方式訪問集群。
  •  不同 namespace 對應的 clientcipher 不同,在創建集群時通過隨機生成的密碼再次加密生成 clientcipher。
  •  即使知道密碼,也無法使用屏蔽的危險命令,除非 IP 地址在白名單中。
  •  本地登陸和 IP 白名單登陸,命令不受限制,方便 DBA 管理和兼容各種監控統計腳本。
  •  IP 白名單可以動態配置,最大支持 32 個 IP 白名單。

IP 白名單功能涉及修改代碼的地方:

1)在 config.c 文件的 configGetCommand 方法中增加參數 trustedip 

  1. void configGetCommand(client *c) {  
  2. robj *o = c->argv[2];  
  3. void *replylen = addDeferredMultiBulkLength(c);  
  4. char *pattern = o->ptr;  
  5. char buf[128];  
  6. int matches = 0 
  7. serverAssertWithInfo(c,o,sdsEncodedObject(o));  
  8. ...  
  9. /* 增加trustedip參數 */  
  10. if (stringmatch(pattern,"trustedip",0)) {  
  11. sds buf = sdsempty();  
  12. int j;  
  13. int numips;  
  14. numips = server.trusted_ips.numips;  
  15. for (j = 0; j < numips; j++) { 
  16. buf = sdscat(buf, server.trusted_ips.ips[j]);  
  17. if (j != numips - 1)  
  18. buf = sdscatlen(buf," ",1);  
  19.  
  20. addReplyBulkCString(c,"trustedip");  
  21. addReplyBulkCString(c,buf);  
  22. sdsfree(buf);  
  23. matches++;  
  24.  
  25. setDeferredMultiBulkLength(c,replylen,matches*2);  

2)在 server.c 文件的 processCommand 方法中增加對 issuperclient 的認證 

  1. typedef struct trustedIPArray {  
  2. int numips;  
  3. sds* ips;  
  4. } trustedIPArray; 

3)在 networking.c 文件中增加 isTrustedIP 方法 

  1. /* 判斷客戶端IP是否在IP白名單中 */  
  2. int isTrustedIP(int fd) {  
  3. char ip[128];  
  4. int i, port;  
  5. anetPeerToString(fd,ip,128,&port); 
  6. if (strcmp(ip, "127.0.0.1") == 0) {  
  7. return 1;  
  8.  
  9. for (i = 0; i < server.trusted_ips.numips; i++) {  
  10. if (strcmp(ip, server.trusted_ips.ips[i]) == 0) {  
  11. return 1;  
  12.  
  13.  
  14. return 0;  

4)在 networking.c 文件的 createClient 方法中增加 issuperclient 的設置 

  1. client *createClient(int fd) {  
  2. client *c = zmalloc(sizeof(client));  
  3. /* passing -1 as fd it is possible to create a non connected client.  
  4. * This is useful since all the commands needs to be executed  
  5. * in the context of a client. When commands are executed in other  
  6. * contexts (for instance a Lua script) we need a non connected client. */  
  7. if (fd != -1) {  
  8. anetNonBlock(NULL,fd);  
  9. anetEnableTcpNoDelay(NULL,fd);  
  10. if (server.tcpkeepalive)  
  11. anetKeepAlive(NULL,fd,server.tcpkeepalive);  
  12. if (aeCreateFileEvent(server.el,fd,AE_READABLE,  
  13. readQueryFromClient, c) == AE_ERR)  
  14.  
  15. close(fd);  
  16. zfree(c);  
  17. return NULL;  
  18.  
  19. ...  
  20. /* 設置is_super_client */  
  21. if (isTrustedIP(fd)) {  
  22. c->is_super_client = 1 
  23. } else {  
  24. c->is_super_client = 0 
  25.  
  26. ...  
  27. return c;  

5)在 server.c 文件的 processCommand 方法中增加對 issuperclient 的認證 

  1. int processCommand(client *c) {  
  2. /* The QUIT command is handled separately. Normal command procs will  
  3. * go through checking for replication and QUIT will cause trouble  
  4. * when FORCE_REPLICATION is enabled and would be implemented in  
  5. * a regular command proc. */ 
  6. if (!strcasecmp(c->argv[0]->ptr,"quit")) {  
  7. addReply(c,shared.ok);  
  8. c->flags |= CLIENT_CLOSE_AFTER_REPLY;  
  9. return C_ERR;  
  10.  
  11. ...  
  12. /* Check if the user is authenticated */  
  13. /* 增加is_super_client認證 */  
  14. if (!c->is_super_client && server.requirepass && !c->authenticated && c->cmd->proc != authCommand)  
  15. ...  
  16. return C_OK;  

6)在 db.c 文件中增加 checkCommandBeforeExec 方法 

  1. /* 如果是super client或者是master,返回1,否則返回0  
  2. * 因為在master-slave下,master(client)需要向slave執行危險命令*/  
  3. int checkCommandBeforeExec(client *c) {  
  4. if (c->is_super_client || (server.masterhost && (c->flags & CLIENT_MASTER))) {  
  5. return 1;  
  6.  
  7. addReplyError(c,"No permission to execute this command");  
  8. return 0;  

2、屏蔽高危指令

通過修改 Redis 源代碼,在 Server 端屏蔽部分危險指令,規定只有通過白名單檢查的客戶端連接才可以執行這些指令。在執行高危指令前進行檢查,如需對 save 指令進行屏蔽,可對 rdb.c 文件的 saveCommand 方法的第一行增加 checkCommandBeforeExec 檢查。 

  1. void saveCommand(client *c) {  
  2. if (!checkCommandBeforeExec(c)) return; /* 執行指令之前進行檢查,如不通過直接返回 */   
  3. if (server.rdb_child_pid != -1) {  
  4. addReplyError(c,"Background save already in progress");  
  5. return;  
  6.  
  7. rdbSaveInfo rsi, *rsiptr;  
  8. rsiptr = rdbPopulateSaveInfo(&rsi);  
  9. if (rdbSave(server.rdb_filename,rsiptr) == C_OK) { 
  10. addReply(c,shared.ok);  
  11. } else {  
  12. addReply(c,shared.err);  
  13.  

屏蔽的高危指令有:

  •  比較耗時類指令:info、keys *。
  •  清空數據類指令:shutdown、flushdb、 flushall。
  •  數據持久化類指令:save、bgsave、bgrewriteaof。
  •  配置類指令:config get、config set、config rewrite。
  •  運維管理類指令:slaveof、monitor、client list、client kill。

在 Redis 源代碼涉及這些指令的地方,都需要加上 checkCommandBeforeExec 方法進行檢查。

3、配置優化

針對集群各個節點的主從實例進行差異化配置,由于每個節點只有主庫對外提供服務,為了最大限度的提高主庫的并發能力,一些比較耗時的操作可以放到從庫去執行。

幾項主要的配置如下:

  •  主庫關閉 bgsave、bgrewriteaof 功能。
  •  從庫開啟 aof 功能,定時調度重寫 aof 文件,釋放服務器磁盤空間。
  •  從庫定時執行 bgsave 操作,備份 rdb 文件。
  •  從庫開啟 slave-read-only 參數,只讀。

當 Redis 集群部署完之后,會有定時任務去檢查服務器上各個 Redis 實例的角色,根據角色的不同修改相關的配置參數,同時將修改后的持久化到配置文件。

三、自動化運維

1、初始化系統環境

在 Redis 服務器上部署集群之前,首先需要初始化系統環境,將這些環境配置添加到 Redis 的 rpm 打包程序的 spec 文件中,安裝 Redis 軟件包時會自動更改相關配置,主要的系統環境參數有以下幾個: 

  1. sed -i -r '/vm.overcommit_memory.*/d' /etc/sysctl.conf  
  2. sed -i -r '/vm.swappiness.*/d' /etc/sysctl.conf  
  3. sed -i -r '/vm.dirty_bytes.*/d' /etc/sysctl.conf  
  4. echo "vm.overcommit_memory = 1>> /etc/sysctl.conf  
  5. echo "vm.swappiness = 0>> /etc/sysctl.conf  
  6. echo "vm.dirty_bytes = 33554432>> /etc/sysctl.conf  
  7. /sbin/sysctl -q -p /etc/sysctl.conf  
  8. groupadd redis >/dev/null 2>&1 || true  
  9. useradd -M -g redis redis -s /sbin/nologin >/dev/null 2>&1 || true  
  10. sed -i -r '/redis soft nofile.*/d' /etc/security/limits.conf  
  11. sed -i -r '/redis hard nofile.*/d' /etc/security/limits.conf  
  12. echo "redis soft nofile 288000" >> /etc/security/limits.conf  
  13. echo "redis hard nofile 288000" >> /etc/security/limits.conf  
  14. sed -i -r '/redis soft nproc.*/d' /etc/security/limits.conf  
  15. sed -i -r '/redis hard nproc.*/d' /etc/security/limits.conf  
  16. echo "redis soft nproc unlimited" >> /etc/security/limits.conf  
  17. echo "redis hard nproc unlimited" >> /etc/security/limits.conf  
  18. echo never > /sys/kernel/mm/transparent_hugepage/enabled 

2、統一運維管理工具

Qunar Redis 集群的統一管理套件,封裝了系統環境初始化、實例安裝、實例啟動、實例關閉、監控報警、定時任務等腳本,實現了監控、統計、注冊等自動化操作。 

  1. /etc/cron.d/appendonly_switch  
  2. /etc/cron.d/auto_upgrade_toolkit  
  3. /etc/cron.d/bgrewriteaof  
  4. /etc/cron.d/check_maxmemory  
  5. /etc/cron.d/dump_rdb_keys  
  6. /etc/cron.d/rdb_backup  
  7. /etc/profile.d/q_redis_path.sh  
  8. /xxx/collectd/etc/collectd.d/collect_redis.conf  
  9. /xxx/collectd/lib/collectd/collect_redis.py  
  10. /xxx/collectd/share/collectd/types_redis.db  
  11. /xxx/nrpe/libexec/q-check-redis-cpu-usage  
  12. /xxx/nrpe/libexec/q-check-redis-latency  
  13. /xxx/nrpe/libexec/q-check-redis-memory-usage  
  14. /xxx/nrpe/libexec/q-check-zookeeper-ruok  
  15. /xxx/redis/tools/cron_appendonly_switch.sh  
  16. /xxx/redis/tools/cron_bgrewrite_aof.sh  
  17. /xxx/redis/tools/cron_check_maxmemory.sh  
  18. /xxx/redis/tools/cron_dump_rdb_keys.sh  
  19. /xxx/redis/tools/cron_rdb_backup.sh  
  20. /xxx/redis/tools/dump_rdb_keys.py  
  21. /xxx/redis/tools/redis-cli5  
  22. /xxx/redis/tools/redis-latency  
  23. /xxx/redis/tools/redis_install.sh  
  24. /xxx/redis/tools/redis_start.sh  
  25. /xxx/redis/tools/redis_stop.sh 

3、單機多實例多版本部署

Qunar Redis 的安裝工具包支持單機多實例安裝,安裝腳本提供選項和配置文件模板,可以自定義安裝不同版本的 Redis,目前支持的 Redis Server 版本有 2.8.6、3.0.7 以及 4.0.14。 

  1. /* 安裝包及Redis實例目錄結構 */  
  2.  
  3. ├── multi  
  4. │ ├── server_2800 /* Redis2.8.6軟件包 */  
  5. │ │ ├── bin  
  6. │ │ └── utils  
  7. │ ├── server_3000 /* Redis3.0.7軟件包 */  
  8. │ │ ├── bin  
  9. │ │ └── utils  
  10. │ └── server_4000 /* Redis4.0.14軟件包 */  
  11. │ ├── bin  
  12. │ └── utils  
  13. ├── redis10088 /* 端口為10088的Redis實例數據目錄,用于存放該實例的配置文件、日志、AOF文件及RDB文件 */  
  14. │ ├── bin  
  15. │ └── utils  
  16. ├── redis10803 /* 端口為10803的Redis實例數據目錄,用于存放該實例的配置文件、日志、AOF文件及RDB文件 */  
  17. │ ├── bin  
  18. │ └── utils  
  19. ├── redis11459 /* 端口為11459的Redis實例數據目錄,用于存放該實例的配置文件、日志、AOF文件及RDB文件 */  
  20. │ ├── bin  
  21. │ └── utils  
  22. /* Redis實例安裝程序用法 */  
  23. Usage: redis_install.sh -P <port> -v [2.8|3.0|4.0] -p <password> -m <size>  
  24. 必選參數:  
  25. -P redis端口  
  26. -p redis密碼  
  27. -v 將要安裝的redis版本,強烈推薦4.0版本  
  28. -m redis實例允許的最大內存大小,單位是G  
  29. 可選參數:  
  30. --cluster 集群模式,version>=3.0  
  31. --testenv 測試環境  
  32. example:  
  33. sudo redis_install.sh -P 6379 -v 4.0 -m 20 -p 1qaz2wsx 

4、使用git管理Redis哨兵

使用 git 集中管理所有的哨兵配置,一個地方發生變更,哨兵集群的所有服務器同時拉取進行同步更新。同時詳細的 commit log,方便跟蹤配置文件修改歷史。Qunar Redis 哨兵具有以下特點:

  •  一套哨兵只管理一個節點,即只對端口號相同的一組 Redis(一主一從或一主多從)實例進行監控和故障轉移。
  •  哨兵只負責節點的高可用,客戶端不需要通過哨兵來訪問 Redis 實例。
  •  哨兵配置文件使用 git 統一管理,配置文件以[節點端口號+20000]_集群 namespace.conf 方式統一命名,例如 30708_redis_delay_test.conf,通過集群任意一個節點的端口號或者 namespace 可以獲取集群全部節點的信息。
  •  當哨兵監控的節點發生切換時,會更新配置中心對應節點的主庫配置和 zookeeper 中對應節點的 dataVersion,客戶端檢測到 zookeeper 的變化會去配置中心獲取節點最新的信息進行重連,同時哨兵會將切換信息發送至 DBA 和運維事件平臺。
  • 哨兵服務器的 IP 默認都添加到 Redis 實例的白名單中,即通過哨兵服務器可以訪問任何一個 Redis 實例進行所有的操作,所以哨兵服務器的權限必須嚴格控制,只有 DBA 才有權限登陸。

5、運維操作平臺化

以上幾項規范統一的標準化流程,為 Qunar Redis 的整個運維平臺化提供了有力的支撐,目前 Qunar Redis 的 90% 以上的運維操作都實現了平臺自動化,包括工單申請及審核、集群部署、實例遷移、集群垂直伸縮、不同維度(服務器、集群、實例)的信息查看等,下面主要介紹下 Qunar Redis 集群部署和實例遷移的實現過程。

集群部署

Qunar Redis 集群部署時主要有以下步驟:

1)開發人員通過平臺提交集群申請工單發起流程,TL 審核完成后流程扭轉到 DBA。

2)DBA 根據申請工單的信息規劃集群規模,如節點個數、內存大小、部署機房、Redis 版本等。

3)根據集群規劃在 Redis 集群部署頁面填寫部署信息。

4)提交部署信息后平臺會自動篩選資源空閑的服務器進行集群部署。

5)集群部署完成后會在在 Qtalk 上通知 DBA,集群的 clientcipher 會通過郵件方式通知開發人員,同時會將集群部署情況推送到公司運維事件平臺,保留操作記錄。

實例遷移

運維過程中實例遷移主要分為兩大類:

1)部分實例遷移。當某臺服務器的可用資源不足時,將這臺機器上的部分實例遷移到其他資源比較空閑的服務器上。在頁面輸入實例的源主機和目前主機,提交后會自動生成遷移任務。

2)整機實例遷移。主要是替換過保服務器或者服務器需要停機維護時,將該機器上的所有實例自動遷移到其他資源比較空間的服務器上。在頁面輸入需要遷移的主機名,提交后會自動生成遷移任務。

遷移任務開始后,整個遷移過程無須人工介入,會自動更新執行進度并輸出日志。

 

 

責任編輯:龐桂玉 來源: DBAplus社群
相關推薦

2019-06-28 09:27:20

高可用架構支付

2019-11-29 10:15:28

GitHub代碼開發者

2021-03-09 20:52:01

架構無狀態服務

2017-06-12 11:09:56

計數架構數據庫

2022-05-31 08:04:03

Redis高可用集群

2018-09-11 09:33:49

Redis高可用架構

2017-12-07 12:47:48

Serverless架構基因

2018-05-25 14:41:56

Serverless無服務器構造

2020-04-22 14:25:48

云開發高可用架構

2025-03-03 04:20:00

高可用架構冗余法則

2018-09-10 08:27:18

登錄Auth0架構

2018-09-27 18:34:08

架構Auth0

2021-06-29 10:18:07

Kafka宕機系統

2019-12-24 09:30:59

蘇寧高可用高并發

2017-10-27 14:52:31

互聯網高可用架構高可用

2009-06-22 14:48:21

DRY架構設計

2017-05-19 15:00:05

session架構web-server

2017-01-23 12:40:45

設計演講報表數據

2025-06-09 00:04:00

2021-04-28 08:52:22

高并發架構設高并發系統
點贊
收藏

51CTO技術棧公眾號

麻豆tv在线观看| 男插女免费视频| 中文字幕一区二区人妻| 91精品观看| 亚洲国产高清福利视频| 爱福利视频一区二区| 91欧美在线视频| 风间由美性色一区二区三区| 欧美怡春院一区二区三区| 欧美激情 一区| 91精品啪在线观看国产手机| 欧美日韩一区二区三区在线免费观看 | 婷婷激情一区| 亚洲乱码国产乱码精品精的特点 | 少妇高潮一区二区三区99小说| 久久精品亚洲| 欧美激情a在线| 在线视频第一页| 久久porn| 日韩一区二区三区av| 欧美牲交a欧美牲交aⅴ免费真 | 色综合综合网| 亚洲成人久久久久| 北条麻妃亚洲一区| 日韩欧美少妇| 亚洲国产成人高清精品| 最新精品视频| 992tv免费直播在线观看| av一区二区久久| 亚洲精品欧美日韩专区| 91porny九色| 亚洲视频www| 欧美激情一区二区三区久久久| a级黄色免费视频| 要久久爱电视剧全集完整观看| 日韩视频在线观看一区二区| 三级a三级三级三级a十八发禁止| 午夜影院在线播放| 亚洲成va人在线观看| 一区二区三区视频在线播放| 黄色在线小视频| 91亚洲永久精品| 国产日韩一区欧美| 高h放荡受浪受bl| 国产久卡久卡久卡久卡视频精品| 国产精品网站大全| 激情视频网站在线观看| 国产精品美女久久久| 韩日精品中文字幕| 日本学生初尝黑人巨免费视频| 欧美日韩午夜| 久久久久久久久久久成人| 一区二区成人免费视频| 999国产精品| 久久精品视频在线观看| 顶级黑人搡bbw搡bbbb搡| 日本精品三区| 精品国产一区久久久| 国产在视频线精品视频| 色欧美自拍视频| 日韩三级成人av网| 97精品在线播放| 久久久五月天| 欧美国产精品日韩| 日韩av免费网址| 亚洲麻豆一区| 欧美一区二粉嫩精品国产一线天| 波多野结衣视频网站| 欧美亚洲专区| 欧美综合第一页| 日韩xxx视频| 激情图区综合网| 成人av电影免费| 免费av网站在线播放| 本田岬高潮一区二区三区| 精品欧美日韩| wwwww在线观看免费视频| 18欧美乱大交hd1984| 亚洲国产一二三精品无码| 91美女精品| 色欧美88888久久久久久影院| 国产精品视频黄色| 二区三区精品| 亚洲国产成人一区| 久久人人爽人人爽人人片| 欧美亚洲精品在线| 久久国产精品影视| 日韩不卡在线播放| 国内成人免费视频| 精品国产一区二区三区日日嗨| 精品欧美不卡一区二区在线观看 | 国产成人亚洲欧洲在线| 水蜜桃久久夜色精品一区的特点| 91香蕉国产在线观看| 刘亦菲毛片一区二区三区| 久久久久99精品一区| 女人床在线观看| 欧美xo影院| 日韩欧美在线1卡| 成人免费av片| 欧美国产精品| 国产成人中文字幕| 亚洲黄色a级片| 中文字幕不卡三区| 免费国产黄色网址| 亚洲精品tv| 亚洲精品视频中文字幕| 欧美成人一区二区三区高清| 久久久xxx| 91久久偷偷做嫩草影院| 福利在线视频导航| 香蕉影视欧美成人| 亚洲综合在线一区二区| 啪啪亚洲精品| 97精品一区二区三区| 国产欧美一级片| 国产日韩欧美高清在线| 加勒比成人在线| gogo大尺度成人免费视频| 亚洲免费视频观看| 国产精品99无码一区二区| 久久99精品网久久| 日韩高清国产一区在线观看| 国产高清在线a视频大全| 欧美日韩在线一区二区| 久久精品成人av| 最新成人av网站| 亚洲xxxxx性| 日本在线观看www| 在线观看日韩高清av| 亚洲 欧美 日韩在线| 国产精品hd| 亚洲一区中文字幕| 韩国中文字幕在线| 欧美日韩一区国产| 日本高清黄色片| 快she精品国产999| 欧美日本韩国一区二区三区| 国产黄大片在线观看| 亚洲精品在线观看视频| 青青草偷拍视频| 国产成人免费在线观看| 国产av不卡一区二区| 日韩有码欧美| 久久五月天综合| a级片在线免费看| 亚洲人成电影网站色mp4| 欧美激情第一区| 亚洲成av人片乱码色午夜| 国产日韩欧美在线| 黄色在线播放网站| 91精选在线观看| 黄色一级片中国| 国产成人综合在线| 亚洲理论电影在线观看| 国内自拍欧美| 日本精品中文字幕| 大片免费播放在线视频| 欧美亚洲综合色| 免费在线观看a级片| 国产综合色视频| 国产资源第一页| 大陆精大陆国产国语精品| 国模精品视频一区二区| 天堂网在线播放| 91黄色在线观看| www.4hu95.com四虎| 九色|91porny| 成年女人18级毛片毛片免费| 天天躁日日躁成人字幕aⅴ| 日韩av成人在线| 在线视频二区| 欧美一级欧美三级在线观看| 久久激情免费视频| 91在线国产福利| 蜜臀av免费观看| 欧美日韩国产综合网| 精品欧美日韩| 日韩电影免费观看高清完整版在线观看| 久久五月天色综合| 香蕉视频成人在线| 欧美日韩免费不卡视频一区二区三区 | 亚洲天堂久久新| 精品一区二区三区免费观看 | 久久一二三区| 青春草在线视频免费观看| 国产精品白浆| 国产精品三级在线| 超碰97国产精品人人cao| 国产亚洲精品91在线| 99久久精品日本一区二区免费| 亚洲h在线观看| 国产黄色片在线| 不卡高清视频专区| 日本三级黄色网址| 亚洲精品少妇| 亚洲自拍偷拍一区二区三区| 任你躁在线精品免费| 国产日本欧美一区| 亚洲天堂免费电影| 欧美插天视频在线播放| 免费成人av电影| 精品国内二区三区| 亚洲熟妇无码久久精品| 天天影视色香欲综合网老头| 亚洲 欧美 国产 另类| av动漫一区二区| 三上悠亚 电影| 免费高清在线一区| 免费无码不卡视频在线观看| 国产精品久久久久9999赢消| 美乳视频一区二区| 亚洲国产欧美在线观看| 国产精品第100页| √天堂8资源中文在线| 日韩有码在线观看| 国产黄色片在线观看| 亚洲爱爱爱爱爱| 国产熟女一区二区三区四区| 欧美午夜一区二区三区免费大片| 日韩美女视频网站| 一区二区三区四区av| 国精产品一区一区二区三区mba| 国产日韩精品一区| 亚洲天堂久久新| 91论坛在线播放| 中文字幕在线播放一区| 成人一区二区三区| 成人做爰69片免费| 国产一区二区在线电影| 精品久久久99| 免费人成精品欧美精品| 成人黄色片视频| 午夜一区二区三区不卡视频| 黄色成人在线看| 亚洲人成毛片在线播放女女| av在线com| 欧美区一区二| 50度灰在线观看| 中文字幕日韩一区二区不卡| 永久域名在线精品| 亚洲精品97| 大陆极品少妇内射aaaaaa| 仙踪林久久久久久久999| 曰韩不卡视频| 亚洲色图二区| 国产在线视频在线| 亚洲午夜精品久久久久久app| 成年在线观看视频| 国内一区二区三区| 日韩中文字幕在线视频观看| 99精品久久| 国产一区二区视频免费在线观看| 蜜桃久久av| 亚洲视频在线a| 久久丁香综合五月国产三级网站| 牛夜精品久久久久久久| 久久精品国产亚洲一区二区三区| 97人人爽人人| 国产成人av网站| 超碰男人的天堂| 91蜜桃网址入口| 国产三级黄色片| **网站欧美大片在线观看| 免费在线黄色网| 亚洲综合成人在线视频| 日韩欧美性视频| 色噜噜久久综合| 亚洲特级黄色片| 欧美变态凌虐bdsm| 神马精品久久| 最近2019年日本中文免费字幕 | av不卡中文字幕| 91视频在线观看免费| 精品国产aaa| 尤物视频一区二区| 国产精品人人人人| 欧美日韩在线播放一区| 精品国产亚洲av麻豆| 亚洲第一免费网站| аⅴ资源新版在线天堂| 色综合久久天天综线观看| 涩涩视频在线播放| 国产日韩精品综合网站| 精品欧美午夜寂寞影院| 台湾成人av| 极品中文字幕一区| 成年人在线看片| 国产成人在线影院| 欧美福利第一页| 亚洲午夜久久久久中文字幕久| 无码人妻丰满熟妇精品| 欧美一区二区人人喊爽| 日韩精品系列| 超碰97人人做人人爱少妇| 超碰超碰人人人人精品| 99视频免费观看| 久久激情电影| 日日碰狠狠添天天爽超碰97| 久久99久久99精品免视看婷婷 | 亚洲成人免费看| 伊人免费在线观看| 亚洲精品久久久久久下一站| 日本电影在线观看网站| 456亚洲影院| 午夜视频一区二区在线观看| 日韩在线观看电影完整版高清免费| 欧美日韩国产综合网| 一路向西2在线观看| 91网站视频在线观看| 国产又粗又硬又长又爽| 色综合久久久久| 日本激情一区二区三区| 久久97精品久久久久久久不卡 | 久久久久久久欧美精品| 蜜臀av粉嫩av懂色av| 国产精品久久久久久久午夜片| 日韩不卡视频在线| 亚洲国产精品悠悠久久琪琪| a级毛片免费观看在线| 国产精品久久久999| 日韩a级大片| 青青草精品视频在线| 国产精品99久久久| 韩国一级黄色录像| 欧美性猛片aaaaaaa做受| 免费在线国产| 青青青国产精品一区二区| 高潮按摩久久久久久av免费| 一二三四中文字幕| 国产在线精品一区二区夜色 | 色乱码一区二区三区网站| 欧美激情国产精品日韩| 99免费精品在线观看| 久久久精品视频免费| 亚洲精品一区在线观看| 欧美精品videosex| 亚洲专区在线视频| 欧美成人tv| 香蕉视频1024| 亚洲国产一区二区三区| 亚洲奶汁xxxx哺乳期| 久久久在线视频| 噜噜噜天天躁狠狠躁夜夜精品 | 日韩精品一页| 亚洲综合网中心| 韩国v欧美v日本v亚洲v| 精品国产视频一区二区三区| 884aa四虎影成人精品一区| 黄网站免费在线播放| www国产亚洲精品| 好吊一区二区三区| 久久久久国产精品无码免费看| 五月天一区二区三区| 四虎精品一区二区三区| 91成人福利在线| 精品视频国产| 久久人人爽av| 夜夜精品视频一区二区 | 91美女蜜桃在线| 欧美特级黄色片| 精品国产一区久久久| 中文在线综合| 久久久久狠狠高潮亚洲精品| 国产精品污网站| av网站在线观看免费| 欧美激情在线播放| 国产乱码精品一区二区亚洲| 亚洲第一狼人区| 亚洲午夜在线观看视频在线| 天堂成人在线| 国产欧美日韩精品在线观看| 欧美777四色影| 日本少妇毛茸茸| 欧美日韩一级视频| 在线观看中文| 久热这里只精品99re8久| 日本少妇一区二区| 欧美日韩在线视频免费播放| 日韩www在线| 性欧美hd调教| 日本熟妇人妻xxxx| 国产欧美va欧美不卡在线| 国产a级免费视频| 欧美在线一区二区视频| 久久久久国产精品| 性欧美丰满熟妇xxxx性久久久| 欧美视频一区在线观看| 日本一本在线免费福利| 日本一区免费| 成人高清视频在线| 亚洲熟妇无码久久精品| 午夜美女久久久久爽久久| 欧美gayvideo| 巨胸大乳www视频免费观看| 91精品在线免费观看| 亚洲精品一区| 男女日批视频在线观看| 中文字幕免费不卡| 人妻va精品va欧美va|