Говоря о распределенных системах управления файлами, вы легко можете подумать о HDFS, GFS и других системах, первая из которых является частью Hadoop, а вторая — распределенной системой управления файлами, предоставляемой Google. В дополнение к этому, местные Taobao и Tencent также имеют свои собственные распределенные системы управления файлами, обе называются TFS (Taobao File System
а такжеTencent File System
).
По сравнению с этими распределенными системами управления файлами, упомянутыми выше, FastDFS может быть ближе нашим инженерам Java, потому что функция загрузки файлов слишком распространена, и мы хотим построить независимую распределенную систему управления файлами, комбинация FastDFS+Nginx, несомненно, лучшее решение. Поэтому Сун Гэ пришел, чтобы кратко поговорить с вами сегодня об этом.
Если вы не знаете, как загружать файлы в традиционной среде разработки, вы можете обратиться к руководству по загрузке файлов, которое Сонг Ге прислал ранее:
1. Что такое FastDFS
1.1 Введение в FastDFS
FastDFS — это легкая распределенная система управления файлами, исходный код которой был открыт Ю Цин из Taobao в 2008 году. FastDFS реализована на языке C и поддерживает Linux, FreeBSD, MacOS и другие UNIX-подобные системы. Подобно google FS, FastDFS — это файловая система уровня приложения, а не файловая система общего назначения, доступ к которой возможен только через проприетарные API-интерфейсы.В настоящее время предоставляются SDK C и Java, а также SDK расширений PHP.
С момента выпуска этого программного обеспечения с открытым исходным кодом, спустя десятилетия, жизнеспособность этого программного обеспечения с открытым исходным кодом по-прежнему сильна, и оно по-прежнему пользуется большим уважением в отрасли.Конечно, это также связано с постоянным совершенствованием программного обеспечения автором. .
FastDFS предназначена для интернет-приложений, решает проблему хранения файлов большой емкости, обеспечивает высокую производительность и высокую масштабируемость.Его можно рассматривать как файловую систему хранения ключей/значений.Ключом является идентификатор файла, а значение является содержимым файла, поэтому он называется более подходящим для службы распределенного хранения файлов.
1.2 Зачем нужен FastDFS
Традиционная разработка уровня предприятия не предъявляет высоких требований к высокому параллелизму, а объем данных может быть небольшим, поэтому управление файлами в такой среде может быть очень простым.
Однако интернет-приложения имеют большой объем доступа и большой объем данных.В интернет-приложениях мы должны рассмотреть решение проблем хранения файлов большой емкости и высокопроизводительного доступа, и для этого особенно подходит FastDFS.Общее хранилище изображений , хранение видео, хранение документов Мы можем использовать FastDFS для хранения и так далее.
1.3 Архитектура FastDFS
Как распределенная система управления файлами, FastDFS в основном включает в себя четыре функции:
- файловое хранилище
- синхронизация файлов
- Файл загружен
- загрузка документа
Эта функция может в основном удовлетворить наши общие потребности в управлении файлами.
Ниже представлена схема архитектуры системы с официального сайта FastDFS:
Из приведенного выше рисунка видно, что архитектура FastDFS включает в себя Tracker и Storage.Вероятно, это можно понять из названия. Tracker используется для отслеживания файлов, что эквивалентно индексу файлов, а Storage используется для сохранения файлов.
Файлы, которые мы загружаем, в конечном итоге хранятся в хранилище, а информация о метаданных файлов хранится в трекере, с помощью которого мы можем добиться балансировки нагрузки для хранилища.
Хранилище обычно встроено в кластер. Кластер хранилища может состоять из нескольких групп. Между различными группами нет связи. Группа эквивалентна небольшому кластеру. Группа состоит из нескольких серверов хранения. Синхронизация файлов через соединения для обеспечения высокая доступность.
2. Установка FastDFS
После знакомства с FastDFS, я думаю, что мои друзья уже хотят его попробовать.Далее давайте взглянем на установку FastDFS.
Для удобства тестирования я не буду запускать здесь несколько виртуальных машин, а установлю Трекер и Хранилище на один сервер.
Обычно мы используем FastDFS для загрузки изображения.После того, как изображение успешно загружено, мы обычно используем Nginx для доступа к следующему изображению, поэтому я представлю здесь установку с трех аспектов:
- Установка трекера
- Установка хранилища
- Установка Nginx
2.1 Установка трекера
Для установки нам сначала нужно подготовить среду, две библиотеки и установочный пакет.
1. Окружающая среда
Давайте сначала посмотрим на среду.Поскольку FastDFS разработан на языке C, перед установкой, если нет среды gcc, необходимо сначала установить ее.Команда установки выглядит следующим образом:
yum install gcc-c++
2. Две библиотеки
Давайте еще раз взглянем на эти две библиотеки.Поскольку FastDFS использует библиотеку libevent, команда установки выглядит следующим образом:
yum -y install libevent
Еще одна библиотека, libfastcommon, официально предоставляется FastDFS и содержит некоторые основные библиотеки, необходимые для работы FastDFS.
libfastcommon адрес загрузки:GitHub.com/happyfish10…
Учитывая медленный доступ к GitHub, Songge скачал установочный файл и поместил его на сетевой диск Baidu.Друзья могут ответить на fastdfs в фоновом режиме публичного аккаунта Songge, чтобы получить ссылку для скачивания.
Скопируйте загруженный libfastcommon в каталог /usr/local/, а затем последовательно выполните следующие команды:
cd /usr/local
tar -zxvf V1.0.43.tar.gz
cd libfastcommon-1.0.43/
./make.sh
./make.sh install
3. Инсталляционный пакет
Далее скачиваем Трекер, обратите внимание, что поскольку Трекер и Хранилище это один и тот же инсталляционный пакет, вы можете скачать его один раз (не нужно скачивать его повторно в разделе 2.2).
Установочный файл можно загрузить из репозитория GitHub FastDFS по адресу:GitHub.com/happyfish10…
Учитывая медленный доступ к GitHub, Songge скачал установочный файл и поместил его на сетевой диск Baidu.Друзья могут ответить на fastdfs в фоновом режиме публичного аккаунта Songge, чтобы получить ссылку для скачивания.
После успешной загрузки скопируйте загруженный файл в каталог /usr/local, а затем выполните следующие команды для установки:
cd /usr/local
tar -zxvf V6.06.tar.gz
cd fastdfs-6.06/
./make.sh
./make.sh install
После успешной установки выполните следующую команду, чтобы скопировать файлы конфигурации из каталога conf в каталоге установки в каталог /etc/fdfs:
cd conf/
cp ./* /etc/fdfs/
4. Конфигурация
Затем войдите в каталог /etc/fdfs/ для настройки:
Откройте файл tracker.conf:
vi tracker.conf
Измените следующую конфигурацию:
Порт по умолчанию — 22122, который можно изменить в соответствии с реальными потребностями, здесь я его менять не буду. Затем настройте каталог хранения метаданных ниже (обратите внимание, что каталог должен существовать).
5. Старт
Затем выполните следующую команду, чтобы запустить Трекер:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
После этого наш Трекер успешно установлен.
2.2 Установка хранилища
Для простоты здесь мы можем создать экземпляр Storage. Для установки хранилища также требуются libevent и libfastcommon, для установки этих двух библиотек, пожалуйста, обратитесь к выше, я не буду здесь вдаваться в подробности.
Сама установка Хранилища такая же, как и у Трекера, и команды выполнения такие же.Поскольку я установил Трекер и Хранилище на один и тот же сервер, нет необходимости выполнять команду установки (эквивалентно уже установленному Хранилищу, когда Трекер установлены).
Единственное, что нужно сделать, это перейти в каталог /etc/fdfs и настроить Storage:
vi storage.conf
Здесь настроены три места, а именно base_path, store_path0 и tracker_server. Шаблон tracker_server имеет два адреса. У нас здесь только один. После завершения настройки не забудьте закомментировать другой, который не используется.
После завершения настройки выполните следующую команду, чтобы запустить Storage:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
После того, как эти два запуска завершены, теперь можно выполнить загрузку файла, но, как правило, если это файл изображения, нам также необходимо предоставить функцию доступа к изображению.В настоящее время лучшим решением, конечно же, является Nginx, поэтому мы здесь вместе. с настроенным Nginx, а затем выполните тест.
2.3 Установка Nginx
Nginx можно считать важным партнером FastDFS.
Установка Nginx делится на два этапа:
- Установите Nginx
- Сначала установите модуль fastdfs-nginx в Storage.
Первый шаг прост: Song Ge уже писал статью о грамотности Nginx, так что вы можете напрямую обратиться к установке Nginx здесь:Минималистский учебник по Nginx!
Далее посмотрите на второй шаг.
Сначала загрузите модуль fastdfs-nginx, адрес загрузки:GitHub.com/happyfish10…
Учитывая медленный доступ к GitHub, Songge скачал установочный файл и поместил его на сетевой диск Baidu.Друзья могут ответить на fastdfs в фоновом режиме публичного аккаунта Songge, чтобы получить ссылку для скачивания.
После завершения загрузки скопируйте загруженный файл в каталог /usr/local. Затем войдите в каталог /usr/local и выполните следующие команды:
cd /usr/local
tar -zxvf V1.22.tar.gz
потом/usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf
копировать файл в/etc/fdfs/
каталог и изменить содержимое файла:
vi /etc/fdfs/mod_fastdfs.conf
Затем вернитесь в каталог распаковки установочного файла nginx, загруженного на первом шаге, и выполните следующую команду, чтобы перенастроить компиляцию и установку:
./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src
make
make install
После завершения установки измените файл конфигурации nginx следующим образом:
vi /usr/local/nginx/conf/nginx.conf
Настройте переадресацию запросов nginx здесь.
После завершения настройки запустите nginx и увидите следующий лог, свидетельствующий об успешном запуске nginx:
ngx_http_fastdfs_set pid=9908
Вопрос: Какая польза от fastdfs-nginx-module
После просмотра всего процесса установки у многих друзей возникают вопросы.В итоге nginx сам напрямую нашел директорию с файлом изображения.Что толку от fastdfs-nginx-module?
Как мы говорили ранее, Хранилище состоит из множества групп, каждая из которых представляет собой небольшой кластер, в каждой группе данные будут синхронизироваться, но если данные не были синхронизированы, то в это время будет отправлен запрос. делать? управлять? На этом этапе модуль fastdfs-nginx поможет нам получить файлы непосредственно из исходного хранилища.
Установка прошла успешно.
3. Вызов Java-клиента
После успешной установки мы будем использовать клиент Java для проверки загрузки и скачивания файлов.
Во-первых, давайте создадим обычный проект Maven и добавим следующие зависимости:
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
Затем добавьте файл конфигурации FastDFS fastdfs-client.properties в каталог ресурсов проекта со следующим содержимым:
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers = 192.168.91.128:22122
fastdfs.connection_pool.enabled = true
fastdfs.connection_pool.max_count_per_entry = 500
fastdfs.connection_pool.max_idle_time = 3600
fastdfs.connection_pool.max_wait_time_in_ms = 1000
Конфигурации здесь в основном известны по именам, поэтому я не буду объяснять их по отдельности. Здесь сначала настройте fastdfs.tracker_servers, который является адресом Tracker, который можно настроить в соответствии с реальной ситуацией.
Конфигурация fastdfs.http_secret_key здесь игнорируется, и я объясню ее вам позже.
3.1 Загрузка файла
После завершения настройки сначала посмотрите на загрузку файла, код выглядит следующим образом:
@Test
void testUpload() {
try {
ClientGlobal.initByProperties("fastdfs-client.properties");
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
NameValuePair nvp[] = null;
//上传到文件系统
String fileId = client.upload_file1("C:\\Users\\javaboy\\Pictures\\picpick\\1.png", "png",
nvp);
logger.info(fileId);
} catch (Exception e) {
e.printStackTrace();
}
}
Здесь сначала загрузите файл конфигурации, затем создайте объект TrackerClient, затем получите TrackerServer на основе этого объекта, а затем создайте экземпляр StorageClient1. Информация о метаданных файла хранится в NameValuePair. Если он есть, он устанавливается по ключу/значению. Если нет, ему может быть напрямую присвоено значение NULL.
Наконец, вызовите клиентский метод upload_file1, чтобы загрузить файл. Первый параметр — это путь к файлу, второй параметр — расширение файла, а третий параметр — метаданные файла. Возвращаемое значение этого метода — это доступ к загруженному файлу.путь. Выполните этот метод и распечатайте журнал следующим образом:
2020-02-29 17:46:03.017 INFO 6184 --- [ main] o.j.fastdfs.FastdfsApplicationTests : group1/M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png
group1/M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png — это путь к файлу, в это время введите в браузереhttp://192.168.91.128/group1/M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.pngВы можете увидеть загруженное изображение.
3.2 Загрузка файла
@Test
void testDownload() {
try {
ClientGlobal.initByProperties("fastdfs-client.properties");
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
byte[] bytes = client.download_file1("group1/M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png");
FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\javaboy\\Pictures\\picpick\\666.png"));
fos.write(bytes);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Этот код прост для понимания: вы можете напрямую вызвать метод download_file1, чтобы получить массив байтов, а затем записать его в локальный файл через поток ввода-вывода.
4. Проблемы безопасности
Теперь любой желающий может получить доступ к нашему серверу для загрузки файлов, что определенно недопустимо.Эту проблему легко решить, достаточно добавить токен при загрузке.
Во-первых, мы включаем проверку токена на стороне сервера:
vi /etc/fdfs/http.conf
После завершения настройки не забудьте перезапустить сервер:
./nginx -s stop
./nginx
Затем подготовьте метод для получения токена на внешнем интерфейсе следующим образом:
@Test
public void getToken() throws Exception {
int ts = (int) Instant.now().getEpochSecond();
String token = ProtoCommon.getToken("M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png", ts, "FastDFS1234567890");
StringBuilder sb = new StringBuilder();
sb.append("?token=").append(token);
sb.append("&ts=").append(ts);
System.out.println(sb.toString());
}
Здесь мы в основном получаем токен по методу ProtoCommon.getToken.Обратите внимание, что первым параметром этого метода является идентификатор файла, к которому вы хотите получить доступ.**Обратите внимание, что этот адрес не содержит группу, поэтому не делайте ошибка;* *Второй параметр - временная метка, третий параметр - ключ, ключ должен совпадать с конфигурацией сервера.
Объедините сгенерированную строку и добавьте ее к пути доступа, например:http://192.168.91.128/group1/M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png?token=7e329cc50307000283a3ad3592bb6d32&ts=1582975854
.В это время, если на пути доступа нет маркера, доступ завершится ошибкой.
Готово! В следующий раз расскажу, как я играю в эту штуку в Spring Boot.