Search in sources :

Example 1 with BookieImpl

use of org.apache.bookkeeper.bookie.BookieImpl in project pulsar by yahoo.

the class BrokerBookieIsolationTest method testSetRackInfoAndAffinityGroupDuringProduce.

@Test
public void testSetRackInfoAndAffinityGroupDuringProduce() throws Exception {
    final String tenant1 = "tenant1";
    final String cluster = "use";
    final String ns2 = String.format("%s/%s/%s", tenant1, cluster, "ns2");
    final int totalPublish = 100;
    final String brokerBookkeeperClientIsolationGroups = "default-group";
    final String tenantNamespaceIsolationGroups = "tenant1-isolation";
    BookieServer[] bookies = bkEnsemble.getBookies();
    ZooKeeper zkClient = bkEnsemble.getZkClient();
    Set<BookieId> isolatedBookies = Sets.newHashSet(bookies[2].getBookieId(), bookies[3].getBookieId());
    ServiceConfiguration config = new ServiceConfiguration();
    config.setLoadManagerClassName(ModularLoadManagerImpl.class.getName());
    config.setClusterName(cluster);
    config.setWebServicePort(Optional.of(0));
    config.setZookeeperServers("127.0.0.1" + ":" + bkEnsemble.getZookeeperPort());
    config.setBrokerShutdownTimeoutMs(0L);
    config.setLoadBalancerOverrideBrokerNicSpeedGbps(Optional.of(1.0d));
    config.setBrokerServicePort(Optional.of(0));
    config.setAdvertisedAddress("localhost");
    config.setStrictBookieAffinityEnabled(true);
    config.setBookkeeperClientIsolationGroups(brokerBookkeeperClientIsolationGroups);
    config.setManagedLedgerDefaultEnsembleSize(2);
    config.setManagedLedgerDefaultWriteQuorum(2);
    config.setManagedLedgerDefaultAckQuorum(2);
    config.setAllowAutoTopicCreationType("non-partitioned");
    int totalEntriesPerLedger = 20;
    int totalLedgers = totalPublish / totalEntriesPerLedger;
    config.setManagedLedgerMaxEntriesPerLedger(totalEntriesPerLedger);
    config.setManagedLedgerMinLedgerRolloverTimeMinutes(0);
    pulsarService = new PulsarService(config);
    pulsarService.start();
    PulsarAdmin admin = PulsarAdmin.builder().serviceHttpUrl(pulsarService.getWebServiceAddress()).build();
    ClusterData clusterData = ClusterData.builder().serviceUrl(pulsarService.getWebServiceAddress()).build();
    admin.clusters().createCluster(cluster, clusterData);
    TenantInfoImpl tenantInfo = new TenantInfoImpl(null, Sets.newHashSet(cluster));
    admin.tenants().createTenant(tenant1, tenantInfo);
    admin.namespaces().createNamespace(ns2);
    try {
        admin.namespaces().getBookieAffinityGroup(ns2);
        fail("ns2 should have no bookie affinity group set");
    } catch (PulsarAdminException.NotFoundException e) {
    // Ok
    }
    @Cleanup PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(pulsarService.getBrokerServiceUrl()).statsInterval(-1, TimeUnit.SECONDS).build();
    final String topicName = String.format("persistent://%s/%s", ns2, "topic1");
    Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name").subscribe();
    consumer.close();
    ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer().topic(topicName).sendTimeout(5, TimeUnit.SECONDS);
    Producer<byte[]> producer = producerBuilder.create();
    for (int i = 0; i < 20; i++) {
        String message = "my-message-" + i;
        producer.send(message.getBytes());
    }
    setDefaultIsolationGroup(tenantNamespaceIsolationGroups, zkClient, isolatedBookies);
    admin.namespaces().setBookieAffinityGroup(ns2, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroups).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns2), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroups).build());
    PersistentTopic topic2 = (PersistentTopic) pulsarService.getBrokerService().getTopicReference(topicName).get();
    ManagedLedgerImpl ml = (ManagedLedgerImpl) topic2.getManagedLedger();
    Awaitility.await().untilAsserted(() -> Assert.assertTrue(ml.getConfig().getBookKeeperEnsemblePlacementPolicyProperties().size() > 0));
    for (int i = 0; i < 80; i++) {
        String message = "my-message-" + i;
        producer.send(message.getBytes());
    }
    producer.close();
    BookieImpl bookie1 = (BookieImpl) bookies[0].getBookie();
    LedgerManager ledgerManager = getLedgerManager(bookie1);
    ManagedLedgerImpl ml2 = (ManagedLedgerImpl) topic2.getManagedLedger();
    // namespace: ns2
    assertEquals(ml2.getLedgersInfoAsList().size(), totalLedgers);
    List<LedgerInfo> ledgers = ml2.getLedgersInfoAsList();
    // validate ledgers' ensemble with affinity bookies
    for (int i = 1; i < ledgers.size(); i++) {
        LedgerInfo lInfo = ledgers.get(i);
        long ledgerId = lInfo.getLedgerId();
        CompletableFuture<Versioned<LedgerMetadata>> ledgerMetaFuture = ledgerManager.readLedgerMetadata(ledgerId);
        LedgerMetadata ledgerMetadata = ledgerMetaFuture.get().getValue();
        Set<BookieId> ledgerBookies = Sets.newHashSet();
        ledgerBookies.addAll(ledgerMetadata.getAllEnsembles().values().iterator().next());
        assertEquals(ledgerBookies.size(), isolatedBookies.size());
        ledgerBookies.removeAll(isolatedBookies);
        assertEquals(ledgerBookies.size(), 0);
    }
}
Also used : BookieId(org.apache.bookkeeper.net.BookieId) LedgerManager(org.apache.bookkeeper.meta.LedgerManager) Versioned(org.apache.bookkeeper.versioning.Versioned) BookieServer(org.apache.bookkeeper.proto.BookieServer) Cleanup(lombok.Cleanup) ModularLoadManagerImpl(org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl) ServiceConfiguration(org.apache.pulsar.broker.ServiceConfiguration) PulsarService(org.apache.pulsar.broker.PulsarService) PulsarClient(org.apache.pulsar.client.api.PulsarClient) PulsarAdmin(org.apache.pulsar.client.admin.PulsarAdmin) TenantInfoImpl(org.apache.pulsar.common.policies.data.TenantInfoImpl) LedgerInfo(org.apache.bookkeeper.mledger.proto.MLDataFormats.ManagedLedgerInfo.LedgerInfo) ManagedLedgerImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl) BookieImpl(org.apache.bookkeeper.bookie.BookieImpl) ZooKeeper(org.apache.zookeeper.ZooKeeper) ClusterData(org.apache.pulsar.common.policies.data.ClusterData) LedgerMetadata(org.apache.bookkeeper.client.api.LedgerMetadata) PersistentTopic(org.apache.pulsar.broker.service.persistent.PersistentTopic) PulsarAdminException(org.apache.pulsar.client.admin.PulsarAdminException) Test(org.testng.annotations.Test)

