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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

redis终于有比较大的进展了,redis3.0.1 稳定版本发布,支持集群。

發(fā)布時(shí)間:2025/4/5 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis终于有比较大的进展了,redis3.0.1 稳定版本发布,支持集群。 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:https://raw.githubusercontent.com/antirez/redis/3.0/00-RELEASENOTES

Redis 3.0 release notes --[ Redis 3.0.1 ] Release date: 5 May 2015 --[ Redis 3.0.0 ] Release date: 1 Apr 2015 --[ Redis 3.0.0 RC6 (version 2.9.106) ] Release date: 24 mar 2015 --[ Redis 3.0.0 RC5 (version 2.9.105) ] Release date: 20 mar 2015 --[ Redis 3.0.0 RC4 (version 2.9.104) ] Release date: 13 feb 2015 --[ Redis 3.0.0 RC3 (version 2.9.103) ] Release date: 30 jan 2015 --[ Redis 3.0.0 RC2 (version 2.9.102) ] Release date: 13 jan 2015 --[ Redis 3.0.0 RC1 (version 2.9.101) ] Release date: 9 oct 2014

官方地址:http://redis.io/topics/cluster-tutorial

Redis cluster tutorial

This document is a gentle introduction to Redis Cluster, that does not use complex to understand distributed systems concepts. It provides instructions about how to setup a cluster, test, and operate it, without going into the details that are covered in the?Redis Cluster specification?but just describing how the system behaves from the point of view of the user.

Note that if you plan to run a serious Redis Cluster deployment, the more formal specification is an highly suggested reading.

Redis cluster is currently alpha quality code, please get in touch in the Redis mailing list or open an issue in the Redis Github repository if you find any issue.

Redis Cluster 101

Redis Cluster provides a way to run a Redis installation where data is?automatically sharded across multiple Redis nodes.

Commands dealing with multiple keys are not supported by the cluster, because this would require moving data between Redis nodes, making Redis Cluster not able to provide Redis-alike performances and predictable behavior under load.

Redis Cluster also provides?some degree of availability during partitions, that is in practical terms the ability to continue the operations when some nodes fail or are not able to communicate.

So in practical terms, what you get with Redis Cluster?

  • The ability to automatically split your dataset among multiple nodes.
  • The ability to continue operations when a subset of the nodes are experiencing failures or are unable to communicate with the rest of the cluster.

Redis Cluster data sharding

Redis Cluster does not use consistency hashing, but a different form of sharding where every key is conceptually part of what we call an?hash slot.

There are 16384 hash slots in Redis Cluster, and to compute what is the hash slot of a given key, we simply take the CRC16 of the key modulo 16384.

Every node in a Redis Cluster is responsible of a subset of the hash slots, so for example you may have a cluster with 3 nodes, where:

  • Node A contains hash slots from 0 to 5500.
  • Node B contains hash slots from 5501 to 11000.
  • Node C contains hash slots from 11001 to 16384.

This allows to add and remove nodes in the cluster easily. For example if I want to add a new node D, I need to move some hash slot from nodes A, B, C to D. Similarly if I want to remove node A from the cluster I can just move the hash slots served by A to B and C. When the node A will be empty I can remove it from the cluster completely.

Because moving hash slots from a node to another does not require to stop operations, adding and removing nodes, or changing the percentage of hash slots hold by nodes, does not require any downtime.

Redis Cluster master-slave model

In order to remain available when a subset of nodes are failing or are not able to communicate with the majority of nodes, Redis Cluster uses a master-slave model where every node has from 1 (the master itself) to N replicas (N-1 additional slaves).

In our example cluster with nodes A, B, C, if node B fails the cluster is not able to continue, since we no longer have a way to serve hash slots in the range 5501-11000.

However if when the cluster is created (or at a latter time) we add a slave node to every master, so that the final cluster is composed of A, B, C that are masters, and A1, B1, C1 that are slaves, the system is able to continue if node B fails.

Node B1 replicates B, so the cluster will elect node B1 as the new master and will continue to operate correctly.

However note that if nodes B and B1 fail at the same time Redis Cluster is not able to continue to operate.

Redis Cluster consistency guarantees

Redis Cluster is not able to guarantee?strong consistency. In practical terms this means that under certain conditions it is possible that Redis Cluster will forget a write that was acknowledged by the system.

The first reason why Redis Cluster can lose writes is because it uses asynchronous replication. This means that during writes the following happens:

  • Your client writes to the master B.
  • The master B replies OK to your client.
  • The master B propagates the write to its slaves B1, B2 and B3.

As you can see B does not wait for an acknowledge from B1, B2, B3 before replying to the client, since this would be a prohibitive latency penalty for Redis, so if your client writes something, B acknowledges the write, but crashes before being able to send the write to its slaves, one of the slaves can be promoted to master losing the write forever.

This is?very similar to what happens?with most databases that are configured to flush data to disk every second, so it is a scenario you are already able to reason about because of past experiences with traditional database systems not involving distributed systems. Similarly you can improve consistency by forcing the database to flush data on disk before replying to the client, but this usually results into prohibitively low performances.

Basically there is a trade-off to take between performances and consistency.

Note: Redis Cluster in the future will allow users to perform synchronous writes when absolutely needed.

There is another scenario where Redis Cluster will lose writes, that happens during a network partition where a client is isolated with a minority of instances including at least a master.

Take as an example our 6 nodes cluster composed of A, B, C, A1, B1, C1, with 3 masters and 3 slaves. There is also a client, that we will call Z1.

After a partition occurs, it is possible that in one side of the partition we have A, C, A1, B1, C1, and in the other side we have B and Z1.

Z1 is still able to write to B, that will accept its writes. If the partition heals in a very short time, the cluster will continue normally. However if the partition lasts enough time for B1 to be promoted to master in the majority side of the partition, the writes that Z1 is sending to B will be lost.

Note that there is a maximum window to the amount of writes Z1 will be able to send to B: if enough time has elapsed for the majority side of the partition to elect a slave as master, every master node in the minority side stops accepting writes.

This amount of time is a very important configuration directive of Redis Cluster, and is called the?node timeout.

After node timeout has elapsed, a master node is considered to be failing, and can be replaced by one if its replicas. Similarly after node timeout has elapsed without a master node to be able to sense the majority of the other master nodes, it enters an error state and stops accepting writes.

Creating and using a Redis Cluster

To create a cluster, the first thing we need is to have a few empty Redis instances running in?cluster mode. This basically means that clusters are not created using normal Redis instances, but a special mode needs to be configured so that the Redis instance will enable the Cluster specific features and commands.

The following is a minimal Redis cluster configuration file:

port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes

As you can see what enables the cluster mode is simply the?cluster-enabled?directive. Every instance also contains the path of a file where the configuration for this node is stored, that by default is?nodes.conf. This file is never touched by humans, it is simply generated at startup by the Redis Cluster instances, and updated every time it is needed.

Note that the?minimal cluster?that works as expected requires to contain at least three master nodes. For your first tests it is strongly suggested to start a six nodes cluster with three masters and three slaves.

To do so, enter a new directory, and create the following directories named after the port number of the instance we'll run inside any given directory.

Something like:

mkdir cluster-test cd cluster-test mkdir 7000 7001 7002 7003 7004 7005

Create a?redis.conf?file inside each of the directories, from 7000 to 7005. As a template for your configuration file just use the small example above, but make sure to replace the port number?7000?with the right port number according to the directory name.

