É possível especificar zonas e regras de zona com o arquivo descritor XML de política de implementação.
Este exemplo coloca shards primários em uma zona e shards de réplica em uma zona diferente, com uma réplica assíncrona única. Todos os shards primários iniciam na zona DC1. Os shards de réplica iniciam na zona DC2.
<?xml version="1.0" encoding="UTF-8"?>
<deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/deploymentPolicy
../deploymentPolicy.xsd" xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy">
<objectgridDeployment objectgridName="library">
<mapSet name="ms1" numberOfPartitions="13" minSyncReplicas="0"
maxSyncReplicas="0" maxAsyncReplicas="1">
<map ref="book" />
<zoneMetadata>
<shardMapping shard="P" zoneRuleRef="primaryRule"/>
<shardMapping shard="A" zoneRuleRef="replicaRule"/>
<zoneRule name ="primaryRule">
<zone name="DC1" />
</zoneRule>
<zoneRule name="replicaRule">
</zoneRule>
</zoneMetadata>
</mapSet>
</objectgridDeployment>
</deploymentPolicy>
Uma réplica assíncrona é definida no elemento mapSet ms1. Portanto, existem dois shards para cada partição: um shard primário e um shard de réplica assíncrona. No elemento zoneMetadata, um elemento shardMapping é definido para cada shard: P para o primário e DC1 para a réplica assíncrona. O atributo primaryRule define a zona configurada para os shards primários, que é apenas a zona DC1, e essa regra deve ser usada para o posicionamento de shard primário. As réplicas assíncronas são colocadas na zona DC2.
No entanto, se a zona DC2 for perdida, os shards de réplica se tornarão indisponíveis. A perda ou a falha de um servidor de contêiner na zona DC1 pode resultar em perda de dados, embora uma réplica tenha sido especificada.
Para abordar essa possibilidade, é possível incluir ou uma zona ou incluir uma réplica, conforme descrito nas seguintes seções.
O seguinte código configura uma nova zona:
<?xml version="1.0" encoding="UTF-8"?>
<deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/deploymentPolicy
../deploymentPolicy.xsd" xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy">
<objectgridDeployment objectgridName="library">
<mapSet name="ms1" numberOfPartitions="13" minSyncReplicas="0"
maxSyncReplicas="0" maxAsyncReplicas="1">
<map ref="book" />
<zoneMetadata>
<shardMapping shard="P" zoneRuleRef="stripeRule"/>
<shardMapping shard="A" zoneRuleRef="stripeRule"/>
<zoneRule name="stripeRule" exclusivePlacement="true">
<zone name="A" />
<zone name="B" />
<zone name="C" />
</zoneRule>
</zoneMetadata>
</mapSet>
</objectgridDeployment>
</deploymentPolicy>
Um total de três zonas foram definidas neste código: A, B e C. Em vez de separar as regras de zona em primário e de réplica, uma regra de zona compartilhada denominada stripeRule é definida. Essa regra inclui todas as zonas, com o atributo exclusivePlacement configurado para true. A política de posicionamento do eXtreme Scale garante que os shards primários e de réplica estejam em zonas separadas. Essa divisão de posicionamento faz com que os shards primários e de réplica se propaguem pelas duas zonas de acordo com essa política. Incluir uma terceira zona C assegura que a perda de qualquer zona não resulte em perda de dados e ainda deixará os shards primários e de réplica para cada partição. Uma falha de zona resulta na perda de um shard primário, de um shard de réplica, ou nenhum deles. Qualquer shard perdido é substituído a partir do shard sobrevivente, colocando-o na outra zona sobrevivente.
O cenário clássico de dois datacenters possui alta velocidade e redes de baixa latência em cada datacenter, porém possui alta latência entre os datacenters. As réplicas síncronas são usadas em cada datacenter onde a baixa latência minimiza o impacto da replicação nos tempos de resposta. A replicação assíncrona é usada entre os datacenters, portanto, a rede de alta latência não tem impacto no tempo de resposta.
<?xml version="1.0" encoding="UTF-8"?>
<deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/deploymentPolicy
../deploymentPolicy.xsd" xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy">
<objectgridDeployment objectgridName="library">
<mapSet name="ms1" numberOfPartitions="13" minSyncReplicas="1"
maxSyncReplicas="1" maxAsyncReplicas="1">
<map ref="book" />
<zoneMetadata>
<shardMapping shard="P" zoneRuleRef="primarySync"/>
<shardMapping shard="S" zoneRuleRef="primarySync"/>
<shardMapping shard="A" zoneRuleRef="async"/>
<zoneRule name ="primarySync" exclusivePlacement="false" >
<zone name="DC1" />
<zone name="DC2" />
</zoneRule>
<zoneRule name="async" exclusivePlacement="true">
<zone name="DC1" />
<zone name="DC2" />
</zoneRule>
</zoneMetadata>
</mapSet>
</objectgridDeployment>
</deploymentPolicy>
A réplica primária e a síncrona compartilham a regra primarySync com uma configuração de atributo exclusivePlacement de false. O atributo exclusivePlacement configurado para false cria uma configuração com os shards primário e de réplica síncrona de cada partição colocada na mesma zona. O shard de réplica assíncrono usa uma segunda regra de zona com a maioria das mesmas zonas como a regra de zona primarySync. No entanto, a réplica assíncrona usa o atributo exclusivePlacement configurado para true. O atributo exclusivePlacement, quando configurado como true, significa que um shard não pode ser colocado em uma zona com outro shard na mesma partição. Como resultado, o shard de réplica assíncrono não é colocado na mesma zona que o shard de réplica primário ou síncrono. Há três shards por partição nesse mapSet: um primário, um síncrono e um assíncrono, de modo que há três elementos shardMapping, um para cada shard.
Se uma zona for perdida, todas as réplicas assíncronas serão perdidas e nenhuma é gerada novamente porque elas não possuem nenhuma zona separada. Se os shards primários e de réplica forem perdidos, a réplica assíncrona sobrevivente será promovida para o primário e uma nova réplica síncrona é criada na zona. Os primários e réplicas são divididos em cada zona.
Com a disposição exclusiva, cada shard possui sua própria zona: Você deve ter zonas suficientes para todos os shards que desejar colocar em suas próprias zonas. Se uma regra possuir uma zona, somente um shard poderá ser colocado na zona. Com duas zonas, é possível ter até dois shards na zona.
O seguinte código configura uma nova zona:
<?xml version="1.0" encoding="UTF-8"?>
<deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/deploymentPolicy
../deploymentPolicy.xsd" xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy">
<objectgridDeployment objectgridName="library">
<mapSet name="ms1" numberOfPartitions="13" minSyncReplicas="0"
maxSyncReplicas="0" maxAsyncReplicas="1">
<map ref="book" />
<zoneMetadata>
<shardMapping shard="P" zoneRuleRef="stripeRule"/>
<shardMapping shard="A" zoneRuleRef="stripeRule"/>
<zoneRule name="stripeRule" exclusivePlacement="true">
<zone name="ReplicationZoneA" />
<zone name="ReplicationZoneB" />
<zone name="ReplicationZoneC" />
</zoneRule>
</zoneMetadata>
</mapSet>
</objectgridDeployment>
</deploymentPolicy>