Делайте идентификаторы такими, чтобы можно было гарантированно их разбить на группы, например с шагом N (макс количество серверов) а стартовое значение сиквенсов у каждого сервера разное (от 1 до N) - назовем это стартовое число 'модуль индекса', таким образом вы сгруппируете данные, и перемещать их можно будет группами, по принадлежности индекса своему модулю индекса (получить его можно взял модуль от индекса по N, если N- степень двойки, то достаточно будет битовой маски).
Вам достаточно хранить, какой индекс модуля размещается на каком физическом сервере, и перемещать данные сразу этими группами, естественно в пределах одной транзакции (открываете транзакцию на обоих серверах, льете данные, по окончанию, комитите на одном, отмечаете в таблице что данные переехали, удаляете, комитите на другом.
Чтобы в процессе переноса на сервере данные не появлялись, сделайте механизмы, отключающие эту ноду от создания новых записей (этакий read/write only) и логирование факта модификации записи по id (дата последнего изменения в каждой таблице - либо используйте штатные механизмы низкоуровнего лога sql-сервера), т.е. таблица, которая будет у вас отвечать за информацию о размещении групп на серверах должна содержать содержать и этот флаг. И да, эту таблицу реплицируйте между серверами штатными инструментами sql-сервера.
Кстати, точно помню, в oracle можно было настроить репликацию данных по условию... не удивлюсь если это есть и у других, тогда за перенос данных между серверами будет отвечать внутренний механизм sql-сервера - это на порядок эффективнее и надежнее чем самописные инструменты.