Как стать автором
Обновить

Распределенная сеть файлового хранилища на Gmail.com

Время на прочтение4 мин
Количество просмотров744
Все давно уже знают о великолепной почте gmail.com и возможности хранить там более 7 гигабайт почты. Думаю, что также все знают о таких плагинах, как GMail Drive, который позволяет хранить в своем аккаунте файлы. Но, сейчас разговор не об этом, я хочу рассказать Вам о реально работающей системе, которая позволяет хранить неограниченное количество файлов на Gmail.com распределенно и с резервированием. Итак, задача, которую мне необходимо было решить еще три года назад, где хранить все увеличивающийся архив файлов, многие из которых я не буду использовать еще долгое время, так как к платным сервисам я отношусь скептически, то решено было сделать бесплатный. Выбор пал на gmail.com, который уже тогда предоставлял достаточно места для хранения почты.

Но, предстояло решить следующие задачи
  1. размер письма gmail.com три года назад составлял 10 мегабайт
  2. если загрузить на почту более 600 мегабайт за короткий период, почта блокируется
  3. если выгрузить из почты более 600 мегабайт за короткий период, почта тоже блокируется
Решение пришло само собой, было создано 100 аккаунтов почты, и написана система хранения.

Система состоит из следующих частей:

1. Загрузка файла в систему

Тут решение пришло само, раз gmail.com не позволяет хранить больше 10 мегабайт, файл разбивается на чанки и загружается по частям. В MySQL были созданы таблицы (см. приложение внизу поста) добавлены аккаунты и написан скрипт загрузки на gmail.

2. Обеспечение резервирования

Для этого был создан скрипт, который определял в скольких местах хранится каждый чанк, если таких мест меньше 2х (например, заблокировался аккаунт или просто новый файл, то скрипт проводил миграцию чанка на другой аккаунт)

3. Загрузка файла

Для загрузки файла, случайным образов выбирался аккаунт хранящий каждый чанк и последовательно грузилось в систему.

4. Проверка аккаунтов.

Специальный скрипт периодически проверял аккаунты на предмет блокировки аккаунта и сохранял эту информацию в БД.

5. Загрузка с других серверов

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

Таким образом была создана система которая позволяет хранить практически неограниченное количество файлов и обеспечивает распределенную сеть загрузки.

Таблица учетых записей
Copy Source | Copy HTML
  1. CREATE TABLE IF NOT EXISTS `account` (
  2.   `ACCOUNT_ID` int(11) NOT NULL auto_increment,
  3.   `ACCOUNT_LOGIN` varchar(32) NOT NULL default '',
  4.   `ACCOUNT_PASSWORD` varchar(32) NOT NULL default '',
  5.   `ACCOUNT_SIZE` int(11) NOT NULL default '0',
  6.   `ACCOUNT_MAX_SIZE` int(11) NOT NULL default '0',
  7.   `ACCOUNT_UPLOAD_ENABLED` tinyint(4) NOT NULL default '0',
  8.   `ACCOUNT_DOWNLOAD_ENABLED` tinyint(4) NOT NULL default '0',
  9.   `ACCOUNT_BANNED` tinyint(4) NOT NULL default '0',
  10.   `ACCOUNT_ERRORS` int(11) NOT NULL default '0',
  11.   `ACCOUNT_INVITES` int(11) NOT NULL default '0',
  12.   `ACCOUNT_UPDATE_DATETIME` datetime default NULL,
  13.   PRIMARY KEY (`ACCOUNT_ID`),
  14.   UNIQUE KEY `ACCOUNT_LOGIN` (`ACCOUNT_LOGIN`),
  15.   KEY `ACCOUNT_SIZE` (`ACCOUNT_SIZE`),
  16.   KEY `ACCOUNT_DOWNLOAD_ENABLED` (`ACCOUNT_DOWNLOAD_ENABLED`),
  17.   KEY `ACCOUNT_BANNED` (`ACCOUNT_BANNED`),
  18.   KEY `ACCOUNT_ERRORS` (`ACCOUNT_ERRORS`),
  19.   KEY `ACCOUNT_INVITES` (`ACCOUNT_INVITES`),
  20.   KEY `ACCOUNT_UPDATE_DATETIME` (`ACCOUNT_UPDATE_DATETIME`)
  21. )

Таблица файлов
Copy Source | Copy HTML
  1. CREATE TABLE IF NOT EXISTS `file` (
  2.   `FILE_ID` int(11) NOT NULL auto_increment,
  3.   `FILE_NAME` varchar(255) NOT NULL default '',
  4.   `FILE_SIZE` int(10) unsigned NOT NULL default '0',
  5.   `FILE_MD5` varchar(32) default NULL,
  6.   `FILE_DOWNLOAD_REQUEST_COUNT` int(10) unsigned NOT NULL default '0',
  7.   `FILE_DAMAGED` tinyint(4) NOT NULL default '0',
  8.   `FILE_NONREMOVABLE` tinyint(4) NOT NULL default '0',
  9.   `FILE_ACCESS_DATETIME` datetime default NULL,
  10.   `FILE_DOWNLOAD_RATE` float NOT NULL default '0',
  11.   PRIMARY KEY (`FILE_ID`),
  12.   KEY `FILE_SIZE` (`FILE_SIZE`),
  13.   KEY `FILE_DOWNLOAD_COUNT` (`FILE_DOWNLOAD_REQUEST_COUNT`),
  14.   KEY `FILE_NONREMOVABLE` (`FILE_NONREMOVABLE`),
  15.   KEY `FILE_ACCESS_DATETIME` (`FILE_ACCESS_DATETIME`),
  16.   KEY `FILE_DOWNLOAD_RATE` (`FILE_DOWNLOAD_RATE`),
  17.   KEY `FILE_MD5` (`FILE_MD5`),
  18.   KEY `FILE_DAMAGED` (`FILE_DAMAGED`,`FILE_NONREMOVABLE`)
  19. )

Таблица чанков
Copy Source | Copy HTML
  1. CREATE TABLE IF NOT EXISTS `file_chunk` (
  2.   `FILE_CHUNK_ID` int(11) NOT NULL auto_increment,
  3.   `FILE_ID` int(11) NOT NULL default '0',
  4.   `FILE_CHUNK_OFFSET` int(11) NOT NULL default '0',
  5.   `FILE_CHUNK_SIZE` int(11) NOT NULL default '0',
  6.   `ACCOUNT_ID` int(11) NOT NULL default '0',
  7.   `FILE_THREAD_ID` varchar(16) NOT NULL default '0',
  8.   `FILE_ATTACH_ID` decimal(2,1) NOT NULL default '0.0',
  9.   PRIMARY KEY (`FILE_CHUNK_ID`),
  10.   UNIQUE KEY `ACCOUNT_ID` (`ACCOUNT_ID`,`FILE_THREAD_ID`,`FILE_ATTACH_ID`),
  11.   KEY `FILE_ID` (`FILE_ID`,`FILE_CHUNK_OFFSET`)
  12. )
Теги:
Хабы:
Всего голосов 42: ↑36 и ↓6+30
Комментарии52

Публикации