Как мы обнаружили в комментариях, решение вашей проблемы было таким же, как описано here: ваша версия s3cmd была слишком старой для поддержки от-bucket to-bucket, и было исправлено обновление вашей версии s3cmd. Я рад, что это было легко исправить.
Однако есть две очень серьезные проблемы с тем, что вы пытаетесь сделать с этим инструментом.
s3cmd утилита не является подходящим инструментом для использования в cronjob на регулярной синхронизации двух ведер, по 2 причинам:
Во-первых, вам нужно сделать скидку на инструмент для запуска так долго, что пожары хрон снова в следующий раз; проблема, которую вы здесь имеете в себе, состоит в том, что вы могли бы одновременно иметь две или более копии s3cmd, одновременно пытаясь синхронизировать те же два ведра. В какой-то момент, когда 2-й экземпляр обнаружил все больше и больше вещей, которые уже были синхронизированы, вероятно, они наверняка догонят первую точку до такой степени, что оба они будут повторно имитировать примерно одни и те же файлы, удвоив количество передач, которые вы будете делать ,
График может выглядеть следующим образом:
... А открывает файл не существует, начинает синхронизироваться файлу
...... B открывает файл не существует, и начинает синхронизировать файл
......... завершает синхронизацию файла
............ B завершает синхронизацию файла.
Предполагая, что вы не используете объекты с версией в своем ковше, ваши данные будут в порядке, но вы платите за вдвое больше запросов и вдвое больше полосы пропускания.
В абсолютном минимуме ваше задание cron должно вызвать сценарий bash, который управляет файлом блокировки, чтобы предотвратить несколько одновременных прогонов.
Во-вторых, и, что более серьезно, s3cmd не будет масштабироваться в этой среде, поскольку у него нет «памяти» того, что находится в каждом ковше.
У меня есть, например, ведро с 8 миллионами предметов в нем. Если бы я хотел сделать однократную копию из ведра в ведро с s3cmd, это было бы хорошо. Проблема заключается в том, что s3cmd не «помнит» то, что видел в ваших ковши раньше, поэтому во второй раз и каждый последующий период времени он должен обнаруживать и проверять все 8 миллионов файлов в одном ведре, а затем проверять, re в другом ведре и (предположительно) проверить, являются ли они идентичными файлами, отправив запрос HEAD
против каждого объекта в обоих направлениях. Таким образом, этот подход не будет масштабироваться и может привести к существенной стоимости ненужных запросов на S3.
Для моих внутренних систем я поддерживаю локальную базу данных объектов в ведрах. Когда я добавляю объект в ведро, я обновляю базу данных с размером, md5 и другими атрибутами объекта после успешной передачи.Затем у меня есть все мои ковши, настроенные с протоколированием (в другое, общее ведро). Мои системы извлекают файлы журнала, анализируют их и для любых объектов, которые были загружены другими процессами (в соответствии с журналами). Я получаю их метаданные и сохраняю их в локальной базе данных тоже ... поэтому у меня есть локальное представление что находится в S3, которое задерживается всего на несколько минут (время ожидания регистрации журналов и их открытие).
Затем, когда мне нужно синхронизировать ведра с файловыми системами или друг с другом, я могу использовать локальную базу данных для сравнения содержимого и принятия решений о том, какие файлы нужно синхронизировать. Конечно, у меня также есть процессы, которые могут проверять базу данных для согласованности с S3.
Если вы собираетесь регулярно синхронизировать два ведра, я бы предложил вам более сложное решение, чем s3cmd.
Вы пробовали это самостоятельно, то есть не в работе cron? –
Да, я попробовал запустить команду, это говорит ОШИБКА: Проблема с параметром: Неверный источник/назначение: –
http://www.admon.org/sync-two-amazon-s3-buckets/ предполагает, что это может быть проблемой для более старых версии ... –