日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Redis详解(三)

發(fā)布時(shí)間:2025/3/8 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis详解(三) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、Redis集群介紹

Clustering:
redis 3.0之后進(jìn)入生產(chǎn)環(huán)境
分布式數(shù)據(jù)庫(kù),通過(guò)分片機(jī)制來(lái)進(jìn)行數(shù)據(jù)分布,clustering 內(nèi)的每個(gè)節(jié)點(diǎn),僅有數(shù)據(jù)庫(kù)的一部分?jǐn)?shù)據(jù);
去中心化的集群:
redis集群中的每一個(gè)節(jié)點(diǎn),都可以作為集群的接入節(jié)點(diǎn)。//每一個(gè)node都有全局元數(shù)據(jù),client訪問(wèn)哪一個(gè)node都可以獲取所有的node
client向任意node發(fā)起請(qǐng)求,該node會(huì)返回給client真正的key所在node,然后讓client去獲取。
每一個(gè)節(jié)點(diǎn)持有全局元數(shù)據(jù),但僅持有部分?jǐn)?shù)據(jù)。
redis分布式的常見(jiàn)解決方案:
Twemproxy(Twitter)
Codis(豌豆莢)
Redis Cluster(官方)
Cerberus(芒果TV)

1、Twemproxy特點(diǎn):

代理分片機(jī)制
優(yōu)點(diǎn):
非常穩(wěn)定,企業(yè)級(jí)方案
缺點(diǎn):
單點(diǎn)故障
需依賴(lài)第三方軟件,例如keepalived //進(jìn)行HA
無(wú)法平滑地橫向擴(kuò)展
沒(méi)有后臺(tái)界面
代理分片機(jī)制引入更多的來(lái)回次數(shù)并提高延遲
單核模式,無(wú)法重新利用多核,除非多實(shí)例
Twitter官方內(nèi)部不再私用Twemproxy
圖1:

2、Codis(豌豆莢)

代理分片機(jī)制
2014年開(kāi)源
基于Go以及C語(yǔ)言研發(fā)
優(yōu)點(diǎn):
文檔充足,企業(yè)級(jí)方案
數(shù)據(jù)自動(dòng)平衡
高性能
簡(jiǎn)單的測(cè)試顯示較Twemproxy快一倍
善用多核CPU
簡(jiǎn)單:
沒(méi)有paxos類(lèi)的協(xié)調(diào)機(jī)制
沒(méi)有主從復(fù)制
有后臺(tái)界面
缺點(diǎn):
代理分片機(jī)制引入更多的來(lái)回次數(shù)并提高延遲 //更多的ping(pong)操作
需要第三方軟件支持協(xié)調(diào)機(jī)制 //目前支持Zookeeper及Etcd
不支持主從復(fù)制,需要另外實(shí)現(xiàn)
Codis采用proxy方案,所以必然會(huì)帶來(lái)單機(jī)性能的損失,
靜測(cè)試,在不開(kāi)pipeline的情況下,大概會(huì)損失40%左右的性能

3、Redis cluster(官方)

官方實(shí)現(xiàn)
需要Redis 3.0 或更高版本
優(yōu)點(diǎn):
無(wú)中心的p2p Gossip分散式模式
更少的來(lái)回次數(shù)并降低延遲
自動(dòng)于多個(gè)Redis節(jié)點(diǎn)進(jìn)行分片,自動(dòng)均衡
不需要第三方軟件支持協(xié)調(diào)機(jī)制
缺點(diǎn):
依賴(lài)于Redis 3.0或更高版本
需要時(shí)間驗(yàn)證其穩(wěn)定性
沒(méi)有后臺(tái)界面
需要智能客戶(hù)端 //萬(wàn)一某個(gè)client下線了,client需要知道哪個(gè)node在線。
Redis客戶(hù)端必須支持Redis cluster架構(gòu)
較Codis有更多的維護(hù)升級(jí)版本

4、Cerberus(芒果TV)

優(yōu)點(diǎn):
數(shù)據(jù)自動(dòng)平衡
本身實(shí)現(xiàn)了Redis的smart client//server端直接實(shí)現(xiàn)了智能client
支持讀寫(xiě)分離
缺點(diǎn):
依賴(lài)Redis 3.0或更高版本
代理分片機(jī)制引入更多的來(lái)回次數(shù)并增大延遲
需要時(shí)間驗(yàn)證其穩(wěn)定性
沒(méi)有后臺(tái)界面
codis-proxy : 是客戶(hù)端連接的Redis代理服務(wù),codis-proxy 本身實(shí)現(xiàn)了Redis協(xié)議,表現(xiàn)得和一個(gè)原生的Redis沒(méi)什么區(qū)別(就像Twemproxy),對(duì)于一個(gè)業(yè)務(wù)來(lái)說(shuō),可以部署多個(gè)codis-proxy,codis-proxy本身是沒(méi)狀態(tài)的。
codis-config :是Codis的管理工具,支持包括,添加/刪除Redis節(jié)點(diǎn),添加/刪除Proxy節(jié)點(diǎn),發(fā)起數(shù)據(jù)遷移等操作,codis-config本身還自帶了一個(gè)http server,會(huì)啟動(dòng)一個(gè)dashboard,用戶(hù)可以直接在瀏覽器上觀察Codis集群的狀態(tài)。
codis-server:是Codis項(xiàng)目維護(hù)的一個(gè)Redis分支,基于2.8.13開(kāi)發(fā),加入了slot的支持和原子的數(shù)據(jù)遷移指令,Codis上層的codis-proxy和codis-config只能和這個(gè)版本的Redis交互才能正常運(yùn)行。
ZooKeeper :用來(lái)存放數(shù)據(jù)路由表和codis-proxy節(jié)點(diǎn)的元信息,codis-config發(fā)起的命令都會(huì)通過(guò)ZooKeeper同步到各個(gè)存活的codis-proxy

二、官方版安裝與實(shí)現(xiàn)

1、安裝與實(shí)現(xiàn)

redis-trib.rb的ruby腳本。redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源碼src目錄下(redis-xxx/src/)
redis-trib.rb是redis作者用ruby完成的。所以redis集群需要先安裝ruby環(huán)境。

[root@wolf src]# cd /usr/local/src ; wget http://download.redis.io/redis-stable.tar.gz [root@wolf src]# tar xvf redis-stable.tar.gz [root@wolf src]# ln -sv redis-stable redis && cd redis [root@wolf src]# yum install tcl ruby ruby-devel rubygems -y && make && make install [root@wolf redis-stable]# make -j 4 && taskset -c 1 make test [root@wolf redis-stable]# make install && cd /usr/local/src/redis-stable/src [root@wolf src]# cp redis-trib.rb /usr/local/bin/ [root@wolf src]# mkdir /redis/{1201,1202,1203,1204,1205,1206,1207,1208} -pv [root@wolf src]# cat /redis/1201/redis.conf port 1201 //分別改為1201,1202,1203,1204...1208 bind 127.0.0.1 //一樣 daemonize yes pidfile /var/run/redis_1201.pid cluster-enabled yes cluster-config-file node_1201.conf //自動(dòng)生成的,不需要配置 cluster-node-timeout 15000 //超時(shí)多久認(rèn)為其宕機(jī)了 appendonly yes cluster-require-full-coverage no //默認(rèn)是yes只要有結(jié)點(diǎn)宕機(jī)導(dǎo)致16384個(gè)槽沒(méi)全被覆蓋,整個(gè)集群就全部停止服務(wù),所以一定要改為no logfile "./redis.log" //日志文件 cluster-slave-validity-factor 0 //出現(xiàn)master監(jiān)測(cè)異常之后,立馬failover //cluster-slave-validity-factor <factor> //0:不管slave和master失聯(lián)多久都會(huì)一直嘗試failover(設(shè)為正數(shù)),失聯(lián)大于一定時(shí)間(factor*TimeOut)不再進(jìn)行FailOver。比如如果TimeOut設(shè)置為5s,該項(xiàng)設(shè)置為10s,如果master和slave失聯(lián)超過(guò)50s,slave不會(huì)去failover它的master(不會(huì)去取代master) 注意:任意非0值都有可能導(dǎo)致當(dāng)master掛掉又沒(méi)有slave給他,這樣redis集群不可用。這種情況只有原來(lái)的master重新回到集群中才能讓集群恢復(fù)工作 //另外幾個(gè)配置文件參考1201的配置文件修改 [root@node112 redis]# redis-server /redis/{1201,1202,,,,1208}/redis.conf [root@node112 redis]# ps -ef |grep redis root 35965 1 0 22:16 ? 00:00:04 redis-server 127.0.0.1:1201 [cluster] root 35985 1 0 22:17 ? 00:00:04 redis-server 127.0.0.1:1202 [cluster] root 35990 1 0 22:17 ? 00:00:04 redis-server 127.0.0.1:1203 [cluster] root 35995 1 0 22:17 ? 00:00:04 redis-server 127.0.0.1:1204 [cluster] root 40784 1 0 22:48 ? 00:00:00 redis-server 127.0.0.1:1205 [cluster] root 40789 1 0 22:48 ? 00:00:00 redis-server 127.0.0.1:1206 [cluster] root 40794 1 0 22:48 ? 00:00:00 redis-server 127.0.0.1:1207 [cluster] root 40799 1 0 22:48 ? 00:00:00 redis-server 127.0.0.1:1208 [cluster]

[root@node112 redis]# redis-trib.rb --help