Example 2 with BookieImpl

use of org.apache.bookkeeper.bookie.BookieImpl in project pulsar by yahoo.

the class BrokerBookieIsolationTest method testBookieIsolationWithSecondaryGroup.

/**
 * It verifies that "ZkIsolatedBookieEnsemblePlacementPolicy" considers secondary affinity-group if primary group
 * doesn't have enough non-faulty bookies.
 *
 * @throws Exception
 */
@Test
public void testBookieIsolationWithSecondaryGroup() throws Exception {
    final String tenant1 = "tenant1";
    final String cluster = "use";
    final String ns1 = String.format("%s/%s/%s", tenant1, cluster, "ns1");
    final String ns2 = String.format("%s/%s/%s", tenant1, cluster, "ns2");
    final String ns3 = String.format("%s/%s/%s", tenant1, cluster, "ns3");
    final String ns4 = String.format("%s/%s/%s", tenant1, cluster, "ns4");
    final int totalPublish = 100;
    final String brokerBookkeeperClientIsolationGroups = "default-group";
    final String tenantNamespaceIsolationGroupsPrimary = "tenant1-isolation-primary";
    final String tenantNamespaceIsolationGroupsSecondary = "tenant1-isolation=secondary";
    BookieServer[] bookies = bkEnsemble.getBookies();
    ZooKeeper zkClient = bkEnsemble.getZkClient();
    Set<BookieId> defaultBookies = Sets.newHashSet(bookies[0].getBookieId(), bookies[1].getBookieId());
    Set<BookieId> isolatedBookies = Sets.newHashSet(bookies[2].getBookieId(), bookies[3].getBookieId());
    Set<BookieId> downedBookies = Sets.newHashSet(BookieId.parse("1.1.1.1:1111"), BookieId.parse("1.1.1.1:1112"));
    setDefaultIsolationGroup(brokerBookkeeperClientIsolationGroups, zkClient, defaultBookies);
    // primary group empty
    setDefaultIsolationGroup(tenantNamespaceIsolationGroupsPrimary, zkClient, downedBookies);
    setDefaultIsolationGroup(tenantNamespaceIsolationGroupsSecondary, zkClient, isolatedBookies);
    ServiceConfiguration config = new ServiceConfiguration();
    config.setLoadManagerClassName(ModularLoadManagerImpl.class.getName());
    config.setClusterName(cluster);
    config.setWebServicePort(Optional.of(0));
    config.setMetadataStoreUrl("zk:127.0.0.1" + ":" + bkEnsemble.getZookeeperPort());
    config.setBrokerShutdownTimeoutMs(0L);
    config.setLoadBalancerOverrideBrokerNicSpeedGbps(Optional.of(1.0d));
    config.setBrokerServicePort(Optional.of(0));
    config.setAdvertisedAddress("localhost");
    config.setBookkeeperClientIsolationGroups(brokerBookkeeperClientIsolationGroups);
    config.setManagedLedgerDefaultEnsembleSize(2);
    config.setManagedLedgerDefaultWriteQuorum(2);
    config.setManagedLedgerDefaultAckQuorum(2);
    config.setAllowAutoTopicCreationType("non-partitioned");
    int totalEntriesPerLedger = 20;
    int totalLedgers = totalPublish / totalEntriesPerLedger;
    config.setManagedLedgerMaxEntriesPerLedger(totalEntriesPerLedger);
    config.setManagedLedgerMinLedgerRolloverTimeMinutes(0);
    pulsarService = new PulsarService(config);
    pulsarService.start();
    PulsarAdmin admin = PulsarAdmin.builder().serviceHttpUrl(pulsarService.getWebServiceAddress()).build();
    ClusterData clusterData = ClusterData.builder().serviceUrl(pulsarService.getWebServiceAddress()).build();
    admin.clusters().createCluster(cluster, clusterData);
    TenantInfoImpl tenantInfo = new TenantInfoImpl(null, Sets.newHashSet(cluster));
    admin.tenants().createTenant(tenant1, tenantInfo);
    admin.namespaces().createNamespace(ns1);
    admin.namespaces().createNamespace(ns2);
    admin.namespaces().createNamespace(ns3);
    admin.namespaces().createNamespace(ns4);
    admin.namespaces().setBookieAffinityGroup(ns2, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).bookkeeperAffinityGroupSecondary(tenantNamespaceIsolationGroupsSecondary).build());
    admin.namespaces().setBookieAffinityGroup(ns3, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).bookkeeperAffinityGroupSecondary(tenantNamespaceIsolationGroupsSecondary).build());
    admin.namespaces().setBookieAffinityGroup(ns4, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns2), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).bookkeeperAffinityGroupSecondary(tenantNamespaceIsolationGroupsSecondary).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns3), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).bookkeeperAffinityGroupSecondary(tenantNamespaceIsolationGroupsSecondary).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns4), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).build());
    try {
        admin.namespaces().getBookieAffinityGroup(ns1);
        fail("ns1 should have no bookie affinity group set");
    } catch (PulsarAdminException.NotFoundException e) {
    // Ok
    }
    @Cleanup PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(pulsarService.getBrokerServiceUrl()).statsInterval(-1, TimeUnit.SECONDS).build();
    PersistentTopic topic1 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns1, "topic1", totalPublish);
    PersistentTopic topic2 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns2, "topic1", totalPublish);
    PersistentTopic topic3 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns3, "topic1", totalPublish);
    BookieImpl bookie1 = (BookieImpl) bookies[0].getBookie();
    LedgerManager ledgerManager = getLedgerManager(bookie1);
    // namespace: ns1
    ManagedLedgerImpl ml = (ManagedLedgerImpl) topic1.getManagedLedger();
    assertEquals(ml.getLedgersInfoAsList().size(), totalLedgers);
    // validate ledgers' ensemble with affinity bookies
    assertAffinityBookies(ledgerManager, ml.getLedgersInfoAsList(), defaultBookies);
    // namespace: ns2
    ml = (ManagedLedgerImpl) topic2.getManagedLedger();
    assertEquals(ml.getLedgersInfoAsList().size(), totalLedgers);
    // validate ledgers' ensemble with affinity bookies
    assertAffinityBookies(ledgerManager, ml.getLedgersInfoAsList(), isolatedBookies);
    // namespace: ns3
    ml = (ManagedLedgerImpl) topic3.getManagedLedger();
    assertEquals(ml.getLedgersInfoAsList().size(), totalLedgers);
    // validate ledgers' ensemble with affinity bookies
    assertAffinityBookies(ledgerManager, ml.getLedgersInfoAsList(), isolatedBookies);
    ManagedLedgerClientFactory mlFactory = (ManagedLedgerClientFactory) pulsarService.getManagedLedgerClientFactory();
    Map<EnsemblePlacementPolicyConfig, BookKeeper> bkPlacementPolicyToBkClientMap = mlFactory.getBkEnsemblePolicyToBookKeeperMap();
    // broker should create only 1 bk-client and factory per isolation-group
    assertEquals(bkPlacementPolicyToBkClientMap.size(), 1);
    // ns4 doesn't have secondary group so, publish should fail
    try {
        PersistentTopic topic4 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns4, "topic1", 1);
        fail("should have failed due to not enough non-faulty bookie");
    } catch (BrokerPersistenceException e) {
    // Ok..
    }
}
Also used : BookieId(org.apache.bookkeeper.net.BookieId) LedgerManager(org.apache.bookkeeper.meta.LedgerManager) BookieServer(org.apache.bookkeeper.proto.BookieServer) Cleanup(lombok.Cleanup) ManagedLedgerClientFactory(org.apache.pulsar.broker.ManagedLedgerClientFactory) ModularLoadManagerImpl(org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl) ServiceConfiguration(org.apache.pulsar.broker.ServiceConfiguration) PulsarService(org.apache.pulsar.broker.PulsarService) PulsarClient(org.apache.pulsar.client.api.PulsarClient) PulsarAdmin(org.apache.pulsar.client.admin.PulsarAdmin) BookKeeper(org.apache.bookkeeper.client.BookKeeper) TenantInfoImpl(org.apache.pulsar.common.policies.data.TenantInfoImpl) ManagedLedgerImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl) BookieImpl(org.apache.bookkeeper.bookie.BookieImpl) ZooKeeper(org.apache.zookeeper.ZooKeeper) ClusterData(org.apache.pulsar.common.policies.data.ClusterData) BrokerPersistenceException(org.apache.pulsar.client.api.PulsarClientException.BrokerPersistenceException) PersistentTopic(org.apache.pulsar.broker.service.persistent.PersistentTopic) EnsemblePlacementPolicyConfig(org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfig) PulsarAdminException(org.apache.pulsar.client.admin.PulsarAdminException) Test(org.testng.annotations.Test)

