none
Равномерное разделение пользователей по спискам RRS feed

  • Вопрос

  • Добрый день.

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

    До миграции:

    Старая база - 253 ящика, общий объем 1.7ТБ

    Новая база - 0 ящиков, общий объем 0.

    После миграции:

    Старая база - 124 ящика, общий объем 0.8ТБ

    Новая база - 129 ящиков, общий объем 0.9ТБ

    Подскажите пожалуйста, реально ли через PS сделать выгрузку пользователей в csv с требуемыми параметрами сортировки и в какую сторону смотреть? В интернете похожие задачи найти не получилось.

    12 ноября 2018 г. 7:02

Ответы

  • Есть готовые скрипты:

    https://gallery.technet.microsoft.com/office/Redistribute-Balance-66228e73

    https://gallery.technet.microsoft.com/office/Redistribute-mailboxes-4718a995

    • Помечено в качестве ответа Валера2 12 ноября 2018 г. 9:45
    • Снята пометка об ответе Валера2 12 ноября 2018 г. 9:47
    • Помечено в качестве ответа Валера2 12 ноября 2018 г. 9:48
    12 ноября 2018 г. 8:51
    Отвечающий

Все ответы

  • ну похоже на вариацию задачи о рюкзаке.

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

    12 ноября 2018 г. 7:15
  • 1. Создать две новых базы, т.к. урезать место от прошлой базы будет в разы сложнее, чем перенести

    2. Распределение по размеру

    # Имя новых баз

    $DBNAME01 = "DB01" $DBNAME02 = "DB02" $MDB01 = @() $MDB02 = @() $SDB01 = 0 $SDB02 = 0 $mbx = Get-Mailbox -ResultSize unlimited | Get-MailboxStatistics | Select @{n="Identity";e={$_.MailboxGuid.Guid}},@{n="Size"; e={[math]::Round(($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}} | Sort-Object Size -Descending foreach($mb in $mbx) { if($SDB01 -le $SDB02) { $SDB01 += $mb.Size $MDB01 += $mb | Select Identity,@{n="TargetDatabase";e={$DBNAME01}} } else { $SDB02 += $mb.Size $MDB02 += $mb | Select Identity,@{n="TargetDatabase";e={$DBNAME02}} } } $MDB01 + $MDB02 | Export-Csv result-csv -NoTypeInformation -UseCulture



    • Изменено KazunEditor 12 ноября 2018 г. 7:50
    12 ноября 2018 г. 7:49
    Отвечающий
  • Спасибо за ответы.

    Всего баз будет 30 дисков на 30 баз по 1ТБ, либо 15 дисков по 2ТБ. Я хотел сначала немного разгрузить самую загруженную базу, потом удалить её и тоже самое по очереди сделать с остальными старыми базами.

    Думаю ваше решение самое оптимальное. Если я правильно понял, в вашем скрипте ящики сортируются по объему и потом распределяются между двумя базами. Если объем отобранных ящиков в первой базе меньше или равен объему ящиков во второй, то он добавляется к первой, если больше, то ко второй.

    Только подскажите еще, пожалуйста, как сделать такую сортировку для большего количества баз?

    12 ноября 2018 г. 8:48
  • Есть готовые скрипты:

    https://gallery.technet.microsoft.com/office/Redistribute-Balance-66228e73

    https://gallery.technet.microsoft.com/office/Redistribute-mailboxes-4718a995

    • Помечено в качестве ответа Валера2 12 ноября 2018 г. 9:45
    • Снята пометка об ответе Валера2 12 ноября 2018 г. 9:47
    • Помечено в качестве ответа Валера2 12 ноября 2018 г. 9:48
    12 ноября 2018 г. 8:51
    Отвечающий
  • Спасибо, это хорошие скрипты. Но не совсем то, что нужно. Они берут все ящики и распределяют их между всеми базами. У меня есть архивные базы и отдельная база для определенных пользователей. И контролировать самому процесс миграции удобнее. В моем случае ваш скрипт подойдет лучше. Буду вам очень признателен, если подскажете как его изменить, чтобы распределение шло в большее количество баз.

    12 ноября 2018 г. 9:59
  • В скрипте - https://gallery.technet.microsoft.com/Leveling-Exchange-Database-3e9cdbc9 , можно указать базы для исключения $IGNORED_DATABASES и сохраняет результат в файл.
    12 ноября 2018 г. 10:16
    Отвечающий
  • Кажется это то, что нужно. Только скрипт почему то выдает ошибку

    Import-Csv : Could not find file 'C:\Users\adm\ExchangeMailboxData.csv'.
    At C:\TEMP\New-ExchangeRebalancingReport.ps1:277 char:24+ 
    
        $Mailboxes = @(Import-Csv $DataFile |
    +                        ~~~~~~~~~~~~~~~~~~~~ 
       + CategoryInfo          : OpenError: (:) [Import-Csv], 
    FileNotFoundException    + FullyQualifiedErrorId : 
    
    FileOpenFailure,Microsoft.PowerShell.Commands.ImportCsvCommand
    Если я правильно понял как работает это скрипт, то этот csv должен сам генерироваться скриптом. У вас не было такой ошибки при запуске?

    12 ноября 2018 г. 11:01
  • Указать только параметр -SaveData.
    12 ноября 2018 г. 11:12
    Отвечающий
  • В общем так и не получилось нормально запустить этот скрипт. Почему то он мне предложил всех пользователей положить в те же базы, в которых они сейчас.

    Но получилось написать скрипт своими силами.

    add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010 # тут задается количество баз по которым будет производиться сортировка $base = @{ base1=0; base2=0; base3=0; base4=0;}

    $userdb = @()

    $mbx = Get-Mailbox -ResultSize unlimited | Get-MailboxStatistics | Select @{n="Identity";e={$_.MailboxGuid.Guid}},@{n="Size"; e={[math]::Round(($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}},@{n="Database";e={$_.Database}}  | Sort-Object Size -Descending

    foreach($mb in $mbx) { $a =($base.GetEnumerator()|Sort Value)[0].Name $base[$a] += $mb.size #запись пользователей в csv, потом можно отсортировать по юзеру и базе для создания move-request

    $userdb = "$mb"+"$base[$a]" $userdb | Add-Content c:\temp\usersdb.csv }

    # Посмотреть насколько ровно раскидало пользователей по базам $base.GetEnumerator()|Sort Value[0].Name

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

    Не особо элегантно, но работает как надо. Спасибо Kazun, ваш скрипт очень помог.


    13 ноября 2018 г. 5:13