Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Минус этого подхода – нет гибкости c алгоритмом распределения и с увеличением количества шардов, если не запастись заранее увеличенным auto_increment_increment.
CREATE TABLE `DatabaseShards` (
`database_shard_id` int(10) unsigned NOT NULL AUTO_INCREMENT, -- номер шарды, автоинкремент
`database_server_id` int(10) unsigned NOT NULL, -- номер сервера
`database_idx` tinyint(3) unsigned NOT NULL, -- номер базы в диапазоне 1 .. server.databases_count (см. ниже)
`units_used` int(10) unsigned NOT NULL DEFAULT '0', -- число сущностей, размещенных на шарде
`units_free` int(10) unsigned NOT NULL, -- сколько еще можно сущностей разместить на шарде
`is_available` tinyint(1) NOT NULL DEFAULT '1', -- если 0, то на этой шарде нельзя больше ничего размешать
-- .. опустим несущественное ..
PRIMARY KEY (`database_shard_id`),
KEY `idx_database_server_id` (`database_server_id`),
KEY `idx_units_free_database_server_id` (`units_free`,`database_server_id`),
CONSTRAINT `DatabaseShards_ibfk_1` FOREIGN KEY (`database_server_id`) REFERENCES `DatabaseServers` (`database_server_id`)
)
CREATE TABLE `DatabaseServers` (
`database_server_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-- .. опустим несущественное ..
`capacity` int(10) unsigned NOT NULL DEFAULT '100', -- "мощность" сервера. В попугаях.
`units_per_shard` int(10) unsigned NOT NULL DEFAULT '1000', -- сколько сущностей размещается на одной шарде сервера
`databases_count` tinyint(3) unsigned NOT NULL DEFAULT '10', -- сколько баз данных создается на сервере
`is_available` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`database_server_id`)
)
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='message_%d' AND TABLE_SCHEMA='%s'"CREATE TABLE IF NOT EXISTS %s.`messages_%d` ( `id` int(20) unsigned NOT NULL AUTO_INCREMENT, ... `data` varchar(1024) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=%d
Генерация ID для шардинга в MySQL