Example 3 with BookieImpl

use of org.apache.bookkeeper.bookie.BookieImpl in project incubator-pulsar by apache.

the class BrokerBookieIsolationTest method testSetRackInfoAndAffinityGroupDuringProduce.

@Test
public void testSetRackInfoAndAffinityGroupDuringProduce() throws Exception {
    final String tenant1 = "tenant1";
    final String cluster = "use";
    final String ns2 = String.format("%s/%s/%s", tenant1, cluster, "ns2");
    final int totalPublish = 100;
    final String brokerBookkeeperClientIsolationGroups = "default-group";
    final String tenantNamespaceIsolationGroups = "tenant1-isolation";
    BookieServer[] bookies = bkEnsemble.getBookies();
    ZooKeeper zkClient = bkEnsemble.getZkClient();
    Set<BookieId> isolatedBookies = Sets.newHashSet(bookies[2].getBookieId(), bookies[3].getBookieId());
    ServiceConfiguration config = new ServiceConfiguration();
    config.setLoadManagerClassName(ModularLoadManagerImpl.class.getName());
    config.setClusterName(cluster);
    config.setWebServicePort(Optional.of(0));
    config.setZookeeperServers("127.0.0.1" + ":" + bkEnsemble.getZookeeperPort());
    config.setBrokerShutdownTimeoutMs(0L);
    config.setLoadBalancerOverrideBrokerNicSpeedGbps(Optional.of(1.0d));
    config.setBrokerServicePort(Optional.of(0));
    config.setAdvertisedAddress("localhost");
    config.setStrictBookieAffinityEnabled(true);
    config.setBookkeeperClientIsolationGroups(brokerBookkeeperClientIsolationGroups);
    config.setManagedLedgerDefaultEnsembleSize(2);
    config.setManagedLedgerDefaultWriteQuorum(2);
    config.setManagedLedgerDefaultAckQuorum(2);
    config.setAllowAutoTopicCreationType("non-partitioned");
    int totalEntriesPerLedger = 20;
    int totalLedgers = totalPublish / totalEntriesPerLedger;
    config.setManagedLedgerMaxEntriesPerLedger(totalEntriesPerLedger);
    config.setManagedLedgerMinLedgerRolloverTimeMinutes(0);
    pulsarService = new PulsarService(config);
    pulsarService.start();
    PulsarAdmin admin = PulsarAdmin.builder().serviceHttpUrl(pulsarService.getWebServiceAddress()).build();
    ClusterData clusterData = ClusterData.builder().serviceUrl(pulsarService.getWebServiceAddress()).build();
    admin.clusters().createCluster(cluster, clusterData);
    TenantInfoImpl tenantInfo = new TenantInfoImpl(null, Sets.newHashSet(cluster));
    admin.tenants().createTenant(tenant1, tenantInfo);
    admin.namespaces().createNamespace(ns2);
    try {
        admin.namespaces().getBookieAffinityGroup(ns2);
        fail("ns2 should have no bookie affinity group set");
    } catch (PulsarAdminException.NotFoundException e) {
    // Ok
    }
    @Cleanup PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(pulsarService.getBrokerServiceUrl()).statsInterval(-1, TimeUnit.SECONDS).build();
    final String topicName = String.format("persistent://%s/%s", ns2, "topic1");
    Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name").subscribe();
    consumer.close();
    ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer().topic(topicName).sendTimeout(5, TimeUnit.SECONDS);
    Producer<byte[]> producer = producerBuilder.create();
    for (int i = 0; i < 20; i++) {
        String message = "my-message-" + i;
        producer.send(message.getBytes());
    }
    setDefaultIsolationGroup(tenantNamespaceIsolationGroups, zkClient, isolatedBookies);
    admin.namespaces().setBookieAffinityGroup(ns2, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroups).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns2), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroups).build());
    PersistentTopic topic2 = (PersistentTopic) pulsarService.getBrokerService().getTopicReference(topicName).get();
    ManagedLedgerImpl ml = (ManagedLedgerImpl) topic2.getManagedLedger();
    Awaitility.await().untilAsserted(() -> Assert.assertTrue(ml.getConfig().getBookKeeperEnsemblePlacementPolicyProperties().size() > 0));
    for (int i = 0; i < 80; i++) {
        String message = "my-message-" + i;
        producer.send(message.getBytes());
    }
    producer.close();
    BookieImpl bookie1 = (BookieImpl) bookies[0].getBookie();
    LedgerManager ledgerManager = getLedgerManager(bookie1);
    ManagedLedgerImpl ml2 = (ManagedLedgerImpl) topic2.getManagedLedger();
    // namespace: ns2
    assertEquals(ml2.getLedgersInfoAsList().size(), totalLedgers);
    List<LedgerInfo> ledgers = ml2.getLedgersInfoAsList();
    // validate ledgers' ensemble with affinity bookies
    for (int i = 1; i < ledgers.size(); i++) {
        LedgerInfo lInfo = ledgers.get(i);
        long ledgerId = lInfo.getLedgerId();
        CompletableFuture<Versioned<LedgerMetadata>> ledgerMetaFuture = ledgerManager.readLedgerMetadata(ledgerId);
        LedgerMetadata ledgerMetadata = ledgerMetaFuture.get().getValue();
        Set<BookieId> ledgerBookies = Sets.newHashSet();
        ledgerBookies.addAll(ledgerMetadata.getAllEnsembles().values().iterator().next());
        assertEquals(ledgerBookies.size(), isolatedBookies.size());
        ledgerBookies.removeAll(isolatedBookies);
        assertEquals(ledgerBookies.size(), 0);
    }
}
Also used : BookieId(org.apache.bookkeeper.net.BookieId) LedgerManager(org.apache.bookkeeper.meta.LedgerManager) Versioned(org.apache.bookkeeper.versioning.Versioned) BookieServer(org.apache.bookkeeper.proto.BookieServer) Cleanup(lombok.Cleanup) ModularLoadManagerImpl(org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl) ServiceConfiguration(org.apache.pulsar.broker.ServiceConfiguration) PulsarService(org.apache.pulsar.broker.PulsarService) PulsarClient(org.apache.pulsar.client.api.PulsarClient) PulsarAdmin(org.apache.pulsar.client.admin.PulsarAdmin) TenantInfoImpl(org.apache.pulsar.common.policies.data.TenantInfoImpl) LedgerInfo(org.apache.bookkeeper.mledger.proto.MLDataFormats.ManagedLedgerInfo.LedgerInfo) ManagedLedgerImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl) BookieImpl(org.apache.bookkeeper.bookie.BookieImpl) ZooKeeper(org.apache.zookeeper.ZooKeeper) ClusterData(org.apache.pulsar.common.policies.data.ClusterData) LedgerMetadata(org.apache.bookkeeper.client.api.LedgerMetadata) PersistentTopic(org.apache.pulsar.broker.service.persistent.PersistentTopic) PulsarAdminException(org.apache.pulsar.client.admin.PulsarAdminException) Test(org.testng.annotations.Test)

