В конфигурации кластера для Distributed-таблицы указываются шарды, а для каждого шарда - реплики.
Distributed таблица выбирает, на какой шард писать какие данные, согласно ключу шардирования.
Например, если вы указали в качестве ключа шардирования rand(), то каждая строка попадёт на случайно выбранный шард.
А если указали UserID и у вас два шарда с weight = 1, то строки с UserID % 2 == 0, попадут на первый шард, а с UserID % 2 == 1 - на второй.
Для ReplacingMergeTree, вам надо, чтобы данные с одним первичным ключом, писались на один шард. Это значит, что в качестве ключа шардирования, вам надо взять функцию от первичного ключа или части его столбцов. Например, если у вас первичный ключ: (CounterID, EventDate, UserID), то вы можете взять в качестве ключа шардирования, например, UserID или CounterID, или cityHash64(UserID, CounterID) и т. п.
И, конечно, можно и самому писать нужные данные на нужные шарды непосредственно.