Now copy your redis-server executable,?compiled from the latest sources in the unstable branch at Github, into the?cluster-test?directory, and finally open 6 terminal tabs in your favorite terminal application.

Start every instance like that, one every tab:

cd 7000 ../redis-server ./redis.conf

As you can see from the logs of every instance, since no?nodes.conf?file existed, every node assigns itself a new ID.

[82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1

This ID will be used forever by this specific instance in order for the instance to have an unique name in the context of the cluster. Every node remembers every other node using this IDs, and not by IP or port. IP addresses and ports may change, but the unique node identifier will never change for all the life of the node. We call this identifier simplyNode ID.

Creating the cluster

Now that we have a number of instances running, we need to create our cluster writing some meaningful configuration to the nodes.

This is very easy to accomplish as we are helped by the Redis Cluster command line utility called?redis-trib, that is a Ruby program executing special commands in the instances in order to create new clusters, check or reshard an existing cluster, and so forth.

The?redis-trib?utility is in the?src?directory of the Redis source code distribution. To create your cluster simply type:

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \ 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

The command used here is?create, since we want to create a new cluster. The option?--replicas 1?means that we want a slave for every master created. The other arguments are the list of addresses of the instances I want to use to create the new cluster.

Obviously the only setup with our requirements is to create a cluster with 3 masters and 3 slaves.

Redis-trib will propose you a configuration. Accept typing?yes. The cluster will be configured and?joined, that means, instances will be bootstrapped into talking with each other. Finally if everything went ok you'll see a message like that:

[OK] All 16384 slots covered

This means that there is at least a master instance serving each of the 16384 slots available.

Playing with the cluster

At this stage one of the problems with Redis Cluster is the lack of client libraries implementations.

I'm aware of the following implementations:

  • redis-rb-cluster?is a Ruby implementation written by me (@antirez) as a reference for other languages. It is a simple wrapper around the original redis-rb, implementing the minimal semantics to talk with the cluster efficiently.
  • redis-py-cluster?appears to be a port of redis-rb-cluster to Python. Not recently updated (last commit 6 months ago) however it may be a starting point.
  • The popular?Predis?has support for Redis Cluster, the support was recently updated and is in active development.
  • The most used Java client,?Jedis?recently added support for Redis Cluster, see the?Jedis Cluster?section in the project README.
  • The?redis-cli?utility in the unstable branch of the Redis repository at Github implements a very basic cluster support when started with the?-c?switch.

An easy way to test Redis Cluster is either to try and of the above clients or simply the?redis-cli?command line utility. The following is an example of interaction using the latter:

$ redis-cli -c -p 7000 redis 127.0.0.1:7000> set foo bar -> Redirected to slot [12182] located at 127.0.0.1:7002 OK redis 127.0.0.1:7002> set hello world -> Redirected to slot [866] located at 127.0.0.1:7000 OK redis 127.0.0.1:7000> get foo -> Redirected to slot [12182] located at 127.0.0.1:7002 "bar" redis 127.0.0.1:7000> get hello -> Redirected to slot [866] located at 127.0.0.1:7000 "world"

The redis-cli cluster support is very basic so it always uses the fact that Redis Cluster nodes are able to redirect a client to the right node. A serious client is able to do better than that, and cache the map between hash slots and nodes addresses, to directly use the right connection to the right node. The map is refreshed only when something changed in the cluster configuration, for example after a failover or after the system administrator changed the cluster layout by adding or removing nodes.

Writing an example app with redis-rb-cluster

Before goign forward showing how to operate the Redis Cluster, doing things like a failover, or a resharding, we need to create some example application or at least to be able to understand the semantics of a simple Redis Cluster client interaction.

In this way we can run an example and at the same time try to make nodes failing, or start a resharding, to see how Redis Cluster behaves under real world conditions. It is not very helpful to see what happens while nobody is writing to the cluster.

This section explains some basic usage of redis-rb-cluster showing two examples. The first is the following, and is theexample.rb?file inside the redis-rb-cluster distribution:

1 require './cluster'23 startup_nodes = [4 {:host => "127.0.0.1", :port => 7000},5 {:host => "127.0.0.1", :port => 7001}6 ]7 rc = RedisCluster.new(startup_nodes,32,:timeout => 0.1)89 last = false1011 while not last12 begin13 last = rc.get("__last__")14 last = 0 if !last15 rescue => e16 puts "error #{e.to_s}"17 sleep 118 end19 end2021 ((last.to_i+1)..1000000000).each{|x|22 begin23 rc.set("foo#{x}",x)24 puts rc.get("foo#{x}")25 rc.set("__last__",x)26 rescue => e27 puts "error #{e.to_s}"28 end29 sleep 0.130 }

The application does a very simple thing, it sets keys in the form?foo<number>?to?number, one after the other. So if you run the program the result is the following stream of commands:

  • SET foo0 0
  • SET foo1 1
  • SET foo2 2
  • And so forth...

The program looks more complex than it should usually as it is designed to show errors on the screen instead of exiting with an exception, so every operation performed with the cluster is wrapped by?begin?rescue?blocks.

The?line 7?is the first interesting line in the program. It creates the Redis Cluster object, using as argument a list of?startup nodes, the maximum number of connections this object is allowed to take against different nodes, and finally the timeout after a given operation is considered to be failed.

The startup nodes don't need to be all the nodes of the cluster. The important thing is that at least one node is reachable. Also note that redis-rb-cluster updates this list of startup nodes as soon as it is able to connect with the first node. You should expect such a behavior with any other serious client.

Now that we have the Redis Cluster object instance stored in the?rc?variable we are ready to use the object like if it was a normal Redis object instance.

This is exactly what happens in?line 11 to 19: when we restart the example we don't want to start again with?foo0, so we store the counter inside Redis itself. The code above is designed to read this counter, or if the counter does not exist, to assign it the value of zero.

However note how it is a while loop, as we want to try again and again even if the cluster is down and is returning errors. Normal applications don't need to be so careful.

Lines between 21 and 30?start the main loop where the keys are set or an error is displayed.

Note the?sleep?call at the end of the loop. In your tests you can remove the sleep if you want to write to the cluster as fast as possible (relatively to the fact that this is a busy loop without real parallelism of course, so you'll get the usually 10k ops/second in the best of the conditions).

Normally writes are slowed down in order for the example application to be easier to follow by humans.

Starting the application produces the following output:

ruby ./example.rb 1 2 3 4 5 6 7 8 9 ^C (I stopped the program here)

This is not a very interesting program and we'll use a better one in a moment but we can already try what happens during a resharding when the program is running.

Resharding the cluster

Now we are ready to try a cluster resharding. To do this please keep the example.rb program running, so that you can see if there is some impact on the program running. Also you may want to comment the?sleep?call in order to have some more serious write load during resharding.

Resharding basically means to move hash slots from a set of nodes to another set of nodes, and like cluster creation it is accomplished using the redis-trib utility.

To start a resharding just type:

./redis-trib.rb reshard 127.0.0.1:7000

You only need to specify a single node, redis-trib will find the other nodes automatically.

Currently redis-trib is only able to reshard with the administrator support, you can't just say move 5% of slots from this node to the other one (but this is pretty trivial to implement). So it starts with questions. The first is how much a big resharding do you want to do:

How many slots do you want to move (from 1 to 16384)?

We can try to reshard 1000 hash slots, that should already contain a non trivial amount of keys if the example is still running without the sleep call.

Then redis-trib needs to know what is the target of the resharding, that is, the node that will receive the hash slots. I'll use the first master node, that is, 127.0.0.1:7000, but I need to specify the Node ID of the instance. This was already printed in a list by redis-trib, but I can always find the ID of a node with the following command if I need:

$ redis-cli -p 7000 cluster nodes | grep myself 97a3a64667477371c4479320d683e4c8db5858b1 :0 myself,master - 0 0 0 connected 0-5460

Ok so my target node is 97a3a64667477371c4479320d683e4c8db5858b1.

Now you'll get asked from what nodes you want to take those keys. I'll just type?all?in order to take a bit of hash slots from all the other master nodes.

After the final confirmation you'll see a message for every slot that redis-trib is going to move from a node to another, and a dot will be printed for every actual key moved from one side to the other.

While the resharding is in progress you should be able to see your example program running unaffected. You can stop and restart it multiple times during the resharding if you want.

At the end of the resharding, you can test the health of the cluster with the following command:

./redis-trib.rb check 127.0.0.1:7000

All the slots will be covered as usually, but this time the master at 127.0.0.1:7000 will have more hash slots, something around 6461.

A more interesting example application

So far so good, but the example application we used is not very good. It writes acritically to the cluster without ever checking if what was written is the right thing.

From our point of view the cluster receiving the writes could just always write the key?foo?to?42?to every operation, and we would not notice at all.

So in the reids-rb-cluster repository, there is a more interesting application that is called?consistency-test.rb. It is a much more interesting application as it uses a set of counters, by default 1000, and sends?INCR?commands in order to increment the counters.

However instead of just writing, the application does two additional things:

  • When a counter is updated using?INCR, the application remembers the write.
  • It also reads a random counter before every write, and check if the value is what it expected it to be, comparing it with the value it has in memory.

What this means is that this application is a simple?consistency checker, and is able to tell you if the cluster lost some write, or if it accepted a write that we did not received acknowledgement for. In the first case we'll see a counter having a value that is smaller than the one we remember, while in the second case the value will be greater.

Running the consistency-test application produces a line of output every second:

$ ruby consistency-test.rb 925 R (0 err) | 925 W (0 err) | 5030 R (0 err) | 5030 W (0 err) | 9261 R (0 err) | 9261 W (0 err) | 13517 R (0 err) | 13517 W (0 err) | 17780 R (0 err) | 17780 W (0 err) | 22025 R (0 err) | 22025 W (0 err) | 25818 R (0 err) | 25818 W (0 err) |

The line shows the number of?Reads and?Writes performed, and the number of errors (query not accepted because of errors since the system was not available).

If some inconsistency is found, new lines are added to the output. This is what happens, for example, if I reset a counter manually while the program is running:

$ redis 127.0.0.1:7000> set key_217 0 OK(in the other tab I see...)94774 R (0 err) | 94774 W (0 err) | 98821 R (0 err) | 98821 W (0 err) | 102886 R (0 err) | 102886 W (0 err) | 114 lost | 107046 R (0 err) | 107046 W (0 err) | 114 lost |

When I set the counter to 0 the real value was 144, so the program reports 144 lost writes (INCR?commands that are not remembered by the cluster).

This program is much more interesting as a test case, so we'll use it to test the Redis Cluster failover.

Testing the failover

Note: during this test, you should take a tab open with the consistency test application running.

In order to trigger the failover, the simplest thing we can do (that is also the semantically simplest failure that can occur in a distributed system) is to crash a single process, in our case a single master.

We can identify a cluster and crash it with the following command:

$ redis-cli -p 7000 cluster nodes | grep master 3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 127.0.0.1:7001 master - 0 1385482984082 0 connected 5960-10921 2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 master - 0 1385482983582 0 connected 11423-16383 97a3a64667477371c4479320d683e4c8db5858b1 :0 myself,master - 0 0 0 connected 0-5959 10922-11422

Ok, so 7000, 7001, and 7002 are masters. Let's crash node 7002 with the?DEBUG SEGFAULT?command:

$ redis-cli -p 7002 debug segfault Error: Server closed the connection

Now we can look at the output of the consistency test to see what it reported.

18849 R (0 err) | 18849 W (0 err) | 23151 R (0 err) | 23151 W (0 err) | 27302 R (0 err) | 27302 W (0 err) |... many error warnings here ...29659 R (578 err) | 29660 W (577 err) | 33749 R (578 err) | 33750 W (577 err) | 37918 R (578 err) | 37919 W (577 err) | 42077 R (578 err) | 42078 W (577 err) |

As you can see during the failover the system was not able to accept 578 reads and 577 writes, however no inconsistency was created in the database. This may sound unexpected as in the first part of this tutorial we stated that Redis Cluster can lost writes during the failover because it uses asynchronous replication. What we did not said is that this is not very likely to happen because Redis sends the reply to the client, and the commands to replicate to the slaves, about at the same time, so there is a very small window to lose data. However the fact that it is hard to trigger does not mean that it is impossible, so this does not change the consistency guarantees provided by Redis cluster.

We can now check what is the cluster setup after the failover (note that in the meantime I restarted the crashed instance so that it rejoins the cluster as a slave):

$ redis-cli -p 7000 cluster nodes 3fc783611028b1707fd65345e763befb36454d73 127.0.0.1:7004 slave 3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 0 1385503418521 0 connected a211e242fc6b22a9427fed61285e85892fa04e08 127.0.0.1:7003 slave 97a3a64667477371c4479320d683e4c8db5858b1 0 1385503419023 0 connected 97a3a64667477371c4479320d683e4c8db5858b1 :0 myself,master - 0 0 0 connected 0-5959 10922-11422 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7005 master - 0 1385503419023 3 connected 11423-16383 3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 127.0.0.1:7001 master - 0 1385503417005 0 connected 5960-10921 2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385503418016 3 connected

Now the masters are running on ports 7000, 7001 and 7005. What was previously a master, that is the Redis instance running on port 7002, is now a slave of 7005.

The output of the?CLUSTER NODES?command may look intimidating, but it is actually pretty simple, and is composed of the following tokens:

  • Node ID
  • ip:port
  • flags: master, slave, myself, fail, ...
  • if it is a slave, the Node ID of the master
  • Time of the last pending PING still waiting for a reply.
  • Time of the last PONG received.
  • Configuration epoch for this node (see the Cluster specification).
  • Status of the link to this node.
  • Slots served...

Manual failover

Sometimes it is useful to force a failover without actually causing any problem on a master. For example in order to upgrade the Redis process of one of the master nodes it is a good idea to failover it in order to turn it into a slave with minimal impact on availability.

Manual failovers are supported by Redis Cluster using the?CLUSTER FAILOVER?command, that must be executed in one of theslaves?of the master you want to failover.

Manual failovers are special and are safer compared to failovers resulting from actual master failures, since they occur in a way that avoid data loss in the process, by switching clients from the original master to the new master only when the system is sure that the new master processed all the replication stream from the old one.

This is what you see in the slave log when you perform a manual failover:

# Manual failover user request accepted. # Received replication offset for paused master manual failover: 347540 # All master replication stream processed, manual failover can start. # Start of election delayed for 0 milliseconds (rank #0, offset 347540). # Starting a failover election for epoch 7545. # Failover election won: I'm the new master.

Basically clients connected to the master we are failing over are stopped. At the same time the master sends its replication offset to the slave, that waits to reach the offset on its side. When the replication offset is reached, the failover starts, and the old master is informed about the configuration switch. When the clients are unblocked on the old master, they are redirected to the new master.

Adding a new node

Adding a new node is basically the process of adding an empty node and then moving some data into it, in case it is a new master, or telling it to setup as a replica of a known node, in case it is a slave.

We'll show both, starting with the addition of a new master instance.

In both cases the first step to perform is?adding an empty node.

This is as simple as to start a new node in port 7006 (we already used from 7000 to 7005 for our existing 6 nodes) with the same configuration used for the other nodes, except for the port number, so what you should do in order to conform with the setup we used for the previous nodes:

  • Create a new tab in your terminal application.
  • Enter the?cluster-test?directory.
  • Create a directory named?7006.
  • Create a redis.conf file inside, similar to the one used for the other nodes but using 7006 as port number.
  • Finally start the server with?../redis-server ./redis.conf

At this point the server should be running.

Now we can use?redis-trib?as usually in order to add the node to the existing cluster.

./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

As you can see I used the?addnode?command specifying the address of the new node as first argument, and the address of a random existing node in the cluster as second argument.

In practical terms redis-trib here did very little to help us, it just sent a?CLUSTER MEET?message to the node, something that is also possible to accomplish manually. However redis-trib also checks the state of the cluster before to operate, so it is a good idea to perform cluster operations always via redis-trib even when you know how the internals work.

Now we can connect to the new node to see if it really joined the cluster:

redis 127.0.0.1:7006> cluster nodes 3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 127.0.0.1:7001 master - 0 1385543178575 0 connected 5960-10921 3fc783611028b1707fd65345e763befb36454d73 127.0.0.1:7004 slave 3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 0 1385543179583 0 connected f093c80dde814da99c5cf72a7dd01590792b783b :0 myself,master - 0 0 0 connected 2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543178072 3 connected a211e242fc6b22a9427fed61285e85892fa04e08 127.0.0.1:7003 slave 97a3a64667477371c4479320d683e4c8db5858b1 0 1385543178575 0 connected 97a3a64667477371c4479320d683e4c8db5858b1 127.0.0.1:7000 master - 0 1385543179080 0 connected 0-5959 10922-11422 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7005 master - 0 1385543177568 3 connected 11423-16383

Note that since this node is already connected to the cluster it is already able to redirect client queries correctly and is generally speaking part of the cluster. However it has two peculiarities compared to the other masters:

  • It holds no data as it has no assigned hash slots.
  • Because it is a master without assigned slots, it does not participate in the election process when a slave wants to become a master.

Now it is possible to assign hash slots to this node using the resharding feature of?redis-trib. It is basically useless to show this as we already did in a previous section, there is no difference, it is just a resharding having as a target the empty node.

Adding a new node as a replica

Adding a new Replica can be performed in two ways. The obivous one is to use redis-trib again, but with the --slave option, like this:

./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000

Note that the command line here is exactly like the one we used to add a new master, so we are not specifiying to which master we want to add the replica. In this case what happens is that redis-trib will add the new node as replica of a random master among the masters with less replicas.

However you can specifiy exactly what master you want to target with your new replica with the following command line:

./redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000

This way we assign the new replica to a specific master.

A more manual way to add a replica to a specific master is to add the new node as an empty master, and then turn it into a replica using the?CLUSTER REPLICATE?command. This also works if the node was added as a slave but you want to move it as a replica of a different master.

For example in order to add a replica for the node 127.0.0.1:7005 that is currently serving hash slots in the range 11423-16383, that has a Node ID 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e, all I need to do is to connect with the new node (already added as empty master) and send the command:

redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

That's it. Now we have a new replica for this set of hash slots, and all the other nodes in the cluster already know (after a few seconds needed to update their config). We can verify with the following command:

$ redis-cli -p 7000 cluster nodes | grep slave | grep 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e f093c80dde814da99c5cf72a7dd01590792b783b 127.0.0.1:7006 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617702 3 connected 2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617198 3 connected

The node 3c3a0c... now has two slaves, running on ports 7002 (the existing one) and 7006 (the new one).

Removing a node

To remove a slave node just use the?del-node?command of redis-trib:

./redis-trib del-node 127.0.0.1:7000 `<node-id>`

The first argument is just a random node in the cluster, the second argument is the ID of the node you want to remove.

You can remove a master node in the same way as well,?however in order to remove a master node it must be empty. If the master is not empty you need to reshard data away from it to all the other master nodes before.

An alternative to remove a master node is to perform a manual failover of it over one of its slaves and remove the node after it turned into a slave of the new master. Obviously this does not help when you want to reduce the actual number of masters in your cluster, in that case, a resharding is needed.

Replicas migration

In Redis Cluster it is possible to reconfigure a slave to replicate with a different master at any time just using the following command:

CLUSTER REPLICATE <master-node-id>

However there is a special scenario where you want replicas to move from one master to another one automatically, without the help of the system administrator. The automatic reconfiguration of replicas is called?replicas migration?and is able to improve the reliability of a Redis Cluster.

Note: you can read the details of replicas migration in the (Redis Cluster Specification)[/topics/cluster-spec], here we'll only provide some information about the general idea and what you should do in order to benefit from it.

The reason why you may want to let your cluster replicas to move from one master to another under certain condition, is that usually the Redis Cluster is as resistant to failures as the number of replicas attached to a given slave.

For example a cluster where every master has a single replica can't continue operations if the master and its replica fail at the same time, simply because there is no other instance to have a copy of the hash slots the master was serving. However while netsplits are likely to isolate a number of nodes at the same time, many other kind of failures, like hardware or software failures local to a single node, are a very notable class of failures that are unlikely to happen at the same time, so it is possible that in your cluster where every master has a slave, the slave is killed at 4am, and the master is killed at 6am. This still will result in a cluster that can no longer operate.

To improve reliability of the system we have the option to add additional replicas to every master, but this is expensive. Replica migration allows to add more slaves to just a few masters. So you have 10 masters with 1 slave each, for a total of 20 instances. However you add, for example, 3 instances more as slaves of some of your masters, so certain masters will have more than a single slave.

With replicas migration what happens is that if a master is left without slaves, a replica from a master that has multiple slaves will migrate to the?orphaned?master. So after your slave goes down at 4am as in the example we made above, another slave will take its place, and when the master will fail as well at 5am, there is still a slave that can be elected so that the cluster can continue to operate.

So what you should know about replicas migration in short?

  • The cluster will try to migrate a replica from the master that has the greatest number of replicas in a given moment.
  • To benefit from replica migration you have just to add a few more replicas to a single master in your cluster, it does not matter what master.
  • There is a configuration parameter that controls the replica migration feature that is called?replica-migration-barrier: you can read more about it in the example?redis.conf?file provided with Redis Cluster.

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3608737.html

總結(jié)

以上是生活随笔為你收集整理的redis终于有比较大的进展了,redis3.0.1 稳定版本发布,支持集群。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

久草精品国产 | 91av精品| 日韩三级视频在线观看 | 天天操天天操天天爽 | 免费看黄在线 | 久草视频在线新免费 | 婷婷视频导航 | 日韩精品久久久久 | 国产精品免费观看网站 | 91精品国产亚洲 | 日韩xxx视频| 日韩有码中文字幕在线 | 国产精品mm| 天堂av网址| 人人干人人艹 | 久久精品国产第一区二区三区 | 正在播放国产一区二区 | 国产精品黄色 | 在线日韩中文字幕 | 超碰人人干人人 | 久久91久久久久麻豆精品 | 欧美特一级片 | 久久永久免费 | 国产精品福利在线播放 | 国产日产精品一区二区三区四区 | 国产美女精品人人做人人爽 | 欧美日韩不卡在线观看 | 久草免费在线观看 | 婷婷免费视频 | 在线观看国产www | 中文字幕中文字幕在线中文字幕三区 | 免费av高清| 激情欧美一区二区免费视频 | 久久高清片 | 日日综合| 国产欧美综合在线观看 | 日本精品小视频 | 日韩成人免费在线 | 亚洲精品国产精品国自产观看 | 韩国视频一区二区三区 | 免费亚洲精品 | 天天色天天射天天综合网 | 国产精品国产三级国产aⅴ无密码 | 亚洲女人av | 亚洲精品影院在线观看 | 国产 日韩 欧美 中文 在线播放 | 久久精品欧美 | 在线观看免费视频你懂的 | 97成人精品区在线播放 | 精品免费久久久久 | 欧美色噜噜 | 国内精品毛片 | 久9在线 | 国产一区免费在线观看 | 中文字幕成人在线 | 偷拍久久久 | 久久国产免费视频 | 国产精品观看视频 | 精品一区精品二区 | 久草视频在线免费播放 | 黄色一级免费电影 | 欧美日韩国产一区二区三区 | 日韩和的一区二在线 | 国产精品入口麻豆 | 国产精品一区二区三区久久久 | 中文字幕在线看视频国产 | 国产精品久久久久一区二区国产 | 国产成人黄色网址 | 国产精品美女久久久免费 | 天天透天天插 | 日韩精品一区二区三区电影 | 国产精品h在线观看 | av福利网址导航 | 国产va在线 | 99精品视频在线免费观看 | 激情xxxx | 国产色久 | 草久在线观看视频 | 国产精品少妇 | 97超碰人人模人人人爽人人爱 | 福利视频午夜 | 天天操夜夜操 | 国产真实精品久久二三区 | 成人久久亚洲 | 久久久久国产精品一区二区 | 在线观看成人一级片 | 91中文字幕在线 | 丁香婷婷久久久综合精品国产 | 欧美成年网站 | 在线观看一 | 啪啪凸凸 | 婷婷综合激情 | 国产成人精品久久亚洲高清不卡 | 国产精品久久久久久妇 | 婷婷在线综合 | 狠狠狠的干 | 99久久精品免费看国产一区二区三区 | 天天插天天干天天操 | 国产区精品 | 成人久久精品 | 色噜噜狠狠狠狠色综合久不 | 网址你懂的在线观看 | 色在线网站 | 中文资源在线官网 | 国产手机在线播放 | 日韩高清网站 | 免费男女羞羞的视频网站中文字幕 | 亚洲精品玖玖玖av在线看 | 日韩av手机在线看 | 欧美男同视频网站 | 伊人久操| av高清一区二区三区 | 国产免费久久久久 | 日韩亚洲精品电影 | 97精品免费视频 | 天天弄天天操 | 一区二区理论片 | 成人免费网视频 | 日韩av资源站 | 99 视频 高清| 国产精品女人网站 | 亚洲免费高清视频 | 久久亚洲热 | 国产五月 | 国产精品99精品久久免费 | 一二三区av | 久久久福利 | 欧美孕妇视频 | 91精品国产高清自在线观看 | 国产精品区在线观看 | www.亚洲精品 | 午夜少妇| 97色资源 | 亚洲精品在线电影 | 国产小视频精品 | 国产精彩视频一区二区 | 国产小视频在线观看免费 | 午夜性盈盈 | 人人舔人人爽 | 中文字幕a∨在线乱码免费看 | 日韩精品欧美一区 | www亚洲视频 | 久久国产精品一区二区三区 | 综合久久久久久久久 | 欧美性免费 | 手机在线黄色网址 | 国产亚洲精品久久久久久大师 | 五月激情片 | 久久涩视频 | 99久久精 | 婷婷激情小说网 | 国产免费成人av | 天天综合天天做天天综合 | 久久久久婷 | 欧亚久久 | 亚洲经典中文字幕 | 久久精品9| 综合精品在线 | 激情小说久久 | 免费精品视频在线 | 亚州精品天堂中文字幕 | 九九九国产 | 9797在线看片亚洲精品 | 91久久国产露脸精品国产闺蜜 | 国产一二区在线观看 | 亚洲黄色在线播放 | 亚洲,播放 | 99精品久久只有精品 | 国产免费黄视频在线观看 | 日本视频不卡 | 久久久久久久久免费视频 | 99夜色| 久草在线免费在线观看 | 激情综合电影网 | 免费看片日韩 | 毛片基地黄久久久久久天堂 | 一区二区视频网站 | 黄色av在 | 免费日韩电影 | 狠狠成人 | 狠狠躁夜夜躁人人爽超碰91 | 亚洲va综合va国产va中文 | 中文字幕影片免费在线观看 | 久久久久蜜桃 | 999精品 | 天天操天天操天天操天天操 | 久久字幕精品一区 | 天天射天天干天天 | 欧美日韩高清免费 | 免费精品| 精品电影一区 | 久久久久在线视频 | 欧美一级视频免费 | 在线观看午夜av | 在线看免费| 国产视频网站在线观看 | 亚洲精品91天天久久人人 | 91av视频在线观看 | 亚洲精品高清一区二区三区四区 | 婷婷丁香花五月天 | 久久99亚洲热视 | 亚洲国产成人精品在线观看 | 国产一区二区久久精品 | 日日夜夜添 | 欧洲精品久久久久毛片完整版 | 日本爱爱片| 欧美精品v国产精品 | 亚州黄色一级 | 国产高清专区 | 欧美日韩中文国产一区发布 | 日韩三级视频在线观看 | 免费观看一区二区 | 一区二区三区www | 夜夜躁日日躁狠狠久久av | 久久y| 免费99视频| 婷婷六月丁 | 国产精品a级 | 美女视频黄在线 | 日日干网| 成片人卡1卡2卡3手机免费看 | 亚洲mv大片欧洲mv大片免费 | 久久久www成人免费精品 | 久久精彩免费视频 | 在线观看aa | 国产爽妇网 | 色播激情五月 | 久久激情视频 久久 | 久久免费视频3 | 99在线精品免费视频九九视 | 国产精品一区二区久久国产 | 日韩免费一区二区三区 | 91激情 | 国产高清在线观看 | 欧美天堂久久 | 麻豆 91 在线 | 97精品国产97久久久久久久久久久久 | 国产精品大尺度 | 免费精品在线 | 欧美精品久久久久久久久久丰满 | 色婷婷成人| 99在线观看免费视频精品观看 | 亚洲精品大片www | 免费在线| 国产国产人免费人成免费视频 | 91成人在线网站 | 国产小视频免费在线网址 | 色婷婷激情网 | 中文亚洲欧美日韩 | 99中文字幕 | 88av色 | 超碰97人人在线 | 在线成人看片 | 国产精品高清在线观看 | 免费看一级片 | 一区二区在线不卡 | 日韩精品观看 | 日韩免费一区二区在线观看 | 探花视频在线观看免费 | 亚洲 欧美 综合 在线 精品 | 色综合天天在线 | 婷婷在线五月 | 在线视频日韩欧美 | 欧美日韩国产色综合一二三四 | 免费看一级 | 99热999| 91精品国产综合久久福利 | 久草在线免费在线观看 | 91伊人影院| 日韩欧美在线不卡 | 一级黄网 | 怡红院成人在线 | 伊人开心激情 | 91片网 | 日日射天天射 | 久久久久综合 | 亚洲一区不卡视频 | a在线免费观看视频 | 在线免费三级 | av福利在线导航 | 99久久久久免费精品国产 | 久久国产精品久久精品国产演员表 | 日韩成人精品 | 日日干干夜夜 | 亚洲精品自拍视频在线观看 | 九热精品 | 色综合久久88 | 久久久国产精品电影 | 欧美另类老妇 | 精品视频一区在线观看 | 久久99九九99精品 | 国产美女免费观看 | 久久精品视频在线免费观看 | 在线高清一区 | 欧美国产日韩激情 | 亚洲精品在线一区二区 | 国产无套精品久久久久久 | 日韩久久久久久久久 | 日日射天天射 | 天天干天天怕 | 国产成人久久精品77777综合 | 色多多视频在线观看 | 免费成人av在线 | 在线观看中文字幕2021 | 精品国产一区二区三区在线观看 | 狠狠操狠狠干天天操 | 在线视频 区 | 视频一区二区免费 | 欧美在线观看视频一区二区三区 | 亚州av免费 | 成人在线免费小视频 | 最近中文字幕在线中文高清版 | av成人资源| 91人人爽人人爽人人精88v | 欧美韩国在线 | 国产精品第一 | 久久久久久亚洲精品 | 日韩 在线a| 亚洲精品动漫久久久久 | 天天搞天天 | 波多野结衣在线观看视频 | 日韩有色 | 欧美日韩伦理一区 | 日韩免费在线观看视频 | 黄色成人在线网站 | 免费成人结看片 | 国产很黄很色的视频 | 中文字幕免费看 | 在线v片 | 亚洲免费av在线播放 | 久久久久久久18 | 久久不卡电影 | 毛片一区二区 | 91毛片在线 | 国产高清在线观看av | 五月婷婷黄色 | 91久久国产自产拍夜夜嗨 | 国产精品亚洲精品 | 亚洲国产三级 | 日韩在线视频不卡 | 久久国产精品99国产 | 99婷婷狠狠成为人免费视频 | 99久久这里只有精品 | 狠狠躁18三区二区一区ai明星 | 人人爽人人澡人人添人人人人 | 日韩免费一二三区 | 欧美在线视频一区二区三区 | 精品久久久久久亚洲综合网站 | 久久久久久久亚洲精品 | 黄色大全免费网站 | 在线免费观看视频一区 | 91精品一区二区三区久久久久久 | 最新国产一区二区三区 | 日本视频精品 | 九色91在线视频 | 99视频在线免费 | 高清在线一区 | 亚洲精品白浆高清久久久久久 | 久久精品免视看 | 国产一级二级在线播放 | 精品美女视频 | 国产伦理一区二区三区 | 日本久久久久久 | 亚洲精品999 | 欧美日韩免费在线观看视频 | av三级在线免费观看 | 亚洲精品国产精品国 | www91在线 | 特级西西www44高清大胆图片 | 欧美韩国日本在线 | 白丝av免费观看 | 伊人网综合在线观看 | 久久国产精品精品国产色婷婷 | 麻豆视屏 | 亚洲综合情 | 欧美analxxxx| 精品国产乱码久久久久久1区二区 | 91精品播放| 二区三区av | 亚洲 欧美 国产 va在线影院 | 国产精品丝袜久久久久久久不卡 | 亚洲国产色一区 | 91字幕 | ,久久福利影视 | 在线观看国产 | 久久久久欠精品国产毛片国产毛生 | 韩国一区二区在线观看 | 久久99国产精品视频 | 国产高清视频在线播放一区 | 久久新 | 97日日碰人人模人人澡分享吧 | 国产三级午夜理伦三级 | 免费在线日韩 | 中文视频一区二区 | 色激情五月 | 国产在线观看网站 | 天天爱天天射天天干天天 | 久久伊人精品天天 | 中文字幕精品久久 | 久久五月网 | aaa亚洲精品一二三区 | 亚洲视频综合在线 | 日韩免费看 | 伊人影院99 | 在线观看免费91 | 99久久精品日本一区二区免费 | 久久精品1区 | 日韩在线中文字幕 | www.com.日本一级 | 亚洲视频综合在线 | 国产五月| 日韩美女黄色片 | 色播五月激情五月 | 欧美日本三级 | 四虎免费在线观看视频 | 欧美日韩视频一区二区 | 国产精品久久久久久爽爽爽 | 欧美激情视频在线免费观看 | 国产精品久久久久久久午夜 | 91精品免费在线观看 | 日韩黄在线观看 | 欧美aa一级 | 国产精品麻豆视频 | 中文字幕日本在线观看 | 久久久在线视频 | 久久高清免费视频 | 在线导航av | 亚洲欧洲日韩在线观看 | 午夜视频在线观看一区二区 | 久久精品亚洲 | 99国产精品久久久久久久久久 | 一区二区三区高清在线观看 | 日韩精品一区二区三区在线视频 | 亚洲理论在线观看 | 亚洲天堂精品视频在线观看 | 婷婷丁香狠狠爱 | 国产va饥渴难耐女保洁员在线观看 | 97人人澡人人添人人爽超碰 | 亚洲成人国产精品 | 久精品视频在线 | 91丝袜美腿 | 521色香蕉网站在线观看 | 婷婷色综合 | 欧美影片 | 国产精品99久久久久久久久 | 激情综合网五月激情 | 伊人看片| 午夜精品视频免费在线观看 | 久久国产经典视频 | 日韩中文字幕免费看 | 99热这里精品 | 在线观看视频黄 | 亚洲 欧美变态 另类 综合 | 久久亚洲视频 | 97精品电影院 | 色综合久久久久久久 | 亚洲精品午夜久久久久久久久久久 | www.五月激情.com| 中文字幕二区在线观看 | 手机av电影在线 | 天天操操操操操 | 欧美日韩电影在线播放 | 久久久久久久久久久成人 | www.玖玖玖| 亚洲欧美视频网站 | 欧美午夜视频在线 | 亚洲高清在线观看视频 | 91专区在线观看 | 在线观看91| 国产精品免费视频久久久 | 久久精品一区二区三区四区 | 毛片网在线 | ,午夜性刺激免费看视频 | 黄色毛片大全 | 欧美日韩另类在线 | 91色网址 | 日韩在线字幕 | 九九综合久久 | 亚洲精品国产精品久久99 | 亚洲片在线 | 美女在线观看av | 国产精品久久久视频 | 久久国产一区二区 | 精品久久一区 | 日日操天天操夜夜操 | 成人性生交大片免费看中文网站 | 97在线免费观看 | 久久综合之合合综合久久 | 免费久久久 | 玖玖精品在线 | 美女激情影院 | a级一a一级在线观看 | 成人9ⅰ免费影视网站 | 久久婷婷一区二区三区 | 91探花在线 | 天天舔夜夜操 | 国产精品福利无圣光在线一区 | 国产一级不卡毛片 | 久久看片网站 | 超碰999 | 国产精品免费视频久久久 | 日韩免费电影网站 | 亚洲成人欧美 | 男女拍拍免费视频 | 日韩精品视频一二三 | 欧美日韩国产二区 | 国产精品一级在线 | 亚洲精品三级 | 日韩一区正在播放 | 国产精品99久久久久久宅男 | 米奇影视7777 | 亚洲精品国产自产拍在线观看 | 中文永久字幕 | 一区二区三区精品在线 | 欧美在线18 | 国产精品一区二区三区在线 | 国产二区精品 | 高清av中文在线字幕观看1 | 久久人人爽视频 | av免费观看高清 | av大片免费看 | 99爱国产精品| 久久精品欧美一区二区三区麻豆 | 中文字幕在线观看免费高清电影 | 欧美91精品久久久久国产性生爱 | 色噜噜狠狠狠狠色综合久不 | 国产精久久 | 久久久国产精品成人免费 | 欧美极品裸体 | 天天干天天操天天搞 | 精品久久久久久亚洲 | 欧美激情奇米色 | 最近2019好看的中文字幕免费 | 午夜电影中文字幕 | 在线观看国产 | 香蕉日日 | 91超在线 | 一区二区三区日韩在线观看 | 在线中文字幕电影 | 91日韩精品视频 | 国产专区精品 | 六月丁香社区 | 久久系列 | 日韩视频一区二区三区在线播放免费观看 | 免费在线观看不卡av | 国产精品欧美一区二区三区不卡 | 国产黄色免费观看 | 久久综合色影院 | 日韩欧美在线观看一区二区三区 | 久久午夜国产精品 | 亚洲综合丁香 | 日日干夜夜草 | 国产精国产精品 | 91亚洲精品久久久蜜桃借种 | 蜜臀久久99精品久久久无需会员 | 色婷婷av一区 | 日韩久久片 | 久久天天操| 狠狠操狠狠操 | 人人舔人人插 | 在线观看亚洲精品视频 | 午夜av大片 | 国产欧美精品在线观看 | 热久在线| 久久伦理网 | 精品高清视频 | 欧美三级高清 | 91亚洲夫妻 | 成人免费在线视频观看 | 成人免费电影 | 久久99免费 | 欧美射射射 | 在线观看视频97 | 99久久综合狠狠综合久久 | 91欧美日韩国产 | 午夜久久久精品 | 日日日日干 | 人人爽人人香蕉 | 精品国产一区二区三区久久影院 | 精品女同一区二区三区在线观看 | 亚洲日日射 | www国产亚洲精品久久麻豆 | 亚洲欧美视频在线播放 | 中文字幕一区二区三区精华液 | 91成人亚洲 | 欧美日韩高清一区二区 | 午夜视频导航 | 97在线免费视频观看 | 中文字幕永久 | 国产三级香港三韩国三级 | 国产精品第二十页 | 手机看片国产 | 色婷婷国产精品一区在线观看 | 亚洲精品456在线播放 | 日韩亚洲国产中文字幕 | 超碰97人人干 | 美女视频黄免费的 | 麻豆va一区二区三区久久浪 | 中文字幕在线网址 | 日韩久久精品一区二区 | 精品自拍网 | 成人丝袜 | 久av在线| 99色在线播放 | 99久久夜色精品国产亚洲 | 黄av资源 | 欧美激情精品久久久久久变态 | 日韩一区二区三区高清免费看看 | 亚洲毛片一区二区三区 | 日日夜夜精品免费观看 | 国产精品久久久久高潮 | 国产视频在线观看免费 | 人人爽人人看 | 久久久久99999 | 亚洲精品国产自产拍在线观看 | 久久成人黄色 | 美女黄色网在线播放 | 免费av网址在线观看 | 麻豆视频免费版 | 国产一区二区日本 | 黄色资源在线 | 国产欧美高清 | 99精品欧美一区二区三区黑人哦 | 国产高清视频免费最新在线 | 中文字幕韩在线第一页 | 一区二区三区免费网站 | 黄网站污| 精品国模一区二区 | 亚洲一区二区三区精品在线观看 | 久久久久国产成人精品亚洲午夜 | 欧美日韩亚洲第一 | 91麻豆精品国产91久久久久久久久 | 亚洲免费精品视频 | 日韩av一区二区在线 | 国产成人在线看 | 国产区高清在线 | 天天色天天色天天色 | 99高清视频有精品视频 | 91网站观看 | 伊人亚洲综合网 | 中文永久免费观看 | 岛国av在线不卡 | 日本黄色大片免费看 | 亚洲精品国产精品国自产在线 | 久草电影免费在线观看 | av理论电影 | 亚洲视频 中文字幕 | 国产亚洲午夜高清国产拍精品 | 91亚洲精品久久久久图片蜜桃 | 久草五月 | 亚洲精品资源在线 | 国产色在线| 免费观看丰满少妇做爰 | 天天操狠狠操夜夜操 | 午夜精品婷婷 | 99久久久久免费精品国产 | 高清有码中文字幕 | 国产一二三区av | 在线免费成人 | 久久成人午夜视频 | 久草国产在线 | 亚洲精品合集 | 黄污在线观看 | 国内精品免费 | 黄色大片日本免费大片 | 日韩精品在线一区 | 亚洲欧美视频在线播放 | 91麻豆免费看 | 亚洲蜜桃在线 | 日韩成人免费观看 | 成人在线视频免费观看 | 亚洲精品在线观看av | 349k.cc看片app| av在观看 | 超碰99人人 | 夜夜躁日日躁 | 97理论电影| 超薄丝袜一二三区 | 日韩在线视频不卡 | 久久九九网站 | 精品国产免费一区二区三区五区 | 黄色av电影免费观看 | 亚洲高清视频在线观看 | 成人小视频免费在线观看 | 日韩av电影中文字幕 | 精品国产一区二区三区久久久蜜月 | 国产看片 色 | 日韩中文字幕免费在线播放 | 99久久激情 | 成人在线免费视频 | 99在线高清视频在线播放 | 日韩va亚洲va欧美va久久 | 91.麻豆视频 | 最新成人av| 91尤物国产尤物福利在线播放 | 91亚洲精品久久久蜜桃 | 精品久久久久久亚洲 | 天天曰视频| 免费黄色网址网站 | 国产精品热 | 日韩a级免费视频 | 91女子私密保健养生少妇 | 爱色av.com | 狠狠狠狠狠狠天天爱 | 免费午夜网站 | 久久免费资源 | 丁香九月激情综合 | 美女av免费看 | 久久久精选 | 黄色一级在线观看 | 久久 一区 | 超碰人人91| 色窝资源 | 91麻豆精品国产自产在线 | 久久综合综合久久综合 | 天天做综合网 | 久久精品毛片 | 国产视频手机在线 | 成人午夜免费福利 | 欧洲一区精品 | 亚洲综合视频在线观看 | 中文一二区 | 日韩免费看| 99精品国产一区二区 | 久久久久久蜜桃一区二区 | 精品成人网| 亚洲激情p | 亚洲欧美观看 | 国产成人av片 | 亚洲六月丁香色婷婷综合久久 | 97涩涩视频 | 在线a视频免费观看 | 成人黄色大片在线免费观看 | 久久美女视频 | 国产在线观看免费观看 | 操操操综合 | 天天射天天添 | 天堂资源在线观看视频 | 99r在线 | 91av欧美| 五月激情在线 | 黄色在线网站噜噜噜 | 久久这里有精品 | 日日干精品 | 激情欧美一区二区三区免费看 | 操少妇视频 | 又粗又长又大又爽又黄少妇毛片 | 精品国产一区二区三区久久久 | 夜夜爽www| 超碰在线日本 | 天天躁日日躁狠狠躁av中文 | 婷婷色网站 | 免费三级av | 色中射 | 久久久久久久久久久久99 | 黄色在线观看污 | 亚洲国产中文字幕在线视频综合 | 欧美激情一区不卡 | 99精品免费久久久久久日本 | 五月天婷婷综合 | 欧美激情另类 | 日韩在线视频线视频免费网站 | 国产探花视频在线播放 | 日本在线精品视频 | 久久毛片高清国产 | 国产午夜三级一二三区 | 亚洲成人精品 | 91精品网站 | 天天干天天射天天插 | 国产原创av片 | 亚洲aⅴ乱码精品成人区 | av在线电影播放 | 成人在线观看你懂的 | 香蕉视频免费在线播放 | 日韩av电影国产 | 日本久久久亚洲精品 | 国产一级片免费观看 | 亚洲人视频在线 | 最新婷婷色 | av黄色国产 | 在线国产欧美 | 久久婷婷开心 | 精品久久久久久亚洲 | 成人午夜精品 | 亚洲色图激情文学 | 99精品在线观看 | 麻豆视频www | 国产精品99久久久久久小说 | aa级黄色大片 | 成人亚洲精品国产www | 992tv人人网tv亚洲精品 | 欧美成人日韩 | 国产精品热 | 国产三级在线播放 | 欧美精品做受xxx性少妇 | 久久免费视频在线 | 亚洲精品电影在线 | 久久夜夜操 | 91系列在线观看 | 久久人人精品 | 国产小视频在线免费观看视频 | 在线三级中文 | a在线播放 | 在线看片视频 | 亚洲激精日韩激精欧美精品 | 中文字幕乱码亚洲精品一区 | 一区二区三区在线免费 | 色福利网 | 在线日韩一区 | 天天弄天天操 | 美女国产 | 91久久在线观看 | 精品99视频 | 国产专区一 | 国产在线播放不卡 | 日本在线观看视频一区 | 天天色天天射天天综合网 | 国产久视频 | 精品久久久久久久久久久久 | 日韩a级免费视频 | 69视频在线播放 | 狠狠躁夜夜躁人人爽超碰91 | 久草在线视频网站 | 欧美国产日韩在线观看 | 麻豆免费视频观看 | 午夜三级大片 | 人人爽网站| 9999精品 | 亚洲黄色在线播放 | 成人啪啪18免费游戏链接 | 国产精品精品久久久久久 | 在线观看视频一区二区 | 五月香视频在线观看 | 欧美国产日韩中文 | 九九热在线观看 | 国产日本在线播放 | 中文免费| 国产精品日韩高清 | 日韩 在线 | 国产精品电影在线 | 日韩69av | 欧美人交a欧美精品 | 又黄又爽又色无遮挡免费 | 亚洲自拍自偷 | 日免费视频 | 香蕉免费在线 | 五月激情av| 97天堂网 | 日韩在线观看一区二区三区 | 国产在线精品国自产拍影院 | 亚洲国产精品一区二区久久hs | 在线v片免费观看视频 | 日本激情中文字幕 | 在线有码中文字幕 | 激情丁香5月 | 黄在线免费看 | 欧美性做爰猛烈叫床潮 | 久久综合影视 | 中文字幕av最新 | 99爱视频 | 国内精品久久久久影院一蜜桃 | 精品免费观看视频 | 日本高清dvd| www.天天干 | a在线一区 | 久久精品成人 | 国产资源网 | 亚洲va欧美va | 国产xx视频| 国产自偷自拍 | 国产一区二区精品久久 | 久久电影国产免费久久电影 | 天天干,天天操,天天射 | 亚洲少妇久久 | av一级久久| 九九爱免费视频在线观看 | 婷婷视频在线播放 | 粉嫩av一区二区三区四区在线观看 | 久久超碰99| 国产精品第二页 | 人人澡人摸人人添学生av | 成人久久亚洲 | 色婷婷88av视频一二三区 | 国产精品永久免费在线 | 久久国产免费看 | 国产高h视频 | 久久午夜鲁丝片 | 永久中文字幕 | 国产在线精品一区二区 | 久草精品免费 | 成人免费xxxxxx视频 | 久久五月天婷婷 | 欧洲亚洲精品 | 91精品中文字幕 | 色姑娘综合 | 亚洲电影久久 | 精品一区二区久久久久久久网站 | 日本久久久久久久久 | 中文字幕在线视频网站 | 亚洲国产资源 | 国产亚洲精品电影 | 久久99操 | 国产99久久久国产精品成人免费 | 中文字幕日韩精品有码视频 | 69国产精品视频免费观看 | 最近日本韩国中文字幕 | 成人国产精品一区 | 91香蕉嫩草 | 偷拍福利视频一区二区三区 | 美女视频黄频 | 丁香六月av | 久久成人午夜视频 | 日日干日日 | 日韩综合在线观看 | 国产精品18久久久久久久网站 | 国产视频精品免费 | 国产精品 9999| 精品视频亚洲 | 日批视频在线 | 伊人久久电影网 | 亚洲精品视频在线观看视频 | 午夜丁香视频在线观看 | 中午字幕在线观看 | 超碰97人人爱 | 久草在线费播放视频 | 香蕉视频在线视频 | 人人干网站 | 蜜臀久久99静品久久久久久 | 久久久精品一区二区三区 | 在线观看成人av | av丝袜美腿 | 国产精品久久久777 成人手机在线视频 | 欧美大jb| 欧美成年黄网站色视频 | 欧美在线观看小视频 | 日韩av成人在线 | 亚洲综合在线视频 | 久久久久久看片 | 成人欧美亚洲 | 国产一二区精品 | 天天摸天天操天天爽 | 精品九九九九 | 黄色a级片在线观看 | 狂野欧美激情性xxxx欧美 | 综合久久精品 | 国产在线观看你懂得 | 国产精品中文字幕在线观看 | 热久久精品在线 | 蜜臀久久99精品久久久久久网站 | 久久久wwww| 亚洲免费一级电影 | 中文字幕第一页在线vr | 992tv在线成人免费观看 | 美女黄久久| 色资源网在线观看 | 国产一区二区三区高清播放 | 99国产精品一区 | 99久久精品久久久久久清纯 | 亚洲欧美婷婷六月色综合 | 天天爱天天爽 | www国产亚洲精品久久网站 | 爱色婷婷| 国产精品69av | 日韩黄色影院 | 91成人免费观看视频 | 久久国产精品99久久久久久丝袜 | 韩日精品在线观看 | 国产97视频在线 | 久精品视频 | 欧美日韩国产欧美 | 欧美一区二区三区在线 | 国产精品大全 | 91久草视频 | 97国产大学生情侣酒店的特点 | 天天操网址 | 亚洲成人资源 | 久久 精品一区 | 久久草| 91禁在线看 | 啪啪免费视频网站 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 日韩一级片观看 | 国产精品久久久久久久午夜 | 久久另类小说 | 瑞典xxxx性hd极品 | 一级黄色大片在线观看 | 国产最新网站 | 日韩免费电影一区二区 | 国产色视频网站2 | 88av网站 | 黄视频色网站 | 日韩亚洲精品电影 | 久久久香蕉视频 | 久久久久久久综合色一本 | 欧美日韩免费观看一区=区三区 | 天天狠狠干 | 91视频国产高清 | 天天弄天天操 |