Example 4 with BookieImpl

use of org.apache.bookkeeper.bookie.BookieImpl in project incubator-pulsar by apache.

the class BrokerBookieIsolationTest method testStrictBookieIsolation.

/**
 * Validate that broker can support tenant based strict bookie isolation.
 *
 * <pre>
 * 1. create one bookie-info group : isolated-group
 * 2. namespace ns1 : has none group
 *    validate: bookie-ensemble for ns1-topics's ledger will be from bookies don't belongs to any group
 *    if bookies don't belongs to any group are not enough, then, throw #BKNotEnoughBookiesException
 * 3. namespace ns2,ns3,ns4: uses isolated-group
 *    validate: bookie-ensemble for above namespace-topics's ledger will try to select from isolated-group firstly
 *    if bookies belongs to isolated-group are not enough
 *    then, bookies from secondary isolation group will be selected (if secondary isolation group set)
 *    if bookies still are not enough, then, bookies don't belongs to any group will be selected.
 * </pre>
 *
 * @throws Exception
 */
@Test
public void testStrictBookieIsolation() throws Exception {
    final String tenant1 = "tenant1";
    final String cluster = "use";
    final String ns1 = String.format("%s/%s/%s", tenant1, cluster, "ns1");
    final String ns2 = String.format("%s/%s/%s", tenant1, cluster, "ns2");
    final String ns3 = String.format("%s/%s/%s", tenant1, cluster, "ns3");
    final String ns4 = String.format("%s/%s/%s", tenant1, cluster, "ns4");
    final int totalPublish = 100;
    final String brokerBookkeeperClientIsolationGroups = "default-group";
    final String tenantNamespaceIsolationGroups = "tenant1-isolation";
    BookieServer[] bookies = bkEnsemble.getBookies();
    ZooKeeper zkClient = bkEnsemble.getZkClient();
    Set<BookieId> defaultBookies = Sets.newHashSet(bookies[0].getBookieId(), bookies[1].getBookieId());
    Set<BookieId> isolatedBookies = Sets.newHashSet(bookies[2].getBookieId(), bookies[3].getBookieId());
    setDefaultIsolationGroup(tenantNamespaceIsolationGroups, zkClient, isolatedBookies);
    ServiceConfiguration config = new ServiceConfiguration();
    config.setLoadManagerClassName(ModularLoadManagerImpl.class.getName());
    config.setClusterName(cluster);
    config.setWebServicePort(Optional.of(0));
    config.setZookeeperServers("127.0.0.1" + ":" + bkEnsemble.getZookeeperPort());
    config.setBrokerShutdownTimeoutMs(0L);
    config.setLoadBalancerOverrideBrokerNicSpeedGbps(Optional.of(1.0d));
    config.setBrokerServicePort(Optional.of(0));
    config.setAdvertisedAddress("localhost");
    config.setStrictBookieAffinityEnabled(true);
    config.setTopicLevelPoliciesEnabled(false);
    config.setSystemTopicEnabled(false);
    config.setBookkeeperClientIsolationGroups(brokerBookkeeperClientIsolationGroups);
    config.setManagedLedgerDefaultEnsembleSize(2);
    config.setManagedLedgerDefaultWriteQuorum(2);
    config.setManagedLedgerDefaultAckQuorum(2);
    config.setAllowAutoTopicCreationType("non-partitioned");
    int totalEntriesPerLedger = 20;
    int totalLedgers = totalPublish / totalEntriesPerLedger;
    config.setManagedLedgerMaxEntriesPerLedger(totalEntriesPerLedger);
    config.setManagedLedgerMinLedgerRolloverTimeMinutes(0);
    pulsarService = new PulsarService(config);
    pulsarService.start();
    PulsarAdmin admin = PulsarAdmin.builder().serviceHttpUrl(pulsarService.getWebServiceAddress()).build();
    ClusterData clusterData = ClusterData.builder().serviceUrl(pulsarService.getWebServiceAddress()).build();
    admin.clusters().createCluster(cluster, clusterData);
    TenantInfoImpl tenantInfo = new TenantInfoImpl(null, Sets.newHashSet(cluster));
    admin.tenants().createTenant(tenant1, tenantInfo);
    admin.namespaces().createNamespace(ns1);
    admin.namespaces().createNamespace(ns2);
    admin.namespaces().createNamespace(ns3);
    admin.namespaces().createNamespace(ns4);
    admin.namespaces().setBookieAffinityGroup(ns2, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroups).build());
    admin.namespaces().setBookieAffinityGroup(ns3, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroups).build());
    admin.namespaces().setBookieAffinityGroup(ns4, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroups).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns2), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroups).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns3), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroups).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns4), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroups).build());
    try {
        admin.namespaces().getBookieAffinityGroup(ns1);
        fail("ns1 should have no bookie affinity group set");
    } catch (PulsarAdminException.NotFoundException e) {
    // Ok
    }
    @Cleanup PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(pulsarService.getBrokerServiceUrl()).statsInterval(-1, TimeUnit.SECONDS).build();
    PersistentTopic topic1 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns1, "topic1", totalPublish);
    PersistentTopic topic2 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns2, "topic1", totalPublish);
    PersistentTopic topic3 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns3, "topic1", totalPublish);
    PersistentTopic topic4 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns4, "topic1", totalPublish);
    BookieImpl bookie1 = (BookieImpl) bookies[0].getBookie();
    LedgerManager ledgerManager = getLedgerManager(bookie1);
    // namespace: ns1
    ManagedLedgerImpl ml = (ManagedLedgerImpl) topic1.getManagedLedger();
    assertEquals(ml.getLedgersInfoAsList().size(), totalLedgers);
    // validate ledgers' ensemble with affinity bookies
    assertAffinityBookies(ledgerManager, ml.getLedgersInfoAsList(), defaultBookies);
    // namespace: ns2
    ml = (ManagedLedgerImpl) topic2.getManagedLedger();
    assertEquals(ml.getLedgersInfoAsList().size(), totalLedgers);
    // validate ledgers' ensemble with affinity bookies
    assertAffinityBookies(ledgerManager, ml.getLedgersInfoAsList(), isolatedBookies);
    // namespace: ns3
    ml = (ManagedLedgerImpl) topic3.getManagedLedger();
    assertEquals(ml.getLedgersInfoAsList().size(), totalLedgers);
    // validate ledgers' ensemble with affinity bookies
    assertAffinityBookies(ledgerManager, ml.getLedgersInfoAsList(), isolatedBookies);
    // namespace: ns4
    ml = (ManagedLedgerImpl) topic4.getManagedLedger();
    assertEquals(ml.getLedgersInfoAsList().size(), totalLedgers);
    // validate ledgers' ensemble with affinity bookies
    assertAffinityBookies(ledgerManager, ml.getLedgersInfoAsList(), isolatedBookies);
    ManagedLedgerClientFactory mlFactory = (ManagedLedgerClientFactory) pulsarService.getManagedLedgerClientFactory();
    Map<EnsemblePlacementPolicyConfig, BookKeeper> bkPlacementPolicyToBkClientMap = mlFactory.getBkEnsemblePolicyToBookKeeperMap();
    // broker should create only 1 bk-client and factory per isolation-group
    assertEquals(bkPlacementPolicyToBkClientMap.size(), 2);
    // make sure bk-isolation group also configure REPP_DNS_RESOLVER_CLASS as ZkBookieRackAffinityMapping to
    // configure rack-aware policy with in isolated group
    Map<EnsemblePlacementPolicyConfig, BookKeeper> bkMap = mlFactory.getBkEnsemblePolicyToBookKeeperMap();
    BookKeeper bk = bkMap.values().iterator().next();
    Method getConf = BookKeeper.class.getDeclaredMethod("getConf");
    getConf.setAccessible(true);
    ClientConfiguration clientConf = (ClientConfiguration) getConf.invoke(bk);
    assertEquals(clientConf.getProperty(REPP_DNS_RESOLVER_CLASS), BookieRackAffinityMapping.class.getName());
}
Also used : BookieId(org.apache.bookkeeper.net.BookieId) LedgerManager(org.apache.bookkeeper.meta.LedgerManager) BookieServer(org.apache.bookkeeper.proto.BookieServer) Cleanup(lombok.Cleanup) ManagedLedgerClientFactory(org.apache.pulsar.broker.ManagedLedgerClientFactory) ModularLoadManagerImpl(org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl) ServiceConfiguration(org.apache.pulsar.broker.ServiceConfiguration) PulsarService(org.apache.pulsar.broker.PulsarService) PulsarClient(org.apache.pulsar.client.api.PulsarClient) PulsarAdmin(org.apache.pulsar.client.admin.PulsarAdmin) BookKeeper(org.apache.bookkeeper.client.BookKeeper) AfterMethod(org.testng.annotations.AfterMethod) Method(java.lang.reflect.Method) BeforeMethod(org.testng.annotations.BeforeMethod) TenantInfoImpl(org.apache.pulsar.common.policies.data.TenantInfoImpl) ManagedLedgerImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl) BookieImpl(org.apache.bookkeeper.bookie.BookieImpl) ZooKeeper(org.apache.zookeeper.ZooKeeper) ClusterData(org.apache.pulsar.common.policies.data.ClusterData) BookieRackAffinityMapping(org.apache.pulsar.bookie.rackawareness.BookieRackAffinityMapping) PersistentTopic(org.apache.pulsar.broker.service.persistent.PersistentTopic) EnsemblePlacementPolicyConfig(org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfig) PulsarAdminException(org.apache.pulsar.client.admin.PulsarAdminException) ClientConfiguration(org.apache.bookkeeper.conf.ClientConfiguration) Test(org.testng.annotations.Test)

