Концепции распределенных баз данных
Скопируйте на подчиненный сервер созданную выше копию базы данных и отредактируйте его конфигурационный файл. Добавляемые в него опции перечислены в листинге 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Листинг 12.6.
После изменения конфигурации запустите подчиненный сервер. Он свяжется с главным севером и проверит, изменилась ли база данных 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)Листинг 12.7.
Репликация пока еще является относительно новым механизмом в MySQL, хотя и хорошо работающим. По крайней мере, функции репликации легко конфигурировать. В MySQL версии 4.0 будут внесены многочисленные улучшения, в том числе направленные на устранение ограничений репликации. В настоящее время репликация лучше всего реализуется в виде синхронизированных резервных копий. Все подчиненные серверы постоянно поддерживают свои данные в синхронизированном состоянии, поэтому при сбое главного сервера нужно лишь переключить приложения на новый сервер.
Если репликация применяется для улучшения производительности работы в организации, следуйте схеме, представленной на рис 12.3. Приложение должно взять на себя заботу о том, чтобы изменения делались лишь на главном сервере. Во всем остальном репликация должна быть абсолютно прозрачной. Если серверы, на которых хранится распределенная база данных, находятся на большом расстоянии друг от друга, попытайтесь внедрить схему круговой репликации. Например, можно закрепить за каждым сервером свой набор таблиц и позволить обновлять их только на одном сервере.
Каждый узел в схеме круговой репликации важен для нормальной работы системы. Чтобы свести к минимуму потери от сбоев, создайте дополнительные подчиненные серверы, не входящие в "цепочку". Они предназначены для экстренной замены вышедшего из строя главного сервера.
Запуск нескольких серверов
Обычно сценарий safe mysqld запускает сервер MySQL от имени специального пользователя. Но на самом деле любой пользователь системы может запустить свой сервер параллельно с другими серверами, при условии, что все они будут работать с разными портами или сокетами. Таким способом часто обеспечивается повышенный уровень безопасности.
К примеру, провайдеры Internet продают дисковое пространство Web-серверов множеству пользователей. В такой открытой среде нельзя рассчитывать на то, что пользователи не будут злоупотреблять своими привилегиями, имея доступ к общим ресурсам. Вместо того чтобы предоставлять каждому пользователю отдельную базу данных и заниматься администрированием всего множества баз данных, провайдеры создают для каждого пользователя свой сервер. Это позволяет пользователям самостоятельно заниматься администрированием, не мешая остальным.
Неудобством такого подхода является то, что приложения должны подключаться к серверам, используя нестандартные установки. Все их нужно свести в персональный конфигурационный файл ~/my.cnf.
Нестандартные значения номера порта или имени сокета, с которыми работает сервер, тоже нужно вынести в отдельный конфигурационный файл, который передается демону 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’Листинг 12.10.
У каждого сервера должна быть своя группа опций. В названии группы нужно указать положительное целое число, уникальное в пределах файла. Группы не обязаны располагаться по порядку. Для каждого сервера нужно задать файл сокета номер порта и каталог данных. Что касается имени пользователя, то разрешается, чтобы один и тот же пользователь запускал несколько серверов. В листинге 12.11 создаются три сервера для трех пользователей.
[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.11.