Добавление сегмента с использованием средств эластичных баз данных

Применимо к: База данных SQL Azure

Добавить шард для нового диапазона или ключа

Часто необходимо, чтобы приложение добавило в существующую карту сегментов новые сегменты для обработки данных, поступление которых ожидается из новых ключей и диапазонов ключей. Например, приложению, разделённому на сегменты с помощью TenantID, возможно, потребуется создать новый сегмент для нового клиента, или данные, разделённые на сегменты ежемесячно, может потребоваться новый сегмент, подготовленный до начала каждого нового месяца.

Если новый диапазон значений ключей еще не является частью существующего сопоставления, можно добавить новый сегмент и связать новый ключ или диапазон с этим сегментом.

Пример: добавление сегмента и его диапазона в имеющееся сопоставление сегментов

В этом примере используются TryGetShard (Java, .NET), CreateShard (Java, .NET), методы CreateRangeMapping (Java, .NET), и создается экземпляр класса ShardLocation (Java, .NET). В следующем примере база данных с именем sample_shard_2 и всеми необходимыми объектами схемы внутри нее была создана для хранения диапазона [300, 400).

// sm is a RangeShardMap object.
// Add a new shard to hold the range being added.
Shard shard2 = null;

if (!sm.TryGetShard(new ShardLocation(shardServer, "sample_shard_2"),out shard2))
{
    shard2 = sm.CreateShard(new ShardLocation(shardServer, "sample_shard_2"));  
}

// Create the mapping and associate it with the new shard
sm.CreateRangeMapping(new RangeMappingCreationInfo<long>
                            (new Range<long>(300, 400), shard2, MappingStatus.Online));

Добавить шард для пустой части существующего диапазона

В некоторых случаях, возможно, вы уже сопоставили диапазон с шардом и частично его заполнили данными, но теперь вы хотите перенаправить предстоящие данные на другой шард. Например, можно сегментировать диапазон по дням и уже выделить 50 дней сегменту, но в день 24 вы хотите, чтобы будущие данные приземлились в другом сегменте. Средство разделения эластичных баз данных может выполнять эту операцию, но если перемещение данных не требуется (например, данные для диапазона дней [25, 50), то есть день 25 включительно до 50 эксклюзивных, пока не существует) вы можете выполнять это полностью с помощью API управления картами сегментов напрямую.

Пример: разбиение диапазона и присвоение пустой части новому добавленному сегменту

База данных с именем sample_shard_2, а также все необходимые объекты схемы внутри нее, были созданы.

// sm is a RangeShardMap object.
// Add a new shard to hold the range we will move
Shard shard2 = null;

if (!sm.TryGetShard(new ShardLocation(shardServer, "sample_shard_2"),out shard2))
{
    shard2 = sm.CreateShard(new ShardLocation(shardServer,"sample_shard_2"));  
}

// Split the Range holding Key 25
sm.SplitMapping(sm.GetMappingForKey(25), 25);

// Map new range holding [25-50) to different shard:
// first take existing mapping offline
sm.MarkMappingOffline(sm.GetMappingForKey(25));

// now map while offline to a different shard and take online
RangeMappingUpdate upd = new RangeMappingUpdate();
upd.Shard = shard2;
sm.MarkMappingOnline(sm.UpdateMapping(sm.GetMappingForKey(25), upd));

Внимание

Используйте этот метод, только если вы уверены, что диапазон для обновленного сопоставления пуст. Методы выше не позволяют проверить данные для перемещаемого диапазона, так что лучше включить проверки в код. Если перемещаемый диапазон содержит строки, фактическое распределение данных не будет соответствовать обновленному сопоставлению сегментов. В таких случаях для выполнения операции используйте средство разбиения и объединения .

Еще не используете средства эластичных баз данных? Ознакомьтесь с нашим руководством по началу работы. Возникшие вопросы вы можете задать нам на странице вопросов Microsoft Q&A по Базе данных SQL. Что касается запросов новых функций, вы можете поделиться новыми идеями или проголосовать за существующие на форуме отзывов по Базе данных SQL.