Example 5 with BookieImpl

use of org.apache.bookkeeper.bookie.BookieImpl in project incubator-pulsar by apache.

the class BrokerBookieIsolationTest method testBookieIsolationWithSecondaryGroup.

/**
 * It verifies that "ZkIsolatedBookieEnsemblePlacementPolicy" considers secondary affinity-group if primary group
 * doesn't have enough non-faulty bookies.
 *
 * @throws Exception
 */
@Test
public void testBookieIsolationWithSecondaryGroup() throws Exception {
    final String tenant1 = "tenant1";
    final String cluster = "use";
    final String ns1 = String.format("%s/%s/%s", tenant1, cluster, "ns1");
    final String ns2 = String.format("%s/%s/%s", tenant1, cluster, "ns2");
    final String ns3 = String.format("%s/%s/%s", tenant1, cluster, "ns3");
    final String ns4 = String.format("%s/%s/%s", tenant1, cluster, "ns4");
    final int totalPublish = 100;
    final String brokerBookkeeperClientIsolationGroups = "default-group";
    final String tenantNamespaceIsolationGroupsPrimary = "tenant1-isolation-primary";
    final String tenantNamespaceIsolationGroupsSecondary = "tenant1-isolation=secondary";
    BookieServer[] bookies = bkEnsemble.getBookies();
    ZooKeeper zkClient = bkEnsemble.getZkClient();
    Set<BookieId> defaultBookies = Sets.newHashSet(bookies[0].getBookieId(), bookies[1].getBookieId());
    Set<BookieId> isolatedBookies = Sets.newHashSet(bookies[2].getBookieId(), bookies[3].getBookieId());
    Set<BookieId> downedBookies = Sets.newHashSet(BookieId.parse("1.1.1.1:1111"), BookieId.parse("1.1.1.1:1112"));
    setDefaultIsolationGroup(brokerBookkeeperClientIsolationGroups, zkClient, defaultBookies);
    // primary group empty
    setDefaultIsolationGroup(tenantNamespaceIsolationGroupsPrimary, zkClient, downedBookies);
    setDefaultIsolationGroup(tenantNamespaceIsolationGroupsSecondary, zkClient, isolatedBookies);
    ServiceConfiguration config = new ServiceConfiguration();
    config.setLoadManagerClassName(ModularLoadManagerImpl.class.getName());
    config.setClusterName(cluster);
    config.setWebServicePort(Optional.of(0));
    config.setMetadataStoreUrl("zk:127.0.0.1" + ":" + bkEnsemble.getZookeeperPort());
    config.setBrokerShutdownTimeoutMs(0L);
    config.setLoadBalancerOverrideBrokerNicSpeedGbps(Optional.of(1.0d));
    config.setBrokerServicePort(Optional.of(0));
    config.setAdvertisedAddress("localhost");
    config.setBookkeeperClientIsolationGroups(brokerBookkeeperClientIsolationGroups);
    config.setManagedLedgerDefaultEnsembleSize(2);
    config.setManagedLedgerDefaultWriteQuorum(2);
    config.setManagedLedgerDefaultAckQuorum(2);
    config.setAllowAutoTopicCreationType("non-partitioned");
    int totalEntriesPerLedger = 20;
    int totalLedgers = totalPublish / totalEntriesPerLedger;
    config.setManagedLedgerMaxEntriesPerLedger(totalEntriesPerLedger);
    config.setManagedLedgerMinLedgerRolloverTimeMinutes(0);
    pulsarService = new PulsarService(config);
    pulsarService.start();
    PulsarAdmin admin = PulsarAdmin.builder().serviceHttpUrl(pulsarService.getWebServiceAddress()).build();
    ClusterData clusterData = ClusterData.builder().serviceUrl(pulsarService.getWebServiceAddress()).build();
    admin.clusters().createCluster(cluster, clusterData);
    TenantInfoImpl tenantInfo = new TenantInfoImpl(null, Sets.newHashSet(cluster));
    admin.tenants().createTenant(tenant1, tenantInfo);
    admin.namespaces().createNamespace(ns1);
    admin.namespaces().createNamespace(ns2);
    admin.namespaces().createNamespace(ns3);
    admin.namespaces().createNamespace(ns4);
    admin.namespaces().setBookieAffinityGroup(ns2, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).bookkeeperAffinityGroupSecondary(tenantNamespaceIsolationGroupsSecondary).build());
    admin.namespaces().setBookieAffinityGroup(ns3, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).bookkeeperAffinityGroupSecondary(tenantNamespaceIsolationGroupsSecondary).build());
    admin.namespaces().setBookieAffinityGroup(ns4, BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns2), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).bookkeeperAffinityGroupSecondary(tenantNamespaceIsolationGroupsSecondary).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns3), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).bookkeeperAffinityGroupSecondary(tenantNamespaceIsolationGroupsSecondary).build());
    assertEquals(admin.namespaces().getBookieAffinityGroup(ns4), BookieAffinityGroupData.builder().bookkeeperAffinityGroupPrimary(tenantNamespaceIsolationGroupsPrimary).build());
    try {
        admin.namespaces().getBookieAffinityGroup(ns1);
        fail("ns1 should have no bookie affinity group set");
    } catch (PulsarAdminException.NotFoundException e) {
    // Ok
    }
    @Cleanup PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(pulsarService.getBrokerServiceUrl()).statsInterval(-1, TimeUnit.SECONDS).build();
    PersistentTopic topic1 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns1, "topic1", totalPublish);
    PersistentTopic topic2 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns2, "topic1", totalPublish);
    PersistentTopic topic3 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns3, "topic1", totalPublish);
    BookieImpl bookie1 = (BookieImpl) bookies[0].getBookie();
    LedgerManager ledgerManager = getLedgerManager(bookie1);
    // namespace: ns1
    ManagedLedgerImpl ml = (ManagedLedgerImpl) topic1.getManagedLedger();
    assertEquals(ml.getLedgersInfoAsList().size(), totalLedgers);
    // validate ledgers' ensemble with affinity bookies
    assertAffinityBookies(ledgerManager, ml.getLedgersInfoAsList(), defaultBookies);
    // namespace: ns2
    ml = (ManagedLedgerImpl) topic2.getManagedLedger();
    assertEquals(ml.getLedgersInfoAsList().size(), totalLedgers);
    // validate ledgers' ensemble with affinity bookies
    assertAffinityBookies(ledgerManager, ml.getLedgersInfoAsList(), isolatedBookies);
    // namespace: ns3
    ml = (ManagedLedgerImpl) topic3.getManagedLedger();
    assertEquals(ml.getLedgersInfoAsList().size(), totalLedgers);
    // validate ledgers' ensemble with affinity bookies
    assertAffinityBookies(ledgerManager, ml.getLedgersInfoAsList(), isolatedBookies);
    ManagedLedgerClientFactory mlFactory = (ManagedLedgerClientFactory) pulsarService.getManagedLedgerClientFactory();
    Map<EnsemblePlacementPolicyConfig, BookKeeper> bkPlacementPolicyToBkClientMap = mlFactory.getBkEnsemblePolicyToBookKeeperMap();
    // broker should create only 1 bk-client and factory per isolation-group
    assertEquals(bkPlacementPolicyToBkClientMap.size(), 1);
    // ns4 doesn't have secondary group so, publish should fail
    try {
        PersistentTopic topic4 = (PersistentTopic) createTopicAndPublish(pulsarClient, ns4, "topic1", 1);
        fail("should have failed due to not enough non-faulty bookie");
    } catch (BrokerPersistenceException e) {
    // Ok..
    }
}
Also used : BookieId(org.apache.bookkeeper.net.BookieId) LedgerManager(org.apache.bookkeeper.meta.LedgerManager) BookieServer(org.apache.bookkeeper.proto.BookieServer) Cleanup(lombok.Cleanup) ManagedLedgerClientFactory(org.apache.pulsar.broker.ManagedLedgerClientFactory) ModularLoadManagerImpl(org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl) ServiceConfiguration(org.apache.pulsar.broker.ServiceConfiguration) PulsarService(org.apache.pulsar.broker.PulsarService) PulsarClient(org.apache.pulsar.client.api.PulsarClient) PulsarAdmin(org.apache.pulsar.client.admin.PulsarAdmin) BookKeeper(org.apache.bookkeeper.client.BookKeeper) TenantInfoImpl(org.apache.pulsar.common.policies.data.TenantInfoImpl) ManagedLedgerImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl) BookieImpl(org.apache.bookkeeper.bookie.BookieImpl) ZooKeeper(org.apache.zookeeper.ZooKeeper) ClusterData(org.apache.pulsar.common.policies.data.ClusterData) BrokerPersistenceException(org.apache.pulsar.client.api.PulsarClientException.BrokerPersistenceException) PersistentTopic(org.apache.pulsar.broker.service.persistent.PersistentTopic) EnsemblePlacementPolicyConfig(org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfig) PulsarAdminException(org.apache.pulsar.client.admin.PulsarAdminException) Test(org.testng.annotations.Test)

