NewSQL = NoSQL+ACID

NewSQL = NoSQL+ACID
A hiki i kēia manawa, mālama ʻo Odnoklassniki ma kahi o 50 TB o ka ʻikepili i hoʻoponopono ʻia i ka manawa maoli ma SQL Server. No ia leo, aneane hiki ʻole ke hāʻawi i ka wikiwiki a me ka hilinaʻi, a hiki i ka ʻike ʻana i ka hiki ʻole o ke kikowaena data me ka hoʻohana ʻana i kahi SQL DBMS. ʻO ka maʻamau, ma ia mau hihia, hoʻohana ʻia kekahi o nā waihona NoSQL, akā ʻaʻole hiki ke hoʻololi ʻia nā mea āpau i NoSQL: koi kekahi mau hui i nā hōʻoia kālepa ACID.

Ua alakaʻi kēia iā mākou i ka hoʻohana ʻana i ka waihona NewSQL, ʻo ia hoʻi, kahi DBMS e hāʻawi ana i ka hoʻomanawanui hewa, scalability a me ka hana ʻana o nā ʻōnaehana NoSQL, akā i ka manawa like ka mālama ʻana i nā hōʻoia ACID i kamaʻāina i nā ʻōnaehana kahiko. He liʻiliʻi nā ʻōnaehana ʻoihana hana o kēia papa hou, no laila ua hoʻokō mākou i kēia ʻōnaehana iā mākou iho a hoʻokomo iā ia i ka hana ʻoihana.

Pehea ka hana a me ka mea i hana - heluhelu ma lalo o ka ʻoki.

I kēia lā, ʻoi aku ka nui o ka lehulehu o Odnoklassniki ma mua o 70 miliona mau malihini kipa. mākou Aia mākou ma ka papa ʻelima ʻoihana pūnaewele nui loa ma ka honua, a ma waena o nā pūnaewele he iwakālua kahi e hoʻohana nui ai nā mea hoʻohana. Mālama ka ʻōnaehana OK i nā ukana kiʻekiʻe loa: ʻoi aku ma mua o hoʻokahi miliona mau noi HTTP/sec ma mua. Aia nā ʻāpana o kahi ʻauwaʻa kikowaena ma mua o 8000 mau ʻāpana i kahi kokoke i kekahi - i loko o ʻehā mau kikowaena data Moscow, kahi e hiki ai i kahi latency pūnaewele ma lalo o 1 ms ma waena o lākou.

Ua hoʻohana mākou iā Cassandra mai 2010, e hoʻomaka ana me ka mana 0.6. I kēia lā, aia kekahi mau kakini hui e hana nei. ʻO nā kaʻina hana puʻupuʻu wikiwiki loa ma mua o 4 miliona mau hana i kēlā me kēia kekona, a ʻo nā hale kūʻai nui loa he 260 TB.

Eia nō naʻe, ʻo kēia nā pūʻulu NoSQL maʻamau i hoʻohana ʻia no ka mālama ʻana nawaliwali i hoohuiia ʻikepili. Ua makemake mākou e hoʻololi i ka waihona mālama koʻikoʻi, Microsoft SQL Server, i hoʻohana ʻia mai ka hoʻokumu ʻana o Odnoklassniki. Aia ka waihona ma mua o 300 SQL Server Standard Edition machines, nona ka 50 TB o ka ʻikepili - nā hui ʻoihana. Hoʻololi ʻia kēia ʻikepili ma ke ʻano he ʻāpana o nā kālepa ACID a koi kūlana kiʻekiʻe.

No ka hāʻawi ʻana i ka ʻikepili ma waena o nā nodes SQL Server, ua hoʻohana mākou i ka vertical a me ke ākea hoʻokaʻawale (sharding). Ma ka mōʻaukala, ua hoʻohana mākou i kahi hoʻolālā ʻikepili maʻalahi: ua pili kēlā me kēia hui me kahi hōʻailona - kahi hana o ka ID entity. Ua kau ʻia nā hui me ka hōʻailona like ma ka server SQL like. Ua hoʻokō ʻia ka pilina master-detail i mea e kūlike mau ai nā hōʻailona o nā moʻolelo nui a me nā keiki a loaʻa ma ka kikowaena hoʻokahi. Ma kahi pūnaewele kaiapili, aneane pau nā moʻolelo i hana ʻia ma ka inoa o ka mea hoʻohana - ʻo ia hoʻi, mālama ʻia nā ʻikepili mea hoʻohana a pau i loko o hoʻokahi subsystem hana ma hoʻokahi kikowaena. ʻO ia hoʻi, kahi pāʻoihana pāʻoihana kokoke i nā papaʻaina mai hoʻokahi kikowaena SQL, i hiki ai ke hōʻoia i ka kūlike o ka ʻikepili me ka hoʻohana ʻana i nā kālepa ACID kūloko, me ka ʻole o ka pono e hoʻohana. lohi a hilinaʻi ʻole kaʻana like ACID.

Mahalo i ka sharding a me ka wikiwiki o SQL:

  • ʻAʻole mākou e hoʻohana i nā kaohi kī ʻē aʻe, ʻoiai ke loaʻa ka sharding i ka ID entity ma kahi kikowaena ʻē aʻe.
  • ʻAʻole mākou e hoʻohana i nā kaʻina hana i mālama ʻia a me nā mea hoʻoiho ma muli o ka ukana hou ma ka DBMS CPU.
  • ʻAʻole mākou hoʻohana i nā JOIN ma muli o nā mea a pau i luna a me ka nui o nā heluhelu maʻamau mai ka disk.
  • Ma waho o kahi kālepa, hoʻohana mākou i ka pae kaʻawale Read Uncommitted e hōʻemi i nā deadlocks.
  • Hana mākou i nā hana pōkole wale nō (ma ka awelika pōkole ma mua o 100 ms).
  • ʻAʻole mākou e hoʻohana i ka multi-row UPDATE a me DELETE ma muli o ka nui o nā deadlocks - hoʻonui mākou i hoʻokahi palapala i ka manawa.
  • Hana mau mākou i nā nīnau ma nā papa kuhikuhi wale nō - ʻo kahi nīnau me kahi hoʻolālā scan papa piha no mākou, ʻo ia hoʻi ka hoʻouka ʻana i ka waihona a hoʻopau ʻia.