/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require'from /usr/local/bin/redis-trib.rb:25:in `<main>' 需要安裝ruby的client # gem install redis //要求ruby版本2.2之上,假如版本低更新ruby版本如下 # yum install autoconf automake bison libffi-devel libtool readline-devel sqlite-devel libyaml-devel # curl -sSL https://rvm.io/mpapis.asc | gpg --import - # curl -L get.rvm.io | bash -s stable # source /etc/profile.d/rvm.sh //加載RVM環(huán)境。 # rvm reload # rvm requirements run # rvm install 2.4.2 //安裝ruby2.4 設(shè)置默認(rèn)的ruby版本: # rvm list # rvm use 2.4.2 --default # ruby --version [root@node112 ~]# redis-trib.rb create --replicas 1 127.0.0.1:1201 127.0.0.1:1202 127.0.0.1:1203 127.0.0.1:1204 127.0.0.1:1205 127.0.0.1:1206 127.0.0.1:1207 127.0.0.1:1208 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join....... >>> Performing Cluster Check (using node 127.0.0.1:1201) M: d392057bb258248b09db27e57da53e6277bfbb87 127.0.0.1:1201slots:0-4095 (4096 slots) master1 additional replica(s) M: 8ee780051bba2d62514c3adddb6ad050128309c2 127.0.0.1:1204slots:12288-16383 (4096 slots) master1 additional replica(s) S: 84fc85c03e8cd1d20b794a36091ccfd5235d3403 127.0.0.1:1207slots: (0 slots) slavereplicates 32d3f692b64dd438d5ff9c4729be53c55d3768bb S: e92354f4f158e5c45c508cf494dfd99892437bb4 127.0.0.1:1208slots: (0 slots) slavereplicates 8ee780051bba2d62514c3adddb6ad050128309c2 S: a23562b6abf030b912f950c0e1fe2f576d4e1b8d 127.0.0.1:1205slots: (0 slots) slavereplicates 8251d8d4bde7dd099acb462094d2132b94457481 M: 32d3f692b64dd438d5ff9c4729be53c55d3768bb 127.0.0.1:1203slots:8192-12287 (4096 slots) master1 additional replica(s) S: b31e1d76d83c050c5870caaaf7a6807b3b5c16a3 127.0.0.1:1206slots: (0 slots) slavereplicates d392057bb258248b09db27e57da53e6277bfbb87 M: 8251d8d4bde7dd099acb462094d2132b94457481 127.0.0.1:1202slots:4096-8191 (4096 slots) master1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. [root@node112 ~]# [root@node112 ~]# netstat -tunlp |grep -i redis tcp 0 0 127.0.0.1:1201 0.0.0.0:* LISTEN 35965/redis-server tcp 0 0 127.0.0.1:1202 0.0.0.0:* LISTEN 35985/redis-server tcp 0 0 127.0.0.1:1203 0.0.0.0:* LISTEN 35990/redis-server tcp 0 0 127.0.0.1:1204 0.0.0.0:* LISTEN 35995/redis-server tcp 0 0 127.0.0.1:1205 0.0.0.0:* LISTEN 40784/redis-server tcp 0 0 127.0.0.1:1206 0.0.0.0:* LISTEN 40789/redis-server tcp 0 0 127.0.0.1:1207 0.0.0.0:* LISTEN 40794/redis-server tcp 0 0 127.0.0.1:1208 0.0.0.0:* LISTEN 40799/redis-server tcp 0 0 127.0.0.1:11201 0.0.0.0:* LISTEN 35965/redis-server tcp 0 0 127.0.0.1:11202 0.0.0.0:* LISTEN 35985/redis-server tcp 0 0 127.0.0.1:11203 0.0.0.0:* LISTEN 35990/redis-server tcp 0 0 127.0.0.1:11204 0.0.0.0:* LISTEN 35995/redis-server tcp 0 0 127.0.0.1:11205 0.0.0.0:* LISTEN 40784/redis-server tcp 0 0 127.0.0.1:11206 0.0.0.0:* LISTEN 40789/redis-server tcp 0 0 127.0.0.1:11207 0.0.0.0:* LISTEN 40794/redis-server tcp 0 0 127.0.0.1:11208 0.0.0.0:* LISTEN 40799/redis-server

Redis集群不僅需要開(kāi)通redis客戶(hù)端連接的端口,而且需要開(kāi)通集群總線端口,集群總線端口為redis客戶(hù)端連接的端口 + 10000

[root@node112 redis]# redis-cli -h 127.0.0.1 -p 1201 測(cè)試: 終端一:訂閱 [root@node112 ~]# redis-cli -h 127.0.0.1 -p 1206 127.0.0.1:1206> SUBSCRIBE mm 終端二:發(fā)布 [root@node112 redis]# redis-cli -h 127.0.0.1 -p 1201 127.0.0.1:1201> PUBLISH mm "test for messages" 在終端一上查看[root@node112 ~]# redis-cli -h 127.0.0.1 -p 1201 127.0.0.1:1201> set hello "hello worlld" OK [root@node112 ~]# redis-cli -h 127.0.0.1 -p 1205 -c //-c使用集群模式 127.0.0.1:1205> get hello -> Redirected to slot [866] located at 127.0.0.1:1201 "hello worlld"

2、集群相關(guān)命令

redis-cluster把所有的物理節(jié)點(diǎn)映射到[0-16383]個(gè)slot(hash槽)上,由cluster負(fù)責(zé)維護(hù)node<->slot<->value
集群選舉容錯(cuò):節(jié)點(diǎn)fail選舉是過(guò)程是集群中所有master參與,半數(shù)以上master與被檢測(cè)node監(jiān)測(cè)超時(shí)(cluster-node-timeout),就認(rèn)為當(dāng)前master節(jié)點(diǎn)down
集群不可用:cluster:fail
1.集群任意master掛掉,且當(dāng)前master沒(méi)有slave。集群進(jìn)入fail狀態(tài),也可以理解成集群的slot映射[0-16838]不完整時(shí)進(jìn)入fail狀態(tài)。
2.集群半數(shù)以上master掛掉,收到error clusterdown The Cluster is down的錯(cuò)誤
集群優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
在master節(jié)點(diǎn)下線后,slave節(jié)點(diǎn)會(huì)自動(dòng)提升為master,保證集群可用性
fail node復(fù)活后,自動(dòng)添加到集群中,變成slave節(jié)點(diǎn)。
缺點(diǎn):
redis的復(fù)制使用異步復(fù)制機(jī)制,auto-fail-over的過(guò)程中。集群可能會(huì)丟失write命令。然而redis幾乎是同時(shí)執(zhí)行(將命令恢復(fù)發(fā)送給客戶(hù)端,以及將命令復(fù)制到slave節(jié)點(diǎn))這兩個(gè)操作。所以實(shí)際操作中,丟失的可能性非常小

127.0.0.1:1202> help @cluster 集群: cluster info :打印集群的信息 cluster nodes :列出集群當(dāng)前已知的所有節(jié)點(diǎn)( node),以及這些節(jié)點(diǎn)的相關(guān)信息。 節(jié)點(diǎn): cluster meet <ip> <port> :將 ip 和 port 所指定的節(jié)點(diǎn)添加到集群當(dāng)中,讓它成為集群的一份子。 cluster forget <node_id> :從集群中移除 node_id 指定的節(jié)點(diǎn)。 cluster replicate <node_id> :將當(dāng)前節(jié)點(diǎn)設(shè)置為 node_id 指定的節(jié)點(diǎn)的從節(jié)點(diǎn)。 cluster saveconfig :將節(jié)點(diǎn)的配置文件保存到硬盤(pán)里面。 槽(slot): cluster addslots <slot> [slot ...] :將一個(gè)或多個(gè)槽( slot)指派( assign)給當(dāng)前節(jié)點(diǎn)。 cluster delslots <slot> [slot ...] :移除一個(gè)或多個(gè)槽對(duì)當(dāng)前節(jié)點(diǎn)的指派。 cluster flushslots :移除指派給當(dāng)前節(jié)點(diǎn)的所有槽,讓當(dāng)前節(jié)點(diǎn)變成一個(gè)沒(méi)有指派任何槽的節(jié)點(diǎn)。 cluster setslot <slot> node <node_id> :將槽 slot 指派給 node_id 指定的節(jié)點(diǎn),如果槽已經(jīng)指派給 另一個(gè)節(jié)點(diǎn),那么先讓另一個(gè)節(jié)點(diǎn)刪除該槽>,然后再進(jìn)行指派。 cluster setslot <slot> migrating <node_id> :將本節(jié)點(diǎn)的槽 slot 遷移到 node_id 指定的節(jié)點(diǎn)中。 cluster setslot <slot> importing <node_id> :從 node_id 指定的節(jié)點(diǎn)中導(dǎo)入槽 slot 到本節(jié)點(diǎn)。 cluster setslot <slot> stable :取消對(duì)槽 slot 的導(dǎo)入( import)或者遷移( migrate)。 鍵: cluster keyslot <key> :計(jì)算鍵 key 應(yīng)該被放置在哪個(gè)槽上。 cluster countkeysinslot <slot> :返回槽 slot 目前包含的鍵值對(duì)數(shù)量。 cluster getkeysinslot <slot> <count> :返回 count 個(gè) slot 槽中的鍵

3、redis-trib.rb命令詳解

redis-trib.rb help //查看幫助信息
redis-trib.rb主要有兩個(gè)類(lèi):ClusterNode和RedisTrib。ClusterNode保存了每個(gè)節(jié)點(diǎn)的信息,RedisTrib則是redis-trib.rb各個(gè)功能的實(shí)現(xiàn)。

create:創(chuàng)建集群 //redis-trib.rb create --replicas 1 $host1:port1 $host2:port2 ... check:檢查集群 info:查看集群信息 fix:修復(fù)集群 reshard:在線遷移slot rebalance:平衡集群節(jié)點(diǎn)slot數(shù)量 add-node:將新節(jié)點(diǎn)加入集群 del-node:從集群中刪除節(jié)點(diǎn) set-timeout:設(shè)置集群節(jié)點(diǎn)間心跳連接的超時(shí)時(shí)間 call:在集群全部節(jié)點(diǎn)上執(zhí)行命令 import:將外部redis數(shù)據(jù)導(dǎo)入集群

3.1、create:創(chuàng)建集群 //redis-trib.rb create --replicas 1 $host1:port1 $host2:port2 ...

