Bioyino - puʻunaue ʻia, hiki ke hoʻonui ʻia ka hōʻuluʻulu ana

No laila ʻohi ʻoe i nā metric. E like me mākou. ʻOhi pū mākou i nā ana. ʻOiaʻiʻo, pono no ka ʻoihana. I kēia lā e kamaʻilio mākou e pili ana i ka loulou mua loa o kā mākou ʻōnaehana nānā - kahi kikowaena hoʻohui statsd-compatible bioyino, no ke aha mākou i kākau ai a no ke aha mākou i haʻalele ai i ka brubeck.

Bioyino - puʻunaue ʻia, hiki ke hoʻonui ʻia ka hōʻuluʻulu ana

Mai kā mākou mau ʻatikala mua (1, 2) hiki iā ʻoe ke ʻike a hiki i kekahi manawa ua hōʻiliʻili mākou i nā māka me ka hoʻohana ʻana Brubeck. Ua kākau ʻia ma C. Mai kahi helu code, maʻalahi ia e like me kahi plug (he mea nui kēia inā makemake ʻoe e hāʻawi) a, ʻo ka mea nui loa, mālama ia i kā mākou mau puke o 2 miliona metrics per second (MPS) ma ka piko. me ka pilikia ole. Hōʻike ka palapala i ke kākoʻo no 4 miliona MPS me kahi asterisk. ʻO ia ke ʻano e loaʻa iā ʻoe ke kiʻi i ʻōlelo ʻia inā hoʻonohonoho pololei ʻoe i ka pūnaewele ma Linux. (ʻAʻole mākou ʻike i ka nui o nā MPS āu e loaʻa ai inā haʻalele ʻoe i ka pūnaewele e like me ia). ʻOiai kēia mau pōmaikaʻi, ua loaʻa iā mākou nā hoʻopiʻi koʻikoʻi e pili ana i ka brubeck.

Koi 1. ʻO Github, ka mea nāna i hoʻomohala i ka papahana, ua ho'ōki i ke kākoʻo ʻana iā ia: hoʻopuka i nā patch a me nā hoʻoponopono, e ʻae i kā mākou a (ʻaʻole wale kā mākou) PR. I nā mahina i hala iho nei (ma kahi o Fepeluali-Malaki 2018), ua hoʻomaka hou ka hana, akā ma mua o kēlā kokoke i 2 mau makahiki o ka mālie piha. Eia kekahi, ke kūkulu ʻia nei ka papahana no ka pono o loko o Gihub, hiki ke lilo i mea keakea nui i ka hoʻokomo ʻana i nā hiʻohiʻona hou.

Koi 2. Ka pololei o ka helu. ʻOhi ʻo Brubeck i ka huina o 65536 mau waiwai no ka hōʻuluʻulu ʻana. I kā mākou hihia, no kekahi mau metric, i ka wā aggregation (30 kekona), ʻoi aku ka nui o nā waiwai e hiki mai (1 ma ka piko). Ma muli o kēia hoʻohālike, ʻike ʻia nā waiwai kiʻekiʻe a me ka liʻiliʻi loa. No ka laʻana, e like me kēia:

Bioyino - puʻunaue ʻia, hiki ke hoʻonui ʻia ka hōʻuluʻulu ana
E like me ia

Bioyino - puʻunaue ʻia, hiki ke hoʻonui ʻia ka hōʻuluʻulu ana
Pehea e pono ai

No ke kumu like, helu hewa ʻia nā huina. E hoʻohui i ʻaneʻi i kahi pahu me kahi 32-bit float overflow, ka mea maʻamau e hoʻouna i ke kikowaena i segfault i ka wā e loaʻa ai kahi metric like ʻole, a lilo nā mea āpau. ʻO ka bug, ma ke ala, ʻaʻole i hoʻopaʻa ʻia.

A ma hope Koi iā X. I ka manawa e kākau ai, ua mākaukau mākou e hōʻike iā ia i nā 14 a i ʻole nā ​​mea hana statsd hana i hiki iā mākou ke loaʻa. E noʻonoʻo kākou ua ulu nui kekahi ʻoihana hoʻokahi a ʻaʻole lawa ka ʻae ʻana i ka 4 miliona MPS. A i ʻole inā ʻaʻole i ulu aʻe, akā ua koʻikoʻi nā metric iā ʻoe a hiki i ka pōkole, 2-3 mau minuke i loko o ka pakuhi hiki ke lilo i mea koʻikoʻi a hoʻoulu i ke kaumaha ʻole i waena o nā luna. No ka mea he hana mahalo ʻole ka mālama ʻana i ke kaumaha, pono nā ʻenehana loea.

