E hoʻouka i ka loiloi ma kahi papahana Highload me ElasticSearch

E Habr! ʻO Maxim Vasiliev koʻu inoa, hana wau ma ke ʻano he loiloi a me ka luna papahana ma FINCH. I kēia lā makemake wau e haʻi iā ʻoe pehea, me ka hoʻohana ʻana iā ElasticSearch, hiki iā mākou ke hana i nā noi 15 miliona i loko o 6 mau minuke a hoʻopaʻa i nā ukana i kēlā me kēia lā ma ka pūnaewele o kekahi o kā mākou mea kūʻai. ʻO ka mea pōʻino, pono mākou e hana me ka ʻole o nā inoa, no ka mea he NDA kā mākou, ke manaʻolana nei mākou ʻaʻole e pilikia ka ʻike o kēia ʻatikala. E hele kāua.

Pehea ka hana o ka papahana

Ma kā mākou hope, hana mākou i nā lawelawe e hōʻoia i ka hana o nā pūnaewele o kā mākou mea kūʻai aku a me ka noi kelepona. Hiki ke ʻike ʻia ke ʻano nui ma ke kiʻikuhi:

E hoʻouka i ka loiloi ma kahi papahana Highload me ElasticSearch

Ma ke kaʻina hana, hana mākou i ka nui o nā kālepa: kūʻai, uku, hana me nā koena mea hoʻohana, kahi e mālama ai mākou i ka nui o nā lāʻau, a me ka lawe ʻana a me ka lawe ʻana i kēia ʻikepili i nā ʻōnaehana waho.

Aia kekahi mau kaʻina hana hoʻohuli ke loaʻa iā mākou ka ʻikepili mai ka mea kūʻai aku a hoʻoili iā ia i ka mea hoʻohana. Eia kekahi, aia nā kaʻina hana no ka hana ʻana me nā uku a me nā polokalamu bonus.

Pōkole hope

I ka wā mua, ua hoʻohana mākou iā PostgreSQL ma ke ʻano he hale kūʻai ʻikepili wale nō. ʻO kāna mau pono maʻamau no kahi DBMS: ke kū ʻana o nā kālepa, kahi ʻōlelo hoʻohālike i hoʻomohala ʻia, kahi ākea o nā mea hana no ka hoʻohui ʻana; hui pū me ka hana maikaʻi e hoʻokō i kā mākou pono no ka manawa lōʻihi.

Ua mālama mākou i nā ʻikepili āpau ma Postgres: mai nā kālepa a i ka nūhou. Akā ua ulu ka helu o nā mea hoʻohana, a me ia ka nui o nā noi.

No ka hoʻomaopopoʻana,ʻo ka helu makahiki o nā kau ma 2017 wale nō ma ka papapihi pūnaewele he 131 miliona. Ma 2018 - 125 miliona. 2019 hou 130 miliona. E hoʻohui i kahi 100-200 miliona mai ka polokalamu kelepona o ka pūnaewele a me ka polokalamu kelepona, aʻoʻoe e loaʻa i kahi helu nui o nā noi.

Me ka ulu ʻana o ka papahana, ua hoʻōki ʻo Postgres i ka hoʻopaʻa ʻana i ka ukana, ʻaʻohe o mākou manawa - ua ʻike ʻia kahi helu nui o nā nīnau like ʻole, no laila ʻaʻole hiki iā mākou ke hana i kahi helu helu helu.

Ua hoʻomaopopo mākou he pono no nā hale kūʻai ʻikepili ʻē aʻe e hāʻawi i kā mākou pono a lawe i ka ukana ma waho o PostgreSQL. Ua manaʻo ʻia ʻo Elasticsearch a me MongoDB he mau koho hiki. Ua nalowale ka hope ma nā helu penei:

  1. Hoʻolohi ka wikiwiki helu helu ʻana i ka ulu ʻana o ka nui o nā ʻikepili i nā kuhikuhi. Me Elastic, ʻaʻole pili ka wikiwiki i ka nui o ka ʻikepili.
  2. ʻAʻohe ʻimi kikokikona piha

No laila ua koho mākou iā Elastic no mākou iho a mākaukau no ka hoʻololi.

Hoʻololi i ka Elastic

1. Ua hoʻomaka mākou i ka hoʻololi ʻana mai kahi lawelawe ʻimi kūʻai. Loaʻa i kā mākou mea kūʻai aku ma kahi o 70 mau wahi kūʻai, a pono kēia i nā ʻano hulina he nui ma ka pūnaewele a me ka noi:

  • Huli kikokiko ma ka inoa kūlanakauhale
  • Geosearch i loko o kahi radius i hāʻawi ʻia mai kekahi wahi. No ka laʻana, inā makemake ka mea hoʻohana e ʻike i nā wahi kūʻai kokoke loa i kona home.
  • Huli ma kahi huinaha i hāʻawi ʻia - kahakiʻi ka mea hoʻohana i kahi huinahā ma ka palapala ʻāina, a hōʻike ʻia iā ia nā kiko āpau o kēia radius.
  • Huli ma nā kānana hou. He ʻokoʻa nā wahi kūʻai mai kekahi i kekahi ma ka ʻokoʻa

