5

com.netflix.astyanax.connectionpool.NodeDiscoveryTypeTOKEN_AWAREで Cassandra の Astyanax クライアントの列挙値を見つけましたが、それが何をするのか理解しようとしていますか?

package com.netflix.astyanax.connectionpool;

public enum NodeDiscoveryType {
    /**
     * Discover nodes exclusively from doing a ring describe
     */
    RING_DESCRIBE,

    /**
     * Discover nodes exclusively from an external node discovery service
     */
    DISCOVERY_SERVICE,

    /**
     * Intersect ring describe and nodes from an external service. This solve
     * the multi-region ring describe problem where ring describe returns nodes
     * from other regions.
     */
    TOKEN_AWARE,

    /**
     * Use only nodes in the list of seeds
     */
    NONE
}

cross colo clusterPHXcolo/datacenterに 12 ノード、 SLC に 12ノードの24 ノードがあるとしcolo/datacenterます。

そして、次のように Astyanax クライアントを使用して Cassandra に接続しています。

private CassandraAstyanaxConnection() {
    context = new AstyanaxContext.Builder()
                .forCluster(ModelConstants.CLUSTER)
                .forKeyspace(ModelConstants.KEYSPACE)
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
        .setPort(9160)
        .setMaxConnsPerHost(40)
        .setSeeds("cdb03.vip.phx.host.com:9160,cdb04.vip.phx.host.com:9160")
    )
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
        .setCqlVersion("3.0.0")
        .setTargetCassandraVersion("1.2")
        .setDiscoveryType(NodeDiscoveryType.TOKEN_AWARE))
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
    .buildKeyspace(ThriftFamilyFactory.getInstance());

    context.start();
    keyspace = context.getEntity();

    emp_cf = ColumnFamily.newColumnFamily(
        ModelConstants.COLUMN_FAMILY, 
        StringSerializer.get(), 
        StringSerializer.get());
}

ofとTOKEN_AWAREofの違いを説明できる人NodeDiscoveryTypeはいますか?TOKEN_AWAREConnectionPoolType

助けてくれてありがとう。

更新されたコード

以下は、変更を加えた後、これまでに使用しているコードです-

private CassandraAstyanaxConnection() {

    context = new AstyanaxContext.Builder()
    .forCluster(ModelConstants.CLUSTER)
    .forKeyspace(ModelConstants.KEYSPACE)
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
        .setPort(9160)
        .setMaxConnsPerHost(40)
        .setSeeds("cdb03.vip.phx.host.com:9160,cdb04.vip.phx.host.com:9160")
        .setLocalDatacenter("phx")
    )
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
        .setCqlVersion("3.0.0")
        .setTargetCassandraVersion("1.2")
        .setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE))
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
    .buildKeyspace(ThriftFamilyFactory.getInstance());

    context.start();
    keyspace = context.getEntity();

    emp_cf = ColumnFamily.newColumnFamily(
        ModelConstants.COLUMN_FAMILY, 
        StringSerializer.get(), 
        StringSerializer.get());
}

あなたはあなたの例で、あなたが使用することを述べました-

    .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
    .setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE)

この二つ一緒ですよね?しかし、私はTOKEN_AWARE ConnectionPoolTypeデフォルトで使用していると信じてRING_DESCRIBEいるので、再度追加しても意味がありません. 私は正しいですか?

私が間違っている場合は修正してください。

4

2 に答える 2

12

「ノード検出」に関して言えば、NodeDiscoveryType の TOKEN_AWARE と ConnectionPoolType の TOKEN_AWARE の関係は相互に関連しており、やや混乱しています。

NodeDiscoveryType は次のように決定されます (通常は setDiscoveryType() 経由ではありません)。

  • setSeedsを介してシードを提供し、ConnectionPoolType が TOKEN_AWARE の場合、 NodeDiscoveryType は RING_DESCRIBE です。
  • setSeedsを介してシードを提供し、ConnectionPoolType が TOKEN_AWARE 以外の場合、構成済みの setDiscoveryType が使用されます。 これは、(setDiscoveryType を介して) 構成された NodeDiscoveryType が使用される唯一のケースです。
  • setSeedsを介してシードを提供せず、かつ ConnectionPoolType が TOKEN_AWARE の場合、 NodeDiscoveryType は TOKEN_AWARE です。
  • setSeedsを介してシードを提供せず、かつ ConnectionPoolType が TOKEN_AWARE 以外の場合 NodeDiscoveryType は DISCOVERY_SERVICE です。

ノード検出

NodeDiscoveryType の設定方法を決定したので、実際のノードの検出にどのように影響するかを見てみましょう。ノード検出は、HostSupplier のどの実装 (すなわちSupplier<List<Host>>) が使用されているかということに要約されます。

  • NodeDiscoveryType (上記から) が DISCOVERY_SERVICE の場合 HostSupplierを使用する必要があります (経由withHostSupplier)。
  • NodeDiscoveryType (上記から) が RING_DESCRIBE の場合は、RingDescribeHostSupplier使用します。
  • NodeDiscoveryType (上から) が TOKEN_AWARE で、HostSupplier が (経由でwithHostSupplier)設定されている場合、RingDescribeHostSupplier で FilteringHostSupplier使用します。
  • NodeDiscoveryType (上記から) が TOKEN_AWARE で、HostSupplier が設定されていない場合は、RingDescribeHostSupplier使用します。

RingDescribe とローカル DC の使用

指定した構成に基づいて、RingDescribeHostSupplier になります。RingDescribeHostSupplier は、データセンターを指定しない限り、リング内のすべてのノードへの接続を許可します。そのため、ConnectionPoolConfigurationImpl を使用して AstyanaxContext を設定する場合は、目的の DC で LocalDatacenter を設定することをお勧めします。これにより、他の DC のホストが接続プールに含まれず、リクエストがローカルであることが保証されます。

.withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
        .setPort(9160)
        .setMaxConnsPerHost(40)
        .setLocalDatacenter("phx")
        .setSeeds("cdb03.vip.phx.host.com:9160,cdb04.vip.phx.host.com:9160")
    )

接続プール タイプ

ConnectionPoolType を TOKEN_AWARE に設定することもできます。その値が設定されていない場合、デフォルトで ROUND_ROBIN になります (上記のノード検出作業のノードを使用)。TOKEN_AWARE Con​​nectionPoolType は、「どのホストがどのトークンを持っているかを追跡し、トラフィックをインテリジェントに誘導しようとします」。

HostSupplier を提供していない限り、私は Astyanax の設定に対してこのようなことを行います。

.withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
        .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
        .setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE)
    )

プールの最適化

別の考慮事項は、ConnectionPoolConfigurationImpl で Astyanax の「レイテンシ認識」を使用してプールの使用を最適化することですが、設定では YMMV を使用します。例:

.setLatencyScoreStrategy(new SmaLatencyScoreStrategyImpl(10000,10000,100,0.50))
// The constructor takes:
//  UpdateInterval: 10000 : Will resort hosts per token partition every 10 seconds
//  ResetInterval: 10000 : Will clear the latency every 10 seconds
//  WindowSize: 100 : Uses last 100 latency samples
//  BadnessThreshold: 0.50 : Will sort hosts if a host is more than 100% 

Astyanax の構成を参照してください

TLDR;

要約すると、NodeDiscoveryType を RING_DESCRIBE に設定し (HostSupplier を使用していない場合)、ConnectionPoolType を TOKEN_AWARE に設定します。さらに、setLocalDatacenter を使用してリクエストを DC に対してローカルに保ち、レイテンシ認識設定を検討します。

于 2013-05-09T22:00:44.480 に答える