精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

麻豆亚洲av成人无码久久精品| 欧美图片激情小说| 日韩在线视频不卡| 久久99高清| 欧美香蕉大胸在线视频观看| 91亚色免费| 欧美日韩黄色网| japanese色系久久精品| 夜夜精品视频一区二区| 国产成人亚洲欧美| 免费黄色网址在线| 国产欧美高清视频在线| 欧美日韩精品专区| 日本黄网站色大片免费观看| 欧美视频xxx| 首页综合国产亚洲丝袜| 俺去啦;欧美日韩| 中文在线观看免费视频| 国精产品一区一区三区四川| 亚洲三级理论片| 国产精品一 二 三| 国产成人麻豆免费观看| 黄色综合网站| 在线播放日韩精品| 美国黄色一级视频| 91亚洲精品| 亚洲一二三四在线| 日韩一区二区三区高清| www.好吊色| 久久精品人人做人人爽电影蜜月| 日韩一二三在线视频播| 18深夜在线观看免费视频| 亚洲男人av| 亚洲人成7777| 欧美理论一区二区| 国产乱淫a∨片免费视频| 99精品久久| 深夜福利国产精品| 国产中年熟女高潮大集合| 欧美日本三级| 在线视频中文字幕一区二区| 国产 欧美 日韩 一区| 国产福利小视频在线观看| 国产一区二区三区免费观看| 国产97在线播放| 精品无码免费视频| 国产国产精品| 国产亚洲精品久久久久久| av电影中文字幕| 日韩av黄色| 天天影视色香欲综合网老头| 影音先锋在线亚洲| 成人影院免费观看| 91视频免费观看| 粉嫩精品一区二区三区在线观看| 一二区在线观看| 老司机一区二区三区| 久久亚洲精品网站| 91ts人妖另类精品系列| 成人亚洲一区| 亚洲全黄一级网站| 久久精品一区二区免费播放| 精品国产欧美| 91精品国产高清一区二区三区蜜臀 | 亚洲国产天堂久久国产91| 午夜不卡福利视频| 福利一区视频| 欧美羞羞免费网站| 亚洲性生活网站| 欧美艳星kaydenkross| 婷婷成人综合网| 日本福利视频一区| 白浆视频在线观看| 香蕉久久一区二区不卡无毒影院| 玖玖精品在线视频| 性欧美高清come| 亚洲精品免费在线| 777久久精品一区二区三区无码| 国产在线看片| 一区二区三区在线视频观看| 精品一区二区三区毛片| 2024最新电影免费在线观看| 亚洲黄色小说网站| 日韩美女爱爱视频| 91九色在线播放| 欧美日韩精品二区| 成人精品视频一区二区| 成人国产精品| 666欧美在线视频| 黄色三级视频在线播放| 99er精品视频| 精品久久久久一区二区国产| 欧美大片免费播放器| 视频一区中文| 久久久国产一区| 免费无遮挡无码永久在线观看视频| 欧美色123| 91精品国产高清久久久久久91| 91美女免费看| 美女一区二区视频| 成人欧美一区二区三区视频| 亚洲精品视频91| 91色.com| 日韩欧美亚洲日产国| 精品176二区| 亚洲卡通动漫在线| 国产一区二区网| 蜜桃视频成人m3u8| 日韩视频永久免费| 日韩在线免费观看av| 国产精品黑丝在线播放| 国产做受高潮69| 国产亚洲久一区二区| 国产九色精品成人porny| yy111111少妇影院日韩夜片| 日本福利片高清在线观看| 国产精品国产三级国产a| aa视频在线播放| 黄色精品视频| 亚洲成人精品久久久| 成人黄色a级片| 亚洲国产国产亚洲一二三| 青青久久av北条麻妃黑人| 一区二区日韩视频| 91捆绑美女网站| 蜜桃视频成人在线观看| 都市激情国产精品| 91精品国产综合久久久蜜臀图片| 日韩Av无码精品| 综合激情视频| 国产ts一区二区| 亚洲精品国产精品国| 久久精品一区八戒影视| 韩国无码av片在线观看网站| 91tv亚洲精品香蕉国产一区| 亚洲福利在线播放| 91n在线视频| 视频一区在线播放| 国产久一道中文一区| 好吊日视频在线观看| 色播五月激情综合网| 99精品一区二区三区无码吞精| 91tv精品福利国产在线观看| 国产91九色视频| 天天综合网在线观看| 亚洲男人天堂一区| 日韩高清第一页| 国产99亚洲| 欧美一区二区视频97| 欧美一区二区三区成人片在线| 18成人在线观看| 超碰在线人人爱| 深爱激情久久| 97色在线观看| 无码精品黑人一区二区三区 | 在线一区高清| 国产va免费精品观看精品| www.日韩系列| 99久久亚洲精品日本无码| 亚洲免费在线视频一区 二区| 亚洲一区二区三区视频播放| 99视频在线观看地址| 欧美亚一区二区| 久久久久久久久久97| 狠狠色综合日日| 国产传媒久久久| 美女一区二区在线观看| 97成人在线视频| 激情小说 在线视频| 欧美视频日韩视频在线观看| 免费黄色在线网址| 国产一区福利在线| 青青草成人免费在线视频| 亚洲另类春色校园小说| 国产精品三级在线| av文字幕在线观看| 亚洲国产精品人久久电影| www.国产色| 国产精品福利在线播放| 国产成人精品一区二区三区在线观看 | 懂色av.com| 国产无人区一区二区三区| 亚洲污视频在线观看| 在线中文一区| 蜜桃传媒视频第一区入口在线看| 全球最大av网站久久| 久久精品国产成人| 天天摸夜夜添狠狠添婷婷| 91国偷自产一区二区三区成为亚洲经典| 国产精品国产三级国产专业不| 精品一区二区免费视频| 久久久亚洲国产精品| 精品国产一区二区三区久久久蜜臀 | 亚洲s码欧洲m码国产av| 国产精品高潮呻吟| 国产精品无码永久免费不卡| 激情六月婷婷综合| 精品一区二区中文字幕| 911精品美国片911久久久| 久久视频在线观看中文字幕| 成人av在线播放| 2019中文字幕在线| 4438x成人网全国最大| 亚洲人成在线观看| 亚洲爆乳无码一区二区三区| 欧美图区在线视频| 日韩大片免费在线观看| 中文字幕亚洲精品在线观看| 小毛片在线观看| 久久97超碰色| 免费国产成人av| 999在线观看精品免费不卡网站| 亚洲视频在线观看日本a| 久久电影在线| 99re在线视频上| 蜜桃成人精品| 538国产精品视频一区二区| 黄a在线观看| 神马久久久久久| 黄色在线网站| 日韩精品亚洲元码| 亚洲a视频在线观看| 欧美巨大另类极品videosbest | 久久亚洲精品大全| 中文字幕一区二区视频| 国产又黄又粗视频| 2023国产精品自拍| 丝袜熟女一区二区三区| 国产成人在线视频网址| 999在线观看| 日韩专区欧美专区| 久久久久久久久久久久久国产精品| 欧美精品观看| 综合网五月天| 欧洲福利电影| 日韩精品久久一区| 亚洲黄页在线观看| 久久久精彩视频| 日韩大尺度在线观看| 激情小说网站亚洲综合网| 99精品国产一区二区三区2021 | 午夜精品无码一区二区三区| 欧美精品乱人伦久久久久久| 在线观看免费中文字幕| 欧美性生交片4| 中文亚洲av片在线观看| 欧美综合久久久| 中文字幕欧美人妻精品一区蜜臀| 欧美在线一区二区| 最新中文字幕第一页| 欧美在线播放高清精品| 日韩精品一区不卡| 欧美无乱码久久久免费午夜一区| 怡红院男人的天堂| 欧美日韩在线三区| 国产精品久久久午夜夜伦鲁鲁| 欧美日韩久久久久久| 91成人在线免费| 欧美一区二区三区日韩| 亚洲国产精品二区| 亚洲第一中文字幕| 九色网友自拍视频手机在线| 一区二区欧美在线| 黄网站app在线观看| 欧美猛交ⅹxxx乱大交视频| 黄页网站在线| 欧美一级淫片丝袜脚交| 久久久成人av毛片免费观看| 国产精品亚洲第一区| av日韩在线免费观看| 99精品在线直播| 欧美亚洲国产日韩| 日韩国产精品一区二区| 中文字幕免费一区二区三区| 欧美久久在线观看| 久久蜜桃精品| 天天色天天综合网| a亚洲天堂av| 日本美女xxx| 亚洲精品国产高清久久伦理二区| 国产精品suv一区二区| 色婷婷av一区| 国产免费久久久| 亚洲国产成人久久综合一区| 精品亚洲成a人片在线观看| 精品国偷自产在线| ririsao久久精品一区| 国产精品mp4| av一级久久| 免费日韩电影在线观看| 91精品国产福利在线观看麻豆| 欧美日韩黄色一级片| 蜜乳av一区二区三区| 一级黄色免费视频| 中文字幕精品一区二区三区精品 | 好吊成人免视频| 亚洲一区二区色| 亚洲精品电影在线| 免费在线观看黄色网| 91成人国产在线观看| www999久久| 欧美日韩精品一区| 欧美日韩一卡| 深夜黄色小视频| a级高清视频欧美日韩| 日韩欧美123区| 91国偷自产一区二区三区观看| 亚洲成熟女性毛茸茸| 中文字幕精品国产| 三妻四妾完整版在线观看电视剧| 91视频-88av| 国产一区二区三区四区大秀| 国产精品69久久久| 紧缚捆绑精品一区二区| 亚洲精品色午夜无码专区日韩| 亚洲国产精品精华液网站| 这里只有精品国产| 亚洲欧美在线一区二区| 2021天堂中文幕一二区在线观| 91性高湖久久久久久久久_久久99| 精品免费视频| 精品人妻一区二区三区四区在线| 国产69精品久久久久毛片| 男人天堂资源网| 欧美综合一区二区| 欧美日韩激情视频一区二区三区| 97久久精品视频| 一区视频网站| 欧美日韩午夜爽爽| 国产一区久久久| 欧洲美女女同性互添| 欧美三区在线观看| 成人在线观看一区| 国产不卡视频在线| 亚洲区小说区图片区qvod按摩| 91成人在线观看喷潮教学| 成人avav影音| www.99re7.com| 精品国产伦一区二区三区免费| 18av在线视频| 91手机视频在线观看| 在线精品小视频| 欧美69精品久久久久久不卡| 一区二区在线电影| 亚洲国产成人在线观看| 久久久中精品2020中文| 国产区精品视频在线观看豆花| 农民人伦一区二区三区| 成人av网站在线| 日本视频免费在线| 国产视频精品免费播放| 345成人影院| 青娱乐一区二区| 青青草国产成人av片免费| 亚洲成人黄色av| 欧美日韩视频第一区| 日韩三级影院| 亚洲a级在线播放观看| 韩国亚洲精品| 亚洲人人夜夜澡人人爽| 色视频成人在线观看免| 精品视频一二三| 成人激情在线观看| 国产一区二区三区四区老人| 白嫩情侣偷拍呻吟刺激| 狠狠综合久久av一区二区小说 | 国产精品久久婷婷| 欧美日韩福利视频| 啪啪激情综合网| 成人在线观看a| 亚洲欧洲精品天堂一级 | 在线观看久久av| 不卡一区视频| 免费无码毛片一区二三区| 久久久久国产精品麻豆| 在线免费观看视频网站| 欧美大尺度激情区在线播放| 欧美a级网站| 男人插女人下面免费视频| 一区二区三区日韩在线观看| 香蕉视频国产在线| 国产日韩欧美中文在线播放| 欧美 日韩 国产 一区| 日本丰满少妇裸体自慰 | 激情黄色小视频| 亚洲一二三四区不卡| 精品久久av| 97在线电影| 日韩成人一级大片| 免费视频一二三区| 中文字幕亚洲情99在线| av自拍一区| 久久国产激情视频| 精品国产福利视频| 黄色在线免费网站| 欧美激情一区二区三区在线视频 | 一区久久精品| 成人性视频免费看| 日韩国产欧美精品一区二区三区| 欧美aaa级|