Ua ʻae kēia mau ʻanuʻu iā mākou e ʻoki i ka hana ʻoi loa ma waho o nā kikowaena SQL. Eia naʻe, ua nui aʻe nā pilikia. E nānā kākou iā lākou.

Nā pilikia me SQL

  • Ma muli o ko mākou hoʻohana ʻana i ka sharding kākau ponoʻī, ua hana lima ʻia ka hoʻohui ʻana i nā shards hou e nā luna hoʻomalu. I kēia manawa a pau, ʻaʻole lawelawe nā replicas data scalable i nā noi.
  • Ke ulu nei ka helu o nā moʻolelo i ka papaʻaina, e emi ana ka wikiwiki o ka hoʻokomo ʻana a me ka hoʻololi ʻana; i ka hoʻohui ʻana i nā indexes i kahi papa i loaʻa, hāʻule ka wikiwiki ma kahi kumu; hana ʻia a hana hou ʻia nā kuhikuhi me ka downtime.
  • ʻO ka loaʻa ʻana o kahi liʻiliʻi o Windows no SQL Server i ka hana ʻana e paʻakikī i ka hoʻokele waiwai

Akā ʻo ka pilikia nui

hoʻomanawanui hewa

He ʻino ka hoʻomanawanui hewa ʻana o ka server SQL maʻamau. E ʻōlelo kākou he hoʻokahi wale nō kikowaena waihona, a hāʻule i hoʻokahi manawa i kēlā me kēia ʻekolu makahiki. I kēia manawa ua iho ka pūnaewele no 20 mau minuke, ʻae ʻia. Inā loaʻa iā ʻoe nā kikowaena 64, a laila e iho ka pūnaewele i hoʻokahi manawa i kēlā me kēia pule ʻekolu. A inā loaʻa iā ʻoe nā kikowaena 200, a laila ʻaʻole hana ka pūnaewele i kēlā me kēia pule. He pilikia kēia.

He aha ka hana e hoʻomaikaʻi ai i ka hoʻomanawanui hewa o kahi kikowaena SQL? Ua kono mai ʻo Wikipedia iā mākou e kūkulu puʻupuʻu loaʻa loa: ma kahi o ka hemahema o kekahi o na mea e loaa ai ka waihona.

Pono kēia i nā ʻauwaʻa o nā mea waiwai nui: ka nui o nā duplications, optical fiber, kaʻana like ʻana, a me ka hoʻokomo ʻana i kahi waihona ʻaʻole pono e hana pono: ma kahi o 10% o nā hoʻololi e pau me ka hemahema o ka node backup e like me ke kaʻaahi ma hope o ka node nui.

Akā, ʻo ka hemahema nui o ia pūʻulu i loaʻa loa, ʻaʻole loaʻa ka loaʻa inā hāʻule ka kikowaena ʻikepili kahi i loaʻa ai. ʻEhā mau kikowaena ʻikepili ʻo Odnoklassniki, a pono mākou e hōʻoia i ka hana i ka wā o ka pau ʻole o kekahi o lākou.

No kēia hiki iā mākou ke hoʻohana Haku Nui hana hou i kūkulu ʻia i loko o SQL Server. ʻOi aku ka maikaʻi o kēia hoʻonā ma muli o ke kumukūʻai o ka polokalamu a loaʻa i nā pilikia kaulana me ka hoʻopiʻi - hiki ʻole ke hoʻopaneʻe ʻia me ka replication synchronous a me ka hoʻopaneʻe ʻana i ka hoʻopiʻi ʻana (a ma muli o ka hoʻololi ʻana) me ka replication asynchronous. ʻO ka implied hoʻoholo hakakā lima ʻAʻole pili kēia koho iā mākou.

Pono kēia mau pilikia āpau i kahi hoʻonā radical, a hoʻomaka mākou e loiloi iā lākou i nā kikoʻī. Maanei pono mākou e kamaʻāina i ka mea a SQL Server e hana nui ai - nā kālepa.

Kūʻai maʻalahi

E noʻonoʻo kākou i ka hana maʻalahi loa, mai ka manaʻo o kahi polokalamu SQL i noi ʻia: hoʻohui i kahi kiʻi i kahi album. Mālama ʻia nā album a me nā kiʻi i loko o nā papa like ʻole. Loaʻa i ka album kahi helu kiʻi lehulehu. A laila hoʻokaʻawale ʻia kēlā ʻano hana i nā pae aʻe:

  1. Hoʻopaʻa mākou i ka album ma ke kī.
  2. E hana i kahi komo ma ka papa kiʻi.
  3. Inā he kūlana lehulehu ko ke kiʻi, a laila e hoʻohui i kahi helu kiʻi lehulehu i ka album, hoʻohou i ka moʻolelo a hana i ke kālepa.

A i ʻole ma pseudocode:

TX.start("Albums", id);
Album album = albums.lock(id);
Photo photo = photos.create(…);

if (photo.status == PUBLIC ) {
    album.incPublicPhotosCount();
}
album.update();

TX.commit();