1、首先為每個(gè)節(jié)點(diǎn)創(chuàng)建ClusterNode對(duì)象,包括連接每個(gè)節(jié)點(diǎn)。檢查每個(gè)節(jié)點(diǎn)是否為獨(dú)立且db為空的節(jié)點(diǎn)。執(zhí)行l(wèi)oad_info方法導(dǎo)入節(jié)點(diǎn)信息。
2、檢查傳入的master節(jié)點(diǎn)數(shù)量是否大于等于3個(gè)。只有大于3個(gè)節(jié)點(diǎn)才能組成集群。//master+slave大于6個(gè)
3、計(jì)算每個(gè)master需要分配的slot數(shù)量,以及給master分配slave。分配的算法大致如下:
先把節(jié)點(diǎn)按照host分類(lèi),這樣保證master節(jié)點(diǎn)能分配到更多的主機(jī)中。
不停遍歷遍歷host列表,從每個(gè)host列表中彈出一個(gè)節(jié)點(diǎn),放入interleaved數(shù)組。直到所有的節(jié)點(diǎn)都彈出為止。
master節(jié)點(diǎn)列表就是interleaved前面的master數(shù)量的節(jié)點(diǎn)列表。保存在masters數(shù)組。
計(jì)算每個(gè)master節(jié)點(diǎn)負(fù)責(zé)的slot數(shù)量,保存在slots_per_node對(duì)象,用slot總數(shù)除以master數(shù)量取整即可。
遍歷masters數(shù)組,每個(gè)master分配slots_per_node個(gè)slot,最后一個(gè)master,分配到16384個(gè)slot為止。
接下來(lái)為master分配slave,分配算法會(huì)盡量保證master和slave節(jié)點(diǎn)不在同一臺(tái)主機(jī)上。對(duì)于分配完指定slave數(shù)量的節(jié)點(diǎn),還有多余的節(jié)點(diǎn),也會(huì)為這些節(jié)點(diǎn)尋找master。分配算法會(huì)遍歷兩次masters數(shù)組。
第一次遍歷masters數(shù)組,在余下的節(jié)點(diǎn)列表找到replicas數(shù)量個(gè)slave。每個(gè)slave為第一個(gè)和master節(jié)點(diǎn)host不一樣的節(jié)點(diǎn),如果沒(méi)有不一樣的節(jié)點(diǎn),則直接取出余下列表的第一個(gè)節(jié)點(diǎn)。
第二次遍歷是在對(duì)于節(jié)點(diǎn)數(shù)除以replicas不為整數(shù),則會(huì)多余一部分節(jié)點(diǎn)。遍歷的方式跟第一次一樣,只是第一次會(huì)一次性給master分配replicas數(shù)量個(gè)slave,而第二次遍歷只分配一個(gè),直到余下的節(jié)點(diǎn)被全部分配出去。
4、打印出分配信息,并提示用戶(hù)輸入“yes”確認(rèn)是否按照打印出來(lái)的分配方式創(chuàng)建集群。
5、輸入“yes”后,會(huì)執(zhí)行flush_nodes_config操作,該操作執(zhí)行前面的分配結(jié)果,給master分配slot,讓slave復(fù)制master,對(duì)于還沒(méi)有握手(cluster meet)的節(jié)點(diǎn),slave復(fù)制操作無(wú)法完成,不過(guò)沒(méi)關(guān)系,flush_nodes_config操作出現(xiàn)異常會(huì)很快返回,后續(xù)握手后會(huì)再次執(zhí)行flush_nodes_config。
6、給每個(gè)節(jié)點(diǎn)分配epoch,遍歷節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)分配的epoch比之前節(jié)點(diǎn)大1。
7、節(jié)點(diǎn)間開(kāi)始相互握手,握手的方式為節(jié)點(diǎn)列表的其他節(jié)點(diǎn)跟第一個(gè)節(jié)點(diǎn)握手。
8、然后每隔1秒檢查一次各個(gè)節(jié)點(diǎn)是否已經(jīng)消息同步完成,使用ClusterNode的get_config_signature方法,檢查的算法為獲取每個(gè)節(jié)點(diǎn)cluster nodes信息,排序每個(gè)節(jié)點(diǎn),組裝成node_id1:slots|node_id2:slot2|...的字符串。如果每個(gè)節(jié)點(diǎn)獲得字符串都相同,即認(rèn)為握手成功。
9、此后會(huì)再執(zhí)行一次flush_nodes_config,這次主要是為了完成slave復(fù)制操作。
10、最后再執(zhí)行check_cluster,全面檢查一次集群狀態(tài)。包括和前面握手時(shí)檢查一樣的方式再檢查一遍。確認(rèn)沒(méi)有遷移的節(jié)點(diǎn)。確認(rèn)所有的slot都被分配出去了。
11、至此完成了整個(gè)創(chuàng)建流程,返回[OK] All 16384 slots covered.。

3.2、check檢查集群狀態(tài)

[root@node112 redis]# redis-trib.rb check 127.0.0.1:1201
檢查集群狀態(tài),只需要選擇一個(gè)集群中的一個(gè)節(jié)點(diǎn)即可。
檢查前會(huì)先執(zhí)行l(wèi)oad_cluster_info_from_node方法,把所有節(jié)點(diǎn)數(shù)據(jù)load進(jìn)來(lái)。load的方式為通過(guò)自己的cluster nodes發(fā)現(xiàn)其他節(jié)點(diǎn),然后連接每個(gè)節(jié)點(diǎn),并加入nodes數(shù)組。接著生成節(jié)點(diǎn)間的復(fù)制關(guān)系。
load完數(shù)據(jù)后,開(kāi)始檢查數(shù)據(jù),檢查的方式也是調(diào)用創(chuàng)建時(shí)候使用的check_cluster。

3.3、info查看集群信息

info命令也是先執(zhí)行l(wèi)oad_cluster_info_from_node獲取完整的集群信息。然后顯示ClusterNode的info_string結(jié)果

[root@node112 redis]# redis-trib.rb info 127.0.0.1:1201 127.0.0.1:1204 (9a60d0fc...) -> 0 keys | 4096 slots | 1 slaves. 127.0.0.1:1203 (31f66735...) -> 1 keys | 4096 slots | 1 slaves. 127.0.0.1:1209 (a4dc7dd4...) -> 0 keys | 4096 slots | 2 slaves. 127.0.0.1:1202 (56b03fec...) -> 0 keys | 4096 slots | 1 slaves. [OK] 1 keys in 4 masters. 0.00 keys per slot on average.

3.4、fix修復(fù)集群

目前fix命令能修復(fù)兩種異常,一種是集群有處于遷移中的slot的節(jié)點(diǎn),一種是slot未完全分配的異常。
fix_open_slot方法是修復(fù)集群有處于遷移中的slot的節(jié)點(diǎn)異常。

1、先檢查該slot是誰(shuí)負(fù)責(zé)的,遷移的源節(jié)點(diǎn)如果沒(méi)完成遷移,owner還是該節(jié)點(diǎn)。沒(méi)有owner的slot無(wú)法完成修復(fù)功能。
2、遍歷每個(gè)節(jié)點(diǎn),獲取哪些節(jié)點(diǎn)標(biāo)記該slot為migrating狀態(tài),哪些節(jié)點(diǎn)標(biāo)記該slot為importing狀態(tài)。對(duì)于owner不是該節(jié)點(diǎn),但是通過(guò)cluster countkeysinslot獲取到該節(jié)點(diǎn)有數(shù)據(jù)的情況,也認(rèn)為該節(jié)點(diǎn)為importing狀態(tài)。
3、如果migrating和importing狀態(tài)的節(jié)點(diǎn)均只有1個(gè),這可能是遷移過(guò)程中redis-trib.rb被中斷所致,直接執(zhí)行move_slot繼續(xù)完成遷移任務(wù)即可。傳遞dots和fix為true。
4、如果migrating為空,importing狀態(tài)的節(jié)點(diǎn)大于0,那么這種情況執(zhí)行回滾流程,將importing狀態(tài)的節(jié)點(diǎn)數(shù)據(jù)通過(guò)move_slot方法導(dǎo)給slot的owner節(jié)點(diǎn),傳遞dots、fix和cold為true。接著對(duì)importing的節(jié)點(diǎn)執(zhí)行cluster stable命令恢復(fù)穩(wěn)定。
5、如果importing狀態(tài)的節(jié)點(diǎn)為空,有一個(gè)migrating狀態(tài)的節(jié)點(diǎn),而且該節(jié)點(diǎn)在當(dāng)前slot沒(méi)有數(shù)據(jù),那么可以直接把這個(gè)slot設(shè)為stable。
6、如果migrating和importing狀態(tài)不是上述情況,目前redis-trib.rb工具無(wú)法修復(fù),上述的三種情況也已經(jīng)覆蓋了通過(guò)redis-trib.rb工具遷移出現(xiàn)異常的各個(gè)方面,人為的異常情形太多,很難考慮完全。
fix_slots_coverage方法能修復(fù)slot未完全分配的異常。未分配的slot有三種狀態(tài)。

1、所有節(jié)點(diǎn)的該slot都沒(méi)有數(shù)據(jù)。該狀態(tài)redis-trib.rb工具直接采用隨機(jī)分配的方式,并沒(méi)有考慮節(jié)點(diǎn)的均衡。本人嘗試對(duì)沒(méi)有分配slot的集群通過(guò)fix修復(fù)集群,結(jié)果slot還是能比較平均的分配,但是沒(méi)有了連續(xù)性,打印的slot信息非常離散。
2、有一個(gè)節(jié)點(diǎn)的該slot有數(shù)據(jù)。該狀態(tài)下,直接把slot分配給該slot有數(shù)據(jù)的節(jié)點(diǎn)。
3、有多個(gè)節(jié)點(diǎn)的該slot有數(shù)據(jù)。此種情況目前還處于TODO狀態(tài),不過(guò)redis作者列出了修復(fù)的步驟,對(duì)這些節(jié)點(diǎn),除第一個(gè)節(jié)點(diǎn),執(zhí)行cluster migrating命令,然后把這些節(jié)點(diǎn)的數(shù)據(jù)遷移到第一個(gè)節(jié)點(diǎn)上。清除migrating狀態(tài),然后把slot分配給第一個(gè)節(jié)點(diǎn)。

3.5、reshard在線遷移slot
在線把集群的一些slot從集群原來(lái)slot負(fù)責(zé)節(jié)點(diǎn)遷移到新的節(jié)點(diǎn),利用reshard可以完成集群的在線橫向擴(kuò)容和縮容。

reshard host:port--from <arg>--to <arg>--slots <arg>--yes--timeout <arg>--pipeline <arg> host:port:這個(gè)是必傳參數(shù),用來(lái)從一個(gè)節(jié)點(diǎn)獲取整個(gè)集群信息,相當(dāng)于獲取集群信息的入口。 --from <arg>:需要從哪些源節(jié)點(diǎn)上遷移slot,可從多個(gè)源節(jié)點(diǎn)完成遷移,以逗號(hào)隔開(kāi),傳遞的是節(jié)點(diǎn)的node id,還可以直接傳遞--from all,這樣源節(jié)點(diǎn)就是集群的所有節(jié)點(diǎn),不傳遞該參數(shù)的話(huà),則會(huì)在遷移過(guò)程中提示用戶(hù)輸入。 --to <arg>:slot需要遷移的目的節(jié)點(diǎn)的node id,目的節(jié)點(diǎn)只能填寫(xiě)一個(gè),不傳遞該參數(shù)的話(huà),則會(huì)在遷移過(guò)程中提示用戶(hù)輸入。 --slots <arg>:需要遷移的slot數(shù)量,不傳遞該參數(shù)的話(huà),則會(huì)在遷移過(guò)程中提示用戶(hù)輸入。 --yes:設(shè)置該參數(shù),可以在打印執(zhí)行reshard計(jì)劃的時(shí)候,提示用戶(hù)輸入yes確認(rèn)后再執(zhí)行reshard。 --timeout <arg>:設(shè)置migrate命令的超時(shí)時(shí)間。 --pipeline <arg>:定義cluster getkeysinslot命令一次取出的key數(shù)量,不傳的話(huà)使用默認(rèn)值為10。 遷移的流程如下:

1、通過(guò)load_cluster_info_from_node方法裝載集群信息。
2、執(zhí)行check_cluster方法檢查集群是否健康。只有健康的集群才能進(jìn)行遷移。
3、獲取需要遷移的slot數(shù)量,用戶(hù)沒(méi)傳遞--slots參數(shù),則提示用戶(hù)手動(dòng)輸入。
4、獲取遷移的目的節(jié)點(diǎn),用戶(hù)沒(méi)傳遞--to參數(shù),則提示用戶(hù)手動(dòng)輸入。此處會(huì)檢查目的節(jié)點(diǎn)必須為master節(jié)點(diǎn)。
5、獲取遷移的源節(jié)點(diǎn),用戶(hù)沒(méi)傳遞--from參數(shù),則提示用戶(hù)手動(dòng)輸入。此處會(huì)檢查源節(jié)點(diǎn)必須為master節(jié)點(diǎn)。--from all的話(huà),源節(jié)點(diǎn)就是除了目的節(jié)點(diǎn)外的全部master節(jié)點(diǎn)。這里為了保證集群slot分配的平均,建議傳遞--from all。
6、執(zhí)行compute_reshard_table方法,計(jì)算需要遷移的slot數(shù)量如何分配到源節(jié)點(diǎn)列表,采用的算法是按照節(jié)點(diǎn)負(fù)責(zé)slot數(shù)量由多到少排序,計(jì)算每個(gè)節(jié)點(diǎn)需要遷移的slot的方法為:遷移slot數(shù)量 * (該源節(jié)點(diǎn)負(fù)責(zé)的slot數(shù)量 / 源節(jié)點(diǎn)列表負(fù)責(zé)的slot總數(shù))。這樣算出的數(shù)量可能不為整數(shù),這里代碼用了下面的方式處理:

n = (numslots/source_tot_slots*s.slots.length) if i == 0n = n.ceil elsen = n.floor

這樣的處理方式會(huì)帶來(lái)最終分配的slot與請(qǐng)求遷移的slot數(shù)量不一致,這個(gè)BUG已經(jīng)在github上提給作者,https://github.com/antirez/redis/issues/2990。
7、打印出reshard計(jì)劃,如果用戶(hù)沒(méi)傳--yes,就提示用戶(hù)確認(rèn)計(jì)劃。
8、根據(jù)reshard計(jì)劃,一個(gè)個(gè)slot的遷移到新節(jié)點(diǎn)上,遷移使用move_slot方法,該方法被很多命令使用,具體可以參見(jiàn)下面的遷移流程。move_slot方法傳遞dots為true和pipeline數(shù)量。
9、至此,就完成了全部的遷移任務(wù)。
redis-trib.rb reshard --from all --to 80b661ecca260c89e3d8ea9b98f77edaeef43dcd --slots 11 10.180.157.199:6379

3.6、rebalance平衡集群節(jié)點(diǎn)slot數(shù)量

ruby redis-trib.rb rebalance --threshold 1 --weight b31e3a2e=5 --weight 60b8e3a1=5 --use-empty-masters --simulate 10.180.157.199:6379

host:port:這個(gè)是必傳參數(shù),用來(lái)從一個(gè)節(jié)點(diǎn)獲取整個(gè)集群信息,相當(dāng)于獲取集群信息的入口。 --weight <arg>:節(jié)點(diǎn)的權(quán)重,格式為node_id=weight,如果需要為多個(gè)節(jié)點(diǎn)分配權(quán)重的話(huà),需要添加多個(gè)--weight <arg>參數(shù),即--weight b31e3a2e=5 --weight 60b8e3a1=5,node_id可為節(jié)點(diǎn)名稱(chēng)的前綴,只要保證前綴位數(shù)能唯一區(qū)分該節(jié)點(diǎn)即可。沒(méi)有傳遞–weight的節(jié)點(diǎn)的權(quán)重默認(rèn)為1。 --auto-weights:這個(gè)參數(shù)在rebalance流程中并未用到。 --threshold <arg>:只有節(jié)點(diǎn)需要遷移的slot閾值超過(guò)threshold,才會(huì)執(zhí)行rebalance操作。具體計(jì)算方法可以參考下面的rebalance命令流程的第四步。 --use-empty-masters:rebalance是否考慮沒(méi)有節(jié)點(diǎn)的master,默認(rèn)沒(méi)有分配slot節(jié)點(diǎn)的master是不參與rebalance的,設(shè)置--use-empty-masters可以讓沒(méi)有分配slot的節(jié)點(diǎn)參與rebalance。 --timeout <arg>:設(shè)置migrate命令的超時(shí)時(shí)間。 --simulate:設(shè)置該參數(shù),可以模擬rebalance操作,提示用戶(hù)會(huì)遷移哪些slots,而不會(huì)真正執(zhí)行遷移操作。 --pipeline <arg>:與reshar的pipeline參數(shù)一樣,定義cluster getkeysinslot命令一次取出的key數(shù)量,不傳的話(huà)使用默認(rèn)值為10。 rebalance命令流程如下:1、load_cluster_info_from_node方法先加載集群信息。 2、計(jì)算每個(gè)master的權(quán)重,根據(jù)參數(shù)--weight <arg>,為每個(gè)設(shè)置的節(jié)點(diǎn)分配權(quán)重,沒(méi)有設(shè)置的節(jié)點(diǎn),則權(quán)重默認(rèn)為1。 3、根據(jù)每個(gè)master的權(quán)重,以及總的權(quán)重,計(jì)算自己期望被分配多少個(gè)slot。計(jì)算的方式為:總slot數(shù)量 * (自己的權(quán)重 / 總權(quán)重)。 4、計(jì)算每個(gè)master期望分配的slot是否超過(guò)設(shè)置的閾值,即--threshold <arg>設(shè)置的閾值或者默認(rèn)的閾值。計(jì)算的方式為:先計(jì)算期望移動(dòng)節(jié)點(diǎn)的閾值,算法為:(100-(100.0*expected/n.slots.length)).abs,如果計(jì)算出的閾值沒(méi)有超出設(shè)置閾值,則不需要為該節(jié)點(diǎn)移動(dòng)slot。只要有一個(gè)master的移動(dòng)節(jié)點(diǎn)超過(guò)閾值,就會(huì)觸發(fā)rebalance操作。 5、如果觸發(fā)了rebalance操作。那么就開(kāi)始執(zhí)行rebalance操作,先將每個(gè)節(jié)點(diǎn)當(dāng)前分配的slots數(shù)量減去期望分配的slot數(shù)量獲得balance值。將每個(gè)節(jié)點(diǎn)的balance從小到大進(jìn)行排序獲得sn數(shù)組。 6、用dst_idx和src_idx游標(biāo)分別從sn數(shù)組的頭部和尾部開(kāi)始遍歷。目的是為了把尾部節(jié)點(diǎn)的slot分配給頭部節(jié)點(diǎn)。sn數(shù)組保存的balance列表排序后,負(fù)數(shù)在前面,正數(shù)在后面。負(fù)數(shù)表示需要有slot遷入,所以使用dst_idx游標(biāo),正數(shù)表示需要有slot遷出,所以使用src_idx游標(biāo)。理論上sn數(shù)組各節(jié)點(diǎn)的balance值加起來(lái)應(yīng)該為0,不過(guò)由于在計(jì)算期望分配的slot的時(shí)候只是使用直接取整的方式,所以可能出現(xiàn)balance值之和不為0的情況,balance值之和不為0即為節(jié)點(diǎn)不平衡的slot數(shù)量,由于slot總數(shù)有16384個(gè),不平衡數(shù)量相對(duì)于總數(shù),基數(shù)很小,所以對(duì)rebalance流程影響不大。7、獲取sn[dst_idx]和sn[src_idx]的balance值較小的那個(gè)值,該值即為需要從sn[src_idx]節(jié)點(diǎn)遷移到sn[dst_idx]節(jié)點(diǎn)的slot數(shù)量。 8、接著通過(guò)compute_reshard_table方法計(jì)算源節(jié)點(diǎn)的slot如何分配到源節(jié)點(diǎn)列表。這個(gè)方法在reshard流程中也有調(diào)用,具體步驟可以參考reshard流程的第六步。 9、如果是simulate模式,則只是打印出遷移列表。 10、如果沒(méi)有設(shè)置simulate,則執(zhí)行move_slot操作,遷移slot,傳入的參數(shù)為:quiet=>true,:dots=>false,:update=>true。 11、遷移完成后更新sn[dst_idx]和sn[src_idx]的balance值。如果balance值為0后,游標(biāo)向前進(jìn)1。 12、直到dst_idx到達(dá)src_idx游標(biāo),完成整個(gè)rebalance操作。

3.7、add-node將新節(jié)點(diǎn)加入集群

--slave:設(shè)置該參數(shù),則新節(jié)點(diǎn)以slave的角色加入集群 --master-id:這個(gè)參數(shù)需要設(shè)置了--slave才能生效,--master-id用來(lái)指定新節(jié)點(diǎn)的master節(jié)點(diǎn)。如果不設(shè)置該參數(shù),則會(huì)隨機(jī)為節(jié)點(diǎn)選擇master節(jié)點(diǎn)。 ruby redis-trib.rb add-node --slave --master-id dcb792b3e85726f012e83061bf237072dfc45f99 10.180.157.202:6379 10.180.157.199:6379

add-node流程如下:
1、通過(guò)load_cluster_info_from_node方法轉(zhuǎn)載集群信息,check_cluster方法檢查集群是否健康。
2、如果設(shè)置了--slave,則需要為該節(jié)點(diǎn)尋找master節(jié)點(diǎn)。設(shè)置了--master-id,則以該節(jié)點(diǎn)作為新節(jié)點(diǎn)的master,如果沒(méi)有設(shè)置--master-id,則調(diào)用get_master_with_least_replicas方法,尋找slave數(shù)量最少的master節(jié)點(diǎn)。如果slave數(shù)量一致,則選取load_cluster_info_from_node順序發(fā)現(xiàn)的第一個(gè)節(jié)點(diǎn)。load_cluster_info_from_node順序的第一個(gè)節(jié)點(diǎn)是add-node設(shè)置的existing_host:existing_port節(jié)點(diǎn),后面的順序根據(jù)在該節(jié)點(diǎn)執(zhí)行cluster nodes返回的結(jié)果返回的節(jié)點(diǎn)順序。
3、連接新的節(jié)點(diǎn)并與集群第一個(gè)節(jié)點(diǎn)握手。
4、如果沒(méi)設(shè)置–slave就直接返回ok,設(shè)置了–slave,則需要等待確認(rèn)新節(jié)點(diǎn)加入集群,然后執(zhí)行cluster replicate命令復(fù)制master節(jié)點(diǎn)。
5、至此,完成了全部的增加節(jié)點(diǎn)的流程。

3.8、del-node從集群中刪除節(jié)點(diǎn)