Aggregations

BookieImpl (org.apache.bookkeeper.bookie.BookieImpl)18 LedgerManager (org.apache.bookkeeper.meta.LedgerManager)9 BookieId (org.apache.bookkeeper.net.BookieId)9 File (java.io.File)8 Cleanup (lombok.Cleanup)8 LedgerDirsManager (org.apache.bookkeeper.bookie.LedgerDirsManager)8 ManagedLedgerImpl (org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl)8 BookieServer (org.apache.bookkeeper.proto.BookieServer)8 PulsarService (org.apache.pulsar.broker.PulsarService)8 ServiceConfiguration (org.apache.pulsar.broker.ServiceConfiguration)8 ModularLoadManagerImpl (org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl)8 PersistentTopic (org.apache.pulsar.broker.service.persistent.PersistentTopic)8 PulsarAdmin (org.apache.pulsar.client.admin.PulsarAdmin)8 PulsarAdminException (org.apache.pulsar.client.admin.PulsarAdminException)8 PulsarClient (org.apache.pulsar.client.api.PulsarClient)8 ClusterData (org.apache.pulsar.common.policies.data.ClusterData)8 TenantInfoImpl (org.apache.pulsar.common.policies.data.TenantInfoImpl)8 ZooKeeper (org.apache.zookeeper.ZooKeeper)8 Test (org.testng.annotations.Test)8 BookKeeper (org.apache.bookkeeper.client.BookKeeper)7