x

Einloggen

Hast du noch keinen Account? Jetzt registrieren!

Серверы квіткоў: размеркаваныя унікальныя першасныя ключы

Original on code.flickr.com/blog

Гэта першы пост у серыі выкарыстанні, злоўжыванне і маштабаванне MySQL на Flickr.

Квіток серверы не з'яўляюцца ў сутнасці цікавыя, але яны важны блок на Flickr. Яны з'яўляюцца ключавымі для тэмы мы будзем казаць крыху пазней, як sharding і майстар-майстар. Квіток серверы даюць нам ва ўсім свеце (Flickr свеце) унікальны цэлых лікаў у якасці першасных ключоў у нашым размеркаванай усталёўцы.

Чаму?

Sharding (ака партыёнінг дадзеных), як мы маштабу ў сховішча Flickr. Замест таго каб захоўваць усе дадзеныя на адзін вельмі вялікі базе дадзеных, у нас ёсць мноства баз дадзеных, кожная з якіх некаторыя дадзеныя, а таксама размеркаваць нагрузку паміж імі. Часам нам трэба для пераносу дадзеных паміж базамі дадзеных, таму нам патрэбныя першасныя ключы, каб быць глабальна ўнікальнымі. Акрамя таго нашы MySQL аскепкі будуюцца як майстар-майстар рэплікант пара для ўстойлівасці. Гэта азначае, што мы павінны быць у стане гарантаваць унікальнасць у аскепка, каб пазбегнуць сутыкненні ключавых. Мы жадалі б пайсці на выкарыстанне MySQL аўтаінкрыментныя слупкі першасных ключоў як і ўсе астатнія, але MySQL не можа гарантаваць унікальнасць па фізічнай і лагічнай базы дадзеных.

GUIDы?

Улічваючы неабходнасць глабальна ўнікальныя ідэнтыфікатары відавочнае пытанне, чаму б не выкарыстоўваць ідэнтыфікатары GUID? Невялікі, таму што GUID, вялікія, і яны дрэнна індэксу MySQL. Адзін са спосабаў захаваць MySQL Пост мы індэксуем усё, што мы жадаем, каб запыт, а мы толькі запыт на індэксы. Так памер індэксу з'яўляецца адным з ключавых разгляды. Калі вы не можаце захоўваць індэксы ў памяці, вы не можаце захаваць вашу базу дадзеных хутка. Акрамя квітка серверы даюць нам паслядоўнасці якіх ёсць вельмі добрымі ўласцівасцямі ў тым ліку са справаздачнасцю і адладкі прасцейшым, і стварэнне спрыяльных кэшаванне хакі.

У адпаведнасці Хэшаванне?

Некаторыя праекты, такія як "Дынама" Amazon забяспечыць паслядоўнае хэшаванні кольца ў верхняй частцы сховішча для апрацоўкі GUID / sharding пытанню. Гэта больш падыходзіць для запісу танныя асяроддзю (напрыклад, LSMTs), у той час як MySQL аптымізаваны для хуткага адвольнага чытання.

Цэнтралізацыя Аўта-прырашчэннямі

Калі мы не можам зрабіць MySQL аўтаматычна крокам працу паміж некалькімі базамі дадзеных, што, калі мы проста выкарыстоўваць адну базу дадзеных? Калі мы ўставілі новы радок у гэтым адна база дадзеных кожных разоў хтосьці выклаў фота мы маглі б проста выкарыстоўваць аўтаінкрыментны ID з гэтай табліцы ў якасці першаснага ключа для ўсіх нашых баз дадзеных.

Вядома, у 60 + фатаграфіі другіх, што табліца будзе атрымліваць даволі вялікі. Мы можам пазбавіцца ад усіх дадатковых дадзеных пра фота, а проста ID у цэнтралізаванай базе дадзеных. Нават тады табліцы атрымлівае unmanageably вялікі хутка. Ёсць і заўвагі, а абранае і групы паведамленняў, а таксама пазнакі, і гэтак далей, і тыя, усе ідэнтыфікатары запатрабуецца.

REPLACE INTO