ʻIke mākou ʻo ka hiʻohiʻona maʻamau no kahi kālepa ʻoihana ʻo ka heluhelu ʻana i ka ʻikepili mai ka waihona i loko o ka hoʻomanaʻo o ka server noi, hoʻololi i kekahi mea a mālama i nā waiwai hou i ka waihona. ʻO ka maʻamau i loko o ia kālepa mākou e hoʻonui i nā hui, nā papa.

Ke hoʻokō nei i kahi kālepa, hiki ke hoʻololi like i ka ʻikepili like mai kahi ʻōnaehana ʻē aʻe. No ka laʻana, hiki i ka Antispam ke hoʻoholo he kānalua ka mea hoʻohana a no laila ʻaʻole pono e hoʻolaha hou ʻia nā kiʻi a pau o ka mea hoʻohana, pono e hoʻouna ʻia no ka hoʻohaʻahaʻa ʻana, ʻo ia hoʻi ka hoʻololi ʻana i ka photo.status i kekahi waiwai ʻē aʻe a hoʻopau i nā helu helu pili. ʻIke loa, inā hana kēia hana me ka ʻole o ka hōʻoia o ka atomicity o ka noi a me ka hoʻokaʻawale ʻana i nā hoʻololi hoʻokūkū, e like me ʻĀKIKA, a laila, ʻaʻole e like ka hopena i ka mea e pono ai - e hōʻike ana ke kiʻi kiʻi i ka waiwai hewa, a i ʻole e hoʻouna ʻia nā kiʻi āpau no ka hoʻololi ʻana.

ʻO ka nui o nā code like, ka hoʻopunipuni ʻana i nā ʻoihana ʻoihana like ʻole i loko o hoʻokahi kālepa, ua kākau ʻia i ka wā holoʻokoʻa o Odnoklassniki. Ma muli o ka ʻike o ka neʻe ʻana i NoSQL mai ʻO ke kūlike o ka hopena ʻIke mākou ʻo ka luʻu nui loa (a me ka hoʻolilo manawa) mai ka hoʻomohala ʻana i nā code e mālama i ka kūlike o ka ʻikepili. No laila, ua noʻonoʻo mākou i ke koi nui no ka waihona hou e hoʻolako i nā hana ACID maoli no ka loiloi noi.

ʻO nā koi ʻē aʻe, ʻaʻole i emi iki ka mea nui:

  • Inā hāʻule ke kikowaena ʻikepili, pono e loaʻa ka heluhelu a me ke kākau ʻana i ka waihona hou.
  • Ke mālama nei i ka wikiwiki hoʻomohala o kēia manawa. ʻO ia hoʻi, i ka wā e hana ai me kahi waihona hou, pono e like ka nui o ke code; ʻaʻohe pono e hoʻohui i kekahi mea i ka waihona, hoʻomohala i nā algorithms no ka hoʻoponopono ʻana i nā paio, mālama ʻana i nā helu helu lua, etc.
  • Pono e kiʻekiʻe ka wikiwiki o ka waihona hou, i ka heluhelu ʻana i ka ʻikepili a i ka wā e hoʻoili ai i nā kālepa, ʻo ia ka manaʻo o nā haʻina haʻawina paʻakikī, ākea, akā lohi, e like me ka laʻana, ʻaʻole i pili. hana ʻelua-phase.
  • Hoʻonui ʻakomi ma ka lele.
  • Ke hoʻohana nei i nā kikowaena haʻahaʻa maʻamau, me ka ʻole o ke kūʻai ʻana i nā lako exotic.
  • Hiki i ka hoʻomohala mālama ʻana e nā mea hoʻomohala ʻoihana. I nā huaʻōlelo ʻē aʻe, ua hāʻawi ʻia ka mea nui i nā hoʻonā waiwai a wehe paha, ʻoi aku ka maikaʻi ma Java.

Hoʻoholo, hoʻoholo

I ka nānā ʻana i nā hoʻonā hiki, hiki mākou i ʻelua mau koho hoʻolālā:

ʻO ka mea mua, ʻo ia ka lawe ʻana i kekahi kikowaena SQL a hoʻokō i ka hoʻomanawanui hewa i koi ʻia, scaling mechanism, failover cluster, hoʻoholo hakakā a puʻunaue ʻia, hilinaʻi a wikiwiki hoʻi nā kālepa ACID. Ua helu mākou i kēia koho ma ke ʻano he mea liʻiliʻi loa a paʻakikī.

ʻO ka lua o ka koho, ʻo ia ka lawe ʻana i kahi waihona NoSQL i mākaukau me ka scaling i hoʻokō ʻia, kahi hui failover, hoʻonā hakakā, a hoʻokō i nā kālepa a me SQL iā ʻoe iho. I ka nānā mua ʻana, ʻo ka hana o ka hoʻokō ʻana i ka SQL, ʻaʻole i ka haʻi ʻana i nā kālepa ACID, e like me kahi hana e lawe i nā makahiki. Akā, ua ʻike mākou ʻo ka hiʻohiʻona SQL a mākou e hoʻohana ai i ka hoʻomaʻamaʻa ʻana i kahi mamao loa mai ANSI SQL Cassandra CQL mamao loa mai ANSI SQL. Ke nānā pono nei mākou iā CQL, ʻike mākou ua kokoke loa ia i ka mea e pono ai mākou.

ʻO Cassandra a me CQL

No laila, he aha ka mea hoihoi e pili ana iā Cassandra, he aha nā mea hiki iā ia?

ʻO ka mea mua, hiki iā ʻoe ke hana i nā papa e kākoʻo i nā ʻano ʻikepili like ʻole; hiki iā ʻoe ke hana SELECT a i ʻole UPDATE ma ke kī mua.

