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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZooKeeper Dynamic Reconfiguration (dynamicConfigFile) ZooKeeper动态配置

發(fā)布時間:2025/3/18 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZooKeeper Dynamic Reconfiguration (dynamicConfigFile) ZooKeeper动态配置 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
有人翻譯的地址:https://www.cnblogs.com/dupang/p/5649843.html

ZooKeeper Dynamic Reconfiguration

  • Overview
  • Changes to Configuration Format
    • Specifying the client port
    • The standaloneEnabled flag
    • The reconfigEnabled flag
    • Dynamic configuration file
    • Backward compatibility
  • Upgrading to 3.5.0
  • Dynamic Reconfiguration of the ZooKeeper Ensemble
    • API
    • Security
    • Retrieving the current dynamic configuration
    • Modifying the current dynamic configuration
      • General
      • Incremental mode
      • Non-incremental mode
      • Conditional reconfig
      • Error conditions
      • Additional comments
  • Rebalancing Client Connections

Overview

Prior to the 3.5.0 release, the membership and all other configuration parameters of Zookeeper were static - loaded during boot and immutable at runtime. Operators resorted to ''rolling restarts'' - a manually intensive and error-prone method of changing the configuration that has caused data loss and inconsistency in production.

Starting with 3.5.0, “rolling restarts” are no longer needed! ZooKeeper comes with full support for automated configuration changes: the set of Zookeeper servers, their roles (participant / observer), all ports, and even the quorum system can be changed dynamically, without service interruption and while maintaining data consistency. Reconfigurations are performed immediately, just like other operations in ZooKeeper. Multiple changes can be done using a single reconfiguration command. The dynamic reconfiguration functionality does not limit operation concurrency, does not require client operations to be stopped during reconfigurations, has a very simple interface for administrators and no added complexity to other client operations.

New client-side features allow clients to find out about configuration changes and to update the connection string (list of servers and their client ports) stored in their ZooKeeper handle. A probabilistic algorithm is used to rebalance clients across the new configuration servers while keeping the extent of client migrations proportional to the change in ensemble membership.

This document provides the administrator manual for reconfiguration. For a detailed description of the reconfiguration algorithms, performance measurements, and more, please see our paper:

Shraer, A., Reed, B., Malkhi, D., Junqueira, F. Dynamic Reconfiguration of Primary/Backup Clusters. In?USENIX Annual Technical Conference (ATC)?(2012), 425-437

Links:?paper (pdf),?slides (pdf),?video,?hadoop summit slides

Note:?Starting with 3.5.3, the dynamic reconfiguration feature is disabled by default, and has to be explicitly turned on via?reconfigEnabled?configuration option.

Changes to Configuration Format

Specifying the client port

A client port of a server is the port on which the server accepts client connection requests. Starting with 3.5.0 the?clientPort?and?clientPortAddress?configuration parameters should no longer be used. Instead, this information is now part of the server keyword specification, which becomes as follows:

server.<positive id> = <address1>:<port1>:<port2>[:role];[<client port address>:]<client port>

The client port specification is to the right of the semicolon. The client port address is optional, and if not specified it defaults to "0.0.0.0". As usual, role is also optional, it can be?participant?or?observer?(participant?by default).

Examples of legal server statements:

  • server.5 = 125.23.63.23:1234:1235;1236

  • server.5 = 125.23.63.23:1234:1235:participant;1236

  • server.5 = 125.23.63.23:1234:1235:observer;1236

  • server.5 = 125.23.63.23:1234:1235;125.23.63.24:1236

  • server.5 = 125.23.63.23:1234:1235:participant;125.23.63.23:1236

The standaloneEnabled flag

Prior to 3.5.0, one could run ZooKeeper in Standalone mode or in a Distributed mode. These are separate implementation stacks, and switching between them during run time is not possible. By default (for backward compatibility)?standaloneEnabled?is set totrue. The consequence of using this default is that if started with a single server the ensemble will not be allowed to grow, and if started with more than one server it will not be allowed to shrink to contain fewer than two participants.

Setting the flag to?false?instructs the system to run the Distributed software stack even if there is only a single participant in the ensemble. To achieve this the (static) configuration file should contain:

standaloneEnabled=false

With this setting it is possible to start a ZooKeeper ensemble containing a single participant and to dynamically grow it by adding more servers. Similarly, it is possible to shrink an ensemble so that just a single participant remains, by removing servers.

Since running the Distributed mode allows more flexibility, we recommend setting the flag to?false. We expect that the legacy Standalone mode will be deprecated in the future.

The reconfigEnabled flag

Starting with 3.5.0 and prior to 3.5.3, there is no way to disable dynamic reconfiguration feature. We would like to offer the option of disabling reconfiguration feature because with reconfiguration enabled, we have a security concern that a malicious actor can make arbitrary changes to the configuration of a ZooKeeper ensemble, including adding a compromised server to the ensemble. We prefer to leave to the discretion of the user to decide whether to enable it or not and make sure that the appropriate security measure are in place. So in 3.5.3 the?reconfigEnabled?configuration option is introduced such that the reconfiguration feature can be completely disabled and any attempts to reconfigure a cluster through reconfig API with or without authentication will fail by default, unless?reconfigEnabled?is set to?true.

To set the option to true, the configuration file (zoo.cfg) should contain:

reconfigEnabled=true

Dynamic configuration file

Starting with 3.5.0 we're distinguishing between dynamic configuration parameters, which can be changed during runtime, and static configuration parameters, which are read from a configuration file when a server boots and don't change during its execution. For now, the following configuration keywords are considered part of the dynamic configuration:?server,?group?and?weight.

Dynamic configuration parameters are stored in a separate file on the server (which we call the dynamic configuration file). This file is linked from the static config file using the new?dynamicConfigFile?keyword.

Example

zoo_replicated1.cfg tickTime=2000 dataDir=/zookeeper/data/zookeeper1 initLimit=5 syncLimit=2 dynamicConfigFile=/zookeeper/conf/zoo_replicated1.cfg.dynamic zoo_replicated1.cfg.dynamic server.1=125.23.63.23:2780:2783:participant;2791 server.2=125.23.63.24:2781:2784:participant;2792 server.3=125.23.63.25:2782:2785:participant;2793