ʻO ka mea mua, ʻo ka hoʻomanawanui hewa, no laila ʻaʻole pilikia ka pilikia ma ke kikowaena i kahi apocalypse zombie psychiatric i ke keʻena. ʻO ka lua, ʻo ka scaling e hiki ke ʻae i ka ʻoi aku ma mua o 4 miliona MPS, me ka ʻole e ʻeli hohonu i ka waihona pūnaewele Linux a me ka ulu mālie "i ka laulā" i ka nui e pono ai.

No ka loaʻa ʻana o kahi lumi no ka hoʻonui ʻana, ua hoʻoholo mākou e hoʻomaka me ka hoʻomanawanui hewa. "E pili ana! Hoʻomanawanui hewa! He mea maʻalahi, hiki iā mākou ke hana, "manaʻo mākou a hoʻokuʻu i nā kikowaena 2, e hāpai ana i kahi kope o ka brubeck ma kēlā me kēia. No ka hana ʻana i kēia, pono mākou e kope i nā kaʻa me nā metric i nā kikowaena ʻelua a kākau pū no kēia pono liʻiliʻi. Ua hoʻoponopono mākou i ka pilikia hoʻomanawanui me kēia, akā ... ʻaʻole maikaʻi loa. I ka wā mua, ua maikaʻi nā mea a pau: e hōʻiliʻili kēlā me kēia brubeck i kāna ʻano ponoʻī o ka hōʻuluʻulu ʻana, kākau i ka ʻikepili iā Graphite i hoʻokahi manawa i kēlā me kēia 30 kekona, e kākau ana i ka wā kahiko (hana ʻia kēia ma ka ʻaoʻao Graphite). Inā hāʻule koke kekahi kikowaena, loaʻa iā mākou ka lua me kāna kope ponoʻī o ka ʻikepili i hōʻuluʻulu ʻia. Akā eia ka pilikia: inā hāʻule ka server, ʻike ʻia kahi "ʻike" ma nā kiʻi. Ma muli o kēia ʻaʻole i hoʻonohonoho ʻia nā kikowaena 30-kekona a brubeck, a i ka manawa o kahi ulia ʻaʻole i kākau ʻia kekahi o lākou. I ka hoʻomaka ʻana o ke kikowaena lua, hana like ka mea. Hiki ke ʻae ʻia, akā makemake wau i ʻoi aku ka maikaʻi! ʻAʻole i pau ka pilikia o ka scalability. ʻO nā metric āpau e "lele" i kahi kikowaena hoʻokahi, a no laila ua kaupalena ʻia mākou i ka 2-4 miliona MPS like, e pili ana i ka pae pūnaewele.