CREATE TABLE photos (id bigint KEY, owner bigint,…);
SELECT * FROM photos WHERE id=?;
UPDATE photos SET … WHERE id=?;

No ka hoʻopaʻa ʻana i ka ʻikepili kope, hoʻohana ʻo Cassandra hoʻokokoke kōrum. Ma ka hihia maʻalahi, ʻo ia ke ʻano o ka hoʻokomo ʻia ʻana o ʻekolu replicas o ka lālani hoʻokahi ma nā node like ʻole o ka puʻupuʻu, manaʻo ʻia ke kākau ʻana he kūleʻa inā ʻo ka hapa nui o nā nodes (ʻo ia hoʻi, ʻelua o ʻekolu) i hōʻoia i ka holomua o kēia hana kākau. . Manaʻo ʻia ka ʻikepili o ka lālani inā, i ka heluhelu ʻana, koho ʻia ka hapa nui o nā nodes a hoʻopaʻa ʻia. No laila, me ʻekolu replicas, e hōʻoiaʻiʻo ʻia ka paʻa ʻana o ka ʻikepili piha a me ka wikiwiki inā hāʻule kekahi node. Ua ʻae kēia ala iā mākou e hoʻokō i kahi hoʻolālā ʻoi aku ka hilinaʻi: e hoʻouna mau i nā noi i nā replicas ʻekolu, e kali ana i ka pane mai nā mea wikiwiki ʻelua. Hoʻolei ʻia ka pane lohi o ke kolu kope i kēia hihia. He pilikia koʻikoʻi paha kahi node i lohi i ka pane ʻana - nā kīʻaha, ʻohi ʻōpala i ka JVM, hoʻihoʻi hou i ka hoʻomanaʻo i ka kernel Linux, hāʻule ʻole o ka lako, wehe ʻia mai ka pūnaewele. Eia naʻe, ʻaʻole pili kēia i nā hana a ka mea kūʻai aku a i ʻole ka ʻikepili ma kekahi ʻano.

ʻO ke ala e hoʻopili ai mākou i ʻekolu nodes a loaʻa kahi pane mai ʻelua i kapa ʻia manao manao: hoʻouna ʻia kahi noi no nā kope hou aʻe ma mua o ka "hāʻule ʻana".

ʻO kekahi pōmaikaʻi ʻē aʻe o Cassandra ʻo Batchlog, kahi hana e hōʻoiaʻiʻo ai i kahi hui o nā hoʻololi āu e hana ai i hoʻopili piha ʻia a ʻaʻole hoʻohana ʻia. ʻAe kēia iā mākou e hoʻonā A i ka ACID - atomicity ma waho o ka pahu.

ʻO ka mea kokoke loa i nā kālepa ma Cassandra ka mea i kapa ʻia "nā kālepa māmā". Akā ua mamao loa lākou mai nā hana ACID "ʻoiaʻiʻo": ʻoiaʻiʻo, he manawa kūpono kēia e hana ai CAS ma ka ʻikepili mai hoʻokahi moʻolelo wale nō, me ka hoʻohana ʻana i ka ʻaelike me ka hoʻohana ʻana i ka protocol Paxos kaumaha kaumaha. No laila, haʻahaʻa ka wikiwiki o ia mau hana.

ʻO ka mea i nalowale iā mākou ma Cassandra

No laila, pono mākou e hoʻokō i nā kālepa ACID maoli ma Cassandra. Me ka hoʻohana ʻana i hiki iā mākou ke hoʻokō maʻalahi i ʻelua mau hiʻohiʻona kūpono o ka DBMS maʻamau: nā kuhikuhi wikiwiki wikiwiki, e hiki ai iā mākou ke hana i nā koho ʻikepili ʻaʻole wale ma ke kī mua, a me kahi mea hana maʻamau o nā ID hoʻonui auto-monotonic.

C*Okahi

No laila ua hānau ʻia kahi DBMS hou C*Okahi, i loko o ʻekolu ʻano nodes kikowaena:

  • Waihona - (kokoke) nā kikowaena Cassandra maʻamau no ka mālama ʻana i ka ʻikepili ma nā disks kūloko. Ke ulu nei ka ukana a me ka nui o ka ʻikepili, hiki ke hoʻonui ʻia ko lākou nui i nā ʻumi a me nā haneli.
  • Nā mea hoʻoponopono hana - e hōʻoia i ka hoʻokō ʻana i nā hana.
  • ʻO nā mea kūʻai aku nā kikowaena noi e hoʻokō i nā hana ʻoihana a hoʻomaka i nā kālepa. Hiki ke loaʻa nā tausani o ia mau mea kūʻai.

NewSQL = NoSQL+ACID

ʻO nā kikowaena o nā ʻano āpau he ʻāpana o kahi puʻupuʻu maʻamau, e hoʻohana i ka protocol memo Cassandra kūloko e kamaʻilio me kekahi a 'ōleloʻala no ka hoʻololi ʻana i ka ʻike cluster. Me ka Heartbeat, aʻo nā kikowaena e pili ana i ka hāʻule ʻana o kekahi, mālama i kahi schema data hoʻokahi - nā papa, ko lākou ʻano a me ka hana hou ʻana; ka hoʻokaʻawale ʻana, cluster topology, etc.

Ka poʻe lawelawe

NewSQL = NoSQL+ACID