del-node可以把某個(gè)節(jié)點(diǎn)從集群中刪除。del-node只能刪除沒(méi)有分配slot的節(jié)點(diǎn)。刪除命令傳遞兩個(gè)參數(shù):
host:port:從該節(jié)點(diǎn)獲取集群信息。
node_id:需要?jiǎng)h除的節(jié)點(diǎn)id。
del-node執(zhí)行結(jié)果示例如下:

redis-trib.rb del-node 10.180.157.199:6379 d5f6d1d17426bd564a6e309f32d0f5b96962fe53

3.9、set-timeout設(shè)置集群節(jié)點(diǎn)間心跳連接的超時(shí)時(shí)間

set-timeout用來(lái)設(shè)置集群節(jié)點(diǎn)間心跳連接的超時(shí)時(shí)間,單位是毫秒,不得小于100毫秒,因?yàn)?00毫秒對(duì)于心跳時(shí)間來(lái)說(shuō)太短了。該命令修改是節(jié)點(diǎn)配置參數(shù)cluster-node-timeout,默認(rèn)是15000毫秒。通過(guò)該命令,可以給每個(gè)節(jié)點(diǎn)設(shè)置超時(shí)時(shí)間,設(shè)置的方式使用config set命令動(dòng)態(tài)設(shè)置,然后執(zhí)行config rewrite命令將配置持久化保存到硬盤(pán)。
ruby redis-trib.rb set-timeout 10.180.157.199:6379 30000

3.10、call在集群全部節(jié)點(diǎn)上執(zhí)行命令

call命令可以用來(lái)在集群的全部節(jié)點(diǎn)執(zhí)行相同的命令。call命令也是需要通過(guò)集群的一個(gè)節(jié)點(diǎn)地址,連上整個(gè)集群,然后在集群的每個(gè)節(jié)點(diǎn)執(zhí)行該命令。
redis-trib.rb call 10.180.157.199:6379 get key

3.11、import將外部redis數(shù)據(jù)導(dǎo)入集群

import命令可以把外部的redis節(jié)點(diǎn)數(shù)據(jù)導(dǎo)入集群。導(dǎo)入的流程如下:
1、通過(guò)load_cluster_info_from_node方法轉(zhuǎn)載集群信息,check_cluster方法檢查集群是否健康。
2、連接外部redis節(jié)點(diǎn),如果外部節(jié)點(diǎn)開(kāi)啟了cluster_enabled,則提示錯(cuò)誤。
3、通過(guò)scan命令遍歷外部節(jié)點(diǎn),一次獲取1000條數(shù)據(jù)。
4、遍歷這些key,計(jì)算出key對(duì)應(yīng)的slot。
5、執(zhí)行migrate命令,源節(jié)點(diǎn)是外部節(jié)點(diǎn),目的節(jié)點(diǎn)是集群slot對(duì)應(yīng)的節(jié)點(diǎn),如果設(shè)置了--copy參數(shù),則傳遞copy參數(shù),如果設(shè)置了--replace,則傳遞replace參數(shù)。
6、不停執(zhí)行scan命令,直到遍歷完全部的key。
7、至此完成整個(gè)遷移流程
這中間如果出現(xiàn)異常,程序就會(huì)停止。沒(méi)使用--copy模式,則可以重新執(zhí)行import命令,使用--copy的話(huà),最好清空新的集群再導(dǎo)入一次。

import命令更適合離線的把外部redis數(shù)據(jù)導(dǎo)入,在線導(dǎo)入的話(huà)最好使用更專(zhuān)業(yè)的導(dǎo)入工具,以slave的方式連接redis節(jié)點(diǎn)去同步節(jié)點(diǎn)數(shù)據(jù)應(yīng)該是更好的方式。

./redis-trib.rb import --from 10.0.10.1:6379 10.10.10.1:7000 //把 10.0.10.1:6379(redis 2.8)上的數(shù)據(jù)導(dǎo)入到 10.10.10.1:7000這個(gè)節(jié)點(diǎn)所在的集群

四、redis分布式鎖

Redis為單進(jìn)程單線程模式、采用隊(duì)列模式將并發(fā)訪問(wèn)變成串行訪問(wèn)。且多client對(duì)redis的鏈接并不存在競(jìng)爭(zhēng)關(guān)系。其次Redis提供SETNX,GETSET方便實(shí)現(xiàn)分布式鎖
條件:
系統(tǒng)是一個(gè)分布式系統(tǒng)(關(guān)鍵是分布式,單機(jī)的可以使用ReentrantLock或者synchronized代碼塊來(lái)實(shí)現(xiàn))
共享資源(各個(gè)系統(tǒng)訪問(wèn)同一個(gè)資源,資源的載體可能是傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)或者NoSQL)
同步訪問(wèn)(即有很多個(gè)進(jìn)程同事訪問(wèn)同一個(gè)共享資源。沒(méi)有同步訪問(wèn),誰(shuí)管你資源競(jìng)爭(zhēng)不競(jìng)爭(zhēng))
分布式鎖多種方式實(shí)現(xiàn),比如zookeeper、redis...。不管哪種方式,基本原理是不變的:用一個(gè)狀態(tài)值表示鎖,對(duì)鎖的占用和釋放通過(guò)狀態(tài)值來(lái)標(biāo)識(shí)。

1、setNX實(shí)現(xiàn)分布式鎖

Redis為單進(jìn)程單線程模式,采用隊(duì)列模式將并發(fā)訪問(wèn)變成串行訪問(wèn),且多客戶(hù)端對(duì)Redis的連接并不存在競(jìng)爭(zhēng)關(guān)系。redis的SETNX命令可以方便的實(shí)現(xiàn)分布式鎖。
SETNX key value //若給定的 key 已經(jīng)存在,則 SETNX 不做任何動(dòng)作。
設(shè)置成功,返回 1 。 //exists key1 測(cè)試key1是否存在,為0表示不存在,1表示存在
設(shè)置失敗,返回 0 。

127.0.0.1:1209> SETNX job "yunweigongchengshi" (integer) 1 127.0.0.1:1209> SETNX job "jiaofugongchengshi" //覆蓋設(shè)置失敗 (integer) 0 127.0.0.1:1209> get job "yunweigongchengshi"

SETNX lock.foo <current Unix time + lock timeout + 1>
返回1:則該客戶(hù)端獲得鎖,把lock.foo的鍵值設(shè)置為時(shí)間值表示該鍵已被鎖定,該客戶(hù)端最后可以通過(guò)DEL lock.foo來(lái)釋放該鎖。
返回0:表明該鎖已被其他客戶(hù)端取得,這時(shí)我們可以先返回或進(jìn)行重試等對(duì)方完成或等待鎖超時(shí)。

GETSET key value
將給定 key 的值設(shè)為 value,并返回 key 的舊值(old value)。
當(dāng) key 存在但不是字符串類(lèi)型時(shí),返回一個(gè)錯(cuò)誤 //當(dāng) key 沒(méi)有舊值時(shí),也即是,key 不存在時(shí),返回 nil 。
127.0.0.1:1209> GETSET job "chanpinjingli" //返回舊指
"yunweigongchengshi"
127.0.0.1:1209> get job //已經(jīng)修改
"chanpinjingli"

2、解決死鎖

刪除鎖的操作應(yīng)該是鎖擁有這執(zhí)行的,只需要等它超時(shí)即可
當(dāng)多個(gè)客戶(hù)端檢測(cè)到鎖超時(shí)后都會(huì)嘗試去釋放它,這里就可能出現(xiàn)一個(gè)競(jìng)態(tài)條件,讓我們模擬一下這個(gè)場(chǎng)景:
C0操作超時(shí)了,但它還持有著鎖,C1和C2讀取lock.foo檢查時(shí)間戳,先后發(fā)現(xiàn)超時(shí)了。
C1 發(fā)送DEL lock.foo
C1 發(fā)送SETNX lock.foo 并且成功了。
C2 發(fā)送DEL lock.foo
C2 發(fā)送SETNX lock.foo 并且成功了。
這樣一來(lái),C1,C2都拿到了鎖!問(wèn)題大了!

解決方法:
C3發(fā)送SETNX lock.foo 想要獲得鎖,由于C0還持有鎖,所以Redis返回給C3一個(gè)0
C3發(fā)送GET lock.foo 以檢查鎖是否超時(shí)了,如果沒(méi)超時(shí),則等待或重試。反之,如果已超時(shí),C3通過(guò)下面的操作來(lái)嘗試獲得鎖:
GETSET lock.foo <current Unix time + lock timeout + 1>
通過(guò)GETSET,C3拿到的時(shí)間戳如果仍然是超時(shí)的,那就說(shuō)明,C3如愿以?xún)斈玫芥i了。

如果在C3之前,有個(gè)叫C4的客戶(hù)端比C3快一步執(zhí)行了上面的操作,那么C3拿到的時(shí)間戳是個(gè)未超時(shí)的值,這時(shí),C3沒(méi)有如期獲得鎖,需要再次等待或重試。留意一下,盡管C3沒(méi)拿到鎖,但它改寫(xiě)了C4設(shè)置的鎖的超時(shí)值,不過(guò)這一點(diǎn)非常微小的誤差帶來(lái)的影響可以忽略不計(jì)。
為了讓分布式鎖的算法更穩(wěn)鍵些,持有鎖的客戶(hù)端在解鎖之前應(yīng)該再檢查一次自己的鎖是否已經(jīng)超時(shí),再去做DEL操作,因?yàn)榭赡芸蛻?hù)端因?yàn)槟硞€(gè)耗時(shí)的操作而掛起,操作完的時(shí)候鎖因?yàn)槌瑫r(shí)已經(jīng)被別人獲得,這時(shí)就不必解鎖了

五、其他

1、Redis漏洞問(wèn)題,參考

最近針對(duì)Redis的弱口令進(jìn)行***的案例較多。處理方法大同小異,對(duì)比參考:

http://blog.jobbole.com/94518/ https://blog.csdn.net/kevin_pso/article/details/54844980 https://blog.51cto.com/simeon/2115184

2、redis集群相關(guān)配置指令

#cat conf/sentinel.conf sentinel monitor redis_cluster 127.0.0.1 16000 1 sentinel failover-timeout redis_cluster 15000 sentinel config-epoch redis_cluster 0 daemonize yes dir "/tmp/mongo/redis" logfile "/tmp/redis/redis-sentinel.log" port 16006

解釋:

sentinel monitor mymaster 127.0.0.1 6379 2 //監(jiān)控的master的名字為mymaster。當(dāng)集群中有2個(gè)sentinel認(rèn)為master死了時(shí),才能真正認(rèn)為該master已經(jīng)不可用了 sentinel down-after-milliseconds mymaster 60000 //如果master在“一定時(shí)間范圍”內(nèi)不回應(yīng)PONG 或者是回復(fù)了一個(gè)錯(cuò)誤消息,那么這個(gè)sentinel會(huì)主觀地(單方面地)認(rèn)為這個(gè)master已經(jīng)不可用了(subjectively down, 也簡(jiǎn)稱(chēng)為SDOWN)。客觀down:ODOWN sentinel failover-timeout mymaster 180000 // sentinel parallel-syncs mymaster 1 //在發(fā)生failover主備切換時(shí),這個(gè)選項(xiàng)指定了最多可以有多少個(gè)slave同時(shí)對(duì)新的master進(jìn)行同步,這個(gè)數(shù)字越小,完成failover所需的時(shí)間就越長(zhǎng),但是如果這個(gè)數(shù)字越大,就意味著越多的slave因?yàn)閞eplication而不可用。可以通過(guò)將這個(gè)值設(shè)為 1 來(lái)保證每次只有一個(gè)slave處于不能處理命令請(qǐng)求的狀態(tài)。

//這些指令都可以通過(guò)SENTINEL SET command動(dòng)態(tài)修改。

參考博客:

https://www.oschina.net/question/tag/twemproxy //twemproxy開(kāi)源中國(guó)社區(qū)
https://www.cnblogs.com/lihaoyang/p/6906444.html //gem安裝redis官方集群版
https://redis.io/commands/cluster-nodes //官方redis集群相關(guān)命令
https://blog.csdn.net/huwei2003/article/details/50973967 //redis-trib.rb詳解
https://piaosanlang.gitbooks.io/redis/content/redisfen-bu-shi-suo-shi-xian.html
https://www.cnblogs.com/haoxinyue/p/redis.html //twitter版redis集群
https://blog.csdn.net/shmiluwei/article/details/51958359 //Codis安裝和配置

