Обычный сервер хранит у себя все данные и обслуживает все клиентские запросы. Схема взаимодействия между сервером и клиентами изображена на рис 12.1. Серверные данные располагаются на одном или нескольких физических дисках. Чтобы сделать запрос, клиент устанавливает соединение с сервером. Сервер анализирует инструкции, выполняет их, извлекает данные и возвращает результаты запроса. По мере возрастания нагрузки производительность сервера снижается. Чтобы избежать этого, задействуют дополнительные ресурсы, например, наращивают память, ставят дополнительные процессоры и даже сетевые платы. Эта стратегия эффективна, если клиенты расположены в непосредственной близости от сервера, — например, несколько серверов приложений взаимодействуют с одной СУБД. Но в тех архитектурах, где сервер и клиенты удалены друг от друга, производительность обратно пропорциональна расстоянию.
(рис 12.1) Обычный сервер баз данных
Решением этой проблемы являются распределенные базы данных (РБД), которые сегментируют хранимую информацию и перемещают отдельные ее блоки ближе к нужным клиентам. Способов организации таких баз данных много. Можно разместить таблицы на разных компьютерах или использовать несколько идентичных хранилищ. Во втором случае серверы взаимодействуют друг с другом для поддержания синхронизации. Если на одном из серверов происходит обновление данных, оно распространяется и на все остальные серверы.
К недостаткам распределенных баз данных можно отнести то, что возрастает сложность управления ими. Но преимуществ все же больше. Главное из них — повышение производительности. Данные быстрее обрабатываются несколькими серверами, а кроме того, данные располагаются ближе к тем пользователям, которые чаще с ними работают.
Система становится более устойчивой, если она способна выдержать сбой одного из своих компонентов. В распределенной базе данных с симметричной схемой хранения исчезновение одного из серверов приводит к замедлению работы пользователей, находящихся ближе к этому серверу, но в целом система остается работоспособной. К тому же, она легко масштабируется, так как ее не нужно останавливать при добавлении еще одного сервера.
В несимметричной системе можно оптимизировать схему расположения данных. Чем ближе пользователи находятся к нужным им данным, тем меньше на их работу влияют сетевые задержки. В результате серверам приходится обрабатывать меньшие объемы данных. Это также способствует повышению безопасности данных, поскольку их можно физически хранить в тех системах, где пользователи имеют право работать с соответствующими данными. В целом, однако, применение распределенных баз данных связано с достаточно высоким риском. Требуется обеспечить соблюдение мер безопасности сразу на нескольких узлах, что не так-то просто реализовать.
РБД состоит из трех основных частей: клиентов, модуля обработки транзакций и хранилища данных. Сервер обычно берет на себя задачи обработки транзакций и хранения данных, хотя в полностью распределенной базе данных за решение этих задач отвечают разные аппаратные компоненты. Обратимся к рис 12.2. Здесь три клиента взаимодействуют с двумя модулями обработки транзакций, которые, в свою очередь, работают с двумя хранилищами. Клиенты посылают свои запросы модулям, а те определяют, в каком из хранилищ находятся требуемые данные.
(рис 12.2) Распределенные серверы
В идеальном случае, клиенты не знают, является система распределенной или нет. Они лишь посылают ей запросы, а система возвращает клиентам результаты этих запросов. Как она это делает, клиентов не интересует. На практике распределенные базы данных проявляют разную "прозрачность". В крайнем случае РБД хранится на нескольких независимых серверах, а клиентскому приложению приходится выбирать сервер в зависимости от того, какую информацию требуется получить. Это подразумевает, что таблицы, находящиеся на разных серверах, не имеют никаких
Если данные реплицируются между несколькими серверами, клиент в общем случае может предпочесть тот или иной сервер. В подобной схеме все серверы хранят одни и те же данные. Специальный модуль может помогать клиентам в выборе серверов, осуществляя выравнивание нагрузки. РСУБД отвечает за выполнение транзакций в многосерверной среде, но в любой момент времени два сервера не могут быть синхронизированы между собой.
В РБД применяется несколько схем распределения данных. В случае
Создать точную копию базы данных MySQL довольно просто. Способы резервного
Рассмотрим проблему обновления данных. Если обновления происходят сразу на двух серверах, их нужно согласовывать. Чтобы не возникали неразрешимые ситуации, необходимо позволить вносить изменения только на одном сервере. Тогда синхронизация будет заключаться в дублировании содержимого сервера, доступного для записи, на все остальные серверы. Их полезность зависит от того, насколько важна актуальность данных. Во многих случаях база данных, содержащая все записи, кроме тех, которые были созданы за последние 24 часа, вполне приемлема.
Методика
/* Каталог МР3-файлов. */ CREATE TABLE song ( ID INT NOT NULL AUTO INCREMENT, Name CHAR(40) NOT NULL, Artist CHAR(16) NOT NULL, Filename CHAR(80) NOT NULL, PRIMARY KEY(ID), INDEX (Name), INDEX (Artist) ); /* Журнал запрашиваемых файлов. */ CREATE TABLE log ( Server TINYINT UNSIGNED NOT NULL, Song INT NOT NULL, DownloadTime DATETIME NOT NULL );
Каждый сервер хранит информацию о доступных песнях в таблице song. В таблицу log заносится запись всякий раз, когда кто-то загружает очередной МР3-файл. У этой таблицы нет первичного ключа, так как в обычном режиме она используется лишь для вставки записей. Наличие индекса только замедлит работу с таблицей.
Раз в день таблицы log всех серверов объединяются по следующему сценарию. Один из серверов прекращает обслуживать запросы Web-приложений. Остальные серверы создают копии таблицы log, извлекают из них последние записи и посылают их серверу, генерирующему отчет. На время этой процедуры каждый сервер должен заблокировать свою таблицу log. Чтобы слишком много пользовательских запросов не оказалось заблокировано, процедуру желательно выполнять в период минимальной активности сервера.
Сервер, генерирующий отчет, загружает полученные данные в свою таблицу log, после чего выполняет сценарий, показанный в листинге 12.2. В этом сценарии создаются два рейтинга популярности: по всем песням и за последние 24 часа. Временный индекс таблицы log ускоряет ее просмотр.
/* Создание индекса. */ CREATE INDEX song ON log (Song); /* Определение рейтинга всех песен. */ DROP TABLE IF EXISTS popular alltime; CREATE TABLE popular alltime ( Rank INT NOT NULL, Song INT NOT NULL, Hits INT NOT NULL, ); SET @id = 0; INSERT INTO popular alltime SELECT (@id := @id+1), song, COUNT (*) FROM Log GROUP BY 2 ORDER BY 3 DESC; ALTER TABLE popular alltime ADD PRIMARY KEY (Rank); /* Определение рейтинга песен за последние 24 часа. */ DROP TABLE IF EXISTS popular last24; CREATE TABLE popular last24 ( Rank INT NOT NULL, Song INT NOT NULL, Hits INT NOT NULL, ); SET @id = 0; INSERT INTO popular last24 SELECT (@id := @id+1), song, COUNT (*) FROM Log WHERE DownloadTime > DATE SUB (NOW(), INTERVAL 24 HOUR) GROUP BY 2 ORDER BY 3 DESC; ALTER TABLE popular last24 ADD PRIMARY KEY (Rank); /* Удаление индекса */ DROP INDEX song ON log;
Таблицы рейтингов не содержат поле-счетчик: вместо него используется инкрементная переменная. Будучи созданной, рейтинговая таблица уже не меняется. Сценарий удаляет существующие таблицы и формирует их заново. Имеет смысл сжимать такие таблицы с помощью утилиты myisampack (см. лекцию "Утилиты командной строки"). Созданные таблицы загружаются остальными серверами, где они заменяют старые рейтинги.
Изменения в таблицу song должны вноситься на одном сервере. Тогда исчезают проблемы, связанные с дублированием песен и первичных ключей. Главный сервер публикует новую редакцию каталога песен либо после каждого изменения, либо по определенному графику.
В описанной схеме требуется, чтобы приложения знали архитектуру всей системы. Эта система не является монолитной и легко справляется со сбоями отдельных компонентов. Каждый из составляющих ее серверов хранит идентичную информацию.
Программа MySQL реализует функции автоматической
(рис 12.3) Схема репликации с одним сервером для записи и двумя серверами для чтения
Все серверы работают под управлением MySQL на разных компьютерах подключенных к сети. В целях синхронизации
Клиенты могут посылать запросы на выборку как главному, так и любому подчиненному серверу. Запись данных должна происходить только на главном сервере, иначе изменения останутся локальными. В схеме на рис 12.3 запросы на выборку направляются только подчиненным серверам, что позволяет главному серверу сосредоточиться на обновлениях.
На подчиненном сервере запускается отдельный поток, который периодически опрашивает главный сервер на предмет наличия изменений. Однако бывает так, что сервер одновременно является и главным, и подчиненным. Тогда становится возможной схема
(рис 12.4) Круговая репликация
Приложение должно предотвращать несогласованные обновления. Рассмотрим такой случай. Серверы А и Б являются друг для друга главным и подчиненным сервером. Оба используют таблицу сообщений с первичным ключом-счетчиком. В определенный момент два пользователя одновременно создают новые сообщения, по одному на каждом сервере. Если таблицы раньше были синхронизированы, то теперь в каждой из них будет новая запись с идентификатором, совпадающим с идентификатором другой записи на другом сервере. Можно избежать этой неприятности, используя внешний генератор идентификаторов, при условии, что он будет однопотоковым.
В схеме на рис 12.4 каждое приложение взаимодействует с одним сервером, хотя это необязательно. Если серверы расположены рядом, можно формировать
Подчиненный сервер контролирует, какое изменение было получено от главного сервера последним. По умолчанию сведения об этом находятся в файле master info.
Если обновление приводит к появлению ошибки, то поток, управляющий синхронизацией, останавливается. В этом случае сервер записывает сообщение в RAND() по умолчанию инициализирует TIMESTAMP().
Вспомните, что FLUSH, поэтому старайтесь не менять таблицы напрямую, а пользуйтесь инструкциями GRANT и .
Значения переменных не реплицируются. Если в обновлении строки участвовала переменная, то на подчиненном сервере будет использовано локальное, а не
Чтобы включить функции mysqld, имеющие отношение к
--binlog-do-db=база данных --binlog-ignore-db=база данных --log-bin-index=каталог --log-bin[=каталог] --log-slave-updates --master-connect-retry=секунды --master-host=узел --master-info-file=файл --master-password=пароль --master-port=порт --master-user=пользователь --replicate-do-db=база данных --replicate-do-table=база данных.таблица --replicate-ignore-db=база данных --replicate-ignore-table= база данных.таблица --replicate-rewrite-db=главный->подчиненный --replicate-wind-do-table=шаблон --replicate-wind-ignore-table=шаблон --server-id=идентификатор
Прежде чем редактировать конфигурационные файлы, создайте на главном сервере учетную запись, чтобы подчиненный сервер мог получать обновления. В листинге 12.3 показана инструкция, создающая пользователя user с привилегией FILE. Никакие другие привилегии подчиненному серверу не нужны. В данном примере пользователь может посылать запросы с любого узла, но на практике обычно указывают конкретное доменное имя.
GRANT FILE ON *.* ТО slave IDENTIFIED BY ‘password’
Теперь нужно остановить главный сервер или заблокировать все таблицы, подлежащие LOAD TABLE, чтобы получить точную копию нужной таблицы.
[/usr/local/var]# tar cvfz freetimedb.tar.gz. /freetime/
Далее требуется включить двоичный журнал на главном сервере, внеся изменения в конфигурационный файл /etc/my. Соответствующая опция называется log bin. С помощью опции server id серверу присваивается уникальный идентификатор. В листинге 12.5 показаны две строки, которые добавляются в раздел [mysqld] конфигурационного файла. После внесения изменений нужно перезапустить главный сервер.
log-bin server_id=1
Скопируйте на подчиненный сервер созданную выше копию базы данных и отредактируйте его конфигурационный файл. Добавляемые в него опции перечислены в листинге 12.6. Поскольку реплицируется лишь одна база данных, с помощью опции replicate-do-db задается конкретное имя: freetime. Данному подчиненному серверу присваивается идентификатор 2.
Master-host=192.168.123.194 Master-user=slave Master-password=password Master-port=3306 Replicate-do-db=freetime Server-id=2
После изменения конфигурации запустите подчиненный сервер. Он свяжется с главным севером и проверит, изменилась ли база данных freetime с момента получения ее последней копии. Пока подчиненный сервер работает, он регулярно получает интересующие его изменения. Задержка обновления зависит от контекста, но обычно она составляет несколько секунд.
В листинге 12.7 перечислены инструкции, используемые в процессе CHANGE MASTER приводит к временной смене главного сервера.
mysql> SHOW MASTER STATUS;
+------------+----------+--------------+------------------+
|File | Position | Binlog do db | Binlog ignore db |
+------------+----------+--------------+------------------+
|red-bin.002 | 312 | | |
+------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> SHOW MASTER STATUS \G
***************************************************************
Master Host: 192.168.123.194
Master User: slave
Master Port: 3306
Connect retry: 60
Log file: red-bin.002
Pos: 312
Slave running: Yes
Replicate do db: freetime
Replicate ignore db:
Last errno: 0
Last error:
Skip connect: 0
1 row in set (0.00 sec)
Репликация пока еще является относительно новым механизмом в MySQL, хотя и хорошо работающим. По крайней мере, функции
Если
Каждый узел в схеме круговой
Обычно сценарий safe mysqld запускает сервер MySQL от имени специального пользователя. Но на самом деле любой пользователь системы может запустить свой сервер параллельно с другими серверами, при условии, что все они будут работать с разными портами или сокетами. Таким способом часто обеспечивается повышенный уровень безопасности.
К примеру, провайдеры Internet продают дисковое пространство Web-серверов множеству пользователей. В такой
Неудобством такого подхода является то, что приложения должны подключаться к серверам, используя нестандартные установки. Все их нужно свести в персональный конфигурационный файл ~/my..
Нестандартные значения номера порта или имени сокета, с которыми работает сервер, тоже нужно вынести в отдельный конфигурационный файл, который передается демону mysqld при запуске. Каждому серверу необходим и свой каталог данных. Все это можно сделать вручную, но лучше воспользоваться специально предназначенным для этих целей сценарием mysqld multi.
Данный сценарий работает с одним конфигурационным файлом, в котором у каждого сервера есть своя группа опций, объединенных под общим заголовком. В группу [mysqld multi] входят опции самого сценария, а названия остальных групп состоят из имени сервера и его номера, например [mysqld 13]. Опции каждой группы передаются соответствующему демону mysqld при его запуске.
Сценарий mysqld multi может запускать и останавливать любой сервер, указанный по номеру, но для этого сценарий должен иметь привилегию SHUTDOWN. Ею не должен владеть кто угодно, поэтому нужно создать специальную учетную запись на каждом сервере, где подобные действия разрешены (листинг 12.10). Имя пользователя и пароль должны быть везде одинаковыми. Поместите их в группу [mysqld multi] как показано в листинге 12.11.
GRANT SHUTDOWN ON *.* TOmulti admin@localhost IDENTIFIED BY ‘password’
У каждого сервера должна быть своя группа опций. В названии группы нужно указать положительное целое число, уникальное в пределах файла. Группы не обязаны располагаться по порядку. Для каждого сервера нужно задать файл сокета номер порта и каталог данных. Что касается имени пользователя, то разрешается, чтобы один и тот же пользователь
[mysqld multi] mysqld = /usr/local/libexec/mysqld mysqladmin = /usr/local/bin/mysqladmin user = multi admin password = password log = /usr/local/var/multi.1og [mysqd1] socket = /tmp/mysql.sock port = 3306 pid-file = /usr/local/mysql/var/mysqld1/myserver.pid datadir = /usr/local/mysql/var/mysqld1/ user = jgalt [mysqd2] socket = /tmp/mysq2.sock port = 3307 pid-file = /usr/local/mysql/var/mysqld2/myserver.pid datadir = /usr/local/mysql/var/mysqld2/ user = dtaggart [mysqd3] socket = /tmp/mysq3.sock port = 3308 pid-file = /usr/local/mysql/var/mysqld3/myserver.pid datadir = /usr/local/mysql/var/mysqld3/ user = hreardon
Обычный сервер хранит у себя все данные и обслуживает все клиентские запросы. Схема взаимодействия между сервером и клиентами изображена на рис 12.1. Серверные данные располагаются на одном или нескольких физических дисках. Чтобы сделать запрос, клиент устанавливает соединение с сервером. Сервер анализирует инструкции, выполняет их, извлекает данные и возвращает результаты запроса. По мере возрастания нагрузки производительность сервера снижается. Чтобы избежать этого, задействуют дополнительные ресурсы, например, наращивают память, ставят дополнительные процессоры и даже сетевые платы. Эта стратегия эффективна, если клиенты расположены в непосредственной близости от сервера, — например, несколько серверов приложений взаимодействуют с одной СУБД. Но в тех архитектурах, где сервер и клиенты удалены друг от друга, производительность обратно пропорциональна расстоянию.
(рис 12.1) Обычный сервер баз данных
Решением этой проблемы являются распределенные базы данных (РБД), которые сегментируют хранимую информацию и перемещают отдельные ее блоки ближе к нужным клиентам. Способов организации таких баз данных много. Можно разместить таблицы на разных компьютерах или использовать несколько идентичных хранилищ. Во втором случае серверы взаимодействуют друг с другом для поддержания синхронизации. Если на одном из серверов происходит обновление данных, оно распространяется и на все остальные серверы.
К недостаткам распределенных баз данных можно отнести то, что возрастает сложность управления ими. Но преимуществ все же больше. Главное из них — повышение производительности. Данные быстрее обрабатываются несколькими серверами, а кроме того, данные располагаются ближе к тем пользователям, которые чаще с ними работают.
Система становится более устойчивой, если она способна выдержать сбой одного из своих компонентов. В распределенной базе данных с симметричной схемой хранения исчезновение одного из серверов приводит к замедлению работы пользователей, находящихся ближе к этому серверу, но в целом система остается работоспособной. К тому же, она легко масштабируется, так как ее не нужно останавливать при добавлении еще одного сервера.
В несимметричной системе можно оптимизировать схему расположения данных. Чем ближе пользователи находятся к нужным им данным, тем меньше на их работу влияют сетевые задержки. В результате серверам приходится обрабатывать меньшие объемы данных. Это также способствует повышению безопасности данных, поскольку их можно физически хранить в тех системах, где пользователи имеют право работать с соответствующими данными. В целом, однако, применение распределенных баз данных связано с достаточно высоким риском. Требуется обеспечить соблюдение мер безопасности сразу на нескольких узлах, что не так-то просто реализовать.
РБД состоит из трех основных частей: клиентов, модуля обработки транзакций и хранилища данных. Сервер обычно берет на себя задачи обработки транзакций и хранения данных, хотя в полностью распределенной базе данных за решение этих задач отвечают разные аппаратные компоненты. Обратимся к рис 12.2. Здесь три клиента взаимодействуют с двумя модулями обработки транзакций, которые, в свою очередь, работают с двумя хранилищами. Клиенты посылают свои запросы модулям, а те определяют, в каком из хранилищ находятся требуемые данные.
(рис 12.2) Распределенные серверы
В идеальном случае, клиенты не знают, является система распределенной или нет. Они лишь посылают ей запросы, а система возвращает клиентам результаты этих запросов. Как она это делает, клиентов не интересует. На практике распределенные базы данных проявляют разную "прозрачность". В крайнем случае РБД хранится на нескольких независимых серверах, а клиентскому приложению приходится выбирать сервер в зависимости от того, какую информацию требуется получить. Это подразумевает, что таблицы, находящиеся на разных серверах, не имеют никаких
Если данные реплицируются между несколькими серверами, клиент в общем случае может предпочесть тот или иной сервер. В подобной схеме все серверы хранят одни и те же данные. Специальный модуль может помогать клиентам в выборе серверов, осуществляя выравнивание нагрузки. РСУБД отвечает за выполнение транзакций в многосерверной среде, но в любой момент времени два сервера не могут быть синхронизированы между собой.
В РБД применяется несколько схем распределения данных. В случае
Создать точную копию базы данных MySQL довольно просто. Способы резервного
Рассмотрим проблему обновления данных. Если обновления происходят сразу на двух серверах, их нужно согласовывать. Чтобы не возникали неразрешимые ситуации, необходимо позволить вносить изменения только на одном сервере. Тогда синхронизация будет заключаться в дублировании содержимого сервера, доступного для записи, на все остальные серверы. Их полезность зависит от того, насколько важна актуальность данных. Во многих случаях база данных, содержащая все записи, кроме тех, которые были созданы за последние 24 часа, вполне приемлема.
Методика
/* Каталог МР3-файлов. */ CREATE TABLE song ( ID INT NOT NULL AUTO INCREMENT, Name CHAR(40) NOT NULL, Artist CHAR(16) NOT NULL, Filename CHAR(80) NOT NULL, PRIMARY KEY(ID), INDEX (Name), INDEX (Artist) ); /* Журнал запрашиваемых файлов. */ CREATE TABLE log ( Server TINYINT UNSIGNED NOT NULL, Song INT NOT NULL, DownloadTime DATETIME NOT NULL );
Каждый сервер хранит информацию о доступных песнях в таблице song. В таблицу log заносится запись всякий раз, когда кто-то загружает очередной МР3-файл. У этой таблицы нет первичного ключа, так как в обычном режиме она используется лишь для вставки записей. Наличие индекса только замедлит работу с таблицей.
Раз в день таблицы log всех серверов объединяются по следующему сценарию. Один из серверов прекращает обслуживать запросы Web-приложений. Остальные серверы создают копии таблицы log, извлекают из них последние записи и посылают их серверу, генерирующему отчет. На время этой процедуры каждый сервер должен заблокировать свою таблицу log. Чтобы слишком много пользовательских запросов не оказалось заблокировано, процедуру желательно выполнять в период минимальной активности сервера.
Сервер, генерирующий отчет, загружает полученные данные в свою таблицу log, после чего выполняет сценарий, показанный в листинге 12.2. В этом сценарии создаются два рейтинга популярности: по всем песням и за последние 24 часа. Временный индекс таблицы log ускоряет ее просмотр.
/* Создание индекса. */ CREATE INDEX song ON log (Song); /* Определение рейтинга всех песен. */ DROP TABLE IF EXISTS popular alltime; CREATE TABLE popular alltime ( Rank INT NOT NULL, Song INT NOT NULL, Hits INT NOT NULL, ); SET @id = 0; INSERT INTO popular alltime SELECT (@id := @id+1), song, COUNT (*) FROM Log GROUP BY 2 ORDER BY 3 DESC; ALTER TABLE popular alltime ADD PRIMARY KEY (Rank); /* Определение рейтинга песен за последние 24 часа. */ DROP TABLE IF EXISTS popular last24; CREATE TABLE popular last24 ( Rank INT NOT NULL, Song INT NOT NULL, Hits INT NOT NULL, ); SET @id = 0; INSERT INTO popular last24 SELECT (@id := @id+1), song, COUNT (*) FROM Log WHERE DownloadTime > DATE SUB (NOW(), INTERVAL 24 HOUR) GROUP BY 2 ORDER BY 3 DESC; ALTER TABLE popular last24 ADD PRIMARY KEY (Rank); /* Удаление индекса */ DROP INDEX song ON log;
Таблицы рейтингов не содержат поле-счетчик: вместо него используется инкрементная переменная. Будучи созданной, рейтинговая таблица уже не меняется. Сценарий удаляет существующие таблицы и формирует их заново. Имеет смысл сжимать такие таблицы с помощью утилиты myisampack (см. лекцию "Утилиты командной строки"). Созданные таблицы загружаются остальными серверами, где они заменяют старые рейтинги.
Изменения в таблицу song должны вноситься на одном сервере. Тогда исчезают проблемы, связанные с дублированием песен и первичных ключей. Главный сервер публикует новую редакцию каталога песен либо после каждого изменения, либо по определенному графику.
В описанной схеме требуется, чтобы приложения знали архитектуру всей системы. Эта система не является монолитной и легко справляется со сбоями отдельных компонентов. Каждый из составляющих ее серверов хранит идентичную информацию.
Программа MySQL реализует функции автоматической
(рис 12.3) Схема репликации с одним сервером для записи и двумя серверами для чтения
Все серверы работают под управлением MySQL на разных компьютерах подключенных к сети. В целях синхронизации
Клиенты могут посылать запросы на выборку как главному, так и любому подчиненному серверу. Запись данных должна происходить только на главном сервере, иначе изменения останутся локальными. В схеме на рис 12.3 запросы на выборку направляются только подчиненным серверам, что позволяет главному серверу сосредоточиться на обновлениях.
На подчиненном сервере запускается отдельный поток, который периодически опрашивает главный сервер на предмет наличия изменений. Однако бывает так, что сервер одновременно является и главным, и подчиненным. Тогда становится возможной схема
(рис 12.4) Круговая репликация
Приложение должно предотвращать несогласованные обновления. Рассмотрим такой случай. Серверы А и Б являются друг для друга главным и подчиненным сервером. Оба используют таблицу сообщений с первичным ключом-счетчиком. В определенный момент два пользователя одновременно создают новые сообщения, по одному на каждом сервере. Если таблицы раньше были синхронизированы, то теперь в каждой из них будет новая запись с идентификатором, совпадающим с идентификатором другой записи на другом сервере. Можно избежать этой неприятности, используя внешний генератор идентификаторов, при условии, что он будет однопотоковым.
В схеме на рис 12.4 каждое приложение взаимодействует с одним сервером, хотя это необязательно. Если серверы расположены рядом, можно формировать
Подчиненный сервер контролирует, какое изменение было получено от главного сервера последним. По умолчанию сведения об этом находятся в файле master info.
Если обновление приводит к появлению ошибки, то поток, управляющий синхронизацией, останавливается. В этом случае сервер записывает сообщение в RAND() по умолчанию инициализирует TIMESTAMP().
Вспомните, что FLUSH, поэтому старайтесь не менять таблицы напрямую, а пользуйтесь инструкциями GRANT и .
Значения переменных не реплицируются. Если в обновлении строки участвовала переменная, то на подчиненном сервере будет использовано локальное, а не
Чтобы включить функции mysqld, имеющие отношение к
--binlog-do-db=база данных --binlog-ignore-db=база данных --log-bin-index=каталог --log-bin[=каталог] --log-slave-updates --master-connect-retry=секунды --master-host=узел --master-info-file=файл --master-password=пароль --master-port=порт --master-user=пользователь --replicate-do-db=база данных --replicate-do-table=база данных.таблица --replicate-ignore-db=база данных --replicate-ignore-table= база данных.таблица --replicate-rewrite-db=главный->подчиненный --replicate-wind-do-table=шаблон --replicate-wind-ignore-table=шаблон --server-id=идентификатор
Прежде чем редактировать конфигурационные файлы, создайте на главном сервере учетную запись, чтобы подчиненный сервер мог получать обновления. В листинге 12.3 показана инструкция, создающая пользователя user с привилегией FILE. Никакие другие привилегии подчиненному серверу не нужны. В данном примере пользователь может посылать запросы с любого узла, но на практике обычно указывают конкретное доменное имя.
GRANT FILE ON *.* ТО slave IDENTIFIED BY ‘password’
Теперь нужно остановить главный сервер или заблокировать все таблицы, подлежащие LOAD TABLE, чтобы получить точную копию нужной таблицы.
[/usr/local/var]# tar cvfz freetimedb.tar.gz. /freetime/
Далее требуется включить двоичный журнал на главном сервере, внеся изменения в конфигурационный файл /etc/my. Соответствующая опция называется log bin. С помощью опции server id серверу присваивается уникальный идентификатор. В листинге 12.5 показаны две строки, которые добавляются в раздел [mysqld] конфигурационного файла. После внесения изменений нужно перезапустить главный сервер.
log-bin server_id=1
Скопируйте на подчиненный сервер созданную выше копию базы данных и отредактируйте его конфигурационный файл. Добавляемые в него опции перечислены в листинге 12.6. Поскольку реплицируется лишь одна база данных, с помощью опции replicate-do-db задается конкретное имя: freetime. Данному подчиненному серверу присваивается идентификатор 2.
Master-host=192.168.123.194 Master-user=slave Master-password=password Master-port=3306 Replicate-do-db=freetime Server-id=2
После изменения конфигурации запустите подчиненный сервер. Он свяжется с главным севером и проверит, изменилась ли база данных freetime с момента получения ее последней копии. Пока подчиненный сервер работает, он регулярно получает интересующие его изменения. Задержка обновления зависит от контекста, но обычно она составляет несколько секунд.
В листинге 12.7 перечислены инструкции, используемые в процессе CHANGE MASTER приводит к временной смене главного сервера.
mysql> SHOW MASTER STATUS;
+------------+----------+--------------+------------------+
|File | Position | Binlog do db | Binlog ignore db |
+------------+----------+--------------+------------------+
|red-bin.002 | 312 | | |
+------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> SHOW MASTER STATUS \G
***************************************************************
Master Host: 192.168.123.194
Master User: slave
Master Port: 3306
Connect retry: 60
Log file: red-bin.002
Pos: 312
Slave running: Yes
Replicate do db: freetime
Replicate ignore db:
Last errno: 0
Last error:
Skip connect: 0
1 row in set (0.00 sec)
Репликация пока еще является относительно новым механизмом в MySQL, хотя и хорошо работающим. По крайней мере, функции
Если
Каждый узел в схеме круговой
Обычно сценарий safe mysqld запускает сервер MySQL от имени специального пользователя. Но на самом деле любой пользователь системы может запустить свой сервер параллельно с другими серверами, при условии, что все они будут работать с разными портами или сокетами. Таким способом часто обеспечивается повышенный уровень безопасности.
К примеру, провайдеры Internet продают дисковое пространство Web-серверов множеству пользователей. В такой
Неудобством такого подхода является то, что приложения должны подключаться к серверам, используя нестандартные установки. Все их нужно свести в персональный конфигурационный файл ~/my..
Нестандартные значения номера порта или имени сокета, с которыми работает сервер, тоже нужно вынести в отдельный конфигурационный файл, который передается демону mysqld при запуске. Каждому серверу необходим и свой каталог данных. Все это можно сделать вручную, но лучше воспользоваться специально предназначенным для этих целей сценарием mysqld multi.
Данный сценарий работает с одним конфигурационным файлом, в котором у каждого сервера есть своя группа опций, объединенных под общим заголовком. В группу [mysqld multi] входят опции самого сценария, а названия остальных групп состоят из имени сервера и его номера, например [mysqld 13]. Опции каждой группы передаются соответствующему демону mysqld при его запуске.
Сценарий mysqld multi может запускать и останавливать любой сервер, указанный по номеру, но для этого сценарий должен иметь привилегию SHUTDOWN. Ею не должен владеть кто угодно, поэтому нужно создать специальную учетную запись на каждом сервере, где подобные действия разрешены (листинг 12.10). Имя пользователя и пароль должны быть везде одинаковыми. Поместите их в группу [mysqld multi] как показано в листинге 12.11.
GRANT SHUTDOWN ON *.* TOmulti admin@localhost IDENTIFIED BY ‘password’
У каждого сервера должна быть своя группа опций. В названии группы нужно указать положительное целое число, уникальное в пределах файла. Группы не обязаны располагаться по порядку. Для каждого сервера нужно задать файл сокета номер порта и каталог данных. Что касается имени пользователя, то разрешается, чтобы один и тот же пользователь
[mysqld multi] mysqld = /usr/local/libexec/mysqld mysqladmin = /usr/local/bin/mysqladmin user = multi admin password = password log = /usr/local/var/multi.1og [mysqd1] socket = /tmp/mysql.sock port = 3306 pid-file = /usr/local/mysql/var/mysqld1/myserver.pid datadir = /usr/local/mysql/var/mysqld1/ user = jgalt [mysqd2] socket = /tmp/mysq2.sock port = 3307 pid-file = /usr/local/mysql/var/mysqld2/myserver.pid datadir = /usr/local/mysql/var/mysqld2/ user = dtaggart [mysqd3] socket = /tmp/mysq3.sock port = 3308 pid-file = /usr/local/mysql/var/mysqld3/myserver.pid datadir = /usr/local/mysql/var/mysqld3/ user = hreardon
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.