Ma kahi o nā mea hoʻokele maʻamau, hoʻohana ʻia ke ʻano Fat Client. ʻAʻole mālama ia node i ka ʻikepili, akā hiki ke hana ma ke ʻano he coordinator no ka hoʻokō ʻana i ka noi, ʻo ia hoʻi, ʻo ka Client ponoʻī e hana ma ke ʻano he coordinator o kāna mau noi: nīnau ʻo ia i nā replicas mālama a hoʻonā i nā paio. ʻAʻole kēia ʻoi aku ka hilinaʻi a me ka wikiwiki ma mua o ka mea hoʻokele maʻamau, e koi ana i ke kamaʻilio me kahi coordinator mamao, akā hiki iā ʻoe ke hoʻokele i ka hoʻouna ʻana i nā noi. Ma waho o kahi kālepa i wehe ʻia ma ka mea kūʻai aku, hoʻouna ʻia nā noi i nā waihona. Inā ua wehe ka mea kūʻai i kahi kālepa, a laila e hoʻouna ʻia nā noi āpau i loko o ke kālepa i ka mea hoʻoponopono kālepa.
NewSQL = NoSQL+ACID

C*One Transaction Coordinator

ʻO ka coordinator kahi mea a mākou i hoʻokō ai no C*One mai ka wā ʻōmua. ʻO ia ke kuleana no ka mālama ʻana i nā hana, nā laka, a me ke ʻano o ka hoʻohana ʻana i nā hana.

No kēlā me kēia hana i lawelawe ʻia, hoʻopuka ka mea hoʻoponopono i kahi hōʻailona manawa: ʻoi aku ka nui o kēlā me kēia hana ma hope o ka hana mua. No ka mea ua hoʻokumu ʻia ka ʻōnaehana hoʻonā hakakā a Cassandra i nā timestamp (o ʻelua mau moʻolelo kūʻē, ʻo ka mea me ka timestamp hou loa i manaʻo ʻia i kēia manawa), e hoʻoholo mau ʻia ka paio no ka hana ma hope. Pela makou i hooko ai wati Lamport - he ala maʻalahi e hoʻonā i nā paio ma kahi ʻōnaehana puʻunaue.

Laka

No ka hōʻoia ʻana i ka noho kaʻawale, ua hoʻoholo mākou e hoʻohana i ke ala maʻalahi - nā laka pessimistic e pili ana i ke kī mua o ka moʻolelo. I nā huaʻōlelo ʻē aʻe, ma kahi kālepa, pono e laka mua ʻia kahi moʻolelo, a laila heluhelu, hoʻololi, a mālama ʻia. Ma hope wale nō o ka hoʻokō kūleʻa hiki ke wehe ʻia kahi moʻolelo i hiki ai i nā kālepa hoʻokūkū ke hoʻohana iā ia.

He mea maʻalahi ka hoʻokō ʻana i ia laka i loko o kahi kaʻawale ʻole. I loko o kahi ʻōnaehana puʻunaue ʻia, ʻelua mau koho nui: e hoʻokō i ka laka i hāʻawi ʻia ma ka pūʻulu, a i ʻole e puʻunaue i nā kālepa i lawelawe mau ʻia nā hana e pili ana i ka moʻolelo hoʻokahi e ka mea hoʻonohonoho like.

No ka mea, i kā mākou hihia, ua māhele ʻia ka ʻikepili ma waena o nā hui o nā kālepa kūloko ma SQL, ua hoʻoholo ʻia e hāʻawi i nā hui kūʻai kūloko i nā coordinators: hoʻokahi coordinator hana i nā hana āpau me nā hōʻailona mai 0 a 9, ʻo ka lua - me nā hōʻailona mai 10 a 19, a laila. ʻO ka hopena, ua lilo kēlā me kēia o nā mea hoʻonohonoho i haku o ka hui kālepa.

A laila hiki ke hoʻokō ʻia nā laka ma ke ʻano o kahi banal HashMap i ka hoʻomanaʻo o ka coordinator.

Nā hāʻule o ka mea hoʻoponopono

Ma muli o ka lawelawe wale ʻana o kahi mea hoʻoponopono i kahi hui o nā kālepa, he mea nui e hoʻoholo koke i ka ʻoiaʻiʻo o kona hāʻule ʻana i mea e pau ai ka hoʻāʻo ʻelua e hoʻokō i ke kālepa. No ka hana ʻana i kēia wikiwiki a hilinaʻi hoʻi, ua hoʻohana mākou i kahi protocol hoʻolohe pepeiao pili piha:

Hāʻawi kēlā me kēia kikowaena ʻikepili i ʻelua mau node hoʻonohonoho. I kēlā me kēia manawa, hoʻouna kēlā me kēia mea hoʻoponopono i ka memo puʻuwai i nā mea hoʻoponopono ʻē aʻe a hoʻomaopopo iā lākou e pili ana i kāna hana ʻana, a me nā leka o ka puʻuwai i loaʻa mai nā mea hoʻoponopono i ka hui i ka manawa hope loa.

NewSQL = NoSQL+ACID

I ka loaʻa ʻana o ka ʻike like mai nā poʻe ʻē aʻe ma ke ʻano he ʻāpana o kā lākou mau memo puʻuwai, e hoʻoholo kēlā me kēia mea hoʻonohonoho nona iho i nā puʻupuʻu puʻupuʻu e hana nei a ʻaʻole hoʻi, alakaʻi ʻia e ke kumu kumu: inā ua loaʻa i ka node X ka ʻike mai ka hapa nui o nā nodes o ka hui e pili ana i ka maʻamau. ka loaʻa ʻana o nā memo mai ka node Y, a laila, hana Y. A ʻo ka hope, i ka manawa e hōʻike ai ka hapa nui i nā memo i nalowale mai ka node Y, a laila ua hōʻole ʻo Y. He mea kupanaha inā hōʻike ke kōrum i ka node X ʻaʻole ia e loaʻa hou ana nā memo mai ia mea, a laila e noʻonoʻo ʻo node X iā ia iho ua hāʻule.