Inā ʻoe e noʻonoʻo iki i ka pilikia a ma ka manawa like e ʻeli i ka hau me kahi ʻōpala, a laila hiki mai kēia manaʻo maopopo i ka manaʻo: pono ʻoe i kahi statsd hiki ke hana ma ke ʻano puʻunaue. ʻO ia ka mea e hoʻokō i ka synchronization ma waena o nā nodes i ka manawa a me nā metric. "ʻOiaʻiʻo, aia paha kēia ʻano hopena," wahi a mākou a hele i Google…. Aole i loaa ia lakou kekahi mea. Ma hope o ka hele ʻana i ka palapala no nā statsd ʻokoʻa (https://github.com/etsy/statsd/wiki#server-implementations mai ka lā 11.12.2017 o Dekemaba, XNUMX), ʻaʻohe mea i loaʻa iā mākou. ʻIke ʻia, ʻaʻole i ʻike nā mea hoʻomohala a i ʻole nā ​​​​mea hoʻohana o kēia mau hoʻonā i nā metric he nui, inā ʻaʻole lākou e hele mai me kekahi mea.

A laila hoʻomanaʻo mākou e pili ana i ka statsd "mea pāʻani" - bioyino, i kākau ʻia ma Just for Fun hackathon (ua hana ʻia ka inoa o ka papahana e ka palapala ma mua o ka hoʻomaka ʻana o ka hackathon) a ʻike mākou ua makemake mākou i kā mākou statsd ponoʻī. He aha ke kumu?

  • no ka mea, he kakaikahi loa na clones statsd ma ka honua nei,
  • no ka mea hiki ke hāʻawi i ka makemake a kokoke paha i ka hoʻomanawanui hewa i makemake ʻia a me ka scalability (me ka synchronizing aggregated metrics ma waena o nā kikowaena a me ka hoʻoponopono ʻana i ka pilikia o ka hoʻouna ʻana i nā paio),
  • no ka mea hiki ke helu pololei i nā metric ma mua o ka brubeck,
  • no ka mea hiki iā ʻoe ke hōʻiliʻili i nā ʻikepili kikoʻī iā ʻoe iho, ʻaʻole i hāʻawi ʻia e brubeck iā mākou,
  • no ka mea, ua loaʻa iaʻu kahi manawa e hoʻolālā i kaʻu noi noiʻi hyperperformance distributed scale lab, ʻaʻole ia e hana hou i ka hoʻolālā ʻana o kahi hyperfor like ʻē aʻe ... ʻoi, ʻo ia.

He aha ka mea e kākau ai? ʻOiaʻiʻo, ma Rust. No ke aha mai?

  • no ka mea, ua loaʻa kahi hoʻonā prototype,
  • no ka mea, ua ʻike mua ka mea kākau o ka ʻatikala iā Rust i kēlā manawa a makemake nui ʻo ia e kākau i kekahi mea i loko o ia mea no ka hana ʻana me ka manawa kūpono e hoʻokomo i loko o ka open-source,
  • no ka mea, ʻaʻole kūpono nā ʻōlelo me GC no mākou ma muli o ke ʻano o ke kaʻa i loaʻa (kokoke i ka manawa maoli) a ʻaʻole ʻae ʻia nā hoʻomaha GC,
  • no ka mea pono ʻoe i ka hana kiʻekiʻe e like me C
  • no ka mea, hāʻawi mai ʻo Rust iā mākou i ka concurrency makaʻu ʻole, a inā mākou i hoʻomaka e kākau iā ia ma C/C ++, ua loaʻa iā mākou i nā mea nāwaliwali hou aʻe, ka nui o ka pale, nā kūlana lāhui a me nā huaʻōlelo weliweli ʻē aʻe ma mua o brubeck.

He paio no hoi ia Rust. ʻAʻohe ʻike o ka hui i ka hana ʻana i nā papahana ma Rust, a i kēia manawa ʻaʻole mākou e hoʻolālā e hoʻohana iā ia i ka papahana nui. No laila, ua hopohopo koʻikoʻi ʻaʻole e holo kekahi mea, akā ua hoʻoholo mākou e lawe i kahi manawa a hoʻāʻo.

Ua hala ka manawa...

ʻO ka hope, ma hope o kekahi mau hoʻāʻo ʻole ʻana, ua mākaukau ka mana hana mua. He aha i hana ai? ʻO kēia ka mea i hana ʻia.

Bioyino - puʻunaue ʻia, hiki ke hoʻonui ʻia ka hōʻuluʻulu ana

Loaʻa i kēlā me kēia node kona mau ana ponoʻī a hōʻiliʻili iā lākou, ʻaʻole ia e hōʻuluʻulu i nā ana no kēlā mau ʻano i koi ʻia kā lākou pūʻulu piha no ka hōʻuluʻulu hope. Hoʻopili ʻia nā nodes i kekahi i kekahi e kekahi ʻano protocol laka i hāʻawi ʻia, e hiki ai iā ʻoe ke koho i waena o lākou i hoʻokahi wale nō (eia mākou i uē ai) i kūpono e hoʻouna i nā metric i ka Mea Nui. Ke hoʻoponopono ʻia nei kēia pilikia e Kanikela, akā, i ka wā e hiki mai ana, hoʻonui ka manaʻo o ka mea kākau i ponoʻī hoʻokō ʻO Raft, kahi o ka mea kūpono loa, ʻoiaʻiʻo, ʻo ia ka node alakaʻi consensus. Ma waho aʻe o ka ʻae ʻana, hoʻouna pinepine ʻia nā nodes (hoʻokahi manawa i kēlā me kēia kekona) i ko lākou mau hoalauna i nā ʻāpana o nā metric pre-aggregated i hiki iā lākou ke hōʻiliʻili i kēlā kekona. ʻIke ʻia e mālama ʻia ka scaling a me ka hoʻomanawanui hewa - paʻa mau kēlā me kēia node i kahi pūʻulu piha o nā metrics, akā ua hoʻouna ʻia nā metric i hoʻohui ʻia, ma o TCP a hoʻopaʻa ʻia i loko o kahi protocol binary, no laila ua hoʻemi nui ʻia nā kumukūʻai hoʻohālikelike i ka UDP. ʻOiai ka nui o nā metric e hiki mai ana, ʻo ka hōʻiliʻili e pono ai ka hoʻomanaʻo liʻiliʻi a me ka liʻiliʻi o ka CPU. No kā mākou mertics hiki ke hoʻopili ʻia, he mau ʻumi megabytes wale nō kēia o ka ʻikepili. Ma ke ʻano he bonus ʻē aʻe, ʻaʻole mākou e loaʻa i nā ʻikepili pono ʻole i kākau hou ʻia ma Graphite, e like me ka hihia me burbeck.

ʻAʻole kaulike nā ʻeke UDP me nā metric ma waena o nā nodes ma nā lako pūnaewele ma o Round Robin maʻalahi. ʻO kaʻoiaʻiʻo, ʻaʻole e hoʻokaʻawale ka ʻenehana pūnaewele i nā ʻike o nā ʻeke a no laila hiki ke huki ʻoi aku ma mua o 4M packets i kēlā me kēia kekona, ʻaʻole e haʻi i nā metric e pili ana i ka ʻike ʻole. Inā mākou e noʻonoʻo ʻaʻole hiki mai nā metric i kēlā me kēia ʻeke, a laila ʻaʻole mākou e ʻike i nā pilikia hana ma kēia wahi. Inā hāʻule kahi kikowaena, ʻike koke ka ʻenehana pūnaewele (i loko o 1-2 kekona) i kēia ʻoiaʻiʻo a wehe i ka server i hāʻule mai ka hoʻololi ʻana. Ma muli o kēia, hiki ke hoʻohuli a hoʻopau ʻia nā node passive (ʻo ia hoʻi, ʻaʻole alakaʻi) me ka ʻike ʻole i ka huki ʻana ma nā pakuhi. ʻO ka hapa nui e nalowale ai mākou he ʻāpana o nā metric i hiki mai i ke kekona hope. ʻO ka nalowale / pani ʻana / hoʻololi koke o kahi alakaʻi e hana mau i kahi anomaly liʻiliʻi (ʻaʻole sync ka manawa 30 kekona), akā inā he kamaʻilio ma waena o nā nodes, hiki ke hōʻemi ʻia kēia mau pilikia, no ka laʻana, ma ka hoʻouna ʻana i nā ʻeke hoʻonohonoho. .

He wahi liʻiliʻi e pili ana i ka hale o loko. ʻO ka noi, ʻoiaʻiʻo, multithreaded, akā ʻokoʻa ka hoʻolālā threading mai ka mea i hoʻohana ʻia ma brubeck. Ua like nā kaula i loko o ka brubeck - aia kēlā me kēia o lākou ke kuleana no ka hōʻiliʻili ʻike a me ka hōʻuluʻulu ʻana. I ka bioyino, ua māhele ʻia nā limahana i ʻelua pūʻulu: nā mea kuleana no ka pūnaewele a me nā mea kuleana no ka hōʻuluʻulu. Hāʻawi kēia māhele iā ʻoe e hoʻokele maʻalahi i ka noi ma muli o ke ʻano o nā metrics: kahi e koi ʻia ai ka hoʻohui ikaika, hiki iā ʻoe ke hoʻohui i nā aggregators, kahi e nui ai nā kaʻa pūnaewele, hiki iā ʻoe ke hoʻohui i ka helu o nā kahe pūnaewele. I kēia manawa, ma kā mākou mau kikowaena hana mākou ma 8 pūnaewele a me 4 aggregation kahe.

ʻO ka ʻāpana helu (ke kuleana no ka hoʻohui ʻana) ʻoluʻolu loa. Hoʻokaʻawale ʻia nā pahu i hoʻopiha ʻia e nā kahe o ka pūnaewele ma waena o ka helu ʻana i nā kahe, kahi i hoʻopaʻa ʻia a hōʻuluʻulu ʻia. Ma ke noi, hāʻawi ʻia nā metric no ka hoʻouna ʻana i nā node ʻē aʻe. ʻO kēia mau mea a pau, me ka hoʻouna ʻana i ka ʻikepili ma waena o nā nodes a me ka hana pū ʻana me Consul, hana ʻia me ka asynchronously, e holo ana ma ka framework tokio.

ʻOi aku ka nui o nā pilikia i ka wā o ka hoʻomohala ʻana ma muli o ka ʻāpana pūnaewele i kuleana no ka loaʻa ʻana o nā metric. ʻO ka pahuhopu nui o ka hoʻokaʻawale ʻana i nā kahe ʻana o ka pūnaewele i loko o nā ʻāpana ʻokoʻa ʻo ia ka makemake e hoʻemi i ka manawa e hoʻolilo ai kahi kahe ole e heluhelu i ka ʻikepili mai ke kumu. Nalo koke nā koho e hoʻohana ana i ka UDP asynchronous a me ka recvmsg maʻamau: ʻo ka mea mua e hoʻopau nui loa i ka CPU hoʻohana-space no ka hana hanana, ʻo ka lua e koi i nā hoʻololi pōʻaiapili. No laila ua hoʻohana ʻia i kēia manawa recvmmsg me nā pale nui (a me nā buffers, nā luna hoʻomalu, he mea ʻole iā ʻoe!). Mālama ʻia ke kākoʻo no ka UDP maʻamau no nā hihia māmā kahi e pono ʻole ai ka recvmmsg. Ma ke ʻano multimessage, hiki ke hoʻokō i ka mea nui: ʻo ka hapa nui o ka manawa, hoʻokaʻawale ke kaula pūnaewele i ka queue OS - heluhelu i ka ʻikepili mai ke kumu a hoʻoili iā ia i ka buffer userspace, hoʻololi wale i kekahi manawa i ka hāʻawi ʻana i ka paʻa piha. nā mea hoʻohui. ʻAʻole e hōʻiliʻili ka pila i loko o ke kumu, ʻaʻole e ulu ka nui o nā ʻeke i hāʻule.

i hoʻopuka

Ma nā hoʻonohonoho paʻamau, ua hoʻonohonoho ʻia ka nui buffer e nui loa. Inā hoʻoholo koke ʻoe e hoʻāʻo iā ʻoe iho i ke kikowaena, hiki iā ʻoe ke hālāwai me ka ʻoiaʻiʻo ma hope o ka hoʻouna ʻana i kahi helu liʻiliʻi o nā metric, ʻaʻole lākou e hōʻea i Graphite, e waiho ana i ka buffer stream stream. No ka hana ʻana me kahi helu liʻiliʻi o nā metric, pono ʻoe e hoʻonohonoho i ka bufsize a me ka nui-nui-nui i nā waiwai liʻiliʻi i ka config.

ʻO ka hope, kekahi mau palapala no ka poʻe aloha papa.

Heluhelu i ka helu o nā metric e hiki mai ana no kēlā me kēia kikowaena: ʻoi aku ma mua o 2 miliona MPS.

Bioyino - puʻunaue ʻia, hiki ke hoʻonui ʻia ka hōʻuluʻulu ana

Hoʻopau i kekahi o nā node a hāʻawi hou i nā metric e komo mai ana.

Bioyino - puʻunaue ʻia, hiki ke hoʻonui ʻia ka hōʻuluʻulu ana

Heluhelu no nā metric puka: hoʻokahi wale nō node e hoʻouna mau - ʻo ka raid boss.

Bioyino - puʻunaue ʻia, hiki ke hoʻonui ʻia ka hōʻuluʻulu ana

Ka helu o ka hana o kēlā me kēia node, e noʻonoʻo ana i nā hewa i nā ʻōnaehana ʻōnaehana like ʻole.

Bioyino - puʻunaue ʻia, hiki ke hoʻonui ʻia ka hōʻuluʻulu ana

ʻO ka kikoʻī o nā metric e hiki mai ana (huna ʻia nā inoa metric).

Bioyino - puʻunaue ʻia, hiki ke hoʻonui ʻia ka hōʻuluʻulu ana

He aha kā mākou e manaʻo nei e hana me kēia aʻe? ʻOiaʻiʻo, e kākau i ke code, damn...! ʻO ka papahana i hoʻolālā mua ʻia e lilo i open-source a e mau nō ia i kona ola ʻana. ʻO kā mākou hoʻolālā koke ka hoʻololi ʻana i kā mākou mana ponoʻī o Raft, ka hoʻololi ʻana i ka protocol peer i kahi ʻoi aku ka portable, e hoʻopuka ana i nā helu kūloko hou, nā ʻano metric hou, nā hoʻoponopono bug a me nā hoʻomaikaʻi ʻē aʻe.

ʻOiaʻiʻo, ʻoluʻolu nā mea a pau e kōkua i ka hoʻomohala ʻana i ka papahana: hana PR, Nā pilikia, inā hiki ke pane mākou, hoʻomaikaʻi, etc.

Me kēlā ʻōlelo ʻana, ʻo ia wale nō e ka poʻe, kūʻai i kā mākou elepani!



Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka