Опубликован: 16.04.2007 | Уровень: специалист | Доступ: платный
Лекция 12:

Концепции распределенных баз данных

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >

Скопируйте на подчиненный сервер созданную выше копию базы данных и отредактируйте его конфигурационный файл. Добавляемые в него опции перечислены в листинге 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.
< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
Александра Каева
Александра Каева
Дмитрий Черепенин
Дмитрий Черепенин

Какого года данный курс?