Hoʻouna ʻia nā memo puʻuwai me ke alapine kiʻekiʻe, ma kahi o 20 mau manawa i kēlā me kēia kekona, me ka manawa o 50 ms. Ma Java, paʻakikī ke hōʻoia i ka pane ʻana o ka noi i loko o 50 ms ma muli o ka lōʻihi o ka hoʻomaha ʻana i hana ʻia e ka ʻohi ʻōpala. Ua hiki iā mākou ke hoʻokō i kēia manawa pane me ka hoʻohana ʻana i ka ʻohi ʻōpala G1, kahi e hiki ai iā mākou ke kuhikuhi i kahi pahuhopu no ka lōʻihi o nā pause GC. Eia nō naʻe, i kekahi manawa, ʻaʻole kakaikahi, hoʻomaha ka mea ʻohi ma mua o 50 ms, hiki ke alakaʻi i ka ʻike hewa hewa. No ka pale ʻana i kēia, ʻaʻole hōʻike ka mea hoʻoponopono i ka hemahema o kahi node mamao i ka wā e nalowale ai ka memo o ka puʻuwai puʻuwai mua mai ia mea, aia wale nō inā ua nalowale kekahi mau mea i ka lālani. ms.

Akā ʻaʻole lawa ka hoʻomaopopo koke i ka node i pau i ka hana. Pono mākou e hana i kekahi mea e pili ana i kēia.

Hoʻopaʻa

ʻO ka papa hana maʻamau e pili ana, i ka wā o ka haku hemahema, e hoʻomaka i kahi koho hou me ka hoʻohana ʻana i kekahi o ʻano hiʻohiʻona ākea algorithms. Eia nō naʻe, ʻo ia mau algorithm he mau pilikia i ʻike ʻia me ka convergence manawa a me ka lōʻihi o ke kaʻina koho ponoʻī. Ua hiki iā mākou ke pale i kēlā mau lohi hou me ka hoʻohana ʻana i kahi hoʻolālā hoʻololi hoʻonohonoho ma kahi pūnaewele pili piha:

NewSQL = NoSQL+ACID

E ʻōlelo mākou makemake mākou e hoʻokō i kahi kālepa ma ka hui 50. E hoʻoholo mua i ka hoʻolālā hoʻololi, ʻo ia hoʻi, nā nodes e hoʻokō i nā hana ma ka hui 50 i ka wā o ka hāʻule ʻole o ka mea hoʻonohonoho nui. ʻO kā mākou pahuhopu, ʻo ia ka mālama ʻana i ka hana ʻōnaehana i ka wā o ka hāʻule ʻole o ke kikowaena data. E hoʻoholo kākou he node ka waihona mua mai kahi kikowaena ʻikepili ʻē aʻe, a ʻo ka waihona ʻelua he node mai ke kolu. Ua koho ʻia kēia ʻano hoʻokahi a ʻaʻole e loli a hiki i ka hoʻololi ʻana o ka topology o ka puʻupuʻu, ʻo ia hoʻi, a hiki i ke komo ʻana o nā nodes hou (kahi kakaʻikahi loa). ʻO ke kaʻina hana no ke koho ʻana i kahi haku hana hou inā hāʻule ka mea kahiko e like nō ia: e lilo ka waihona mua i haku hana, a inā ua pau ka hana ʻana, e lilo ka lua i ka haku hana.

ʻOi aku ka hilinaʻi o kēia kumumanaʻo ma mua o ka algorithm honua, no ka mea e hoʻāla i kahi haku hou ua lawa ia e hoʻoholo ai i ka hemahema o ka mea kahiko.

Akā pehea e hoʻomaopopo ai nā mea kūʻai aku i ka haku e hana nei i kēia manawa? ʻAʻole hiki ke hoʻouna i ka ʻike i nā tausani o nā mea kūʻai aku ma 50 ms. Hiki ke kūlana ke hoʻouna ka mea kūʻai aku i kahi noi e wehe i kahi kālepa, me ka ʻike ʻole ʻaʻole e hana hou ana kēia haku, a e pau ka noi. No ka pale ʻana i kēia, hoʻouna ʻia nā mea kūʻai aku i kahi noi e wehe i kahi kālepa i ka haku hui a me kāna mau mālama ʻelua i ka manawa hoʻokahi, akā ʻo ka mea nāna i hana i kēia manawa e pane i kēia noi. E hana ka mea kūʻai aku i nā kamaʻilio hope a pau i loko o ke kālepa wale nō me ka haku hana.

Ua loaʻa i nā haku waihona nā noi no nā kālepa ʻaʻole na lākou i ka laina o nā hana i hānau ʻole ʻia, kahi i mālama ʻia ai no kekahi manawa. Inā make ka haku hana, noi ka haku hou e wehe i nā kālepa mai kāna pila a pane i ka mea kūʻai. Inā ua wehe mua ka mea kūʻai aku i kahi kālepa me ka haku kahiko, a laila ʻaʻole mālama ʻia ka pane ʻelua (a, ʻoiaʻiʻo, ʻaʻole e pau kēlā ʻano hana a e hana hou ʻia e ka mea kūʻai aku).

Pehea e hana ai ka hana

E ʻōlelo kākou ua hoʻouna ka mea kūʻai aku i kahi noi i ka coordinator e wehe i kahi kālepa no kēlā me kēia hui me kēlā a me kēlā kī nui. Hoʻopaʻa ka mea hoʻoponopono i kēia hui a waiho i loko o ka papa laka i ka hoʻomanaʻo. Inā pono, heluhelu ka mea hoʻoponopono i kēia hui mai ka waiho ʻana a mālama i ka ʻikepili i loaʻa i loko o kahi kūlana kālepa i ka hoʻomanaʻo o ka mea hoʻoponopono.