Inā mākou e kamaʻilio e pili ana i ka hui, a laila ma Postgres kahi kumu ʻikepili no ka palapala ʻāina a me ka nūhou, a ma Elastic Snapshots i lawe ʻia mai ka ʻikepili kumu. ʻO ka ʻoiaʻiʻo, ʻaʻole hiki i Postgres ke hoʻokō i ka ʻimi e nā pae āpau. ʻAʻole wale ka nui o nā indexes, hiki nō iā lākou ke uhi, no laila ua nalowale ka mea hoʻonohonoho Postgres a ʻaʻole maopopo i ka index e hoʻohana ai.

2. ʻO ka ʻaoʻao o ka lālani ka ʻaoʻao nūhou. Hōʻike ʻia nā hoʻolaha ma ka pūnaewele i kēlā me kēia lā i ʻole e nalowale ka mea hoʻohana i ke kahe o ka ʻike, pono e hoʻokaʻawale ʻia ka ʻikepili ma mua o ka hoʻopuka ʻana. ʻO kēia ka mea e ʻimi ai: hiki iā ʻoe ke ʻimi i ka pūnaewele ma ka hoʻokūkū kikokikona, a ma ka manawa like e hoʻohui i nā kānana hou, ʻoiai ua hana ʻia lākou ma o Elastic.

3. A laila ua hoʻoneʻe mākou i ka hana hoʻoili. Hiki i nā mea hoʻohana ke kūʻai i kekahi huahana ma ka pūnaewele a komo i kahi huki makana. Ma hope o ia mau kūʻai ʻana, hana mākou i ka nui o ka ʻikepili, ʻoi aku hoʻi i nā hopena pule a me nā lā hoʻomaha. No ka hoʻohālikelike, inā ma nā lā maʻamau ka helu o nā kūʻai ma waena o 1,5-2 miliona, a laila ma nā lā hoʻomaha hiki ke piʻi i ka 53 miliona.

I ka manawa like, pono e hana ʻia ka ʻikepili i ka manawa pōkole loa - ʻaʻole makemake nā mea hoʻohana e kali i ka hopena no kekahi mau lā. ʻAʻohe ala e hiki ai ke hoʻokō i kēlā mau manawa ma o Postgres - loaʻa pinepine mākou i nā laka, a ʻoiai mākou e hoʻoponopono nei i nā noi āpau, ʻaʻole hiki i nā mea hoʻohana ke nānā inā loaʻa iā lākou nā makana a ʻaʻole paha. ʻAʻole ʻoluʻolu loa kēia no ka ʻoihana, no laila ua neʻe mākou i ka hana ʻana iā Elasticsearch.

Ke olakino

I kēia manawa ua hoʻonohonoho ʻia nā mea hou e pili ana i ka hanana, e like me kēia mau kūlana:

  1. Nā wahi kūʻai. Ke loaʻa koke iā mākou ka ʻikepili mai kahi kumu waho, hoʻomaka koke mākou i ka hōʻano hou.
  2. Nūhou. Ke hoʻoponopono ʻia kekahi nūhou ma ka pūnaewele, hoʻouna ʻia ia iā Elastic.

Eia hou, pono e haʻi i nā pono o Elastic. Ma Postgres, i ka hoʻouna ʻana i kahi noi, pono ʻoe e kali a hiki i ka hoʻokō pono ʻana i nā moʻolelo āpau. Hiki iā ʻoe ke hoʻouna i nā moʻolelo 10 iā Elastic a hoʻomaka i ka hana koke, me ke kali ʻole i ka māhele ʻana o nā moʻolelo ma nā Shards āpau. ʻOiaʻiʻo, ʻaʻole ʻike koke kekahi Shard a i ʻole Replica i ka ʻikepili, akā e loaʻa koke nā mea āpau.

Nā ʻano hoʻohui

Aia 2 mau ala e hoʻohui me Elastic:

  1. Ma o kekahi mea kūʻai maoli ma luna o TCP. Ke make mālie nei ka mea hoʻokele maoli: ʻaʻole i kākoʻo hou ʻia, loaʻa iā ia kahi syntax kūpono ʻole. No laila, ʻaʻole mākou e hoʻohana a hoʻāʻo e haʻalele loa.
  2. Ma o kahi kikowaena HTTP hiki ke hoʻohana i nā noi JSON a me ka syntax Lucene. ʻO ka mea hope he mīkini kikokikona e hoʻohana ana i ka Elastic. Ma kēia mana, loaʻa iā mākou ka hiki ke Batch ma o nā noi JSON ma HTTP. ʻO kēia ke koho a mākou e ho'āʻo nei e hoʻohana.

