日韩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ò),歡迎將生活随笔推薦給好友。

国产黄色资源 | 国产精品99久久久久的智能播放 | 日韩午夜电影 | 天堂在线视频免费观看 | 激情久久五月天 | 亚洲影院天堂 | 日本三级不卡视频 | 99国产精品免费网站 | 国产成人精品三级 | 亚州精品在线视频 | 在线观看mv的中文字幕网站 | 国产一区免费 | 色播五月婷婷 | av网站在线免费观看 | 亚洲精品午夜aaa久久久 | 天堂av在线网 | 黄网站免费大全入口 | 国产精品永久在线观看 | 开心激情五月网 | 久久久久成人精品 | 国产精成人品免费观看 | 91视频xxxx| 婷婷六月丁 | 在线国产精品视频 | 毛片一区二区 | 四虎在线免费 | 日本久久久久久久久 | 国产免费成人 | 亚洲 中文 在线 精品 | 国产精品专区一 | 天天射射天天 | 日本黄区免费视频观看 | 日本久久久久久科技有限公司 | 黄色在线成人 | 国产高清不卡一区二区三区 | 黄av免费在线观看 | 韩国av免费看 | 揉bbb玩bbb少妇bbb | 国产三级国产精品国产专区50 | 天堂久久电影网 | 久久久亚洲国产精品麻豆综合天堂 | 久操视频在线免费看 | 人人艹视频 | av在线电影免费观看 | 国产一级视频在线观看 | 国产精品第10页 | 亚洲精品女 | 国产特级毛片 | 成年人黄色在线观看 | 日韩欧美成 | 欧美a视频在线观看 | 丁香婷婷综合色啪 | 狠狠久久 | 久久在线观看 | 蜜桃视频日本 | 亚洲一区二区三区四区精品 | 久久久蜜桃一区二区 | 亚洲日韩欧美一区二区在线 | 91mv.cool在线观看| 国产在线久久久 | 亚洲午夜精品久久久久久久久久久久 | 免费午夜在线视频 | 插插插色综合 | 99视频一区 | 午夜精品麻豆 | 久久久久免费精品国产 | 射九九| 在线性视频日韩欧美 | 夜夜干夜夜 | 国产精品国产毛片 | 日韩av一区二区三区 | 日韩视| 在线观看中文字幕dvd播放 | 天天拍天天色 | 人人搞人人搞 | 亚洲三级网 | 久章草在线观看 | 一区二区三区高清 | 国产精品美女久久久久久网站 | 久久国产成人午夜av影院潦草 | 亚洲精品黄色在线观看 | 日韩在线观看免费 | 91福利视频免费观看 | 欧美网址在线观看 | 在线观看精品一区 | 亚洲三级精品 | 五月天.com | 欧美a级片网站 | 日韩免费视频观看 | 五月婷婷激情 | 久久五月天色综合 | 人人爱人人做人人爽 | 青春草免费视频 | 欧美aaaxxxx做受视频 | 国产精品 999| 亚洲成人蜜桃 | 日韩理论电影网 | 黄网站色成年免费观看 | 日本精品视频网站 | 黄色在线观看污 | 色多多污污 | 亚洲波多野结衣 | 国产精品va在线 | 国产一区二区视频在线播放 | 日日爱av| 视频在线观看99 | av网站在线观看播放 | 亚洲精品99久久久久久 | 国产精品18久久久久久久久久久久 | 国产精品免费大片视频 | 人人插人人澡 | 久久艹艹 | 91在线永久 | 日本视频网 | 99久久婷婷| 日韩在线视频观看 | 亚洲精品动漫久久久久 | 国产精品久久久久久久久久三级 | 亚洲视频在线观看免费 | 中文在线8资源库 | 精品国产免费观看 | 免费a v视频 | 日韩欧美在线观看一区二区 | 偷拍福利视频一区二区三区 | 久久精品一区二区三区四区 | 久久精品观看 | 999久久国产精品免费观看网站 | 久久99精品久久久久蜜臀 | 特级毛片在线免费观看 | 欧美一区二区在线免费观看 | 免费碰碰 | 五月天久久婷婷 | 久久精品国产亚洲aⅴ | 久久视频精品 | 久久九九影视网 | 亚洲女裸体 | 久久999久久 | 美女久久久久 | 日韩专区在线播放 | 成人h动漫在线看 | 久久亚洲综合国产精品99麻豆的功能介绍 | 91九色视频国产 | 国产第一二区 | 看黄色91 | 亚洲精品国产精品乱码在线观看 | 国产原创91| 麻豆91在线看 | 黄色毛片视频免费 | 91精品国产91久久久久福利 | 精品视频中文字幕 | av在线免费观看不卡 | 日韩午夜电影网 | 美女视频久久久 | 亚洲成av人片在线观看 | 偷拍福利视频一区二区三区 | 成人精品在线 | 视频国产在线观看18 | 国产日韩在线一区 | 国产999精品久久久影片官网 | 96国产精品 | 久久精品中文字幕一区二区三区 | 国产粉嫩在线 | 日本不卡一区二区 | 久久久在线免费观看 | 国产精国产精品 | 91麻豆精品国产91久久久无需广告 | 亚洲欧美日韩一区二区三区在线观看 | 精品久久久久久久久久久久 | 永久黄网站色视频免费观看w | 91在线视频免费91 | 国产网红在线观看 | 国产五码一区 | 香蕉视频在线网站 | 美女网站在线观看 | 91精品国自产在线观看欧美 | 色婷婷99| 久久久久国产一区二区三区四区 | 日本99久久 | 伊人午夜视频 | 国产亚洲精品久久久久久久久久久久 | 91九色视频在线 | 欧美一区二区三区特黄 | 久草视频免费在线观看 | 伊人官网| 韩国一区在线 | 99精品欧美一区二区 | 日韩在线观 | 婷婷精品| 高潮毛片无遮挡高清免费 | 成人在线观看免费视频 | 日日夜夜人人精品 | 中文字幕在线视频第一页 | 欧美大香线蕉线伊人久久 | 夜夜躁日日躁狠狠久久88av | 综合色中文 | 久久久久综合视频 | 亚洲亚洲精品在线观看 | 日韩av播放在线 | 免费日韩av电影 | 日韩在线观看中文字幕 | 国产精品麻豆视频 | 亚洲精品乱码久久久久久写真 | 欧美激情va永久在线播放 | 五月婷婷六月综合 | 日本黄色大片免费看 | 免费观看全黄做爰大片国产 | 婷婷色社区 | 91av视频免费在线观看 | 在线你懂 | 国产最新91 | 日韩中文字幕免费电影 | 日韩精品一区二区三区免费观看视频 | 婷婷av网站| 在线电影av | 亚洲综合爱 | 91久久久久久久一区二区 | 九月婷婷色 | 国产精品毛片一区二区在线看 | 精品国产视频一区 | 日韩电影在线观看一区二区 | 久久国产剧场电影 | www.色综合.com | 97超碰资源 | 嫩草伊人久久精品少妇av | 激情综合网婷婷 | 狠狠干我| 久久久久成人精品免费播放动漫 | 一区二区三区四区精品 | 日韩大片在线免费观看 | 五月婷婷开心 | 五月激情综合婷婷 | 日韩成人免费电影 | 久久视频6 | 青春草免费在线视频 | 亚洲视频久久久 | www.综合网.com| 五月婷婷,六月丁香 | 成年人免费av | 亚洲精品免费看 | www.超碰97.com| 久产久精国产品 | 亚洲精品国产精品99久久 | 国产女人40精品一区毛片视频 | 99久久精品日本一区二区免费 | 日韩在线不卡视频 | 最新免费av在线 | 精品一区二区三区电影 | 亚洲伊人网在线观看 | www视频在线播放 | 久草av在线播放 | 狠狠操狠狠干2017 | 色偷偷88欧美精品久久久 | 日韩在线视频观看免费 | 久久久精品日本 | 免费色婷婷 | 美女免费视频一区 | 狠狠狠狠狠狠狠狠 | 免费在线观看成人 | 国产精品18久久久 | 精品一区二区在线看 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 国产精品18久久久久久久网站 | 亚洲精品国产精品乱码不99热 | 国产成人性色生活片 | 五月婷婷黄色网 | 久久午夜色播影院免费高清 | 亚洲资源网 | 国产一区二区在线免费视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久久久在线观看 | 久久综合色一综合色88 | 福利网在线 | 中文字幕精品三级久久久 | 在线香蕉视频 | 又污又黄的网站 | 国产乱对白刺激视频在线观看女王 | 女人18片 | 久久综合五月天婷婷伊人 | 最近免费中文字幕mv在线视频3 | 久久久久免费精品视频 | 亚洲精品视频在线免费播放 | 国产精品久久综合 | 免费毛片一区二区三区久久久 | 日韩av中文 | 在线亚洲人成电影网站色www | 91九色蝌蚪在线 | 久久国产亚洲 | 黄色国产高清 | 日韩av一区二区在线影视 | 永久免费av在线播放 | 欧美日韩国产精品一区二区亚洲 | 日韩久久精品一区二区 | 97视频播放 | 国产精品理论片在线观看 | 99婷婷| 国产精品久久久一区二区三区网站 | 天天天操操操 | 在线观看黄a | 91在线色| 视频二区在线 | 久草视频在线资源站 | 91精品入口 | 久草精品在线 | 看片黄网站 | 99超碰在线观看 | 久久久久网址 | 日韩 在线观看 | 美女露久久 | 国产二级视频 | 欧美精品久 | 国产大陆亚洲精品国产 | 91欧美国产 | 色综合网在线 | www.色综合.com| 日韩在线观看视频中文字幕 | 日韩在线视频免费播放 | 色香蕉网| 成片视频免费观看 | 精品国产免费av | 国产日韩在线观看一区 | 日本久久综合网 | 久久a视频 | 国产精品免费在线视频 | 欧美少妇影院 | 久久97久久97精品免视看 | 日日干天天操 | 国产精品一区二区三区久久久 | jizzjizzjizz亚洲 | 国产麻豆精品传媒av国产下载 | 99久视频| 中文有码在线 | 天天操天天操天天操天天操 | 久久这里只有精品视频99 | 国产免码va在线观看免费 | 久久av中文字幕片 | 在线观看视频在线观看 | 丁香五婷 | 久久a久久 | 国产日韩精品一区二区三区在线 | 中文字幕在线日亚洲9 | 91超在线| 免费日韩电影 | 国产精品一区二区三区免费视频 | 国产视频精品视频 | 日韩专区视频 | 亚洲国产视频网站 | 99精品视频免费观看 | 欧美精品久久久久久久亚洲调教 | 免费看v片网站 | 黄色三级免费网址 | 国产福利在线不卡 | 免费观看9x视频网站在线观看 | 免费av网址在线观看 | 成人久久久久久久久久 | 国产成人一区二区三区影院在线 | 中文字幕在线有码 | 五月婷婷久久丁香 | 97在线视频免费播放 | 国产高清一区二区 | wwxxxx日本| 91麻豆网 | 天天av在线播放 | 亚洲午夜大片 | 日韩av电影一区 | 973理论片235影院9 | 亚洲精品美女在线 | 在线亚洲成人 | 国产黄色观看 | 99爱精品在线 | 日p视频 | 国产精品一区二区视频 | 中文免费观看 | 亚洲国产精品久久久久婷婷884 | 亚洲一区精品二人人爽久久 | 九九99靖品 | a√天堂中文在线 | 高清av中文在线字幕观看1 | 福利一区在线 | 日韩视频在线不卡 | 激情在线免费视频 | 国产视频美女 | 人人模人人爽 | 波多野结衣在线播放一区 | 久久情网 | 中文字幕免费播放 | 91完整版在线观看 | 亚洲欧美乱综合图片区小说区 | 国内精品在线看 | 欧美日韩高清免费 | 国产理论一区二区三区 | 曰韩在线 | 伊人狠狠色丁香婷婷综合 | 久久福利影视 | 中文成人字幕 | www日韩在线 | 国产区高清在线 | 99精品视频精品精品视频 | 在线影院中文字幕 | 天天曰天天射 | 成人一区二区在线 | 一区 在线观看 | 精品国产a | 久久老司机精品视频 | 四虎精品成人免费网站 | 亚洲免费视频观看 | www.com.日本一级 | 婷婷丁香色综合狠狠色 | 444av| 色综合久久天天 | 337p欧美 | 久久视频免费在线观看 | 国产在线精品福利 | 亚洲黄色影院 | 草久在线观看 | 久久精品亚洲国产 | 福利视频一区二区 | 在线午夜电影神马影院 | 国内外成人免费在线视频 | 天天综合狠狠精品 | 亚洲精品国产精品国自产 | 99久久99精品| 国产偷国产偷亚洲清高 | 天天摸夜夜操 | 成年人在线观看网站 | 久久久久久久久久久久久久av | 久久久久久久久久电影 | 国产精品乱码久久久 | 九九九电影免费看 | 国产xvideos免费视频播放 | 国产精品亚洲精品 | 欧美性猛片, | 东方av免费在线观看 | 国产又黄又爽又猛视频日本 | 国内精品福利视频 | 中文字幕一区二区三 | 91电影福利| 精品久久99 | 99久久这里只有精品 | 亚洲高清av在线 | 欧美精品在线一区二区 | 国产999精品久久久久久麻豆 | 亚洲91精品在线观看 | 国产免费美女 | 日韩精品免费在线观看视频 | 91人人澡人人爽人人精品 | 亚洲精品视频在线观看网站 | 久草网站 | 亚洲精品国久久99热 | 91视频高清完整版 | 午夜在线日韩 | www久久精品 | 久久国产视频网 | 午夜久久福利视频 | 欧洲色吧| 国产成人一区二区三区在线观看 | 日韩av午夜在线观看 | 97精品国产97久久久久久 | 亚洲在线色| 国产视频在线一区二区 | 中文视频一区二区 | 精品国产伦一区二区三区免费 | 在线视频 国产 日韩 | 亚洲人在线 | 91成人在线观看高潮 | 日本最新一区二区三区 | 午夜精品一二三区 | 日韩在线观看你懂的 | 日韩美在线| 亚洲最大免费成人网 | 综合久久精品 | 欧美怡红院视频 | 日本精品久久久一区二区三区 | 人人插人人艹 | 久久久久免费精品国产 | 免费黄色在线网址 | 色欧美成人精品a∨在线观看 | 国产一区二三区好的 | 久久天| 黄色aaa毛片 | 国产精品一区二区果冻传媒 | 91片黄在线观 | 国产精品露脸在线 | 人人爱人人射 | 久久99网| 亚洲综合小说 | 日韩毛片在线一区二区毛片 | 国产色久| 国产精品日韩 | 国产手机视频在线观看 | 国产成人精品一区二区 | 欧美亚洲一区二区在线 | 天天色天天综合网 | 人人澡人人爱 | 亚洲va男人天堂 | av在线播放网址 | 五月天综合激情网 | 久久久www免费电影网 | 91精品免费在线视频 | 国产裸体视频网站 | 香蕉久草 | 久影院 | av片在线看 | 国产欧美日韩视频 | 久久久久久久久久久精 | 欧美性大战 | 国产精品aⅴ | 91中文字幕视频 | 日韩高清黄色 | 在线欧美小视频 | 天天操夜夜操夜夜操 | 成人黄性视频 | 狠狠色狠狠色综合日日92 | 亚洲春色成人 | 五月天久久久久 | 国产精品成人免费一区久久羞羞 | 亚洲国产精品久久久久婷婷884 | 久久亚洲二区 | 99久久精品日本一区二区免费 | av福利免费 | 高潮久久久久久 | av免费看电影 | 激情黄色av| 伊人小视频| a黄色大片 | 国产麻豆精品95视频 | 成人黄色在线 | 九九免费在线观看 | 日韩精品网址 | 国产成人三级一区二区在线观看一 | 欧美乱码精品一区二区 | 久久久99久久 | 亚洲国产日韩一区 | 成人91av| 91国内在线视频 | 久久精品国产免费看久久精品 | 久久亚洲免费 | 99热精品免费观看 | 99r在线| 日韩av午夜| 怡红院av久久久久久久 | 天天操夜操视频 | 亚洲精品午夜视频 | 激情视频一区二区三区 | 九色视频网 | 天天干天天做 | 黄网站色成年免费观看 | 看黄色91 | 日韩av不卡在线播放 | 免费在线观看亚洲视频 | 91在线成人| 麻豆影视网 | 91精品国产欧美一区二区成人 | 成人精品在线 | 伊人婷婷| 爱情影院aqdy鲁丝片二区 | 在线看小早川怜子av | 亚洲精品www | 国产精品资源在线 | 欧美午夜视频在线 | 日韩狠狠操 | 久草观看| av中文字幕网址 | 在线视频观看你懂的 | 国产五十路毛片 | 国产亚洲精品美女 | 国产欧美高清 | 成人福利在线 | 日韩一区二区免费在线观看 | 久久高清免费视频 | 国产伦理久久精品久久久久_ | 在线看片视频 | av亚洲产国偷v产偷v自拍小说 | 人人澡人 | 久久中文网| 天天色.com| 成人免费在线看片 | 午夜精品久久久久久久久久久 | 九九久久国产精品 | 2019中文在线观看 | 99久e精品热线免费 99国产精品久久久久久久久久 | 在线观看中文字幕一区二区 | 国产成人福利在线观看 | 黄色1级大片 | 日韩影视精品 | 国产精品美女久久久久久2018 | 国产精品国产三级在线专区 | 亚洲黄色一级大片 | 成人久久久精品国产乱码一区二区 | av在线免费观看网站 | 久久在线视频在线 | 天天干天天拍天天操天天拍 | 99日精品| av网站免费线看精品 | 欧美日韩高清一区二区 | 久久人人爽人人爽人人片av免费 | 国产成人av一区二区三区在线观看 | 国产 一区二区三区 在线 | 97精品国产91久久久久久久 | 免费观看一级成人毛片 | 黄色a大片 | 最近中文字幕完整高清 | 色在线网| 亚洲三级毛片 | 天天躁日日躁狠狠躁av中文 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 日韩av电影网站在线观看 | 亚洲欧美偷拍另类 | 在线精品视频免费播放 | 精品国产电影 | 日本精品视频免费观看 | 免费观看性生交 | 欧美网址在线观看 | 日韩欧美国产精品 | 91九色在线观看 | 日韩久久视频 | 久草在线99 | 久草视频在线新免费 | 99久久日韩精品免费热麻豆美女 | 国产成人久久av977小说 | 高清视频一区二区三区 | 在线免费观看国产视频 | 视频三区 | 国产一区二区不卡视频 | 97超级碰碰碰视频在线观看 | 亚洲欧洲一区二区在线观看 | 国产91精品看黄网站在线观看动漫 | 激情欧美xxxx | 一本一道久久a久久综合蜜桃 | 免费高清在线观看成人 | 国产中出在线观看 | 亚洲综合成人在线 | 久久综合九色综合97婷婷女人 | 综合网av | 成人久久久久久久久 | 啪啪免费观看网站 | 天天综合人人 | 久久五月婷婷丁香社区 | 午夜免费电影院 | 天天五月天色 | 国产精品免费一区二区三区在线观看 | 激情九九 | 日韩一区在线播放 | 色中文字幕在线观看 | 一区二区三区在线免费观看 | 欧美一区二区三区激情视频 | 最近中文字幕第一页 | 成人黄色在线观看视频 | 美女免费电影 | 欧美日韩视频精品 | 丝袜美腿av | 黄污网站在线 | 国产精品剧情在线亚洲 | 精品免费国产一区二区三区四区 | 草久久精品 | 国产一区高清在线 | 久久免费毛片 | 成人国产精品一区二区 | 久久久网址| 99精品国产视频 | 国产精品大片在线观看 | 一级黄色片在线免费观看 | www.xxxx变态.com| 国产精品初高中精品久久 | 激情视频免费在线观看 | 在线观看国产区 | 久草在线在线精品观看 | 欧美做受高潮 | 97超碰资源网 | 五月天丁香综合 | 中文字幕国内精品 | 久久嗨 | 国产日韩三级 | 久久综合五月 | 欧美激情h| 在线免费观看麻豆视频 | 欧美国产不卡 | 超碰在线最新地址 | 97在线视频免费观看 | 三级午夜片 | 夜夜夜夜操 | 黄色av网站在线免费观看 | 久久久免费| 国产69精品久久久久9999apgf | 天天综合入口 | 日本中文字幕在线免费观看 | 手机在线日韩视频 | 日韩特黄av| 热久久国产 | 中文字幕a∨在线乱码免费看 | 亚洲黄色激情小说 | 午夜影院一级片 | 日本久久精品 | 国产精品理论视频 | 人人看黄色 | 国产99精品 | 日韩在线不卡视频 | 日韩va欧美va亚洲va久久 | 国产一级一级国产 | 婷婷色在线观看 | 午夜在线看 | 欧美高清视频不卡网 | 国产一级免费电影 | 国产精品久久一 | 超碰夜夜 | 日韩精品中文字幕一区二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产高清视频在线播放 | 久久成人精品电影 | av 一区二区三区四区 | 久久天堂亚洲 | 一本一道久久a久久精品蜜桃 | 色婷婷亚洲 | 成片人卡1卡2卡3手机免费看 | 九色视频网址 | 日韩网站在线 | 97超碰免费 | 久久精品视频在线免费观看 | 99久久久久久久久久 | 在线成人观看 | 亚洲欧洲精品视频 | 日韩狠狠操 | 看毛片网站 | 成年人在线看片 | 96亚洲精品久久 | 免费看片网页 | 鲁一鲁影院 | 日韩欧美在线免费观看 | 亚洲日本国产 | 最近日本中文字幕 | 中文字幕精品一区久久久久 | 肉色欧美久久久久久久免费看 | 麻豆视频免费入口 | 国产视频日韩视频欧美视频 | 午夜精品久久一牛影视 | 婷婷丁香激情 | 成人精品在线 | 五月色丁香 | 亚洲丝袜一区二区 | 成人少妇影院yyyy | 国产97在线视频 | 成人av午夜| 免费看黄色91 | 久久伊人八月婷婷综合激情 | 五月天久久久久久 | 久久久久久久久免费 | av网站手机在线观看 | 日韩免费一区二区 | 亚洲精品一区二区网址 | 麻豆视频在线免费 | 久久精品精品电影网 | 九九交易行官网 | 欧美精品乱码久久久久 | 久久久噜噜噜久久久 | 操久| 天天综合精品 | 夜夜操综合网 | 国产黄色片在线 | 天天干天天玩天天操 | 国产91精品一区二区麻豆亚洲 | 久久久久欠精品国产毛片国产毛生 | 久草在线视频国产 | 成人羞羞视频在线观看免费 | 高清中文字幕 | 日韩高清不卡一区二区三区 | 西西大胆免费视频 | www.福利| 在线国产专区 | 天天插天天操天天干 | 国产欧美精品xxxx另类 | 欧美精品一区二区蜜臀亚洲 | 成人av电影在线 | 国产成人精品一区二区 | 人人爽人人av | 福利区在线观看 | 激情五月婷婷综合 | 成人av在线网址 | 免费网站观看www在线观看 | 亚州精品一二三区 | 日韩精品久久久久久久电影竹菊 | 亚洲综合成人av | www.色国产 | 国产精品久久久久久影院 | 97超碰人人澡 | 99中文字幕在线观看 | 91色视频| 国产中文字幕在线观看 | 欧美另类调教 | 日韩精品欧美一区 | 国产一级一片免费播放放 | 青青草在久久免费久久免费 | 久久伦理电影网 | 毛片网在线观看 | 日韩色在线 | 最近免费中文视频 | 九九亚洲精品 | 麻豆免费看片 | 久草在线在线视频 | 国产精品久久久久久吹潮天美传媒 | 久久国产亚洲精品 | 国产亚洲欧美在线视频 | 91香蕉视频在线下载 | 在线观看成人av | 国产一区二区精品 | 免费黄色小网站 | 久久久久久免费毛片精品 | 中文字幕一区二区三区在线视频 | 东方av免费在线观看 | 91手机电影 | 这里只有精彩视频 | 天天激情 | 欧美一级特黄aaaaaa大片在线观看 | 91精品人成在线观看 | 99热在线国产 | 天天射天天 | 91免费看黄色 | 精品福利视频在线观看 | 91影视成人| 欧美日韩精品在线观看 | 深爱激情五月婷婷 | 十八岁以下禁止观看的1000个网站 | 国内丰满少妇猛烈精品播放 | 97色婷婷成人综合在线观看 | 国产精品6999成人免费视频 | 偷拍久久久 | 日批视频在线观看免费 | 国内精品久久久久久久久久清纯 | 99久久超碰中文字幕伊人 | 国产美女免费观看 | 国产精品久久在线 | 国产97免费 | 亚洲欧美日韩国产一区二区 | 日韩av网站在线播放 | 午夜电影久久 | 国产美女免费看 | 99国内精品久久久久久久 | 手机在线欧美 | 亚洲综合成人婷婷小说 | 久久视频免费在线观看 | 国产在线视频不卡 | 国产精品成人免费 | 国产精品成人在线观看 | 亚洲精品国产综合99久久夜夜嗨 | 在线观看一级片 | 日韩高清一区 | 亚洲一区精品人人爽人人躁 | a电影免费看 | 一级黄色av | 亚洲va在线va天堂va偷拍 | 又粗又长又大又爽又黄少妇毛片 | 中文字幕日韩电影 | 国产精品毛片一区二区在线 | 国产精品美女久久久久久久网站 | 国产字幕在线播放 | 色网站中文字幕 | 成人影片免费 | 日韩高清观看 | 亚洲精品资源在线观看 | 96亚洲精品久久久蜜桃 | 免费福利视频网 | 免费一区在线 | 亚洲激情视频 | 韩国av在线播放 | 日韩在线观看a | 色综合五月 | 肉色欧美久久久久久久免费看 | 欧美一区二区伦理片 | 天天射天天干天天插 | 成 人 黄 色 视频免费播放 | 国产高清不卡 | 亚洲自拍偷拍色图 | 91高清完整版在线观看 | 97成人在线视频 | 一区二区三区在线观看免费 | 国产精品乱码一区二三区 | 久久在线观看视频 | 美女黄网站视频免费 | 日日操网站 | 国产精品一区免费观看 | 国产又粗又猛又黄视频 | 中文字幕一区二区三区乱码不卡 | 久久久福利视频 | 免费视频一二三 | 9999在线观看| 91av视频导航 | 五月天色丁香 | 一级性视频 | 国产精品theporn| 91中文在线观看 | 欧美大片第1页 | 一区二区在线影院 | 97精品久久人人爽人人爽 | 亚洲 中文 欧美 日韩vr 在线 | 一本一本久久a久久精品综合妖精 | 精品在线观看一区二区 | 91免费看黄色 | 一区二区在线电影 | 亚洲精品美女久久久久网站 | 青草视频在线免费 | 九九热中文字幕 | 综合久久婷婷 | 国产资源在线免费观看 | 亚洲黄色在线播放 | 久久伊人婷婷 | 国产视频精品免费播放 | 国产专区精品视频 | 久久久电影网站 | 国产精久久久 | 久久综合久色欧美综合狠狠 | 国产福利在线不卡 | 伊人婷婷激情 | 亚洲国产大片 | 日韩美av在线 | 中文字幕在线久一本久 | 91伊人久久大香线蕉蜜芽人口 | 日韩有码第一页 | 久艹视频在线观看 | 精品免费 | 99久久久久 | 久久免费视频这里只有精品 | 久久99国产精品久久99 | 国产一卡在线 | 天天操天天射天天 | 在线一区电影 | 精品国产一区二 | 欧美一级日韩三级 | 国产精品刺激对白麻豆99 | 91亚色免费视频 | 久久久国产精品网站 | 欧美精品一区二区蜜臀亚洲 | 婷婷午夜天| 美女啪啪图片 | 男女日麻批 | 亚洲精品99久久久久中文字幕 | 九色福利视频 | 九色91在线视频 | 亚州五月| 99热精品国产一区二区在线观看 | 精品一二区 | 黄色av一区二区 | 在线国产一区 | 日本黄色大片儿 | 特级黄色视频毛片 | 国产免费三级在线观看 | 色香蕉网 | 久久99在线视频 | 九九涩涩av台湾日本热热 | 福利电影久久 | 日b视频国产| av中文字幕剧情 | 久久天天综合网 | a√天堂中文在线 | 久久激情视频 | 国产自产在线视频 | 超级碰碰碰视频 | 天天色天天射天天操 | 国产99久久久国产精品免费看 | 久久成人一区二区 | 日本动漫做毛片一区二区 | 国产精品欧美久久久久天天影视 | 日韩在观看线 | 国产一区二区三区免费观看视频 | 天天爱天天草 | 99免在线观看免费视频高清 | 色婷婷狠狠五月综合天色拍 | 4438全国亚洲精品在线观看视频 | 十八岁以下禁止观看的1000个网站 | 国产一区二区视频在线播放 | 亚洲综合在线发布 | 国产精品久久亚洲 | 在线观看视频你懂 | 免费高清在线视频一区· | 一本一本久久a久久精品综合小说 | 激情综合婷婷 | 国产精品一区二区久久精品 | 国产一区国产二区在线观看 | 国产精品久久久久久a | 1000部国产精品成人观看 | 成人av网站在线观看 | 久久精品99久久 | 国产成人综合在线观看 | 中文字幕视频 | 国产精选视频 | 超碰国产97 | 国产在线国偷精品产拍 | 综合色婷婷 | 在线观看视频黄 | 中文在线中文a | 久久成年人视频 | 青青草国产精品视频 | 中文资源在线观看 | 在线亚洲播放 | 日韩在线首页 | 久久亚洲精品电影 | 久久99久久99精品免费看小说 | 在线亚洲天堂网 | 国产精品久久久久久久久久久久 | 又长又大又黑又粗欧美 | 亚洲一区二区三区四区在线视频 |