NewSQL = NoSQL+ACID

Ke makemake ka mea kūʻai e hoʻololi i ka ʻikepili i kahi kālepa, hoʻouna ʻo ia i kahi noi i ka coordinator e hoʻololi i ka hui, a waiho ka coordinator i ka ʻikepili hou i ka papa kūlana kālepa i ka hoʻomanaʻo. Hoʻopau kēia i ka hoʻopaʻa ʻana - ʻaʻole i hoʻopaʻa ʻia i ka waihona.

NewSQL = NoSQL+ACID

Ke noi ka mea kūʻai aku i kāna ʻikepili i hoʻololi ʻia ma ke ʻano he ʻāpana o ka hana hoʻoikaika, hana ka mea hoʻoponopono penei:

  • inā aia ka ID i ke kālepa, a laila lawe ʻia ka ʻikepili mai ka hoʻomanaʻo;
  • inā ʻaʻohe ID ma ka hoʻomanaʻo, a laila heluhelu ʻia ka ʻikepili i nalowale mai nā nodes mālama, hui pū me nā mea i hoʻomanaʻo ʻia, a hāʻawi ʻia ka hopena i ka mea kūʻai aku.

No laila, hiki i ka mea kūʻai ke heluhelu i kāna mau hoʻololi ponoʻī, akā ʻaʻole ʻike nā mea kūʻai aku i kēia mau loli, no ka mea, mālama ʻia lākou i loko o ka hoʻomanaʻo o ka coordinator, ʻaʻole lākou i loko o nā nodes Cassandra.

NewSQL = NoSQL+ACID

Ke hoʻouna aku ka mea kūʻai aku i ka commit, mālama ʻia ka mokuʻāina i loko o ka hoʻomanaʻo o ka lawelawe e ka coordinator i loko o kahi pūʻulu i hoʻopaʻa ʻia, a hoʻouna ʻia ma ke ʻano he pūʻulu i hoʻopaʻa ʻia i ka waihona Cassandra. Hana nā hale kūʻai i nā mea āpau e pono ai e hōʻoia i ka hoʻopili ʻia ʻana o kēia pūʻolo atomically (holo loa), a hoʻihoʻi i kahi pane i ka coordinator, nāna e hoʻokuʻu i nā laka a hōʻoia i ka holomua o ke kālepa i ka mea kūʻai.

NewSQL = NoSQL+ACID

A no ka rollback, pono e hoʻokuʻu wale ka coordinator i ka hoʻomanaʻo i noho ʻia e ka mokuʻāina kālepa.

Ma muli o ka hoʻomaikaʻi ʻana i luna, ua hoʻokō mākou i nā kumu ACID:

  • Atomicity. He hōʻoiaʻiʻo kēia ʻaʻole e hoʻopaʻa hapa ʻia nā hana i loko o ka ʻōnaehana; a i ʻole e hoʻopau ʻia kāna mau hana a pau, a i ʻole e hoʻopau ʻia kekahi. Hoʻopili mākou i kēia loina ma o ka pūʻulu i hoʻopaʻa ʻia ma Cassandra.
  • Kūlike. ʻO kēlā me kēia kālepa kūleʻa, ma ka wehewehe ʻana, hoʻopaʻa i nā hopena kūpono wale nō. Inā, ma hope o ka wehe ʻana i kahi kālepa a hana i kahi ʻāpana o nā hana, ʻike ʻia he hewa ʻole ka hopena, hana ʻia kahi rollback.
  • Kaʻawale. Ke hoʻokō ʻia kahi kālepa, ʻaʻole pono nā hana like ʻole e hoʻopilikia i kona hopena. Hoʻokaʻawale ʻia nā kālepa hoʻokūkū me ka hoʻohana ʻana i nā laka pessimistic ma ka coordinator. No ka heluhelu ʻana ma waho o kahi kālepa, ʻike ʻia ke kumu kaʻawale ma ka pae Read Committed.
  • Laulua. ʻO nā pilikia ma nā pae haʻahaʻa — ʻeleʻele ʻōnaehana, hāʻule ʻole o ka lako — pono e mālama ʻia nā hoʻololi i hana ʻia e kahi kālepa kūleʻa i ka wā e hoʻomaka ai nā hana.

Heluhelu ma na kuhikuhi

E lawe kāua i kahi papaʻaina maʻalahi:

CREATE TABLE photos (
id bigint primary key,
owner bigint,
modified timestamp,
…)

Loaʻa iā ia kahi ID (ki nui), ka mea nona a me ka lā hoʻololi. Pono ʻoe e hana i kahi noi maʻalahi - koho i ka ʻikepili i ka mea nona ka lā hoʻololi "no ka lā hope".

SELECT *
WHERE owner=?
AND modified>?

I mea e hoʻokō koke ʻia ai kēlā nīnau, ma kahi SQL DBMS maʻamau pono ʻoe e kūkulu i kahi kuhikuhi ma nā kolamu (mea nona, hoʻololi ʻia). Hiki iā mākou ke hana i kēia me ka maʻalahi, ʻoiai ua loaʻa iā mākou nā hōʻoia ACID!

Nā papa kuhikuhi ma C*One

Aia kahi papa kumu me nā kiʻi kahi o ka moʻolelo ID ke kī mua.

NewSQL = NoSQL+ACID

No ka papa kuhikuhi, hana ʻo C*One i kahi papaʻaina hou he kope o ka mea kumu. Ua like ke kī me ka ʻōlelo kuhikuhi, a aia pū me ke kī nui o ka moʻolelo mai ka papa kumu:

NewSQL = NoSQL+ACID

I kēia manawa hiki ke kākau hou ʻia ka nīnau no ka "mea nona ka lā hope" ma ke ʻano he koho mai kahi papa ʻē aʻe:

SELECT * FROM i1_test
WHERE owner=?
AND modified>?

Mālama ʻia ke kūlike o ka ʻikepili i nā kiʻi papa kumu a me ka papa kuhikuhi i1 e ka mea hoʻonohonoho. Ma muli o ka schema data wale nō, i ka wā i loaʻa ai kahi hoʻololi, hana ka mea hoʻonohonoho a mālama i kahi hoʻololi ʻaʻole wale ma ka papa nui, akā ma nā kope pū kekahi. ʻAʻohe hana hou i hana ʻia ma ka papa kuhikuhi, ʻaʻole i heluhelu ʻia nā lāʻau, a ʻaʻole hoʻohana ʻia nā laka. ʻO ia hoʻi, ʻo ka hoʻohui ʻana i nā indexes ʻaneʻane ʻaʻohe kumu waiwai a ʻaʻohe hopena i ka wikiwiki o ka noi ʻana i nā hoʻololi.

Ke hoʻohana nei i ka ACID, ua hiki iā mākou ke hoʻokō i nā kikoʻī like SQL. Kūlike lākou, hiki ke hoʻonui ʻia, wikiwiki, haku mele, a kūkulu ʻia i loko o ka ʻōlelo hulina CQL. ʻAʻole koi ʻia nā hoʻololi i ke code no ke kākoʻo ʻana i nā kuhikuhi. He maʻalahi nā mea a pau e like me SQL. A ʻo ka mea nui loa, ʻaʻole pili nā kuhikuhi i ka wikiwiki o ka hoʻololi ʻana i ka papa kuhikuhi mua.

He aha lā

Ua kūkulu mākou i ka C*One i ʻekolu makahiki i hala aku nei a ua hoʻomaka mākou i ka hana ʻoihana.

He aha ka mea i loaʻa iā mākou i ka hopena? E noʻonoʻo kākou i kēia me ka hoʻohana ʻana i ka laʻana o ka hoʻoiho kiʻi a me ka subsystem mālama, kekahi o nā ʻano ʻikepili koʻikoʻi i loko o kahi ʻoihana pūnaewele. ʻAʻole mākou e kamaʻilio e pili ana i nā kino o nā kiʻi iā lākou iho, akā e pili ana i nā ʻano meta-information. I kēia manawa aia ʻo Odnoklassniki ma kahi o 20 biliona mau moʻolelo, ʻo ka ʻōnaehana kaʻina hana 80 tausani heluhelu noi i kēlā me kēia kekona, a hiki i ka 8 tausani ACID kālepa i kēlā me kēia kekona e pili ana me ka hoʻololi ʻana i ka ʻikepili.

I ka wā i hoʻohana ai mākou i ka SQL me ka replication factor = 1 (akā ma RAID 10), ua mālama ʻia ke kiʻi metainformation ma kahi pūʻulu nui loa o 32 mau mīkini e holo ana i ka Microsoft SQL Server (me 11 backups). Ua hoʻokaʻawale ʻia nā kikowaena 10 no ka mālama ʻana i nā backup. He 50 mau kaa makamae. I ka manawa like, ua hoʻohana ʻia ka ʻōnaehana i ka ukana helu, me ka ʻole o ka mālama ʻana.

Ma hope o ka neʻe ʻana i ka ʻōnaehana hou, ua loaʻa iā mākou ka helu replication = 3 - he kope i kēlā me kēia kikowaena data. Aia ka ʻōnaehana he 63 Cassandra storage nodes a me 6 coordinator machines, no ka huina o 69 mau kikowaena. Akā ʻoi aku ka liʻiliʻi o kēia mau mīkini, ʻo kā lākou kumukūʻai ma kahi o 30% o ke kumukūʻai o kahi ʻōnaehana SQL. I ka manawa like, mālama ʻia ka ukana ma 30%.

Me ka hoʻokomo ʻia ʻana o C*One, ua emi pū ka latency: ma SQL, lawe ʻia kahi hana kākau ma kahi o 4,5 ms. Ma C*One - ma kahi o 1,6 ms. ʻO ka lōʻihi o ke kālepa ma ka awelika ma lalo o 40 ms, ua hoʻopau ʻia ka hana i 2 ms, ʻo ka lōʻihi heluhelu a kākau ʻana ma ka awelika 2 ms. 99th percentile - 3-3,1 ms wale nō, ua emi ka helu o ka manawa i 100 mau manawa - ma muli o ka hoʻohana nui ʻana o ka manaʻo.

I kēia manawa, ua hoʻopau ʻia ka hapa nui o nā node SQL Server; ke kūkulu ʻia nei nā huahana hou me ka hoʻohana ʻana iā C*One. Ua hoʻololi mākou iā C*One e hana i kā mākou ao hoʻokahi ao, ka mea i hiki ai ke hoʻolōʻihi i ka hoʻolaha ʻana o nā pūʻulu hou, hoʻomaʻamaʻa i ka hoʻonohonoho ʻana a me ka hana automate. Me ka ʻole o ke code kumu, ʻoi aku ka paʻakikī a me ka paʻakikī o ka hana ʻana i kēia.

I kēia manawa ke hana nei mākou i ka hoʻoili ʻana i kā mākou mau hale mālama ʻē aʻe i ke ao - akā he moʻolelo ʻokoʻa loa kēlā.

Source: www.habr.com

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