Mahalo i ke kikowaena HTTP, hiki iā mākou ke hoʻohana i nā hale waihona puke e hāʻawi i kahi hoʻokō asynchronous o ka mea kūʻai aku HTTP. Hiki iā mākou ke hoʻohana i ka Batch a me ka asynchronous API, ka hopena i ka hana kiʻekiʻe, i kōkua nui i nā lā o ka hoʻolaha nui (ʻoi aku ma lalo)

ʻO kekahi mau helu no ka hoʻohālikelike:

  • Mālama i nā mea hoʻohana makana Postgres ma 20 mau kaula me ka hui ʻole: 460713 mau moʻolelo i 42 kekona
  • Elastic + reactive client no 10 threads + batch no 1000 elements: 596749 records in 11 seconds
  • Elastic + reactive mea kūʻai aku no 10 mau kaula + pūʻulu no 1000 mau mea: 23801684 komo i loko o 4 minuke

I kēia manawa ua kākau mākou i kahi mana noi HTTP e kūkulu iā JSON ma ke ʻano he Batch / ʻaʻole ʻo Batch a hoʻouna ʻia ma o kekahi mea kūʻai aku HTTP, me ka ʻole o ka waihona. Hiki iā ʻoe ke koho e hoʻouna i nā noi me ka synchronously a i ʻole asynchronously.

I kekahi mau hoʻohui, hoʻohana mau mākou i ka mea kūʻai aku kaʻa kaʻa, akā he mea wale nō kēia o ka refactoring e hiki mai ana. I kēia hihia, hoʻohana ʻia kahi mea kūʻai maʻamau i kūkulu ʻia ma ke kumu o Spring WebClient no ka hana ʻana.

E hoʻouka i ka loiloi ma kahi papahana Highload me ElasticSearch

hoʻolaha nui

Hoʻokahi manawa i ka makahiki, hoʻolaha ka papahana i kahi hoʻolaha nui no nā mea hoʻohana - ʻo ia ka Highload like, no ka mea i kēia manawa hana mākou me nā ʻumi miliona o nā mea hoʻohana i ka manawa like.

ʻO ka maʻamau ka piʻi ʻana o nā ukana i ka wā hoʻomaha, akā aia kēia hoʻolaha ma kahi pae ʻokoʻa loa. I ka makahiki ma mua, i ka lā hoʻolaha, kūʻai aku mākou i 27 mau ʻāpana waiwai. Ua hana ʻia ka ʻikepili no ka hapalua hola, kahi i pilikia ai nā mea hoʻohana. Ua loaʻa i nā mea hoʻohana nā makana no ke komo ʻana, akā ua maopopo ka pono e hoʻokō ʻia ke kaʻina hana.

I ka hoʻomaka ʻana o 2019, ua hoʻoholo mākou e pono iā ElasticSearch. No ka makahiki holoʻokoʻa, ua hoʻonohonoho mākou i ka hana ʻana o ka ʻikepili i loaʻa ma Elastic a me kā lākou hoʻopuka ʻana ma ka api o ka noi kelepona a me ka pūnaewele. ʻO ka hopena, i ka makahiki aʻe i ka wā o ka hoʻolaha, ua hana mākou 15 komo i loko o 131 minuke.

No ka mea he nui kā mākou poʻe makemake e kūʻai i nā waiwai a komo i ke kiʻi ʻana i nā makana i nā hoʻolaha, ʻo ia ke ana manawa. I kēia manawa ke hoʻouna aku nei mākou i ka ʻike hou iā Elastic, akā i ka wā e hiki mai ana mākou e hoʻolālā e hoʻoili i ka ʻike waihona no nā mahina i hala aku nei i Postgres ma ke ʻano he mālama mau. I mea e hoʻopaʻa ʻole ai i ka Elastic index, nona nā palena.

Hoʻoholo / Hoʻoholo

I kēia manawa, ua hoʻololi mākou i nā lawelawe āpau a mākou i makemake ai iā Elastic a ua hoʻomaha i kēia no kēia manawa. I kēia manawa ke kūkulu nei mākou i kahi index ma Elastic ma luna o ka waihona hoʻomau nui ma Postgres, e lawe ana i ka ukana mea hoʻohana.

I ka wā e hiki mai ana, hoʻolālā mākou e hoʻololi i nā lawelawe inā maopopo mākou ua ʻano like ʻole ka noi ʻikepili a ʻimi ʻia no ka helu palena ʻole o nā kolamu. ʻAʻole kēia he hana no nā Postgres.

Inā makemake mākou i ka ʻimi kikokikona piha i ka hana a i ʻole he nui nā ʻano hulina ʻokoʻa, a laila ua ʻike mua mākou e pono e unuhi ʻia kēia i loko o ka Elastic.

⌘⌘⌘

Mahalo no ka heluhelu ʻana. Inā hoʻohana kāu hui iā ElasticSearch a loaʻa iā ia nā hihia hoʻokō ponoʻī, a laila e haʻi mai iā mākou. He mea hoihoi ia ke ʻike i ke ʻano o nā poʻe ʻē aʻe 🙂

Source: www.habr.com

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