Нешматлікім больш дзесяці гадоў назад MySQL пастаўляецца з нестандартным пашырэннем спектру SQL ANSI, "REPLACE INTO". Пазней "INSERT на паўтаральных KEY UPDATE" прыйшлі разам і вырашыць зыходную задачу значна лепш. Аднак REPLACE INTO усё яшчэ падтрымліваецца.

REPLACE працуе сапраўды гэтак жа, як INSERT, за выключэннем выпадкаў, старыя радкі ў табліцы мае тое ж значэнне, як новага радка першасны ключ ці ўнікальны індэкс, стары радок выдаляецца перад новым устаўляецца радок.

Гэта дазваляе нам атамарна абнаўляць у такім месцы, у адным радку базы дадзеных, а таксама атрымаць новыя аўтаінкрыментам першаснай ID.

Збіраны ўсё разам

Квіток сервера Flickr з'яўляецца вылучаны сервер базы дадзеных, з адной базай дадзеных на ім, і ў гэтай базе дадзеных Ёсць табліцы як Tickets32 для 32-бітных ідэнтыфікатараў і Tickets64 для 64-бітных ідэнтыфікатараў.

Tickets64 схема выглядае наступным чынам:


CREATE TABLE `Tickets64` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`stub` char(1) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `stub` (`stub`)
) ENGINE=MyISAM

SELECT * from Tickets64 вяртае адзін радок, якая выглядае прыкладна так:


+-------------------+------+
| id | stub |
+-------------------+------+
| 72157623227190423 | a |
+-------------------+------+

Калі мне патрэбен новы глабальны ўнікальны 64-разрадны ID я выканаеце наступныя SQL:


REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();

SPOFы

Вы сапраўды не ведаю жадаю вылучэнні ідэнтыфікатараў быць адзінай кропкі адмовы. Мы дасягаем "высокі ўзровень даступнасці", выканаўшы два сервера квіток. На гэтым запісе / абнаўленні аб'ём рэплікацыі паміж скрынь будзе праблематычным, і замак заб'е прадукцыйнасці сайта. Мы падзяліць адказнасць паміж дзвюма скрынямі шляхам дзялення ID прастора пасярэдзіне, разгладжвае і цяжкасці, з дапамогай:


TicketServer1:
auto-increment-increment = 2
auto-increment-offset = 1
TicketServer2:
auto-increment-increment = 2
auto-increment-offset = 2

Мы кругавы паміж двума серверамі для балансавання нагрузкі і займацца часу прастою. Бакі рабіць дрэйфу трохі не сінхранізаваны, я думаю, у нас ёсць некалькі больш 100 тысяч аб'ектаў няцотныя лікі, то раўнамерна нумарам аб'ектаў на дадзены момант, але гэта не шкодзіць 1.

Падрабязней паслядоўнасцяў

Насамрэч мы некалькі табліц, то проста Tickets32 і Tickets64 на квітку сервераў. Мы паслядоўнасці для фатаграфій, для рахункаў, для OfflineTasks, а таксама для груп і г.д. OfflineTasks атрымаць сваю паслядоўнасць, таму што мы прапаліць шматлікія з іх мы не жадаем, каб залішне падбеглі разлічвае на іншыя рэчы. Групы, а таксама рахункаў атрымаць свае паслядоўнасці, таму што мы атрымаць настолькі, параўнальна, мала. Фатаграфіі маюць сваю ўласную паслядоўнасць, што мы пераканаліся, сінхранізаваць наш стары стол з аўта-інкрыментам, калі мы скароцім больш таму, што яго прыемна ведаць, колькі фатаграфій мы былі загружаны, і мы выкарыстоўваем ID, як скарачэнне для адсочвання.

Так Там што

Гэта не асабліва элегантным, але яна працуе дзіўна добра для нас, якія маюць вырабляецца пачынальна з пятніцы 13-го студзеня 2006 гады і з'яўляецца добрым прыкладам інжынерных Flickr тупы магчымую рэч, якая будзе працаваць прынцып дызайну.

Падрабязней хуткім часам.