VK Cloud logo

ClickHouse-тің репликацияланатын және үлестірілген кестелерін пайдалану

Репликация — дерекқорларды ауқымдаудың тәсілдерінің бірі. Бұл тәсілдің мәні дерекқордың бір серверіндегі деректердің бір немесе бірнеше басқа серверге үздіксіз көшірілуінде (репликациялануында). Соның арқасында сұрауларды өңдеу үшін бір емес, бірнеше серверді пайдалануға болады. Осылайша, жүктемені бір серверден бірнеше серверге бөлу мүмкіндігі пайда болады.

VK Cloud сервисінде ДБ инстансын жасау кезеңінде реплика жасау мүмкіндігі бар — ол үшін Инстанс жасау қадамында Реплика жасау опциясын белсендіріңіз.

Сипаттама

ClickHouse ДББЖ-де деректер репликациясы дәстүрлі жүйелердегідей әдетте ДБ немесе тіпті инстанс деңгейінде емес, кестелер деңгейінде бапталады. Яғни кластердегі басқа хосттарға деректер репликациялануы үшін кестені дұрыс құру қажет. ClickHouse архитектурасы бірдей атауы бар кестелердің екі реплика арасында репликациялануын (яғни деректері бірдей болуын), ал шардтар арасында ешқандай байланыс болмауын, яғни деректердің «шардталуын» көздейді. Өкінішке қарай, мұның бәрі ClickHouse тарапынан бақыланбайды, сондықтан барлығын өзіңіз дұрыс жасап, баптауыңыз керек.

Репликацияланатын кестелерді жасау

Мысалы, бізде ClickHouse кластеры бар делік, мысалы екі шарды бар — әрқайсысында екі репликадан. VK Cloud-тағы ClickHouse кластерінің атауы әрқашан cluster. Сұрауды орындайық:

CREATE TABLE table_name ON CLUSTER cluster(    EventDate DateTime,    CounterID UInt32,    UserID UInt32) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_name', '{replica}')PARTITION BY toYYYYMM(EventDate)ORDER BY (CounterID, EventDate, intHash32(UserID))SAMPLE BY intHash32(UserID);

Оны бір серверде бір рет орындауға болады, себебі ON CLUSTER опциясы бар. Бұл жағдайда ClickHouse кластердің барлық түйіндері көрсетілген конфигурациялық файлға жүгінеді және олардың әрқайсысында сұрауды орындайды. Бұл опциясыз дәл осындай сұрауды әр түйінде жеке орындауға болады.

Осы команданың ерекшеліктерін қарастырайық. Мұнда ReplicatedMergeTree кесте қозғалтқышы пайдаланылады. Бұл қозғалтқыш және Replicated тобына жататын басқалары кестедегі өзгерістерді ZooKeeper-те жариялауға арналған. Тиісінше, аргументтер осы ақпаратты Zookeeper-де сақтау параметрлері болып табылады. Бірінші бөлігі — жол, екіншісі — ақпарат жарияланатын кілттің атауы. Фигуралық жақшалар ішінде макростар көрсетілген, макростар әр сервердің конфигінде анықталады. VK Cloud кластерінде олар кластер құрамына сәйкес әлдеқашан бапталып тұрады, сондықтан мысалдағыдай тікелей көрсетуге болады.

Нәтижесінде бір шардтың реплика серверлері ZooKeeper-те бірдей жолға ие болады және басқа серверлерден өзгерістерді қолданады әрі өз өзгерістерін жариялайды (екіжақты репликация). Яғни серверлердің біріне жүгініп, өзекті деректерді алуға болады, бірақ барлық шардтар бойынша деректерді қалай алуға болады? Ыңғайлы болу үшін бұл жағдайда Distributed кесте түрін пайдалануға болады.

Distributed-кестелерді жасау

CREATE TABLE distributed ON CLUSTER cluster(    EventDate DateTime,    CounterID UInt32,    UserID UInt32) ENGINE = Distributed(cluster, default, table_name, UserID);

Мұндай кесте кластердегі барлық серверлердегі кестеге нұсқайды. Яғни SELECT сұрауын пайдаланғанда деректер барлық түйіндерден жиналады. Осындай кестені барлық серверлерде жасап, олардың кез келгенінен барлық деректерге жүгінуге болады — бұл жүктемені теңестірудің бір түрі (алайда бұған қатты сенім артпаған жөн, өйткені ClickHouse бір уақытта көп мөлшердегі ауыр сұрауларды орындауға арналмаған).

Кластерге деректерді жазудың екі тәсілі бар:

Біріншіден, қай серверлерге қандай деректер жазылатынын өзіңіз анықтап, жазуды тікелей әр шардқа орындай аласыз. Яғни үлестірілген кесте «қарап тұрған» кестелерге INSERT жасауға болады. Бұл ең икемді шешім, өйткені пәндік саланың талаптарына байланысты күрделі болуы мүмкін кез келген шардтау схемасын пайдалануға болады.

Сонымен қатар бұл ең оңтайлы шешім, өйткені деректер әртүрлі шардтарға толық тәуелсіз түрде жазыла алады.

Екіншіден, INSERT-ті Distributed кестесіне орындауға болады. Бұл жағдайда кесте енгізілетін деректерді серверлер бойынша өзі таратады. Distributed кестесіне жазу үшін онда шардтау кілті көрсетілуі керек (соңғы параметр). Сондай-ақ, егер шард біреу ғана болса, онда жазу шардтау кілтін көрсетпей де жұмыс істейді (өйткені бұл жағдайда оның мағынасы жоқ).