When the ensemble configuration changes, the static configuration parameters remain the same. The dynamic parameters are pushed by ZooKeeper and overwrite the dynamic configuration files on all servers. Thus, the dynamic configuration files on the different servers are usually identical (they can only differ momentarily when a reconfiguration is in progress, or if a new configuration hasn't propagated yet to some of the servers). Once created, the dynamic configuration file should not be manually altered. Changed are only made through the new reconfiguration commands outlined below. Note that changing the config of an offline cluster could result in an inconsistency with respect to configuration information stored in the ZooKeeper log (and the special configuration znode, populated from the log) and is therefore highly discouraged.

Example 2

Users may prefer to initially specify a single configuration file. The following is thus also legal:

zoo_replicated1.cfg tickTime=2000 dataDir=/zookeeper/data/zookeeper1 initLimit=5 syncLimit=2 clientPort=2791 // note that this line is now redundant and therefore not recommended server.1=125.23.63.23:2780:2783:participant;2791 server.2=125.23.63.24:2781:2784:participant;2792 server.3=125.23.63.25:2782:2785:participant;2793

The configuration files on each server will be automatically split into dynamic and static files, if they are not already in this format. So the configuration file above will be automatically transformed into the two files in Example 1. Note that the clientPort and clientPortAddress lines (if specified) will be automatically removed during this process, if they are redundant (as in the example above). The original static configuration file is backed up (in a .bak file).

Backward compatibility

We still support the old configuration format. For example, the following configuration file is acceptable (but not recommended):

zoo_replicated1.cfg tickTime=2000 dataDir=/zookeeper/data/zookeeper1 initLimit=5 syncLimit=2 clientPort=2791 server.1=125.23.63.23:2780:2783:participant server.2=125.23.63.24:2781:2784:participant server.3=125.23.63.25:2782:2785:participant

During boot, a dynamic configuration file is created and contains the dynamic part of the configuration as explained earlier. In this case, however, the line "clientPort=2791" will remain in the static configuration file of server 1 since it is not redundant -- it was not specified as part of the "server.1=..." using the format explained in the section?Changes to Configuration Format. If a reconfiguration is invoked that sets the client port of server 1, we remove "clientPort=2791" from the static configuration file (the dynamic file now contain this information as part of the specification of server 1).

Upgrading to 3.5.0

Upgrading a running ZooKeeper ensemble to 3.5.0 should be done only after upgrading your ensemble to the 3.4.6 release. Note that this is only necessary for rolling upgrades (if you're fine with shutting down the system completely, you don't have to go through 3.4.6). If you attempt a rolling upgrade without going through 3.4.6 (for example from 3.4.5), you may get the following error:

2013-01-30 11:32:10,663 [myid:2] - INFO [localhost/127.0.0.1:2784:QuorumCnxManager$Listener@498] - Received connection request /127.0.0.1:60876 2013-01-30 11:32:10,663 [myid:2] - WARN [localhost/127.0.0.1:2784:QuorumCnxManager@349] - Invalid server id: -65536

During a rolling upgrade, each server is taken down in turn and rebooted with the new 3.5.0 binaries. Before starting the server with 3.5.0 binaries, we highly recommend updating the configuration file so that all server statements "server.x=..." contain client ports (see the section?Specifying the client port). As explained earlier you may leave the configuration in a single file, as well as leave the clientPort/clientPortAddress statements (although if you specify client ports in the new format, these statements are now redundant).

Dynamic Reconfiguration of the ZooKeeper Ensemble

The ZooKeeper Java and C API were extended with getConfig and reconfig commands that facilitate reconfiguration. Both commands have a synchronous (blocking) variant and an asynchronous one. We demonstrate these commands here using the Java CLI, but note that you can similarly use the C CLI or invoke the commands directly from a program just like any other ZooKeeper command.

API

There are two sets of APIs for both Java and C client.

Reconfiguration API

Reconfiguration API is used to reconfigure the ZooKeeper cluster. Starting with 3.5.3, reconfiguration Java APIs are moved into ZooKeeperAdmin class from ZooKeeper class, and use of this API requires ACL setup and user authentication (see?Security?for more information.).

Note: for temporary backward compatibility, the reconfig() APIs will remain in ZooKeeper.java where they were for a few alpha versions of 3.5.x. However, these APIs are deprecated and users should move to the reconfigure() APIs in ZooKeeperAdmin.java.

Get Configuration API

Get configuration APIs are used to retrieve ZooKeeper cluster configuration information stored in /zookeeper/config znode. Use of this API does not require specific setup or authentication, because /zookeeper/config is readable to any users.

Security

Prior to?3.5.3, there is no enforced security mechanism over reconfig so any ZooKeeper clients that can connect to ZooKeeper server ensemble will have the ability to change the state of a ZooKeeper cluster via reconfig. It is thus possible for a malicious client to add compromised server to an ensemble, e.g., add a compromised server, or remove legitimate servers. Cases like these could be security vulnerabilities on a case by case basis.

To address this security concern, we introduced access control over reconfig starting from?3.5.3?such that only a specific set of users can use reconfig commands or APIs, and these users need be configured explicitly. In addition, the setup of ZooKeeper cluster must enable authentication so ZooKeeper clients can be authenticated.

We also provides an escape hatch for users who operate and interact with a ZooKeeper ensemble in a secured environment (i.e. behind company firewall). For those users who want to use reconfiguration feature but don't want the overhead of configuring an explicit list of authorized user for reconfig access checks, they can set?"skipACL"?to "yes" which will skip ACL check and allow any user to reconfigure cluster.

Overall, ZooKeeper provides flexible configuration options for the reconfigure feature that allow a user to choose based on user's security requirement. We leave to the discretion of the user to decide appropriate security measure are in place.

Access Control

The dynamic configuration is stored in a special znode ZooDefs.CONFIG_NODE = /zookeeper/config. This node by default is read only for all users, except super user and users that's explicitly configured for write access.

Clients that need to use reconfig commands or reconfig API should be configured as users that have write access to CONFIG_NODE. By default, only the super user has full control including write access to CONFIG_NODE. Additional users can be granted write access through superuser by setting an ACL that has write permission associated with specified user.

A few examples of how to setup ACLs and use reconfiguration API with authentication can be found in ReconfigExceptionTest.java and TestReconfigServer.cc.

Authentication

Authentication of users is orthogonal to the access control and is delegated to existing authentication mechanism supported by ZooKeeper's pluggable authentication schemes. See?ZooKeeper and SASL?for more details on this topic.

Disable ACL check

ZooKeeper supports?"skipACL"?option such that ACL check will be completely skipped, if skipACL is set to "yes". In such cases any unauthenticated users can use reconfig API.

Retrieving the current dynamic configuration

The dynamic configuration is stored in a special znode ZooDefs.CONFIG_NODE = /zookeeper/config. The new?config?CLI command reads this znode (currently it is simply a wrapper to?get /zookeeper/config). As with normal reads, to retrieve the latest committed value you should do a?sync?first.

[zk: 127.0.0.1:2791(CONNECTED) 3] config server.1=localhost:2780:2783:participant;localhost:2791 server.2=localhost:2781:2784:participant;localhost:2792 server.3=localhost:2782:2785:participant;localhost:2793 version=400000003

Notice the last line of the output. This is the configuration version. The version equals to the zxid of the reconfiguration command which created this configuration. The version of the first established configuration equals to the zxid of the NEWLEADER message sent by the first successfully established leader. When a configuration is written to a dynamic configuration file, the version automatically becomes part of the filename and the static configuration file is updated with the path to the new dynamic configuration file. Configuration files corresponding to earlier versions are retained for backup purposes.

During boot time the version (if it exists) is extracted from the filename. The version should never be altered manually by users or the system administrator. It is used by the system to know which configuration is most up-to-date. Manipulating it manually can result in data loss and inconsistency.

Just like a?get?command, the?config?CLI command accepts the?-w?flag for setting a watch on the znode, and?-s?flag for displaying the Stats of the znode. It additionally accepts a new flag?-c?which outputs only the version and the client connection string corresponding to the current configuration. For example, for the configuration above we would get:

[zk: 127.0.0.1:2791(CONNECTED) 17] config -c 400000003 localhost:2791,localhost:2793,localhost:2792

Note that when using the API directly, this command is called?getConfig.

As any read command it returns the configuration known to the follower to which your client is connected, which may be slightly out-of-date. One can use the?sync?command for stronger guarantees. For example using the Java API:

zk.sync(ZooDefs.CONFIG_NODE, void_callback, context); zk.getConfig(watcher, callback, context);

Note: in 3.5.0 it doesn't really matter which path is passed to the?sync()?command as all the server's state is brought up to date with the leader (so one could use a different path instead of ZooDefs.CONFIG_NODE). However, this may change in the future.

Modifying the current dynamic configuration

Modifying the configuration is done through the?reconfig?command. There are two modes of reconfiguration: incremental and non-incremental (bulk). The non-incremental simply specifies the new dynamic configuration of the system. The incremental specifies changes to the current configuration. The?reconfig?command returns the new configuration.

A few examples are in:?ReconfigTest.java,?ReconfigRecoveryTest.java?and?TestReconfigServer.cc.

General

Removing servers:?Any server can be removed, including the leader (although removing the leader will result in a short unavailability, see Figures 6 and 8 in the?paper). The server will not be shut-down automatically. Instead, it becomes a "non-voting follower". This is somewhat similar to an observer in that its votes don't count towards the Quorum of votes necessary to commit operations. However, unlike a non-voting follower, an observer doesn't actually see any operation proposals and does not ACK them. Thus a non-voting follower has a more significant negative effect on system throughput compared to an observer. Non-voting follower mode should only be used as a temporary mode, before shutting the server down, or adding it as a follower or as an observer to the ensemble. We do not shut the server down automatically for two main reasons. The first reason is that we do not want all the clients connected to this server to be immediately disconnected, causing a flood of connection requests to other servers. Instead, it is better if each client decides when to migrate independently. The second reason is that removing a server may sometimes (rarely) be necessary in order to change it from "observer" to "participant" (this is explained in the section?Additional comments).

Note that the new configuration should have some minimal number of participants in order to be considered legal. If the proposed change would leave the cluster with less than 2 participants and standalone mode is enabled (standaloneEnabled=true, see the section?The standaloneEnabled flag), the reconfig will not be processed (BadArgumentsException). If standalone mode is disabled (standaloneEnabled=false) then its legal to remain with 1 or more participants.

Adding servers:?Before a reconfiguration is invoked, the administrator must make sure that a quorum (majority) of participants from the new configuration are already connected and synced with the current leader. To achieve this we need to connect a new joining server to the leader before it is officially part of the ensemble. This is done by starting the joining server using an initial list of servers which is technically not a legal configuration of the system but (a) contains the joiner, and (b) gives sufficient information to the joiner in order for it to find and connect to the current leader. We list a few different options of doing this safely.

  • Initial configuration of joiners is comprised of servers in the last committed configuration and one or more joiners, where?joiners are listed as observers.?For example, if servers D and E are added at the same time to (A, B, C) and server C is being removed, the initial configuration of D could be (A, B, C, D) or (A, B, C, D, E), where D and E are listed as observers. Similarly, the configuration of E could be (A, B, C, E) or (A, B, C, D, E), where D and E are listed as observers.?Note that listing the joiners as observers will not actually make them observers - it will only prevent them from accidentally forming a quorum with other joiners.?Instead, they will contact the servers in the current configuration and adopt the last committed configuration (A, B, C), where the joiners are absent. Configuration files of joiners are backed up and replaced automatically as this happens. After connecting to the current leader, joiners become non-voting followers until the system is reconfigured and they are added to the ensemble (as participant or observer, as appropriate).

  • Initial configuration of each joiner is comprised of servers in the last committed configuration +?the joiner itself, listed as a participant.?For example, to add a new server D to a configuration consisting of servers (A, B, C), the administrator can start D using an initial configuration file consisting of servers (A, B, C, D). If both D and E are added at the same time to (A, B, C), the initial configuration of D could be (A, B, C, D) and the configuration of E could be (A, B, C, E). Similarly, if D is added and C is removed at the same time, the initial configuration of D could be (A, B, C, D). Never list more than one joiner as participant in the initial configuration (see warning below).

  • Whether listing the joiner as an observer or as participant, it is also fine not to list all the current configuration servers, as long as the current leader is in the list. For example, when adding D we could start D with a configuration file consisting of just (A, D) if A is the current leader. however this is more fragile since if A fails before D officially joins the ensemble, D doesn’t know anyone else and therefore the administrator will have to intervene and restart D with another server list.

  • Warning

    Never specify more than one joining server in the same initial configuration as participants. Currently, the joining servers don’t know that they are joining an existing ensemble; if multiple joiners are listed as participants they may form an independent quorum creating a split-brain situation such as processing operations independently from your main ensemble. It is OK to list multiple joiners as observers in an initial config.

    If the configuration of existing servers changes or they become unavailable before the joiner succeeds to connect and learn obout configuration changes, the joiner may need to be restarted with an updated configuration file in order to be able to connect.

    Finally, note that once connected to the leader, a joiner adopts the last committed configuration, in which it is absent (the initial config of the joiner is backed up before being rewritten). If the joiner restarts in this state, it will not be able to boot since it is absent from its configuration file. In order to start it you’ll once again have to specify an initial configuration.

    Modifying server parameters:?One can modify any of the ports of a server, or its role (participant/observer) by adding it to the ensemble with different parameters. This works in both the incremental and the bulk reconfiguration modes. It is not necessary to remove the server and then add it back; just specify the new parameters as if the server is not yet in the system. The server will detect the configuration change and perform the necessary adjustments. See an example in the section?Incremental mode?and an exception to this rule in the section?Additional comments.

    It is also possible to change the Quorum System used by the ensemble (for example, change the Majority Quorum System to a Hierarchical Quorum System on the fly). This, however, is only allowed using the bulk (non-incremental) reconfiguration mode. In general, incremental reconfiguration only works with the Majority Quorum System. Bulk reconfiguration works with both Hierarchical and Majority Quorum Systems.

    Performance Impact:?There is practically no performance impact when removing a follower, since it is not being automatically shut down (the effect of removal is that the server's votes are no longer being counted). When adding a server, there is no leader change and no noticeable performance disruption. For details and graphs please see Figures 6, 7 and 8 in the?paper.

    The most significant disruption will happen when a leader change is caused, in one of the following cases:

  • Leader is removed from the ensemble.

  • Leader's role is changed from participant to observer.

  • The port used by the leader to send transactions to others (quorum port) is modified.

  • In these cases we perform a leader hand-off where the old leader nominates a new leader. The resulting unavailability is usually shorter than when a leader crashes since detecting leader failure is unnecessary and electing a new leader can usually be avoided during a hand-off (see Figures 6 and 8 in the?paper).

    When the client port of a server is modified, it does not drop existing client connections. New connections to the server will have to use the new client port.

    Progress guarantees:?Up to the invocation of the reconfig operation, a quorum of the old configuration is required to be available and connected for ZooKeeper to be able to make progress. Once reconfig is invoked, a quorum of both the old and of the new configurations must be available. The final transition happens once (a) the new configuration is activated, and (b) all operations scheduled before the new configuration is activated by the leader are committed. Once (a) and (b) happen, only a quorum of the new configuration is required. Note, however, that neither (a) nor (b) are visible to a client. Specifically, when a reconfiguration operation commits, it only means that an activation message was sent out by the leader. It does not necessarily mean that a quorum of the new configuration got this message (which is required in order to activate it) or that (b) has happened. If one wants to make sure that both (a) and (b) has already occurred (for example, in order to know that it is safe to shut down old servers that were removed), one can simply invoke an update (set-data, or some other quorum operation, but not a?sync) and wait for it to commit. An alternative way to achieve this was to introduce another round to the reconfiguration protocol (which, for simplicity and compatibility with Zab, we decided to avoid).

    Incremental mode

    The incremental mode allows adding and removing servers to the current configuration. Multiple changes are allowed. For example:

    > reconfig -remove 3 -add server.5=125.23.63.23:1234:1235;1236

    Both the add and the remove options get a list of comma separated arguments (no spaces):

    > reconfig -remove 3,4 -add server.5=localhost:2111:2112;2113,6=localhost:2114:2115:observer;2116

    The format of the server statement is exactly the same as described in the section?Specifying the client port?and includes the client port. Notice that here instead of "server.5=" you can just say "5=". In the example above, if server 5 is already in the system, but has different ports or is not an observer, it is updated and once the configuration commits becomes an observer and starts using these new ports. This is an easy way to turn participants into observers and vise versa or change any of their ports, without rebooting the server.

    ZooKeeper supports two types of Quorum Systems – the simple Majority system (where the leader commits operations after receiving ACKs from a majority of voters) and a more complex Hierarchical system, where votes of different servers have different weights and servers are divided into voting groups. Currently, incremental reconfiguration is allowed only if the last proposed configuration known to the leader uses a Majority Quorum System (BadArgumentsException is thrown otherwise).

    Incremental mode - examples using the Java API:

    List<String> leavingServers = new ArrayList<String>(); leavingServers.add("1"); leavingServers.add("2"); byte[] config = zk.reconfig(null, leavingServers, null, -1, new Stat()); List<String> leavingServers = new ArrayList<String>(); List<String> joiningServers = new ArrayList<String>(); leavingServers.add("1"); joiningServers.add("server.4=localhost:1234:1235;1236"); byte[] config = zk.reconfig(joiningServers, leavingServers, null, -1, new Stat());String configStr = new String(config); System.out.println(configStr);

    There is also an asynchronous API, and an API accepting comma separated Strings instead of List<String>. See src/java/main/org/apache/zookeeper/ZooKeeper.java.

    Non-incremental mode

    The second mode of reconfiguration is non-incremental, whereby a client gives a complete specification of the new dynamic system configuration. The new configuration can either be given in place or read from a file:

    > reconfig -file newconfig.cfg?//newconfig.cfg is a dynamic config file, see?Dynamic configuration file

    > reconfig -members server.1=125.23.63.23:2780:2783:participant;2791,server.2=125.23.63.24:2781:2784:participant;2792,server.3=125.23.63.25:2782:2785:participant;2793

    The new configuration may use a different Quorum System. For example, you may specify a Hierarchical Quorum System even if the current ensemble uses a Majority Quorum System.

    Bulk mode - example using the Java API:

    ArrayList<String> newMembers = new ArrayList<String>(); newMembers.add("server.1=1111:1234:1235;1236"); newMembers.add("server.2=1112:1237:1238;1239"); newMembers.add("server.3=1114:1240:1241:observer;1242");byte[] config = zk.reconfig(null, null, newMembers, -1, new Stat());String configStr = new String(config); System.out.println(configStr);

    There is also an asynchronous API, and an API accepting comma separated String containing the new members instead of List<String>. See src/java/main/org/apache/zookeeper/ZooKeeper.java.

    Conditional reconfig

    Sometimes (especially in non-incremental mode) a new proposed configuration depends on what the client "believes" to be the current configuration, and should be applied only to that configuration. Specifically, the?reconfig?succeeds only if the last configuration at the leader has the specified version.

    > reconfig -file <filename> -v <version>

    In the previously listed Java examples, instead of -1 one could specify a configuration version to condition the reconfiguration.

    Error conditions

    In addition to normal ZooKeeper error conditions, a reconfiguration may fail for the following reasons:

  • another reconfig is currently in progress (ReconfigInProgress)

  • the proposed change would leave the cluster with less than 2 participants, in case standalone mode is enabled, or, if standalone mode is disabled then its legal to remain with 1 or more participants (BadArgumentsException)

  • no quorum of the new configuration was connected and up-to-date with the leader when the reconfiguration processing began (NewConfigNoQuorum)

  • -v x?was specified, but the version?y?of the latest configuration is not?x?(BadVersionException)

  • an incremental reconfiguration was requested but the last configuration at the leader uses a Quorum System which is different from the Majority system (BadArgumentsException)

  • syntax error (BadArgumentsException)

  • I/O exception when reading the configuration from a file (BadArgumentsException)

  • Most of these are illustrated by test-cases in?ReconfigFailureCases.java.

    Additional comments

    Liveness:?To better understand the difference between incremental and non-incremental reconfiguration, suppose that client C1 adds server D to the system while a different client C2 adds server E. With the non-incremental mode, each client would first invoke?config?to find out the current configuration, and then locally create a new list of servers by adding its own suggested server. The new configuration can then be submitted using the non-incremental?reconfig?command. After both reconfigurations complete, only one of E or D will be added (not both), depending on which client's request arrives second to the leader, overwriting the previous configuration. The other client can repeat the process until its change takes effect. This method guarantees system-wide progress (i.e., for one of the clients), but does not ensure that every client succeeds. To have more control C2 may request to only execute the reconfiguration in case the version of the current configuration hasn't changed, as explained in the section?Conditional reconfig. In this way it may avoid blindly overwriting the configuration of C1 if C1's configuration reached the leader first.

    With incremental reconfiguration, both changes will take effect as they are simply applied by the leader one after the other to the current configuration, whatever that is (assuming that the second reconfig request reaches the leader after it sends a commit message for the first reconfig request -- currently the leader will refuse to propose a reconfiguration if another one is already pending). Since both clients are guaranteed to make progress, this method guarantees stronger liveness. In practice, multiple concurrent reconfigurations are probably rare. Non-incremental reconfiguration is currently the only way to dynamically change the Quorum System. Incremental configuration is currently only allowed with the Majority Quorum System.

    Changing an observer into a follower:?Clearly, changing a server that participates in voting into an observer may fail if error (2) occurs, i.e., if fewer than the minimal allowed number of participants would remain. However, converting an observer into a participant may sometimes fail for a more subtle reason: Suppose, for example, that the current configuration is (A, B, C, D), where A is the leader, B and C are followers and D is an observer. In addition, suppose that B has crashed. If a reconfiguration is submitted where D is said to become a follower, it will fail with error (3) since in this configuration, a majority of voters in the new configuration (any 3 voters), must be connected and up-to-date with the leader. An observer cannot acknowledge the history prefix sent during reconfiguration, and therefore it does not count towards these 3 required servers and the reconfiguration will be aborted. In case this happens, a client can achieve the same task by two reconfig commands: first invoke a reconfig to remove D from the configuration and then invoke a second command to add it back as a participant (follower). During the intermediate state D is a non-voting follower and can ACK the state transfer performed during the second reconfig comand.

    Rebalancing Client Connections

    When a ZooKeeper cluster is started, if each client is given the same connection string (list of servers), the client will randomly choose a server in the list to connect to, which makes the expected number of client connections per server the same for each of the servers. We implemented a method that preserves this property when the set of servers changes through reconfiguration. See Sections 4 and 5.1 in the?paper.

    In order for the method to work, all clients must subscribe to configuration changes (by setting a watch on /zookeeper/config either directly or through the?getConfig?API command). When the watch is triggered, the client should read the new configuration by invoking?sync?and?getConfig?and if the configuration is indeed new invoke the?updateServerList?API command. To avoid mass client migration at the same time, it is better to have each client sleep a random short period of time before invokingupdateServerList.

    A few examples can be found in:?StaticHostProviderTest.java?and?TestReconfig.cc

    Example (this is not a recipe, but a simplified example just to explain the general idea):

    public void process(WatchedEvent event) {synchronized (this) {if (event.getType() == EventType.None) {connected = (event.getState() == KeeperState.SyncConnected);notifyAll();} else if (event.getPath()!=null && event.getPath().equals(ZooDefs.CONFIG_NODE)) {// in prod code never block the event thread!zk.sync(ZooDefs.CONFIG_NODE, this, null);zk.getConfig(this, this, null);}} } public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {if (path!=null && path.equals(ZooDefs.CONFIG_NODE)) {String config[] = ConfigUtils.getClientConfigStr(new String(data)).split(" "); // similar to config -clong version = Long.parseLong(config[0], 16);if (this.configVersion == null){this.configVersion = version;} else if (version > this.configVersion) {hostList = config[1];try {// the following command is not blocking but may cause the client to close the socket and// migrate to a different server. In practice its better to wait a short period of time, chosen// randomly, so that different clients migrate at different timeszk.updateServerList(hostList);} catch (IOException e) {System.err.println("Error updating server list");e.printStackTrace();}this.configVersion = version; } } }

    總結

    以上是生活随笔為你收集整理的ZooKeeper Dynamic Reconfiguration (dynamicConfigFile) ZooKeeper动态配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    婷婷丁香色 | 欧美一二三专区 | 久久久久久久久久久免费 | 在线观看午夜 | 国产一线天在线观看 | 在线看片一区 | 激情综合一区 | 91一区二区三区在线观看 | 久久网站免费 | 狠狠精品| 香蕉蜜桃视频 | 三级黄色大片在线观看 | 综合激情 | 一级黄色大片在线观看 | 欧美视频不卡 | 亚洲高清精品在线 | av在线短片| 色播五月婷婷 | 国产91综合一区在线观看 | 亚洲国产午夜视频 | 国产精品一区二区无线 | 五月婷婷在线观看视频 | 岛国av在线免费 | 99精品国产一区二区 | 九九热在线视频 | 国产一级免费视频 | 国产精品免费不卡 | 欧美日韩性生活 | 四虎免费在线观看视频 | 成人国产精品久久久久久亚洲 | 国产女人免费看a级丨片 | 国产亚洲精品久久久久久移动网络 | 日韩午夜电影网 | 国产亚洲小视频 | 欧美精品久久久久久久 | 免费观看一区二区三区视频 | 精品欧美一区二区三区久久久 | 国产一级片久久 | 色在线网站| 国产精品视频你懂的 | 国产精品一区在线播放 | 狠狠干电影 | 天堂网av在线 | 亚洲.www | 毛片网站在线观看 | 久久免费a| 青青河边草免费视频 | 国产资源网| 成人av动漫在线观看 | 国产一区视频在线播放 | 国产精品精 | 欧美超碰在线 | 黄色网大全 | 亚洲一区免费在线 | 国语精品免费视频 | www.在线观看av | 一区免费在线 | 99免费精品视频 | 麻豆91在线播放 | 国产va饥渴难耐女保洁员在线观看 | 色鬼综合网 | 欧美激情综合五月 | 免费a级黄色毛片 | 久久午夜羞羞影院 | 亚洲影院一区 | 国产精品观看在线亚洲人成网 | 国产综合久久 | 男女精品久久 | 亚洲欧美婷婷六月色综合 | 成人国产电影在线观看 | 国产色婷婷精品综合在线手机播放 | 精品一区二区三区在线播放 | 久久精品国产精品亚洲 | 在线观看免费一级片 | 国产在线观看你懂得 | 亚洲桃花综合 | 日韩在线视频免费播放 | 日本久久免费电影 | 成年人免费电影在线观看 | 97精品国自产拍在线观看 | 色老板在线 | 日韩a在线看 | 玖玖在线视频观看 | 成人毛片久久 | 99免在线观看免费视频高清 | 久久久久成人精品免费播放动漫 | 91成人精品国产刺激国语对白 | 久久精品小视频 | 日韩字幕在线观看 | 成人av在线资源 | 综合激情网... | 久久观看最新视频 | 国产特级毛片aaaaaa | 色综合久久久久久中文网 | 欧美日韩国产在线一区 | 一区在线观看视频 | 久久久久免费网 | 胖bbbb搡bbbb擦bbbb| 亚洲精品视频中文字幕 | 欧美 高跟鞋交 xxxxhd | 国产精品麻豆三级一区视频 | 91精品秘密在线观看 | 欧美一级特黄aaaaaa大片在线观看 | 免费在线日韩 | 国产97av| 日本久久成人 | 黄色国产高清 | 色视频成人在线观看免 | 亚洲乱码精品久久久久 | 日韩在线电影 | 国产精品久久久久久久久久久久冷 | 国产一二区在线观看 | 亚洲视频电影在线 | 欧美激情片在线观看 | 天天干天天干天天干 | 91传媒免费在线观看 | 欧美黄色特级片 | 午夜天使| www色| av夜夜操| 国产色道| 国产精品自在线拍国产 | 国产中文在线播放 | 999久久精品 | 黄色av一区二区三区 | 国产成人av一区二区三区在线观看 | 五月天丁香亚洲 | 日韩女同一区二区三区在线观看 | 日本色小说视频 | 国产在线播放一区二区 | 久久,天天综合 | 国产成人精品国内自产拍免费看 | 中文乱码视频在线观看 | 97在线影院 | 最近2019年日本中文免费字幕 | 国产亚洲精品女人久久久久久 | 国产成人久久精品一区二区三区 | 韩国av免费观看 | 国精产品一二三线999 | 91视频观看免费 | 骄小bbw搡bbbb揉bbbb | 精品视频99 | 久久视频这里只有精品 | 99久高清在线观看视频99精品热在线观看视频 | 国产精品 日韩 欧美 | 亚洲经典中文字幕 | 国产精品99久久久久人中文网介绍 | 国产电影一区二区三区四区 | 国产精品美女久久久久久 | 成人av免费看 | 久久久在线 | 夜夜躁天天躁很躁波 | 天天躁日日躁狠狠躁 | 国产精品久久久 | 天天射网 | 欧美精品久久久久久久免费 | 91亚洲激情 | 激情五月六月婷婷 | 999久久久久久久久 69av视频在线观看 | 日韩精品播放 | 超碰97人人在线 | 综合网色 | 999抗病毒口服液 | 欧美日韩在线免费视频 | 国产精品高清免费在线观看 | 在线日韩中文 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 天天综合网国产 | 久久高清av | 日韩久久久久久久久 | 亚洲国产一区二区精品专区 | 五月婷婷国产 | 豆豆色资源网xfplay | 香蕉97视频观看在线观看 | 成人黄大片视频在线观看 | 免费在线观看黄 | 国产色婷婷精品综合在线手机播放 | 久久精品国产精品亚洲精品 | 欧美一区二区三区在线播放 | 在线你懂 | 久久久久国产成人精品亚洲午夜 | 免费看一级黄色大全 | 亚洲日本成人网 | 婷婷网站天天婷婷网站 | 国产精品久久片 | 国产精品18久久久久久久久久久久 | 国精产品999国精产品岳 | 在线欧美小视频 | 在线免费黄色av | 欧美精品乱码久久久久久 | 国产精品色视频 | 91av九色| 91av片| 亚洲成av人片在线观看香蕉 | 日日操网站 | 亚洲精品久久久久999中文字幕 | 伊色综合久久之综合久久 | 久久久99精品免费观看乱色 | 成人国产一区二区 | 99热最新网址| 五月天久久综合 | 日韩,精品电影 | 日韩欧美视频二区 | 国产中文伊人 | 国产精品一区二区在线播放 | 看片一区二区三区 | 日韩欧美在线视频一区二区 | 欧美日性视频 | 婷婷丁香七月 | 亚洲国产成人精品久久 | 欧美久久久久久久 | 日韩欧美有码在线 | 久久综合色综合88 | 黄色一级影院 | 久草免费手机视频 | 看国产黄色片 | 婷婷av网| 免费在线观看日韩 | 久久久99国产精品免费 | 国产黄色电影 | 国产精品自产拍在线观看桃花 | 91在线你懂的 | 国产老妇av| 国产中文在线视频 | 日韩欧美久久 | 国产精品成久久久久 | 丁香六月综合网 | 欧美日韩伦理在线 | 久久五月天综合 | 区一区二区三区中文字幕 | 成年人免费观看在线视频 | 丁香婷婷深情五月亚洲 | 久久午夜国产 | 精品一区二区久久久久久久网站 | 国产人在线成免费视频 | 日日爽天天操 | a精品视频| 五月天久久狠狠 | 91色国产在线 | 国产精品毛片 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 日韩三级视频在线观看 | 国产视频在线观看一区 | 精品一区av| 婷婷精品 | 91精彩视频在线观看 | 国产va饥渴难耐女保洁员在线观看 | 国产黄色美女 | 色婷婷狠 | 天天躁日日 | 欧美中文字幕久久 | 波多野结衣资源 | 午夜精品一二三区 | 麻豆视频国产精品 | 在线播放国产一区二区三区 | 中文乱码视频在线观看 | 人人射| 波多野结衣久久资源 | 欧美另类色图 | 国产精品人成电影在线观看 | 亚洲三级黄色 | 国产一级视频在线观看 | 日韩色视频在线观看 | 天天操天天操天天操天天 | 成人三级网站在线观看 | 成人亚洲免费 | 成人免费看片98欧美 | 国产污视频在线观看 | 国产 视频 高清 免费 | 久草男人天堂 | 日日夜夜婷婷 | 久久96国产精品久久99软件 | 亚洲成年人在线播放 | 国产精品永久久久久久久www | 亚洲精品高清在线观看 | 久精品视频免费观看2 | 国产日韩精品一区二区三区 | 日韩电影一区二区在线观看 | 六月激情久久 | 免费在线观看午夜视频 | 天天草视频 | 欧美激情综合五月 | 在线观看日本韩国电影 | 99精品国产一区二区三区不卡 | a色视频 | 精品国产免费人成在线观看 | www.黄色在线 | 99夜色 | 一级黄色片在线播放 | 国产热re99久久6国产精品 | 亚洲高清在线观看视频 | 91精品资源 | 亚洲涩综合 | av中文字幕免费在线观看 | wwwwww色| 国产精品视频你懂的 | 日韩,精品电影 | 久久精品理论 | 久久综合导航 | 美女精品在线 | 亚洲综合在线播放 | 亚洲天堂精品视频在线观看 | 精品久久久久久综合 | 99久久国产免费,99久久国产免费大片 | 黄色在线观看网站 | 91综合视频在线观看 | 中文字幕精品久久 | 国产成人精品综合 | 精品国产一区二区三区免费 | 久久久www成人免费毛片麻豆 | 日本久久电影网 | 天天色中文 | 精品一区二区三区在线播放 | 日韩久久精品一区二区 | 一级性生活片 | 992tv人人网tv亚洲精品 | 人人插人人玩 | 色狠狠综合天天综合综合 | 五月婷影院 | 91女神的呻吟细腰翘臀美女 | 久久久18 | 欧美精品九九99久久 | 日韩欧美国产视频 | 最新精品国产 | 国产一区二区三区免费观看视频 | 日本中文字幕影院 | 成+人+色综合 | 亚州日韩中文字幕 | 日韩在线欧美在线 | 日韩激情av在线 | 干干操操| 亚洲另类人人澡 | 婷婷色狠狠| 最近中文字幕高清字幕免费mv | 国产精品成人av电影 | 久久精品首页 | 色多多在线观看 | 精品国产一区二区三区久久 | 午夜黄色影院 | 久草爱 | 韩日在线一区 | 亚洲综合涩 | 91av视频网站| 成在人线av| 2019中文最近的2019中文在线 | 99国产一区 | 激情动态 | 国产91精品一区二区 | 激情综合五月网 | 天天综合日日夜夜 | 久草资源在线观看 | 天天色天天色天天色 | 444av| 日韩av电影网站在线观看 | 亚洲激情电影在线 | 亚洲视频456| 国产一区二区在线播放视频 | 99久久精品国产观看 | 国产精品日韩在线 | 韩日三级av | 国内精品久久久久久 | 久久久久久蜜av免费网站 | 中文字幕高清视频 | 欧美少妇xxx | 久久99国产精品免费网站 | 色就是色综合 | 激情av五月婷婷 | 亚洲国产精品成人va在线观看 | 久久国产亚洲视频 | 久久精品一二三区白丝高潮 | 国产视频精品视频 | 五月婷婷丁香综合 | 91在线视频观看 | 日韩精品资源 | 福利视频一区二区 | 色婷婷一 | 国产视频99 | av视屏在线 | 中文字幕一区二区三区四区 | 久久黄色网页 | freejavvideo日本免费 | 欧美日韩高清一区二区 | 欧美日本国产在线观看 | 日韩精品免费在线视频 | 丝袜美女视频网站 | 97超碰人人网| 久久久国产精品一区二区中文 | 91精品国产欧美一区二区 | 天天躁日日躁狠狠躁 | 国产手机免费视频 | 欧美污污网站 | 国产女人18毛片水真多18精品 | 草久久av| 国产视频高清 | 日日日日日| 成人免费在线视频观看 | 国产手机视频在线播放 | 亚洲欧洲精品视频 | 成人三级网站在线观看 | 日本久热 | 国产精品成久久久久 | 五月导航| 成人小视频在线观看免费 | 992tv在线 | 国产成人精品亚洲精品 | 最新av免费在线 | 亚洲视频综合 | 国产视频一区在线 | 色资源二区在线视频 | 99精品视频在线播放观看 | 亚洲国产欧洲综合997久久, | 91九色精品女同系列 | 久久视频这里只有精品 | 九九热在线精品视频 | 国产精品av免费在线观看 | 草久久av | 天天射天天爱天天干 | 又大又硬又黄又爽视频在线观看 | 黄色的网站在线 | 不卡av免费在线观看 | 久久综合婷婷 | 国产精品普通话 | 天天干天天干天天干天天干天天干天天干 | 日批网站免费观看 | 黄av免费在线观看 | 久久视频免费看 | 国产一线在线 | 美女免费黄网站 | 久草在线观看 | 婷婷精品视频 | 色婷婷激情电影 | 久久成人午夜视频 | av在线一| 久久精品爱爱视频 | 黄色一级免费网站 | 九九免费在线观看视频 | 中文字幕在线看人 | 字幕网在线观看 | www.久久com| 色天堂在线视频 | 精品成人久久 | 少妇啪啪av入口 | 天堂av在线网站 | 激情五月五月婷婷 | 全黄网站 | 不卡在线一区 | 中文字幕久久久精品 | 91中文视频 | 国产亚洲精品久久久久久久久久 | 中文字幕在线久一本久 | 久久国产精品99久久久久久进口 | 国产黄色免费电影 | 国产精品中文 | 五月婷在线播放 | 最新精品国产 | 在线播放 一区 | 成人理论在线观看 | 在线观看成人 | 国产精品99免视看9 国产精品毛片一区视频 | av中文字幕在线免费观看 | 狠狠狠狠狠操 | 九色激情网 | 一区在线免费观看 | 国产视频日本 | 在线观看亚洲国产精品 | 色av资源网 | 手机av在线不卡 | 国产美女精彩久久 | 免费观看一区二区三区视频 | 五月天视频网站 | 国产精品一区二区三区在线 | 欧美不卡视频在线 | 少妇精品久久久一区二区免费 | av短片在线观看 | 在线天堂视频 | 国产 日韩 欧美 中文 在线播放 | 91网免费观看 | 久久久观看 | 在线之家官网 | 久久久久久看片 | 精品国产视频在线观看 | 色婷在线 | 综合网在线视频 | 色99导航| 少妇搡bbbb搡bbb搡69 | 女人18片 | 色噜噜狠狠狠狠色综合久不 | 97成人精品视频在线播放 | 四虎www com | 日韩色区 | 亚洲视频免费视频 | 一区中文字幕 | 香蕉在线视频播放网站 | 亚洲一区尤物 | 日韩精品免费专区 | av电影在线不卡 | 国产高清在线视频 | 国产不卡精品视频 | 亚洲精品小视频 | 亚洲国产伊人 | 五月婷婷狠狠 | 日韩精品一区二区在线观看 | 久久亚洲精品国产亚洲老地址 | 97超碰福利久久精品 | 国产精品视频全国免费观看 | 精品一二三区视频 | av一级二级 | 亚洲爽爽网 | 综合激情网 | 久久久久麻豆v国产 | 2019天天干天天色 | 日韩在线不卡av | 久久www免费视频 | 久久97精品 | 国产裸体无遮挡 | 最近免费在线观看 | 人人超碰在线 | 18久久久 | 91精品国产自产在线观看 | 在线91网| 91亚洲精品在线观看 | 亚洲精品美女 | 丁香婷婷电影 | 欧美aaaxxxx做受视频 | 高清日韩一区二区 | 国产白浆在线观看 | 免费黄色看片 | 亚洲日本一区二区在线 | 一本一道久久a久久精品蜜桃 | 亚洲欧美日韩国产 | 又长又大又黑又粗欧美 | 99精品视频中文字幕 | 三级视频日韩 | 精品亚洲二区 | 少妇资源站 | 久久女同性恋中文字幕 | 日韩成人免费观看 | 天天操天天曰 | 久久亚洲精品国产亚洲老地址 | 日韩一级成人av | 美女视频黄色免费 | 免费视频色 | 久草在线免费色站 | 久久久久综合视频 | 中文字幕久久久精品 | 最近中文字幕免费av | 中文字幕在线观看免费 | 欧美日韩有码 | 欧美成天堂网地址 | 日韩色爱 | 在线观看aa | 九九热免费观看 | 国产在线播放一区 | 日日爱av| 日本成人中文字幕在线观看 | 日韩在线精品视频 | 伊人丁香 | 久久综合久久综合九色 | 日日射av| 在线成人一区二区 | 久久福利综合 | 欧美一进一出抽搐大尺度视频 | 四虎成人网| www.com久久 | 欧美嫩草影院 | 在线看的av网站 | 亚洲狠狠操| 在线观看不卡视频 | 97人人模人人爽人人少妇 | 久久国产视频网站 | 国产黄色av | 成人黄色电影在线观看 | 成人免费一区二区三区在线观看 | 欧美日韩二区三区 | 亚洲欧美视屏 | 国产精品视频99 | 日韩欧美aaa | 中文字幕文字幕一区二区 | 免费a视频| 久久99精品国产一区二区三区 | 亚洲精品美女久久久久 | 午夜视频在线观看一区二区三区 | 欧美成人一区二区 | 精品免费视频 | a黄色影院 | 91豆麻精品91久久久久久 | 国产九九精品 | 亚洲激情综合 | 国产精品毛片一区二区在线 | 免费看片网站91 | 午夜精品久久久久久久久久久久 | 狠狠躁夜夜a产精品视频 | 激情av资源| 在线观看中文字幕2021 | 一区二区三区四区五区在线视频 | 精品99在线| 丁香婷婷综合色啪 | 久久精品国产亚洲aⅴ | 亚洲粉嫩av | 国产传媒一区在线 | 亚洲精品国精品久久99热一 | 欧美另类69| av综合在线观看 | 免费99精品国产自在在线 | 国产在线观看你懂的 | 五月婷在线视频 | 日韩在线视频免费观看 | 美女视频黄免费 | 成人在线观看av | 日日夜夜网 | 久久手机精品视频 | 免费人成在线观看网站 | 福利一区在线视频 | 亚洲精品美女久久17c | 亚洲精品视频免费在线 | 亚洲欧洲国产视频 | 伊人天堂av | 91桃色国产在线播放 | 91精品1区2区 | 亚洲日本色 | 国产精品久久久一区二区三区网站 | 亚洲一区视频在线播放 | 亚洲dvd| 女人18片毛片90分钟 | 99九九99九九九视频精品 | 在线免费观看欧美日韩 | 视频一区二区精品 | 国产特级毛片aaaaaa毛片 | 三级黄色在线观看 | 91精品夜夜 | 91久久一区二区 | 99性视频 | 日韩精品极品视频 | 91亚色视频在线观看 | www.伊人网 | 免费情缘 | а天堂中文最新一区二区三区 | 亚洲免费a | 国产成人精品一区二区三区福利 | 久产久精国产品 | 久久在线视频精品 | 在线观看网站你懂的 | 国产视频1 | www.狠狠操| 免费精品人在线二线三线 | 免费在线黄色av | 亚洲激情婷婷 | 夜夜骑日日操 | 九色免费视频 | 国产情侣一区 | 中文字幕区 | 久草综合在线观看 | 日韩美在线 | 手机av在线免费观看 | 久久免费视频观看 | 久久国产精品99久久人人澡 | 日韩视频免费看 | 国产精品久久久久久久午夜片 | 手机成人免费视频 | 亚洲精区二区三区四区麻豆 | 最近高清中文在线字幕在线观看 | 国产无遮挡又黄又爽在线观看 | 久久久久免费观看 | 日韩有码中文字幕在线 | 国产日韩欧美精品在线观看 | 欧美日韩精品免费观看视频 | 成人免费视频免费观看 | 国产成人精品综合久久久久99 | 黄污污网站 | 成人h电影 | 欧美激情精品久久久久久免费印度 | 中文字幕日韩一区二区三区不卡 | 91在线观看欧美日韩 | 99精品色 | 在线观看国产一区二区 | 丝袜制服综合网 | 国产精品18久久久久久久久 | 91豆麻精品91久久久久久 | 最近中文字幕免费av | 中文在线亚洲 | 国产一区在线播放 | 国产破处精品 | 99久久激情 | 狠狠干.com| 久久国产美女视频 | 国产成人精品免高潮在线观看 | 欧美日韩在线观看一区二区 | 91桃色在线观看视频 | 黄色在线观看免费 | 国产精品视频免费看 | 99久久精品国产网站 | 91在线视频观看 | 天天操天天色天天射 | 日日爱av| 日韩精品免费在线视频 | 激情av网 | 日韩免费在线观看视频 | 亚洲综合激情小说 | 97超碰香蕉 | 成人三级视频 | 免费三级av | 欧美在线视频二区 | 最新国产在线观看 | 九九精品视频在线看 | 懂色av一区二区三区蜜臀 | 亚洲精品视频在线观看免费视频 | 欧美男同视频网站 | 九色91福利 | 午夜视频不卡 | 国产精品一区在线播放 | 久久av中文字幕片 | 欧美极品一区二区三区 | 久草视频在 | 久久精品www人人爽人人 | 国产精品久久久亚洲 | 久久韩国免费视频 | 亚洲黄色影院 | 国产精品毛片一区二区在线看 | 国产一区二区在线免费播放 | 国产不卡免费 | 丝袜美腿在线播放 | 91视频亚洲| 美女免费网站 | 欧美孕交vivoestv另类 | 福利视频一区二区 | 亚洲午夜久久久久久久久 | 亚洲国产中文字幕在线观看 | 日韩国产精品久久久久久亚洲 | 久久久影视 | 中文字幕一区二区三区四区视频 | 91麻豆精品国产91久久久使用方法 | 国产成人99av超碰超爽 | 日韩高清成人在线 | 亚洲人成网站精品片在线观看 | 在线国产能看的 | 在线欧美小视频 | 国产成人综合在线观看 | 久草在线视频在线观看 | 国产又粗又硬又长又爽的视频 | 亚洲在线精品 | 高清av网站| 国产精品a级 | 九九精品视频在线观看 | 在线精品视频免费播放 | av黄色国产 | 日本成人中文字幕在线观看 | 日韩欧美在线综合网 | 欧美性极品xxxx做受 | 精品国产一区二区三区四 | 免费成人av在线看 | 国产成人精品久久亚洲高清不卡 | 国产中文字幕在线播放 | 国产精品视屏 | 中文字幕高清在线播放 | 婷婷日日 | 久久久国产日韩 | av电影中文字幕 | 国产精品女主播一区二区三区 | 手机av在线网站 | 日韩色高清 | 日韩视频一区二区三区 | 色爱区综合激月婷婷 | 又黄又刺激的视频 | 91精品免费看 | 日本久久精 | 免费高清影视 | 天天爽人人爽夜夜爽 | 婷婷六月综合亚洲 | 天天操天天操一操 | av电影在线观看完整版一区二区 | 日韩视频免费观看高清完整版在线 | 国产1区在线 | av久久久久久 | www国产亚洲精品久久麻豆 | 日韩 在线 | 91av在线精品| 91传媒在线播放 | 久久久久在线视频 | 狠狠操综合网 | 国产精品 9999 | av在线网站观看 | 欧美日韩国产mv | 久久公开视频 | 欧亚久久| 亚洲另类交 | 网站免费黄 | 色先锋av资源中文字幕 | 日韩一区二区三区高清在线观看 | 91超碰在线播放 | 在线 精品 国产 | 天天鲁一鲁摸一摸爽一爽 | 色婷婷伊人| 国产视频精品在线 | 国产婷婷一区二区 | 国产精品麻 | 91在线区 | 欧美一级日韩免费不卡 | 亚洲一级片在线观看 | 免费看成年人 | 久久精品久久99精品久久 | 日本黄色免费在线观看 | 91高清免费 | 天天插伊人 | 一级全黄毛片 | 亚洲日韩中文字幕 | 色婷婷a| 婷婷丁香在线视频 | 婷婷福利影院 | www.在线看片.com | 天天操夜夜叫 | 不卡视频国产 | 精品人人人 | 91大神精品视频 | 激情伊人五月天久久综合 | 又紧又大又爽精品一区二区 | 国产精品久久久区三区天天噜 | 美女视频网站久久 | 悠悠av资源片 | 午夜精品一区二区三区在线观看 | 亚洲精品在线观 | 日韩精品一区二区在线观看 | 96精品视频 | bbbb操bbbb| 狠狠狠狠干 | 亚洲欧美婷婷六月色综合 | 国产不卡免费av | 日韩深夜在线观看 | 玖玖在线播放 | 娇妻呻吟一区二区三区 | 日韩高清不卡一区二区三区 | 在线高清av | 久久精品视频日本 | 天天玩天天操天天射 | 国产资源网 | 91精品国自产在线 | 欧美日韩国产欧美 | 97在线精品国自产拍中文 | 国产精品激情偷乱一区二区∴ | 日韩精品最新在线观看 | 伊人天天色 | 日韩免费在线视频 | 国产婷婷精品av在线 | 午夜精品久久久久久久爽 | 免费下载高清毛片 | 日韩大片在线观看 | 国内精品久久久久久久久 | 国产日产欧美在线观看 | 精品一区二区三区在线播放 | 久操中文字幕在线观看 | 日韩精品中文字幕在线观看 | 久久婷婷一区二区三区 | 久久激情网站 | 中文字幕在线视频网站 | 狠狠亚洲| 天天干.com| 色六月婷婷| 一区免费在线 | 日韩理论电影网 | 午夜性福利 | 国内精品久久久久久久久 | 韩国av免费在线 | 成人免费视频网站 | 国产成人久久av | 亚洲精品国产视频 | 国产精品 中文字幕 亚洲 欧美 | 久久精品艹 | 国产亚洲精品v | 久久艹欧美| 国产一级免费在线观看 | 国产免费xvideos视频入口 | 日本女人的性生活视频 | 在线免费观看黄色av | 亚州av成人| 不卡的av在线播放 | 婷婷久久一区 | 久久久久久久久久久精 | 88av色| 天天操天天射天天舔 | 国产麻豆果冻传媒在线观看 | 亚洲精品免费在线播放 | 亚洲免费在线视频 | 色爽网站 | 亚洲国产成人精品在线观看 | 8x成人在线| 国产精品久久久久久久久久免费看 | adc在线观看 | 黄色综合 | 国产福利一区二区三区视频 | www.99热精品| 一级黄网 | 亚洲最大激情中文字幕 | 热99久久精品 | 国产视频首页 | 色婷婷一区 | 六月丁香在线观看 | 欧美人体xx | 女人高潮特级毛片 | 成年人黄色免费网站 | www.亚洲精品在线 | 久久一区二区三区超碰国产精品 | av免费播放 | 久久久香蕉视频 | 久久人人爽人人爽人人片av免费 | 国产精品99久久久久久小说 | 丁香影院在线 | 免费观看视频黄 | 丁香九月婷婷 | av电影在线观看完整版一区二区 | 91精品国产99久久久久久红楼 | 亚洲免费专区 | 亚洲精品在线观看的 | 国产区在线看 | 91成人在线观看喷潮 | 丁香在线视频 | 成人wwwxxx视频 | 久久精品亚洲国产 | 99久久精品国产亚洲 | 免费看污污视频的网站 | 日韩欧美一区二区在线 | 国产精品久久久久久久久搜平片 | 亚洲经典精品 | 亚洲国产精品激情在线观看 | 久久在线视频精品 | 成人在线观看免费视频 | 美女在线国产 | 久久精品小视频 | 国产美女免费 | 日韩av一区二区三区 | 成 人 黄 色 免费播放 | 亚洲综合在线五月天 | 精品美女久久久久久免费 | 国产成人亚洲在线观看 | 国产精品久久久久久吹潮天美传媒 | 狠狠狠狠狠狠天天爱 | 精品国产电影一区 | 久久只有精品 | 欧美天天射 | 亚洲成人精品久久 | 欧美激情在线看 | 九九在线国产视频 | 欧美超碰在线 | 亚洲一区欧美激情 | 91视频在线看 | 激情www | 国产在线黄 | 999ZYZ玖玖资源站永久 | www.啪啪.com| 成人免费视频播放 | 激情欧美一区二区免费视频 | 天天综合网天天综合色 | 成人精品电影 | 日韩成人精品一区二区三区 | 亚洲最大av | 午夜久操 | 韩国一区二区三区视频 | 免费国产在线精品 | 国产精品久久久久久久av大片 | 区一区二区三区中文字幕 | 久久久免费网站 | 黄网站色欧美视频 | 一区二区三区四区五区在线 | 美女网站色在线观看 | 免费开视频 | 热99久久精品| 夜夜干夜夜 | 夜色在线资源 | 中文字幕在线观看免费高清完整版 | 91免费观看| 在线影院 国内精品 | 国产香蕉在线 | 91视频在线免费 | 久久欧美在线电影 | 亚洲黄色免费观看 | 久久人人爽 | 99久久影院 | 在线你懂的视频 | 精品夜夜嗨av一区二区三区 | 园产精品久久久久久久7电影 | 色噜噜噜| www.五月天婷婷.com | www.亚洲激情.com | 亚洲日本黄色 | 日韩最新中文字幕 | 国内精品久久久久久久影视简单 | 国产精品永久在线 | 亚洲精品国偷拍自产在线观看 | 日批视频在线 | 天天色天天射综合网 | 久久久性 | 精品视频一区在线观看 | 91成人精品视频 | 色综合天天综合 | 在线观看黄网 | 一区免费在线 | 69国产成人综合久久精品欧美 | 免费观看特级毛片 | 最新久久免费视频 | 又色又爽又激情的59视频 |