轉(zhuǎn)載于:https://blog.51cto.com/hmtk520/2115789

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Redis详解(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

久久久久二区 | 精品国产一区二区三区男人吃奶 | 国产不卡在线观看 | 国产特级毛片aaaaaa | 欧美午夜激情网 | 国产一区二区三区免费在线 | 天天干天天做天天操 | 婷婷六月天丁香 | 人人爽久久涩噜噜噜网站 | 久久激情视频 久久 | 青青色影院 | 伊人色综合久久天天 | 在线观看亚洲电影 | 丁香视频五月 | 一区在线电影 | 在线观看色视频 | 日韩在线视频在线观看 | 97韩国电影 | 国产精品精品视频 | 免费av电影网站 | 在线观看av片 | www.狠狠色.com | 超碰97人人爱 | 制服丝袜在线91 | 美女天天操 | 成人黄色视| 91最新地址永久入口 | 中文字幕一区二区三区四区久久 | 亚洲免费成人 | 美女精品久久久 | 日韩av免费一区二区 | 96精品视频 | 九九日韩 | 视频在线国产 | 婷婷丁香狠狠爱 | 人人爽人人澡人人添人人人人 | 波多野结衣在线播放视频 | 国产又粗又猛又色又黄视频 | 亚洲成人av在线电影 | 在线成人免费电影 | 91av在线免费视频 | 91桃色免费观看 | 99久久精品无码一区二区毛片 | 又粗又长又大又爽又黄少妇毛片 | 精品久久综合 | 麻豆影视在线播放 | 亚洲婷婷伊人 | 国产又黄又爽又猛视频日本 | 免费在线观看中文字幕 | 国产丝袜美腿在线 | av片中文| 国产精品理论在线观看 | 500部大龄熟乱视频 欧美日本三级 | 2021久久 | 丝袜足交在线 | 国产精品美女免费 | 国产视频在线一区二区 | 91久久久久久国产精品 | 在线免费观看亚洲视频 | 手机看国产毛片 | 亚洲午夜激情网 | 国产精品欧美一区二区 | 视频二区| 亚洲精品乱码久久久久久高潮 | 亚洲国产97在线精品一区 | 91av视频在线免费观看 | 国产一区免费在线 | 久久伦理电影网 | 一区二区三区免费在线观看视频 | 福利网在线 | 中文字幕资源网在线观看 | 中文字幕日韩国产 | 在线亚洲成人 | 一区二区中文字幕在线 | 免费的黄色的网站 | 国产九九九视频 | 免费日韩电影 | 在线精品视频免费观看 | 在线观看黄色小视频 | 国产精品日韩欧美一区二区 | 免费一级日韩欧美性大片 | 日韩极品在线 | 日韩综合精品 | 国产成人久久久77777 | 综合色站导航 | 中文字幕乱码电影 | 国产成人精品久久久 | 色婷婷狠狠操 | h动漫中文字幕 | 亚洲成年片 | av日韩中文 | 久久综合加勒比 | 久艹视频免费观看 | 91在线porny国产在线看 | 天天爽天天爽夜夜爽 | 中文字幕在 | 国产精品嫩草影院123 | 亚洲免费公开视频 | 国产精品久久久久久久久软件 | 国产高清一区二区 | 免费一级特黄毛大片 | 日韩在线大片 | 中文字幕国产一区二区 | 久草在线视频在线观看 | 欧美色888| 久精品在线观看 | 超碰资源在线 | 91精品国产成人www | 国产裸体永久免费视频网站 | 丁香激情视频 | 久草视频在线免费 | 中文网丁香综合网 | 99在线免费视频观看 | 久草在线综合 | 久草视频免费看 | 一区中文字幕电影 | 久久免费视频4 | 日韩欧美在线免费观看 | 国产日韩精品一区二区 | 狠狠色噜噜狠狠狠狠2022 | 日韩av片免费在线观看 | 伊人永久 | 欧美日韩在线观看一区二区三区 | 中文字幕高清有码 | 欧美夫妻生活视频 | 国内精品久久久久久久影视简单 | 99色人| 99久久精品久久久久久动态片 | 丰满少妇久久久 | 国产一级免费电影 | 五月天天色 | 在线之家免费在线观看电影 | 婷婷六月色 | 精品视频一区在线 | 一区二区三区三区在线 | 国产免费观看久久黄 | 高清精品视频 | 欧美一进一出抽搐大尺度视频 | 亚洲色图27p | 午夜国产影院 | 久久成人国产精品免费软件 | 中文字幕在线观看视频网站 | 午夜精品一区二区三区四区 | 天天色综合三 | 麻豆91精品 | 国内久久精品 | 久久精品91视频 | 超碰国产在线播放 | 91亚洲精品久久久中文字幕 | 97av在线视频免费播放 | 久久精品这里精品 | 国产精品99久久久久久人免费 | 久久爱www. | 国产一区二区视频在线 | 色网影音先锋 | 国产一区成人 | 欧美日韩久久久 | 中午字幕在线 | 国产性xxxx | 国产精品久久久久久久免费大片 | 亚洲精品tv久久久久久久久久 | 在线观看日本韩国电影 | 亚洲女人天堂成人av在线 | 51精品国自产在线 | 欧美日韩国产页 | 天天爱天天操天天干 | 久久久精品高清 | 免费在线观看午夜视频 | 久久综合网色—综合色88 | 免费看片成人 | 女人18精品一区二区三区 | 午夜精品久久久久 | 日韩有码在线观看视频 | 在线观看视频在线 | 99热国产在线中文 | 欧美日韩视频在线 | 456成人精品影院 | 又黄又爽又色无遮挡免费 | 国产一区精品在线 | 欧美一级小视频 | 日本性久久 | 欧美伦理电影一区二区 | 国产老妇av | 亚洲欧美日韩国产一区二区 | 国产福利a| 91精品久久久久久久久久久久久 | 亚洲精品www久久久 www国产精品com | 伊人中文字幕在线 | 久久国产欧美日韩精品 | 天天操天天射天天插 | 天天操天天爱天天干 | 日韩免费在线观看 | 国产视频2区 | 99在线观看免费视频精品观看 | 亚洲欧美日韩精品久久奇米一区 | 一区二区三区高清在线 | a久久免费视频 | 日日日操| 成年人三级网站 | 国产一区二区影院 | 国产精品国内免费一区二区三区 | 91最新国产 | 另类老妇性bbwbbw高清 | 日韩欧美在线综合网 | 日韩特级黄色片 | 免费在线国产 | 亚洲一区免费在线 | www.天天色| 久久影院午夜论 | 日韩中文字幕视频在线 | 最近日本中文字幕a | 探花视频在线观看免费版 | 中文字幕在线观看1 | 国产午夜小视频 | 国内精品久久久精品电影院 | 成人cosplay福利网站 | 精品一区二区亚洲 | 在线观看国产www | 欧美亚洲国产日韩 | 天天干夜夜 | 少妇搡bbb| 亚洲va在线va天堂va偷拍 | 欧美在线日韩在线 | 国产视频久久久久 | 在线日韩中文 | 亚洲第五色综合网 | 日韩中文字幕亚洲一区二区va在线 | 91人人爽人人爽人人精88v | 久久久久久久福利 | 久草精品网 | 337p日本欧洲亚洲大胆裸体艺术 | 亚洲国产精品一区二区尤物区 | 成人免费观看完整版电影 | 亚洲日本欧美在线 | 九九视频免费观看视频精品 | 久久人人爽人人片av | 国产馆在线播放 | 天天av天天 | 国产激情免费 | www夜夜操 | 日韩成年视频 | 国产精品区在线观看 | 日韩有码第一页 | 香蕉视频日本 | 天天干.com | 婷婷色影院 | 激情五月开心 | 精品日韩视频 | 久久久亚洲影院 | 久久久久观看 | 国产精品久久一区二区三区, | 在线观看视频一区二区三区 | 成人免费观看完整版电影 | 免费观看视频的网站 | 欧美a在线免费观看 | 免费大片黄在线 | 欧美一级爽 | 国内精品久久久久久久久久久久 | 色香天天 | 国产精品热视频 | free,性欧美 九九交易行官网 | 91九色在线观看视频 | 2019天天干天天色 | 成人97人人超碰人人99 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 丁香六月伊人 | av在线播放不卡 | 日本久久久久久久久 | 免费黄色a级毛片 | 97视频在线 | 久 久久影院 | 97精品国自产拍在线观看 | 国产精品一区二区果冻传媒 | 综合精品久久 | 亚洲精品免费看 | 91精品一区二区三区蜜桃 | 五月激情亚洲 | 久久久久日本精品一区二区三区 | 91麻豆精品 | www.狠狠色 | 精品资源在线 | 亚洲精品玖玖玖av在线看 | 免费合欢视频成人app | 国产美女视频一区 | 久久久久99精品成人片三人毛片 | 亚洲天天干 | 中文字幕电影一区 | 亚洲欧美一区二区三区孕妇写真 | 成人黄色片在线播放 | 日日添夜夜添 | 伊人手机在线 | 国产精品美女在线 | 国产精品久久亚洲 | 天天鲁天天干天天射 | 91精品国产一区二区三区 | 日本中文字幕在线电影 | 欧美性生活大片 | 精品黄色在线观看 | 亚洲欧美日韩一二三区 | 精品一区二区免费在线观看 | 国产片免费在线观看视频 | 27xxoo无遮挡动态视频 | 五月天视频网 | 亚洲国产精品成人综合 | 99免费| 最新99热| 少妇bbb搡bbbb搡bbbb | 久久无码精品一区二区三区 | 日日综合网 | 日韩 精品 一区 国产 麻豆 | 97国产在线视频 | 六月天综合网 | 亚洲精品视频免费看 | 99精品国产在热久久 | 97在线看 | 亚州欧美视频 | 蜜臀av网址| 免费看成年人 | 天天躁天天躁天天躁婷 | 亚洲影院天堂 | 在线观看一区二区精品 | 国产亚洲欧美日韩高清 | 天天干天天草 | 久久五月精品 | 午夜精品电影 | 欧美在线18 | 久久精品在线视频 | 免费黄色在线网址 | 国内久久久久 | 欧美欧美 | 波多野结衣久久精品 | 国产精品h在线观看 | 国产 一区二区三区 在线 | 免费看一级 | 在线观看黄色av | 96视频免费在线观看 | 欧美一区二区三区在线看 | 欧洲亚洲国产视频 | 91av视频播放 | 808电影| 免费视频黄 | 99久久精品午夜一区二区小说 | 精品色综合 | 在线综合 亚洲 欧美在线视频 | 日日爱999 | 久久久精品国产一区二区三区 | 久久精品伊人 | 性色av免费观看 | 久久精品一区二区三 | 国产精品国产亚洲精品看不卡15 | av片中文 | 天天草天天干天天射 | 另类五月激情 | 色综合久久久久久久久五月 | 中文字幕 国产 一区 | 国产成人在线免费观看 | 亚洲乱码在线 | 久久久久免费网站 | 808电影| 五月天开心 | 黄色成人影院 | 96av在线视频 | 四虎影视成人精品 | 欧美一级裸体视频 | a黄色大片 | 亚洲精品视频免费观看 | 欧美福利久久 | 亚洲国产字幕 | 天天干天天操天天爱 | 免费网站在线观看人 | 国产又粗又猛又黄 | 欧美日韩国产在线 | 96久久久 | av亚洲产国偷v产偷v自拍小说 | 日韩欧美网站 | 亚洲日本欧美在线 | 久久99精品国产一区二区三区 | 亚洲精品一区二区在线观看 | 五月婷婷一区二区三区 | 美女精品久久久 | 中文字幕免费中文 | av中文天堂| 国产精品久久久网站 | 一区二区三区免费播放 | 国产免费资源 | 国产一区二区在线观看免费 | 日本黄色免费看 | 99在线观看精品 | 国产日韩欧美综合在线 | 国产精品久久久久影院日本 | 最新精品视频在线 | 在线观看中文字幕 | 免费av影视 | 黄色片免费电影 | 又爽又黄又刺激的视频 | 波多野结衣理论片 | 亚洲黄色app | 国产亚洲在线视频 | 国产精品高清一区二区三区 | 在线一二三四区 | 亚洲综合五月 | 久久 地址| 日韩一区二区三区高清在线观看 | av观看网站| 色婷婷www| 九九热精品国产 | 国产在线观看免 | 久久精品www人人爽人人 | 亚洲国产福利视频 | 国产99久久精品 | 九色精品免费永久在线 | 国产第页 | 久久综合久久88 | 99re8这里有精品热视频免费 | 亚洲国产精品久久久久久 | 久久久精品国产一区二区电影四季 | 国产亚洲成av片在线观看 | 国产精品18久久久久久vr | 久久91久久久久麻豆精品 | 国产一区二区在线观看免费 | 国产精品久久久久久久久久久久午夜 | 国产精品久久久久久久久久久免费 | 九色在线视频 | 五月亚洲综合 | 久久精品一区二区三区国产主播 | 日韩丝袜 | 精品v亚洲v欧美v高清v | 99人久久精品视频最新地址 | 欧美日韩亚洲在线观看 | 日韩高清在线一区二区三区 | 丁香婷婷在线观看 | 国产精品欧美久久久久天天影视 | 亚洲成年片 | 97人人爽人人| 免费观看黄 | 日韩久久精品一区二区三区下载 | 天天操伊人 | 香蕉精品在线观看 | 欧美大片在线看免费观看 | a极黄色片 | 最新91在线视频 | 在线中文字幕一区二区 | 日韩精品中文字幕在线不卡尤物 | 国产一区影院 | 激情网站网址 | 99在线热播精品免费99热 | 日韩r级在线 | 日韩免费在线视频观看 | 日本中文字幕在线一区 | 中文字幕专区高清在线观看 | 国产一级久久 | 中文字幕 91 | 在线免费观看国产视频 | 91精品一区二区三区久久久久久 | 97人人澡人人添人人爽超碰 | 久草在线在线精品观看 | 国产精品国产三级国产不产一地 | 亚洲男人天堂2018 | 欧美精品一区二区免费 | 高清av中文字幕 | 99在线视频精品 | 亚洲视频网站在线观看 | 婷婷久久五月 | 日韩资源在线观看 | 亚洲天堂网站视频 | 有没有在线观看av | 久草男人天堂 | 丁香六月在线 | 欧美日韩在线视频一区二区 | 亚洲国产午夜视频 | 一本一本久久a久久精品牛牛影视 | 麻豆91小视频 | 日韩动漫免费观看高清完整版在线观看 | 欧美一区视频 | 日本精品视频一区 | 久草视频首页 | 精品嫩模福利一区二区蜜臀 | 欧美日韩中字 | 九九精品久久久 | 国产中文字幕一区二区三区 | 最新av网站在线观看 | 天天av资源 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 国语精品视频 | 在线观看免费版高清版 | 日韩一区正在播放 | 亚洲精品午夜久久久 | 国产视频精品免费播放 | 毛片网站在线看 | 日韩精品在线视频免费观看 | 日本黄色免费在线观看 | 特级毛片在线观看 | 久久国内免费视频 | 美女福利视频在线 | 日本精a在线观看 | 国产香蕉视频在线观看 | 成人一区二区在线 | 中中文字幕av在线 | 五月婷婷综合激情网 | 免费看黄色毛片 | 免费日韩 精品中文字幕视频在线 | 中文字幕一区二区三区四区久久 | 国产一区二区不卡视频 | 人人躁 | 久久国内精品 | 国产精品久久久久久久久婷婷 | 好看的国产精品视频 | 欧美乱淫视频 | 日韩免费观看一区二区三区 | 伊人激情网 | 国产精品一区二区美女视频免费看 | 欧美午夜寂寞影院 | 日韩中文字幕第一页 | 国产高清视频在线播放 | 综合色站导航 | 久色婷婷| 青青河边草免费 | 国产一区二区视频在线播放 | 欧美污在线观看 | 国产99一区| 国产免费又爽又刺激在线观看 | 永久免费视频国产 | 久久一二三四 | 久久在线电影 | 黄污网站在线 | 国产成人精品综合久久久久99 | 成人午夜电影网 | 天天摸天天操天天舔 | 91精品欧美| 久热免费| 青青河边草观看完整版高清 | 欧美日韩免费视频 | 中文在线免费观看 | 最新影院 | 日韩在线不卡视频 | 久艹视频免费观看 | 国产无套精品久久久久久 | 婷婷色综合 | 久久天天躁夜夜躁狠狠躁2022 | 日韩成人高清在线 | 亚洲精选99 | 日韩精品中文字幕在线观看 | 99精品欧美一区二区三区黑人哦 | 日韩高清在线看 | 波多野结衣视频一区二区三区 | 在线视频 成人 | 精品久久久久久久久久久院品网 | 97精品久久人人爽人人爽 | 毛片网站观看 | av观看久久久| 91网免费看 | 日韩精选在线 | av资源免费观看 | 六月丁香综合 | 日韩com | 久久免费视频在线观看 | 深爱婷婷网 | 视频一区在线免费观看 | 免费看国产精品 | 亚洲精品国产电影 | 成人av片免费观看app下载 | 成人av午夜| 丁香婷婷激情国产高清秒播 | 成人在线播放av | 九九热免费精品视频 | 97av免费视频 | 337p日本欧洲亚洲大胆裸体艺术 | 国产精品一区二区免费 | 免费看一级 | 日韩欧美国产精品 | 2023亚洲精品国偷拍自产在线 | 中文字幕高清在线 | 51久久夜色精品国产麻豆 | 成人av高清在线 | 久章操| 欧美一进一出抽搐大尺度视频 | 精品一区二区三区电影 | 成人av教育 | 韩国av不卡| 久日视频| 久久艹在线观看 | 在线观看国产 | 伊人成人久久 | 欧美贵妇性狂欢 | 天天操伊人 | 亚洲综合激情网 | 欧美淫aaa免费观看 日韩激情免费视频 | 久久久久久免费视频 | 免费看成年人 | 麻豆传媒视频在线播放 | 91精品在线播放 | 久久9精品 | 亚洲人av免费网站 | 看全黄大色黄大片 | 亚洲精品在线国产 | 91av电影在线 | 国产在线国偷精品产拍免费yy | 日韩精品免费一线在线观看 | 成人国产精品久久久久久亚洲 | 免费视频久久 | 中文字幕免费播放 | 亚洲专区在线 | 99热手机在线观看 | 欧美色一色 | 91精品第一页 | 免费观看9x视频网站在线观看 | 伊人婷婷在线 | 亚洲综合色激情五月 | 免费观看黄色12片一级视频 | 成+人+色综合 | 日韩婷婷 | 亚洲精品乱码久久久久 | 久草99 | 91视频在线自拍 | 欧美亚洲国产精品久久高清浪潮 | 日韩欧美精品一区 | 天天色宗合 | 免费看的国产视频网站 | 国产女人免费看a级丨片 | 天天综合五月天 | 亚洲激情在线视频 | 婷婷在线精品视频 | 色综合久久久久综合体桃花网 | 五月天狠狠操 | 伊人黄| 久久精品国产免费观看 | 国产一级在线视频 | www黄在线 | 91精品久久久久 | 久久躁日日躁aaaaxxxx | 亚洲免费精品一区二区 | 成人91视频 | 日韩三级在线观看 | 国产69精品久久app免费版 | 中文字幕电影高清在线观看 | 看av免费| 又爽又黄在线观看 | 国产一区二区三区免费观看视频 | 日日插日日干 | 国产爽妇网 | 91看片淫黄大片91 | 久久久精品国产一区二区电影四季 | 国产视频首页 | 亚洲精品午夜久久久久久久久久久 | 婷婷五情天综123 | 99久久婷婷国产一区二区三区 | 99久久精品无码一区二区毛片 | 国产精品午夜久久 | 日韩精品一区二区三区第95 | 中文字幕亚洲五码 | 日韩欧美一级二级 | 五月视频 | 日韩高清在线观看 | 国产视 | 国产精品不卡视频 | h视频在线看| 麻豆果冻剧传媒在线播放 | 美女网色 | 久久不见久久见免费影院 | 男女靠逼app | 亚洲男人天堂a | 国产精品一区二区在线观看 | 大胆欧美gogo免费视频一二区 | 欧美日韩精品在线观看视频 | 色香蕉视频 | 成人一区二区三区在线 | 国产亚洲午夜高清国产拍精品 | 久久96国产精品久久99软件 | 亚洲国产成人在线播放 | 五月天网站在线 | 免费午夜在线视频 | 久久只精品99品免费久23小说 | 久操中文字幕在线观看 | 国产成人综合图片 | 天天天天天天干 | www天天操 | 久操视频在线播放 | 日韩极品在线 | 日韩在线中文字幕视频 | 久久久官网 | 正在播放亚洲精品 | 97人人添人澡人人爽超碰动图 | 日韩av免费网站 | av丁香| 在线电影av | 精品你懂的| 国产美女久久 | 精品国产一区二区三区久久 | 中文在线中文资源 | 九九久久视频 | 中文字幕在线观看一区二区三区 | 欧美日韩国产高清视频 | 亚洲激情p | 国产日韩精品一区二区三区 | 香蕉久久久久久久 | 久久久久久久久久久久av | 日韩专区一区二区 | 亚洲天堂社区 | 日韩av中文 | 日韩乱色精品一区二区 | 亚洲japanese制服美女 | 日韩av视屏在线观看 | 一区二区三区在线观看免费视频 | 黄网站色视频免费观看 | 亚洲成人影音 | 国产永久免费高清在线观看视频 | www.com久久久| 黄色毛片一级片 | 亚洲最新av网址 | 8x成人在线 | 色香网| 中文字幕免费播放 | 精品麻豆入口免费 | 综合网久久 | 色视频成人在线观看免 | 超碰在线人人97 | 精品国产一区二区三区久久久蜜臀 | 久久久久久免费视频 | 欧美在线视频第一页 | 97免费在线观看视频 | 亚洲日日夜夜 | 久久免费精品国产 | 国产三级视频在线 | a黄色片 | 亚洲精品久久在线 | 中文一区在线观看 | 国产看片免费 | 国产精品k频道 | 丁香婷婷激情国产高清秒播 | 婷婷国产v亚洲v欧美久久 | 中文成人字幕 | 亚洲精品欧美成人 | 精品视频资源站 | 91精品国产91p65 | 国产亚洲成av片在线观看 | 国产精品a久久久久 | 成人在线观看日韩 | 日韩影视在线观看 | 色夜视频| 麻豆成人精品视频 | 91久久人澡人人添人人爽欧美 | www.91av在线| 亚州国产精品 | 欧美精品国产综合久久 | 婷婷精品在线 | 久久精品综合一区 | 一区二区久久久久 | 美女视频黄免费网站 | 久久久久在线视频 | 亚洲黄在线观看 | 黄色国产区 | 美女福利视频一区二区 | 欧美激情视频在线观看免费 | 四虎影视成人精品国库在线观看 | 亚洲在线不卡 | 国产日韩在线看 | 欧美大片mv免费 | 久久久国产一区二区三区四区小说 | 婷婷av在线 | 奇米影视在线99精品 | 亚洲成人av在线电影 | a黄色影院| 久久丝袜视频 | 国产美女在线免费观看 | 超碰公开在线 | 激情久久影院 | 欧美一区二区三区在线视频观看 | 手机在线黄色网址 | 精品亚洲午夜久久久久91 | 99久久久国产精品免费观看 | 特级毛片在线免费观看 | 亚洲一级黄色av | 国产综合小视频 | 亚洲精品综合在线 | 国产综合精品一区二区三区 | 色吊丝在线永久观看最新版本 | 丁香久久五月 | 久久私人影院 | 亚洲欧美日韩在线看 | 啪啪精品 | 天天综合色 | 中文字幕亚洲在线观看 | 日本公妇在线观看 | 蜜桃视频在线视频 | 成人av电影免费观看 | 国产在线观看免费 | 97精品免费视频 | 免费视频在线观看网站 | 最近中文字幕大全中文字幕免费 | 国产精在线 | 色综合激情久久 | 久久精品1区 | 国产69精品久久久久久 | 91精品国产福利 | 国产精品亚州 | 啪啪免费视频网站 | 色婷婷狠狠操 | 午夜精品久久久久久久久久久 | 97精品国自产拍在线观看 | 69国产盗摄一区二区三区五区 | 91男人影院 | 91看片一区二区三区 | 欧美在线观看视频免费 | 成 人 黄 色 视频播放1 | 蜜臀av性久久久久av蜜臀妖精 | 国产黄色a | 啪嗒啪嗒免费观看完整版 | 成人av在线直播 | 日韩电影精品 | 国产精品99久久久精品免费观看 | 婷婷射五月| 99精品在这里 | 国产精品久久久久一区 | 一区二区亚洲精品 | 天天天干天天射天天天操 | 六月丁香激情网 | 婷婷丁香社区 | 国产一级性生活 | 99视频在线观看免费 | 99精品一级欧美片免费播放 | 99精品一级欧美片免费播放 | 国产99一区视频免费 | www.色婷婷 | 开心激情久久 | 91香蕉嫩草 | 国产精品系列在线播放 | 成人黄色av网站 | 亚洲手机天堂 | 日韩av电影免费在线观看 | 在线看片日韩 | 欧美成年人在线视频 | 黄污网站在线 | 国产免费小视频 | 午夜精品久久 | 中文一区二区三区在线观看 | 干狠狠| 亚洲天堂网站视频 | 久久99国产精品免费网站 | 中文字幕精品www乱入免费视频 | 成人国产电影在线观看 | 欧美日韩性 | 不卡电影一区二区三区 | 成人免费av电影 | 亚洲人人网 | 日韩av一区二区三区在线观看 | 日本aa在线 | 国内外成人在线视频 | 四虎欧美 | 日本性动态图 | 精品99999| 久草免费在线观看视频 | 最近高清中文字幕 | 国产免费观看视频 | 免费网站v| 66av99精品福利视频在线 | 亚洲黄网址 | 少妇bbw搡bbbb搡bbbb | 成人久久影院 | 中文字幕在线观看网站 | 91精品毛片 | 91探花在线视频 | 久久精彩视频 | 国产麻豆精品免费视频 | 日韩中文字幕免费电影 | 在线天堂中文www视软件 | 九九在线视频 | 91黄视频在线观看 | 色婷婷福利 | 亚洲香蕉在线观看 | 日韩理论电影在线 | 懂色av一区二区在线播放 | 亚洲精品视频网 | 日韩在线视频免费观看 | 日韩视频在线观看视频 | 欧美不卡在线 | 国产中文字幕视频在线观看 | 成人av在线观| 日韩av男人的天堂 | 日日夜夜精品免费视频 | 国产高清久久 | 国产免码va在线观看免费 | 午夜性色 | 波多野结衣一区二区三区中文字幕 | 国产精品久久久久久久久久白浆 | 天堂网av在线 | 在线不卡中文字幕播放 | 成人亚洲欧美 | 99视频国产精品 | wwwwww黄| 成年人免费观看在线视频 | 国产精品福利一区 | 五月天色丁香 | 99中文字幕视频 | 国产精品国产亚洲精品看不卡 | 国产色视频一区二区三区qq号 | 精品久久精品久久 | avove黑丝 | 国产精品99久久久精品 | 国产精品一区二区久久 | 91爱爱电影| 久草在线在线精品观看 | 久操视频在线播放 | 中文网丁香综合网 | 狠狠色丁香婷婷综合基地 | 成 人 a v天堂 | 精品久久九九 | 成年人在线视频观看 | 国产二区av | 国产又粗又硬又长又爽的视频 | av观看在线观看 | 国产小视频在线免费观看视频 | 欧美伦理电影一区二区 | 久久久三级视频 | 日韩视频在线观看视频 | 天天草视频 | 91手机视频| 欧美日韩高清免费 | 最新国产精品亚洲 | 日韩网站在线观看 | 一本大道久久精品懂色aⅴ 五月婷社区 | 91在线视频网址 | 日本激情中文字幕 | 国产高清免费av | 91人人澡人人爽人人精品 | 99精品乱码国产在线观看 | 五月天天天操 | 精品国产a | 香蕉影视app | 日韩99热| 婷婷伊人综合亚洲综合网 | 国产精品亚洲片夜色在线 | 国产精品99久久久久久宅男 | 亚洲午夜精品久久久久久久久 | 日韩在线国产 | 精品久久1 | 国产精品1区| 国产成人av在线影院 | 中文字幕 婷婷 | 99国产情侣在线播放 | 日本精品久久久久久 | 日韩成人邪恶影片 | 国产日韩精品在线 | 在线观看国产麻豆 | 久久人人爽人人人人片 | 国内99视频 | 九九视频网 | 狠狠干在线播放 | 天天天综合 | 日韩啪视频 | 97在线影视| 久久精品日本啪啪涩涩 | 免费视频在线观看网站 | 丁香视频| 99精品国产视频 | 在线香蕉视频 | 国产成本人视频在线观看 | 瑞典xxxx性hd极品 | 日日爱夜夜爱 | 亚洲 精品在线视频 | 欧美日韩不卡在线视频 | 人人插人人艹 | 色婷婷国产精品一区在线观看 | av在观看| 亚洲日韩中文字幕在线播放 | 99国产成+人+综合+亚洲 欧美 | 91精品秘密在线观看 | 日韩精品亚洲专区在线观看 | 国产精品 国内视频 | 亚洲一区日韩 | 久二影院 | 日日操操 | 黄色小说在线观看视频 | 丁香婷婷综合色啪 | 色综合中文字幕 | 日日干天天插 | 丁香五月网久久综合 | 麻豆传媒一区二区 | 中文字幕资源站 | 国产精品18毛片一区二区 | 日韩欧美高清不卡 | 国产精品综合av一区二区国产馆 | 伊人中文字幕在线 | 91 在线视频播放 | 在线观看色网 | 毛片www| 永久免费视频国产 | 欧美人体xx | 国产精品毛片一区二区 | 麻豆 free xxxx movies hd | 国外成人在线视频网站 | 国产精品video爽爽爽爽 | a'aaa级片在线观看 | 久久亚洲综合色 | 午夜免费在线观看 | 欧美日韩国产精品爽爽 | 成人 亚洲 欧美 | 91日韩精品一区 | 天天插狠狠插 |