Назад | Перейти на главную страницу

Мне нужно разбить базу данных mysql. Я хочу начать с 12 осколков на 2 машинах. Как лучше всего переместить некоторые из них, когда я хочу добавить новый сервер?

Все таблицы InnoDb. Я бы предпочел не использовать mysqldump, потому что размер сегментов будет около 200 ГБ (около 700 миллионов строк), а это займет слишком много времени.

Я надеялся просто остановить mysql на час, скопировать файлы данных на новую машину и запустить резервное копирование. Но вы не можете сделать это с помощью InnoDb, так как некоторые данные находятся в общем табличном пространстве. Даже если у меня установлен параметр innodb_file_per_table.

Это не веб-сайт, а специальное приложение, которое сейчас используют десятки тысяч, поэтому время безотказной работы и производительность важны. Я полагаю, я мог бы добавить логику в свое серверное приложение, чтобы обеспечить постепенную перебалансировку / перемещение шарда.

Есть ли у кого-нибудь идеи получше?

Если вы создаете таблицу после включения innodb_file_per_table вариант, то все содержимое таблицы должно храниться в файлах, уникальных для данной таблицы.

Если это не удастся ...

Если хранение двоичных журналов на неопределенный срок не является проблемой, вы можете сделать дамп данных перед загрузкой каких-либо данных. Этот начальный дамп можно использовать для начальной репликации. Затем нужно просто дождаться, пока репликация наверстает упущенное, прежде чем вы попытаетесь переключиться.

В качестве альтернативы, если вы уже используете репликацию для резервного копирования, вы можете вместо этого настроить репликацию с сервера резервного копирования. Очевидным штрафом будет то, что резервные копии будут отключены во время дампа базы данных.

Третий вариант: вы всегда можете скопировать все содержимое MySQL на новый сервер, запустить его, а затем удалить все, что вы не используете.

Вы можете попробовать innodb hotcopy из http://www.innodb.com/products/hot-backup/features/

Дороговато, но, похоже, вы можете получить пробную копию.

вы могли бы положить mysqlproxy между appserv и серверами приложений, чтобы добавить логику [предупреждение - это влияет на производительность].

вы также можете использовать репликацию mysql, но вам все равно нужно будет запустить ее из полной резервной копии.

пс.

другие предлагают mysqlhotcopy. тогда посмотри на xtrabackup - то же самое, но с открытым исходным кодом.

Percona xtrabackup, похоже, делает то, что требуется. В частности, если у вас установлен inndb_table_per_file, вы можете сделать «горячее» резервное копирование таблиц innodb в базе данных и импортировать их в другой экземпляр mysql.

Посмотрите эти шаги, чтобы узнать, как:

http://www.percona.com/docs/wiki/percona-xtrabackup:xtrabackup_manual#restoring_a_single_ibd_file

Мы предлагаем решение этой проблемы с использованием нашей технологии dbShards. Мы можем предоставить горячий набор вторичных серверов для ваших существующих баз данных с надежной репликацией. Затем вы можете повторно подключить вторичные серверы, не отключая первичные (главные) базы данных, и плавно перейти на дополнительные серверы сегментов.

Для получения дополнительной информации вы можете прочитать об этом по адресу: http://www.dbshards.com