Дик-ДИ_2018_МУ. Технология построения защищенных распределенных приложений
Скачать 0.74 Mb.
|
1.3 Порядок выполнения работы 1.3.1 Установка операционной системы В качестве операционной системы для нашего кластера будем использовать Ubuntu Server 16.04.3 LTS. Все узлы будут работать на VirtualBox. Выставим следующие системные настройки для виртуальной машины: 10 GB пространства для жёсткого диска, два ядра и 1024 Мб памяти. Виртуальную машину можно оснастить двумя сетевыми адаптерами: один NAT, а другой для внутренней сети. После того, как была скачена и установлена операционная система, необходимо обновиться и установить ssh и rsync: sudo apt-get update && sudo apt-get upgrade sudo apt-get install ssh sudo apt-get install rsync Для редактирования файлов с консоли будем использовать редактор nano. Для его установки введем команду: sudo apt-get install nano Для запуска: nano файл или если нужно редактировать системные файлы (с root правами), то sudo nano файл Для удобства также можно поставит оболочку Midnight Commander sudo apt-get install mc для ее запуска mc или если хотите редактировать системные файлы (с root правами), то 12 sudo mc Изменим имя узла на master в файле /etc/hostname. 1.3.2 Установка Java Далее необходимо установить OpenJDK 8 версии: sudo apt-get install openjdk-8-jdk 1.3.3 Создание отдельной учетной записи для запуска Hadoop Мы будем использовать выделенную учетную запись для запуска Hadoop. Это не обязательно, но рекомендуется. Также предоставим новому пользователю права sudo, чтобы облегчить себе жизнь в будущем. sudo addgroup hadoop sudo adduser --ingroup hadoop hduser sudo usermod -aG sudo hduser Во время создания нового пользователя, необходимо будет ввести ему пароль. 1.3.4 Настройка статического IP адреса Для дальнейшей работы нам потребуются IP-адреса серверов. Для того чтобы узнать IP-адрес, можно воспользоваться командой ifconfig Вместо использования динамически выделенных адресов более удобным может оказаться использование статических адресов. Для настройки статического IP-адреса замените в файле /etc/network/interfaces для соответствующего интерфейса «dhcp» на «static» и укажите значения адреса, маски сети, шлюза и адрес DNS сервера для соответствия требованиям вашей сети: auto enp0s3 iface enp0s3 inet static address 192.168.0.1 netmask 255.255.255.0 gateway 192.168.0.254 dns-nameservers 192.168.0.254 В приведенных далее примерах для серверов используются адреса вида 192.168.0.X. 1.3.5 Настройка доменного имени узла Нам необходимо, чтобы все узлы могли легко обращаться друг к другу. В большом кластере желательно использовать dns сервер, но для нашей маленькой конфигурации подойдет файл /etc/hosts. В нем мы будем описывать соответствие ip-адреса узла к его имени в сети. Для одного узла ваш файл должен выглядеть примерно так: 13 127.0.0.1 localhost # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 192.168.0.1 master 1.3.6 Настройка SSH Для управления узлами кластера hadoop необходим доступ по ssh. Для созданного пользователя hduser предоставить доступ к master. Для начала необходимо сгенерировать новый ssh ключ: ssh-keygen -t rsa -P "" Следующим шагом необходимо добавить созданный ключ в список авторизованных: cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys Проверяем работоспособность, подключившись к себе: ssh master Чтобы вернуться в локальную сессию, просто наберите: exit 1.3.7 Отключение IPv6 Если не отключить IPv6, то в последствии можно получить много проблем. Для отключения IPv6 в Ubuntu 12.04 / 12.10 / 13.04 нужно отредактировать файл sysctl.conf: sudo nano /etc/sysctl.conf Добавляем следующие параметры: # IPv6 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 Сохраняем и перезагружаем операционную систему командой sudo reboot 1.3.8 Установка Apache Hadoop Скачаем необходимые файлы. Актуальные версии фреймворка располагаются по адресу: http://www.apache.org/dyn/closer.cgi/hadoop/common. Воспользуемся стабильной версией 2.7.4. 14 Создадим папку downloads в корневом каталоге и скачаем последнюю версию: sudo mkdir /downloads cd /downloads sudo wget http://apache-mirror.rbc.ru/pub/apache/hadoop/common/stable/hadoop- 2.7.4.tar.gz Распакуем содержимое пакета в /usr/local/, переименуем папку и выдадим пользователю hduser права создателя: sudo mv /downloads/hadoop-2.7.4.tar.gz /usr/local/ cd /usr/local/ sudo tar xzf hadoop-2.7.4.tar.gz sudo mv hadoop-2.7.4 hadoop sudo chown -R hduser:hadoop hadoop 1.3.9 Обновление $HOME/.bashrc Для удобства, добавим в .bashrc список переменных: #Hadoop variables export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 export HADOOP_INSTALL=/usr/local/hadoop export PATH=$PATH:$HADOOP_INSTALL/bin export PATH=$PATH:$HADOOP_INSTALL/sbin export HADOOP_MAPRED_HOME=$HADOOP_INSTALL export HADOOP_COMMON_HOME=$HADOOP_INSTALL export HADOOP_HDFS_HOME=$HADOOP_INSTALL export YARN_HOME=$HADOOP_INSTALL На этом шаге заканчиваются предварительные подготовки. 1.3.10 Настройка Apache Hadoop Все последующая работа будет вестись из папки /usr/local/hadoop. Откроем etc/hadoop/hadoop-env.sh и зададим JAVA_HOME. export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 Опишем, какие у нас будут узлы в кластере в файле etc/hadoop/slaves master Этот файл может располагаться только на главном узле. Все новые узлы необходимо описывать здесь. Основные настройки системы располагаются в etc/hadoop/core-site.xml: Настройки HDFS лежат в etc/hadoop/hdfs-site.xml: 15 Здесь параметр dfs.replication задает количество реплик, которые будут хранится на файловой системе. По умолчанию его значение равно 3. Оно не может быть больше, чем количество узлов в кластере. Параметры dfs.namenode.name.dir и dfs.datanode.data.dir задают пути, где будут физически располагаться данные и информация в HDFS. Необходимо заранее создать папку tmp. Сообщим нашему кластеру, что мы желаем использовать YARN. Для этого изменим etc/hadoop/mapred-site.xml: 16 -Xmx52428800 -Xmx52428800 Все настройки по работе YARN описываются в файле etc/hadoop/yarn- site.xml: 17 Настройки resourcemanager нужны для того, чтобы все узлы кластера можно было видеть в панели управления. Сменим пользователя на hduser: su hduser Отформатируем HDFS: /usr/local/hadoop/bin/hdfs namenode –format Запустим hadoop службы: /usr/local/hadoop/sbin/start-dfs.sh /usr/local/hadoop/sbin/start-yarn.sh Необходимо убедиться, что запущены следующие java-процессы: hduser@master:/usr/local/hadoop$ jps 4868 SecondaryNameNode 5243 NodeManager 5035 ResourceManager 4409 NameNode 4622 DataNode 5517 Jps Теперь у нас есть готовый образ, который послужит основой для создания кластера. Далее можно создать требуемое количество копий нашего образа. На копиях необходимо настроить сеть, сгенерировать новые MAC-адреса для сетевых интерфейсов, выдать им необходимые IP-адреса и поправить файл /etc/hosts на всех узлах кластера так, чтобы в нем были прописаны все соответствия. Например: 127.0.0.1 localhost 18 192.168.0.1 master 192.168.0.2 slave1 Заменим имя нового узла на slave1, для этого внесем изменения в файл /etc/hostname. Сгенерируем на узле новые SSH-ключи и добавим их все в список авторизованных на узле master. На каждом узле кластера изменим значения параметра dfs.replication в /usr/local/hadoop/etc/hadoop/hdfs-site.xml. Например, выставим везде значение 2. Добавим на узле master новый узел в файл /usr/local/hadoop/etc/hadoop/slaves: master slave1 1.3.11 Создание на главном узле файл подкачки Создадим на главном узле папку, в которую попозже мы подмонтируем файл подкачки: sudo mkdir /media/swap Создаем файл подкачки sudo dd if=/dev/zero of=/media/swap/swapfile.img bs=2048 count=1M Выставляем нужные права на файл: sudo chmod 600 /media/swap/swapfile.img Создаем swap sudo mkswap /media/swap/swapfile.img Добавляем swap в fstab. Это нужно сделать чтобы каждый раз при старте ОС, автоматически монтировался файл подкачки, который мы создали, для этого открываем файл /etc/fstab в редакторе: sudo nano /etc/fstab и добавляем в файл: # mount swap image /media/swap/swapfile.img swap swap sw 0 0 Активируем (включаем) наш swap sudo swapon /media/swap/swapfile.img Убедимся, что swap нормально работает. Для этого выполним: cat /proc/swaps 19 1.3.12 Запуск Hadoop Когда все настройки прописаны, то на главном узле можно запустить наш кластер. /usr/local/hadoop/sbin/start-dfs.sh /usr/local/hadoop/sbin/start-yarn.sh На slave-узле должны запуститься следующие процессы: hduser@slave1:/usr/local/hadoop$ jps 1748 Jps 1664 NodeManager 1448 DataNode Теперь у нас есть свой мини-кластер. Посмотреть состояние нод кластера можно по адресу http://master:8088/cluster/nodes. Давайте запустим задачу Word Count. Для этого нам потребуется загрузить в HDFS несколько текстовых файлов. Для примера, возьмём книги в формате txt с сайта Free ebooks — Project Gutenberg. cd /home/hduser mkdir books cd books wget http://www.gutenberg.org/files/20417/20417.txt wget http://www.gutenberg.org/files/5000/5000-8.txt wget http://www.gutenberg.org/files/4300/4300-0.txt wget http://www.gutenberg.org/files/972/972.txt Перенесем наши файлы в HDFS: cd /usr/local/hadoop bin/hdfs dfs -mkdir /in bin/hdfs dfs -copyFromLocal /home/hduser/books/* /in bin/hdfs dfs -ls /in Запустим Word Count: /usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoo p-mapreduce-examples-2.7.4.jar wordcount /in /out Отслеживать работу можно через консоль, а можно через веб-интерфейс ResourceManager'а по адресу http://master:8088/cluster/apps/. По завершению работы, результат будет располагаться в папке /out в HDFS. Для того, чтобы скачать его на локальную файловую систему выполним: /usr/local/hadoop/bin/hdfs dfs -copyToLocal /out /home/hduser/ Теперь в директории /home/hduser/out можно увидеть результаты выполнения задачи. 1.3.12 Дополнительные команды Удаление директории из HDFS: /usr/local/hadoop/bin/hdfs dfs –rm -r /out 20 Отмена режима HDFS только для чтения, возникшего из-за сбоя: /usr/local/hadoop/bin/hdfs dfsadmin -safemode leave Остановка Yarn: /usr/local/hadoop/sbin/stop-yarn.sh Остановка DFS: /usr/local/hadoop/sbin/stop-dfs.sh 1.4 Контрольные вопросы 1 Для чего предназначен Hadoop? 2 Из каких компонентов состоит Hadoop? 3 В чем заключается парадигма MapReduce? 4 В чем заключается фаза map? 5 В чем заключается фаза reduce? 6 Какие преимущества дает использование парадигмы MapReduce при обработке «больших данных» (big data)? 21 ЛАБОРАТОРНАЯ РАБОТА № 2. НАСТРОЙКА РЕПЛИКАЦИИ НА СУБД MYSQL Цель работы 2.1 Цель лабораторной работы заключается в закреплении теоретических основ курса «Технологии построения распределенных защищенных приложений» и получении первоначальных навыков настройки репликации на СУБД MySQL. Общие сведение 2.2 2.2.1 Репликация данных Репликация (англ. replication) — механизм синхронизации содержимого нескольких копий объекта (например, содержимого базы данных). Под репликацией также понимают процесс копирования данных из одного источника на другой (или на множество других). Репликация является одной из техник масштабирования данных в распределенных системах. Репликация делятся на синхронные и асинхронные. В случае синхронной репликации, если одна реплика (копия) обновляется, все другие реплики того же фрагмента данных также должны быть обновлены в одной и той же транзакции. Это означает, что все реплики остаются непротиворечивыми. Недостатком данного метода являются высокие накладные расходы на синхронизацию реплик. В случае асинхронной репликации обновление одной реплики распространяется на другие спустя некоторое время, а не в той же транзакции. Таким образом, при асинхронной репликации вводится задержка, или время ожидания, в течение которого отдельные реплики могут быть фактически неидентичными. В тоже время накладные расходы на репликацию существенно уменьшаются. Существует два основных подхода при работе с репликацией данных в MySQL: репликация master-slave (ведущий – ведомый, главный – подчиненный, мастер – слейв); репликация master-master (мастер – мастер) или в более общем виде multimaster (мультимастер). 2.2.2 Master-slave репликация В этом подходе выделяется один основной сервер базы данных, который называется ведущим. На нем происходят все изменения в данных (любые запросы MySQL INSERT/UPDATE/DELETE). Ведомый сервер постоянно копирует все изменения с Мастера. С приложения на ведомый сервер отправляются запросы чтения данных (запросы SELECT). Таким образом, 22 ведущий сервер отвечает за изменения данных, а ведомый за чтение (рисунок 3). Рисунок 3 — Master-slave репликация В приложении нужно использовать два соединения — одно для ведущего сервера, второе для ведомого. $master = mysql_connect('10.10.0.1', 'root', 'pwd'); $slave = mysql_connect('10.10.0.2', 'root', 'pwd'); # ... mysql_query('INSERT INTO users ...', $master); # ... $q = mysql_query('SELECT * FROM photos ...', $slave); # Используем два соединения для записи и чтения соответственно 2.2.3 Master-slave репликация на несколько slave серверов Преимущество этого типа репликации в том, что можно использовать более одного ведомого сервера. Обычно следует использовать не более 20 ведомых серверов при работе с одним ведущим (рисунок 4). Рисунок 4 — Master-slave репликация на несколько slave серверов запись PHP ведомый MySQL чтение ведомый MySQL ведомый MySQL чтение чтение ведущий MySQL чтение ведущий MySQL PHP ведомый MySQL чтение чтение запись 10.10.0.1 10.10.0.2 23 Тогда в приложении один из ведомых серверов выбирается для обработки запросов случайным образом: $master = mysql_connect('10.10.0.1', 'root', 'pwd'); $slaves = [ '10.10.0.2', '10.10.0.3', '10.10.0.4', ]; $slave = mysql_connect($slaves[array_rand($slaves)], 'root', 'pwd'); # ... mysql_query('INSERT INTO users ...', $master); # ... $q = mysql_query('SELECT * FROM photos ...', $slave); 2.2.4 Задержка репликации MySQL реализует асинхронную репликацию. Это означает, что данные на ведомом сервере могут появиться с небольшой задержкой. Поэтому, в последовательных операциях необходимо использовать чтение с ведущего сервера, чтобы получить актуальные данные: $master = mysql_connect('10.10.0.1', 'root', 'pwd'); $slave = mysql_connect('10.10.0.2', 'root', 'pwd'); # ... mysql_query('UPDATE users SET age = 25 WHERE id = 7', $master); $q = mysql_query ('SELECT * FROM users WHERE id = 7', $master); # При обращении к изменяемым данным, необходимо использовать # соединение с ведущим сервером # ... $q = mysql_query('SELECT * FROM photos ...', $slave); |