Поделиться через


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

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

Добавление сегмента для нового диапазона или ключа

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

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

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

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

// 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.