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

Область применения: База данных 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));

Для версии .NET можно также использовать PowerShell в качестве альтернативы, чтобы создать диспетчер карты сегментов. Пример представлен здесь.

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

В некоторых случаях к этому моменту диапазон может быть уже сопоставлен с сегментом и частично заполнен данными, но теперь последующие данные должны направляться в другой сегмент. Например, можно сегментировать диапазон по дням и выделить 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 по Базе данных SQL. Что касается запросов новых функций, вы можете поделиться новыми идеями или проголосовать за существующие на форуме отзывов о Базе данных SQL.