Ntau tus tsim tawm yuav tsum paub qhov no txog databases

Nco tseg. txhais.: Jaana Dogan yog ib tus kws tshaj lij ntawm Google uas tam sim no ua haujlwm ntawm kev soj ntsuam ntawm lub tuam txhab cov kev pabcuam tsim khoom sau hauv Go. Hauv tsab xov xwm no, uas tau txais txiaj ntsig zoo ntawm cov neeg hais lus Askiv, nws tau sau hauv 17 cov ntsiab lus tseem ceeb ntawm cov ntsiab lus hais txog DBMSs (thiab qee zaum faib tshuab feem ntau) uas muaj txiaj ntsig zoo rau cov neeg tsim khoom loj / thov kev thov.

Ntau tus tsim tawm yuav tsum paub qhov no txog databases

Feem ntau ntawm cov tshuab computer khaws cia lawv lub xeev thiab, raws li, xav tau qee yam ntawm cov ntaub ntawv khaws cia. Kuv tau sau cov kev paub txog cov ntaub ntawv nyob rau lub sijhawm ntev, raws li kev tsim qauv yuam kev uas ua rau cov ntaub ntawv poob thiab kev puas tsuaj. Hauv cov txheej txheem uas ua cov ntaub ntawv loj, cov ntaub ntawv nyob hauv plawv ntawm lub system architecture thiab ua raws li lub hauv paus tseem ceeb hauv kev xaiv qhov kev daws teeb meem zoo. Txawm hais tias muaj tseeb tias kev saib xyuas zoo yog them rau kev ua haujlwm ntawm cov ntaub ntawv, cov teeb meem uas cov neeg tsim khoom sim xav txog yog feem ntau tsuas yog qhov ntxeev ntawm cov dej khov. Hauv cov kab lus no, kuv qhia qee cov tswv yim uas yuav pab tau rau cov neeg tsim khoom uas tsis yog tshwj xeeb hauv daim teb no.

  1. Koj muaj hmoo yog tias 99,999% ntawm lub sijhawm lub network tsis ua teeb meem.
  2. ACID txhais tau tias muaj ntau yam sib txawv.
  3. Txhua lub database muaj nws tus kheej cov txheej txheem los xyuas kom meej qhov sib xws thiab kev sib cais.
  4. Optimistic thaiv los ntawm kev cawm thaum nws yog ib qho nyuaj los tswj qhov ib txwm muaj.
  5. Muaj lwm yam kev tsis txaus ntseeg ntxiv rau kev nyeem ntawv qias neeg thiab cov ntaub ntawv poob.
  6. Cov ntaub ntawv thiab cov neeg siv tsis tas yuav pom zoo rau qhov kev txiav txim.
  7. Daim ntawv thov-qib sharding tuaj yeem txav mus sab nraum daim ntawv thov.
  8. Autoincrementing tuaj yeem ua rau muaj kev phom sij.
  9. Stale cov ntaub ntawv tuaj yeem pab tau thiab tsis tas yuav raug kaw.
  10. Distortions yog ib yam rau txhua lub sij hawm qhov chaw.
  11. Kev ncua muaj ntau lub ntsiab lus.
  12. Cov kev xav tau ntawm kev ua tau zoo yuav tsum raug ntsuas rau ib qho kev lag luam tshwj xeeb.
  13. Nested muas yuav txaus ntshai.
  14. Kev ua lag luam yuav tsum tsis txhob muab khi rau lub xeev daim ntawv thov.
  15. Query planners tuaj yeem qhia koj ntau yam txog databases.
  16. Kev tsiv teb tsaws chaw online yog qhov nyuaj, tab sis ua tau.
  17. Ib qho kev nce ntxiv hauv cov ntaub ntawv suav nrog kev nce ntxiv hauv qhov tsis muaj kev cia siab.

Kuv xav ua tsaug rau Emmanuel Odeke, Rein Henrichs thiab lwm tus rau lawv cov lus tawm tswv yim ntawm tsab xov xwm dhau los no.

Koj muaj hmoo yog tias 99,999% ntawm lub sijhawm lub network tsis ua teeb meem.

Cov lus nug tseem tshuav txog yuav ua li cas txhim khu kev qha niaj hnub network thev naus laus zis thiab ntau npaum li cas cov tshuab poob qis vim qhov tsis ua haujlwm network. Cov ntaub ntawv ntawm qhov teeb meem no tsis tshua muaj thiab kev tshawb fawb feem ntau yog cov koom haum loj nrog cov koom tes tshwj xeeb, khoom siv thiab cov neeg ua haujlwm.

Nrog rau qhov muaj tus nqi ntawm 99,999% rau Spanner (Google cov ntaub ntawv xa tawm thoob ntiaj teb), Google thov tias tsuas yog 7,6% teeb meem muaj feem xyuam nrog lub network. Nyob rau tib lub sijhawm, lub tuam txhab hu nws lub network tshwj xeeb "tus ncej tseem ceeb" ntawm qhov muaj ntau. Kawm Bailis thiab Kingsbury, ua nyob rau hauv 2014, sib tw ib qho ntawm "misconceptions txog kev faib xam", uas Peter Deutsch tsim nyob rau hauv 1994. Lub network puas ntseeg tau tiag tiag?

Kev tshawb fawb dav dav sab nraum cov tuam txhab loj, ua rau dav Internet, tsuas yog tsis muaj nyob. Kuj tseem tsis muaj cov ntaub ntawv txaus los ntawm cov players loj txog qhov feem pua ​​​​ntawm lawv cov neeg siv khoom cov teeb meem cuam tshuam txog kev sib txuas. Peb paub zoo txog kev sib tsoo hauv lub network pawg ntawm cov chaw muab kev pabcuam huab loj uas tuaj yeem tshem tawm tag nrho cov ntu hauv Is Taws Nem rau ob peb teev tsuas yog vim tias lawv yog cov xwm txheej siab uas cuam tshuam rau coob tus neeg thiab tuam txhab. Kev sib txuas hauv network tuaj yeem ua rau muaj teeb meem ntau ntxiv, txawm tias tsis yog tag nrho cov xwm txheej no tau pom. Cov neeg siv kev pabcuam huab kuj tsis paub dab tsi txog qhov ua rau muaj teeb meem. Yog tias muaj qhov ua tsis tiav, nws yuav luag tsis tuaj yeem ua rau nws ua yuam kev hauv lub network ntawm tus muab kev pabcuam sab. Rau lawv, cov kev pabcuam thib peb yog lub thawv dub. Nws yog tsis yooj yim sua kom ntsuas qhov cuam tshuam yam tsis tau ua tus muab kev pabcuam loj.

Muab qhov uas cov neeg ua si loj tshaj qhia txog lawv lub tshuab, nws muaj kev nyab xeeb los hais tias koj muaj hmoo yog tias muaj teeb meem hauv network tsuas yog ib feem me me ntawm cov teeb meem poob qis. Kev sib txuas lus hauv network tseem raug kev txom nyem los ntawm tej yam zoo li no xws li kho vajtse tsis ua haujlwm, kev hloov pauv ntawm topology, kev tswj hwm kev teeb tsa, thiab hluav taws xob tawm. Tsis ntev los no, kuv xav tsis thoob thaum kawm tias cov npe ntawm cov teeb meem tshwm sim tau raug ntxiv shark tom (yog, koj hnov ​​lawm).

ACID txhais tau tias muaj ntau yam sib txawv

Lub ntsiab lus ACID sawv cev rau Atomicity, Consistency, Isolation, Reliability. Cov cuab yeej ntawm kev lag luam no yog tsim los xyuas kom meej tias lawv siv tau thaum muaj kev ua tsis tiav, yuam kev, kho vajtse tsis ua haujlwm, thiab lwm yam. Yog tias tsis muaj ACID lossis cov phiaj xwm zoo sib xws, nws yuav nyuaj rau cov neeg tsim daim ntawv thov kom sib txawv ntawm lawv lub luag haujlwm thiab dab tsi cov ntaub ntawv muaj lub luag haujlwm. Feem ntau cov kev sib raug zoo sib pauv databases sim ua raws li ACID, tab sis txoj hauv kev tshiab xws li NoSQL tau ua rau ntau lub databases tsis muaj ACID kev lag luam vim tias lawv kim heev los siv.

Thaum kuv xub nkag mus rau hauv kev lag luam, peb cov thawj coj tau tham txog qhov cuam tshuam ntawm ACID lub tswv yim. Yuav kom ncaj ncees, ACID yog suav tias yog ib qho lus piav qhia tsis yog tus qauv siv nruj. Niaj hnub no kuv pom tias nws muaj txiaj ntsig zoo tshaj plaws vim nws tsa ib pawg ntawm cov teeb meem (thiab qhia txog ntau yam kev daws teeb meem).

Tsis yog txhua DBMS yog ACID raws; Nyob rau tib lub sijhawm, kev siv cov ntaub ntawv uas txhawb ACID nkag siab txog cov kev xav tau sib txawv. Ib qho ntawm cov laj thawj vim li cas kev siv ACID yog patchy yog vim muaj ntau qhov kev lag luam tawm uas yuav tsum tau ua los siv ACID cov cai. Cov neeg tsim khoom tuaj yeem nthuav tawm lawv cov ntaub ntawv raws li ACID-raws li, tab sis kev txhais ntawm cov xwm txheej ntawm ntug yuav txawv heev, raws li cov txheej txheem rau kev tuav cov xwm txheej "tsis zoo". Qhov tsawg kawg nkaus, cov neeg tsim khoom tuaj yeem nkag siab txog qib siab ntawm kev tsis sib haum xeeb ntawm kev siv hauv paus kom tau txais kev nkag siab zoo ntawm lawv tus cwj pwm tshwj xeeb thiab tsim kev lag luam tawm.

Kev sib cav txog seb MongoDB puas ua raws li cov cai ACID txuas ntxiv txawm tias tom qab tso tawm version 4. MongoDB tsis tau txais kev txhawb nqa ntev kaw lus, txawm hais tias los ntawm lub neej ntawd cov ntaub ntawv tau cog lus rau disk tsis pub ntau tshaj ib zaug txhua 60 vib nas this. Xav txog qhov xwm txheej hauv qab no: ib daim ntawv thov sau ob daim ntawv (w1 thiab w2). MongoDB ntse khw muag khoom w1, tab sis w2 ploj vim qhov kho vajtse tsis ua haujlwm.

Ntau tus tsim tawm yuav tsum paub qhov no txog databases
Daim duab qhia qhov scenario. MongoDB tsoo ua ntej nws tuaj yeem sau cov ntaub ntawv rau disk

Kev cog lus rau disk yog txheej txheem kim. Los ntawm kev zam kom tsis tu ncua, cov neeg tsim khoom txhim kho cov ntaub ntawv kev ua tau zoo ntawm kev siv nyiaj ntawm kev ntseeg siab. MongoDB tam sim no txhawb kev nkag mus, tab sis kev sau qias neeg tseem tuaj yeem cuam tshuam cov ntaub ntawv kev ncaj ncees txij li cov cav raug ntes txhua 100ms los ntawm lub neej ntawd. Ntawd yog, qhov xwm txheej zoo sib xws tseem muaj peev xwm rau cov cav thiab cov kev hloov pauv hauv lawv, txawm tias qhov kev pheej hmoo tsawg dua.

Txhua database muaj nws tus kheej sib xws thiab cais mechanisms

Ntawm cov kev cai ACID, qhov sib xws thiab kev sib cais yog qhov loj tshaj plaws ntawm cov kev siv sib txawv vim tias qhov sib txawv ntawm kev lag luam tawm yog dav dua. Nws yuav tsum tau hais tias qhov sib xws thiab kev sib cais yog cov haujlwm kim heev. Lawv xav tau kev sib koom tes thiab nce kev sib tw rau cov ntaub ntawv sib xws. Qhov nyuaj ntawm qhov teeb meem nce ntxiv thaum nws tsim nyog los ntsuas cov ntaub ntawv kab rov tav hla ntau lub chaw cov ntaub ntawv (tshwj xeeb yog tias lawv nyob hauv thaj chaw sib txawv). Kev ua tiav qib siab ntawm qhov sib xws yog qhov nyuaj heev, vim nws kuj txo qhov muaj thiab ua kom muaj kev sib koom ua ke hauv network. Rau kev piav qhia dav dav ntawm qhov tshwm sim no, kuv qhia koj kom xa mus rau CAP theorem. Nws tseem tsim nyog sau cia tias cov ntawv thov tuaj yeem daws qhov tsis sib xws me me, thiab cov programmers tuaj yeem nkag siab qhov nuances ntawm qhov teeb meem zoo txaus los siv cov laj thawj ntxiv hauv daim ntawv thov los daws qhov tsis sib xws yam tsis muaj kev cia siab hnyav rau hauv cov ntaub ntawv los daws nws.

DBMSs feem ntau muab ntau theem ntawm kev sib cais. Cov neeg tsim daim ntawv thov tuaj yeem xaiv qhov ua tau zoo tshaj plaws raws li lawv qhov kev nyiam. Kev cais qis qis tso cai rau kev nce nrawm, tab sis kuj ua rau muaj kev pheej hmoo ntawm cov ntaub ntawv sib tw. Kev rwb thaiv tsev siab txo qis qhov tshwm sim no, tab sis ua haujlwm qeeb thiab tuaj yeem ua rau muaj kev sib tw, uas yuav ua rau cov brakes zoo li no hauv lub hauv paus uas tsis ua haujlwm pib.

Ntau tus tsim tawm yuav tsum paub qhov no txog databases
Kev tshuaj xyuas ntawm cov qauv sib txuas uas twb muaj lawm thiab kev sib raug zoo ntawm lawv

SQL tus qauv txhais tsuas yog plaub theem kev cais tawm, txawm hais tias hauv txoj kev xav thiab kev coj ua muaj ntau ntxiv. Jepson.io muab cov ntsiab lus zoo heev ntawm cov qauv sib txuam uas twb muaj lawm. Piv txwv li, Google Spanner lav rau sab nraud serializability nrog moos synchronization, thiab txawm hais tias qhov no yog txheej txheem cais tawm nruj dua, nws tsis tau txhais hauv cov txheej txheem cais tawm.

Tus qauv SQL hais txog cov theem kev cais tawm hauv qab no:

  • Serializable (feem ntau nruj thiab kim): Serializable execution muaj tib yam li ib co sequential lw execution. Sequential execution txhais tau hais tias txhua qhov kev sib pauv tom ntej pib tsuas yog tom qab ua tiav ib qho dhau los. Nws yuav tsum raug sau tseg tias qib Serializable Feem ntau siv raws li kev sib cais snapshot (piv txwv li, hauv Oracle) vim qhov sib txawv ntawm kev txhais, txawm hais tias snapshot cais nws tus kheej tsis yog sawv cev hauv SQL tus qauv.
  • Rov nyeem dua: Cov ntaub ntawv tsis raug tso cai nyob rau hauv qhov kev hloov pauv tam sim no muaj rau kev hloov pauv tam sim no, tab sis kev hloov pauv los ntawm lwm yam kev hloov pauv (xws li kab tshiab) tsis pom.
  • Nyeem cog lus: Cov ntaub ntawv tsis raug tso cai tsis muaj rau kev hloov pauv. Hauv qhov no, kev hloov pauv tsuas tuaj yeem pom cov ntaub ntawv cog lus, thiab kev nyeem phantom tuaj yeem tshwm sim. Yog tias qhov kev hloov pauv nkag thiab ua rau kab tshiab, qhov kev hloov pauv tam sim no yuav tuaj yeem pom lawv thaum nug.
  • Nyeem tsis tau (tsawg kawg yog qib nruj thiab kim): Cov ntawv nyeem qias neeg raug tso cai, kev hloov pauv tuaj yeem pom cov kev hloov pauv tsis tau ua los ntawm lwm yam kev hloov pauv. Hauv kev xyaum, qib no yuav muaj txiaj ntsig zoo rau kev kwv yees ntxhib, xws li cov lus nug COUNT(*) ntawm lub rooj.

Qib Serializable minimizes qhov kev pheej hmoo ntawm cov ntaub ntawv sib tw, thaum ua tus nqi kim tshaj plaws los siv thiab ua rau muaj kev sib tw siab tshaj plaws ntawm qhov system. Lwm qib kev cais tawm yooj yim dua rau kev siv, tab sis ua kom muaj kev sib tw ntawm cov ntaub ntawv. Qee qhov DBMSs tso cai rau koj los teeb tsa qhov kev cai cais tawm, lwm tus muaj qhov nyiam nyiam thiab tsis yog txhua qib tau txais kev txhawb nqa.

Kev them nyiaj yug rau qib kev sib cais feem ntau tau tshaj tawm hauv DBMS muab, tab sis tsuas yog kev kawm ua tib zoo saib ntawm nws tus cwj pwm tuaj yeem qhia qhov tshwm sim tiag tiag.

Ntau tus tsim tawm yuav tsum paub qhov no txog databases
Kev tshuaj xyuas ntawm concurrency anomalies ntawm txawv qib sib txawv rau txawv DBMSs

Martin Kleppmann hauv nws qhov project pab tsiaj Sib piv sib txawv qib sib txawv, tham txog concurrency anomalies, thiab seb lub database puas muaj peev xwm ua raws li ib qho kev sib cais. Kleppmann qhov kev tshawb fawb qhia tau hais tias qhov sib txawv ntawm cov neeg tsim cov ntaub ntawv xav li cas txog qib kev sib cais.

Optimistic thaiv los ntawm kev cawm thaum nws yog ib qho nyuaj los tswj qhov ib txwm muaj.

Thaiv tuaj yeem kim heev, tsis yog vim nws nce kev sib tw hauv cov ntaub ntawv, tab sis kuj vim nws xav kom cov ntawv thov servers txuas mus tas li rau cov ntaub ntawv. Network segmentation tuaj yeem ua rau cov xwm txheej kaw tshwj xeeb thiab ua rau muaj kev tsis sib haum xeeb uas nyuaj rau txheeb xyuas thiab daws teeb meem. Nyob rau hauv rooj plaub uas tshwj xeeb locking tsis haum, optimistic locking pab.

Optimistic xauv yog ib txoj hauv kev uas thaum nyeem ib txoj hlua, nws yuav siv sij hawm rau hauv tus account nws version, checksum, los yog lub sij hawm ntawm kev hloov kho kawg. Qhov no tso cai rau koj los xyuas kom meej tias tsis muaj atomic version hloov ua ntej hloov qhov nkag:

UPDATE products
SET name = 'Telegraph receiver', version = 2
WHERE id = 1 AND version = 1

Hauv qhov no, hloov kho lub rooj products yuav tsis raug ua yog tias lwm qhov haujlwm yav dhau los tau hloov pauv rau kab no. Yog tias tsis muaj lwm txoj haujlwm tau ua nyob rau kab no, qhov kev hloov pauv rau ib kab yuav tshwm sim thiab peb tuaj yeem hais tias qhov hloov tshiab tau ua tiav.

Muaj lwm yam kev tsis txaus ntseeg ntxiv rau kev nyeem ntawv qias neeg thiab cov ntaub ntawv poob

Thaum nws los txog rau cov ntaub ntawv sib xws, kev tsom mus rau lub peev xwm ntawm haiv neeg cov xwm txheej uas tuaj yeem ua rau kev nyeem ntawv qias neeg thiab cov ntaub ntawv poob. Txawm li cas los xij, cov ntaub ntawv anomalies tsis nres ntawd.

Ib qho piv txwv ntawm xws li anomalies yog kaw distortion (sau skews). Distortions yog ib qho nyuaj rau nrhiav tau vim hais tias lawv feem ntau tsis nquag nrhiav. Lawv tsis yog vim kev nyeem ntawv qias neeg lossis cov ntaub ntawv poob, tab sis rau kev ua txhaum cai ntawm kev txwv tsis pub muab tso rau hauv cov ntaub ntawv.

Piv txwv li, cia peb xav txog daim ntawv thov saib xyuas uas xav kom ib tus neeg teb xov tooj yuav tsum tau hu rau txhua lub sijhawm:

BEGIN tx1;                      BEGIN tx2;
SELECT COUNT(*)
FROM operators
WHERE oncall = true;
0                               SELECT COUNT(*)
                                FROM operators
                                WHERE oncall = TRUE;
                                0
UPDATE operators                UPDATE operators
SET oncall = TRUE               SET oncall = TRUE
WHERE userId = 4;               WHERE userId = 2;
COMMIT tx1;                     COMMIT tx2;

Hauv qhov xwm txheej saum toj no, cov ntaub ntawv kev noj nyiaj txiag yuav tshwm sim yog tias ob qho kev lag luam tau ua tiav. Txawm hais tias tsis muaj kev nyeem ntawv qias neeg lossis cov ntaub ntawv poob, kev ncaj ncees ntawm cov ntaub ntawv raug cuam tshuam: tam sim no ob tus neeg raug suav hais tias yog hu rau tib lub sijhawm.

Serializable cais, schema tsim, los yog database txwv yuav pab tshem tawm kev sau ntawv tsis ncaj ncees. Cov neeg tsim khoom yuav tsum muaj peev xwm txheeb xyuas cov kev tsis sib haum xeeb no thaum lub sijhawm kev txhim kho kom tsis txhob muaj lawv hauv kev tsim khoom. Nyob rau tib lub sijhawm, kev kaw cov distortions yog qhov nyuaj heev los nrhiav hauv lub hauv paus code. Tshwj xeeb tshaj yog nyob rau hauv cov tshuab loj, thaum pab pawg tsim kho sib txawv yog lub luag haujlwm rau kev ua haujlwm raws li tib lub rooj thiab tsis pom zoo rau qhov tshwj xeeb ntawm cov ntaub ntawv nkag.

Cov ntaub ntawv thiab cov neeg siv tsis tas yuav pom zoo tias yuav ua li cas

Ib qho ntawm cov yam ntxwv tseem ceeb ntawm cov ntaub ntawv yog qhov lav ntawm kev txiav txim siab, tab sis qhov kev txiav txim no nws tus kheej yuav tsis pob tshab rau tus tsim software. Databases ua kev lag luam nyob rau hauv qhov kev txiav txim lawv tau txais, tsis yog nyob rau hauv kev txiav txim programmers npaj siab. Qhov kev txiav txim ntawm kev lag luam yog qhov nyuaj rau kev kwv yees, tshwj xeeb tshaj yog nyob rau hauv cov khoom siv sib xyaw ua ke.

Thaum lub sij hawm txoj kev loj hlob, tshwj xeeb tshaj yog thaum ua hauj lwm nrog cov tsev qiv ntawv uas tsis yog-thaiv, cov style tsis zoo thiab tsis tshua muaj kev nyeem ntawv yuav ua rau cov neeg siv ntseeg hais tias kev lag luam raug ua tiav, thaum qhov tseeb lawv tuaj yeem tuaj txog hauv cov ntaub ntawv hauv txhua qhov kev txiav txim.

Thaum xub thawj siab ib muag, nyob rau hauv cov kev pab cuam hauv qab no, T1 thiab T2 raug hu ua sequentially, tab sis yog hais tias cov kev khiav hauj lwm yog tsis thaiv thiab tam sim ntawd rov qab rau hauv daim ntawv. cog lus, ces qhov kev txiav txim ntawm kev hu yuav raug txiav txim los ntawm lub sij hawm thaum lawv nkag mus rau hauv lub database:

result1 = T1() // cov txiaj ntsig tiag tiag yog cov lus cog tseg
result2 = T2()

Yog tias xav tau atomicity (uas yog, tag nrho cov haujlwm yuav tsum ua kom tiav lossis rho tawm) thiab cov teeb meem sib txuas, tom qab ntawd cov haujlwm T1 thiab T2 yuav tsum tau ua hauv ib qho kev sib pauv.

Daim ntawv thov-qib sharding tuaj yeem txav mus sab nraum daim ntawv thov

Sharding yog ib txoj hauv kev uas horizontally partitioning ib database. Qee cov databases tuaj yeem faib cov ntaub ntawv kab rov tav, thaum lwm tus tsis tuaj yeem, lossis tsis zoo rau nws. Thaum cov ntaub ntawv architects/developers muaj peev xwm kwv yees raws nraim li cas cov ntaub ntawv yuav nkag mus, lawv muaj peev xwm tsim kab rov tav partitions nyob rau hauv cov neeg siv qhov chaw es tsis txhob delegating no ua hauj lwm rau lub database. Cov txheej txheem no hu ua "application-level sharding" (application-level sharding).

Hmoov tsis zoo, lub npe no feem ntau tsim cov kev xav tsis zoo uas sharding nyob hauv daim ntawv thov kev pabcuam. Qhov tseeb, nws tuaj yeem ua raws li cov txheej txheem cais nyob rau hauv pem hauv ntej ntawm cov ntaub ntawv. Nyob ntawm cov ntaub ntawv loj hlob thiab schema iterations, sharding yuav tsum tau ua heev complex. Qee cov tswv yim yuav tau txais txiaj ntsig los ntawm kev muaj peev xwm rov hais dua yam tsis tas yuav rov siv dua daim ntawv thov servers.

Ntau tus tsim tawm yuav tsum paub qhov no txog databases
Ib qho piv txwv ntawm ib qho architecture uas cov ntawv thov servers raug cais tawm ntawm qhov kev pabcuam sharding

Tsiv sharding mus rau hauv ib qho kev pabcuam cais nthuav dav lub peev xwm los siv cov tswv yim sib txawv sharding yam tsis tas yuav rov siv dua daim ntawv thov. Vitess yog ib qho piv txwv ntawm xws li ib tug sharding system nyob rau hauv daim ntawv thov. Vitess muab kab rov tav sharding rau MySQL thiab tso cai rau cov neeg siv txuas rau nws ntawm MySQL raws tu qauv. Lub kaw lus faib cov ntaub ntawv mus rau hauv MySQL nodes sib txawv uas tsis paub dab tsi txog ib leeg.

Autoincrementing tuaj yeem ua rau muaj kev phom sij

AUTOINCREMENT yog ib txoj hauv kev los tsim cov yuam sij tseem ceeb. Muaj ntau zaus thaum databases siv los ua ID generators, thiab cov database muaj cov ntxhuav tsim los tsim cov cim. Muaj ntau ntau qhov laj thawj vim li cas thiaj tsim cov yuam sij tseem ceeb uas siv qhov pib nce ntxiv yog deb ntawm qhov zoo:

  • Nyob rau hauv ib tug faib database, auto-incrementing yog ib qho teeb meem loj. Txhawm rau tsim tus ID, yuav tsum muaj lub xauv thoob ntiaj teb. Hloov chaw, koj tuaj yeem tsim UUID: qhov no tsis tas yuav muaj kev sib cuam tshuam ntawm cov chaw sib txawv. Auto-incrementing nrog cov xauv tuaj yeem ua rau muaj kev sib cav thiab txo qis kev ua haujlwm ntawm cov khoom siv hauv cov xwm txheej sib faib. Qee qhov DBMSs (piv txwv li, MySQL) yuav xav tau kev teeb tsa tshwj xeeb thiab ua tib zoo saib xyuas kom txhim kho tus tswv-master replication. Thiab nws yooj yim ua yuam kev thaum teeb tsa, uas yuav ua rau kev kaw tsis tiav.
  • Qee cov databases muaj partitioning algorithms raws li tus yuam sij tseem ceeb. Kev sib law liag IDs tuaj yeem ua rau qhov kub tsis tuaj yeem tshwm sim thiab nce ntxiv ntawm qee qhov kev faib tawm thaum lwm tus nyob twj ywm.
  • Tus yuam sij tseem ceeb yog txoj hauv kev ceev tshaj plaws kom nkag mus rau kab hauv ib lub database. Nrog rau txoj hauv kev zoo dua los txheeb xyuas cov ntaub ntawv, cov lej ID ua ntu zus tuaj yeem tig kem tseem ceeb tshaj plaws hauv cov lus rau hauv kab tsis muaj txiaj ntsig uas muaj qhov tsis muaj txiaj ntsig. Yog li ntawd, thaum twg los tau, thov xaiv lub ntiaj teb no cim thiab tej yam ntuj tso tus yuam sij (xws li username).

Ua ntej txiav txim siab txog txoj hauv kev, xav txog qhov cuam tshuam ntawm nws pib nce IDs thiab UUIDs ntawm indexing, partitioning, thiab sharding.

Stale cov ntaub ntawv tuaj yeem pab tau thiab tsis tas yuav tsum tau kaw

Multiversion Concurrency Control (MVCC) siv ntau qhov kev xav tau sib xws uas tau tham luv luv saum toj no. Qee cov databases (piv txwv li, Postgres, Spanner) siv MVCC los "paub" kev lag luam nrog snapshots-laus versions ntawm database. Snapshot muas kuj tuaj yeem raug serialized los xyuas kom meej qhov sib xws. Thaum nyeem los ntawm qhov qub snapshot, cov ntaub ntawv dhau los tau nyeem.

Kev nyeem cov ntaub ntawv tsis zoo me ntsis tuaj yeem pab tau, piv txwv li, thaum tsim cov kev tshuaj ntsuam xyuas los ntawm cov ntaub ntawv los yog xam cov nqi kwv yees.

Thawj qhov zoo ntawm kev ua haujlwm nrog cov ntaub ntawv keeb kwm yav dhau los yog qhov tsis tshua muaj latency (tshwj xeeb tshaj yog tias cov ntaub ntawv faib tawm thoob plaws thaj chaw sib txawv). Qhov thib ob yog tias kev nyeem ntawv nkaus xwb tsis muaj xauv. Qhov no yog qhov txiaj ntsig tseem ceeb rau cov ntawv thov uas nyeem ntau, tsuav lawv tuaj yeem tswj cov ntaub ntawv stale.

Ntau tus tsim tawm yuav tsum paub qhov no txog databases
Daim ntawv thov neeg rau zaub mov nyeem cov ntaub ntawv los ntawm cov qauv hauv zos uas yog 5 vib nas this dhau los, txawm tias qhov tseeb version muaj nyob rau sab nraud ntawm Dej Hiav Txwv Pacific

DBMSs cia li tshem tawm cov laus dua thiab, qee zaum, tso cai rau koj ua qhov no ntawm kev thov. Piv txwv li, Postgres tso cai rau cov neeg siv ua VACUUM raws li kev thov, thiab ib ntus ua qhov haujlwm no tau txais. Spanner khiav cov khoom khib nyiab kom tshem tawm cov duab thaij duab qub tshaj li ib teev.

Txhua lub sijhawm cov peev txheej yuav raug cuam tshuam

Qhov zoo tshaj plaws-kub zais hauv computer science yog tias txhua lub sijhawm APIs dag. Qhov tseeb, peb cov tshuab tsis paub lub sijhawm tam sim no. Cov khoos phis tawj muaj cov quartz siv lead ua uas tsim kev vibrations uas siv los ua kom lub sijhawm. Txawm li cas los xij, lawv tsis raug txaus thiab tej zaum yuav ua ntej / poob qab lub sijhawm. Kev hloov pauv tuaj yeem ncav cuag 20 vib nas this ib hnub. Yog li ntawd, lub sij hawm ntawm peb cov computers yuav tsum tau synchronized nrog lub network ib.

NTP servers yog siv rau synchronization, tab sis cov txheej txheem synchronization nws tus kheej yuav raug rau lub network qeeb. Txawm tias synchronizing nrog NTP server hauv tib lub chaw cov ntaub ntawv yuav siv sij hawm qee lub sijhawm. Nws yog qhov tseeb tias kev ua haujlwm nrog pej xeem NTP server tuaj yeem ua rau muaj kev cuam tshuam ntau dua.

Atomic moos thiab lawv cov GPS counterparts yog qhov zoo dua rau kev txiav txim siab lub sijhawm tam sim no, tab sis lawv kim heev thiab xav tau kev teeb tsa nyuaj, yog li lawv tsis tuaj yeem ntsia tau rau txhua lub tsheb. Vim li no, cov chaw khaws ntaub ntawv siv ib txoj hauv kev sib tw. Atomic thiab/lossis GPS moos qhia lub sijhawm meej, tom qab ntawd nws tau tshaj tawm rau lwm lub tshuab los ntawm cov servers thib ob. Qhov no txhais tau hais tias txhua lub tshuab yuav muaj qee qhov offset los ntawm lub sijhawm.

Qhov xwm txheej yog qhov hnyav dua los ntawm qhov tseeb tias cov ntawv thov thiab cov ntaub ntawv feem ntau nyob ntawm cov tshuab sib txawv (yog tias tsis nyob hauv cov chaw sib txawv). Yog li, lub sijhawm yuav txawv tsis yog ntawm DB nodes faib thoob cov tshuab sib txawv. Nws kuj yuav txawv ntawm daim ntawv thov server.

Google TrueTime siv txoj hauv kev sib txawv kiag li. Cov neeg feem coob ntseeg tias Google qhov kev nce qib hauv qhov kev taw qhia no tau piav qhia los ntawm banal hloov mus rau atomic thiab GPS moos, tab sis qhov no tsuas yog ib feem ntawm daim duab loj. Nov yog li cas TrueTime ua haujlwm:

  • TrueTime siv ob qhov chaw sib txawv: GPS thiab atomic moos. Cov moos no muaj cov hom kev ua tsis tiav. [saib nplooj 5 kom paub meej no - kwv yees. txhais.), yog li lawv siv sib koom ua ke nce kev ntseeg tau.
  • TrueTime muaj qhov txawv txav API. Nws rov qab lub sij hawm raws li lub caij nyoog nrog kev ntsuas qhov yuam kev thiab tsis paub tseeb ua rau nws. Lub sijhawm tiag tiag hauv lub sijhawm yog qhov chaw nruab nrab ntawm cov ciam teb sab saud thiab sab qis ntawm lub sijhawm. Spanner, Google cov ntaub ntawv faib tawm, tsuas yog tos kom txog thaum nws muaj kev nyab xeeb los hais tias lub sijhawm tam sim no tawm ntawm qhov ntau. Txoj kev no qhia txog qee qhov latency rau hauv lub system, tshwj xeeb tshaj yog tias qhov tsis paub meej ntawm cov masters siab, tab sis ua kom muaj tseeb txawm tias nyob hauv qhov xwm txheej thoob ntiaj teb.

Ntau tus tsim tawm yuav tsum paub qhov no txog databases
Cov khoom siv Spanner siv TrueTime, qhov twg TT.now() rov qab ib ntus, yog li Spanner tsuas yog pw tsaug zog kom txog thaum lub sijhawm nws tuaj yeem ntseeg tau tias lub sijhawm tam sim no tau dhau los ntawm qee qhov taw tes.

Txo qhov tseeb ntawm kev txiav txim siab lub sijhawm tam sim no txhais tau hais tias kev nce ntxiv ntawm lub sijhawm ntawm Spanner kev ua haujlwm thiab kev ua haujlwm tsawg. Qhov no yog vim li cas nws yog ib qho tseem ceeb kom tswj tau qhov tseeb tshaj plaws txawm hais tias nws yog tsis yooj yim sua kom tau txais ib tug zoo saib.

Kev ncua muaj ntau lub ntsiab lus

Yog tias koj nug ntau tus kws tshaj lij txog qhov kev ncua sijhawm yog dab tsi, koj yuav tau txais cov lus teb sib txawv. Hauv DBMS latency feem ntau hu ua "database latency" thiab txawv ntawm qhov pom los ntawm tus neeg siv khoom. Qhov tseeb yog tias tus neeg siv tau soj ntsuam cov lej ntawm lub network ncua sijhawm thiab cov ntaub ntawv qeeb. Lub peev xwm los cais cov hom latency yog qhov tseem ceeb thaum kho qhov teeb meem loj hlob. Thaum sau thiab nthuav tawm cov ntsuas ntsuas, ib txwm sim ua kom lub qhov muag ntawm ob hom.

Cov kev xav tau ntawm kev ua tau zoo yuav tsum raug ntsuas rau ib qho kev lag luam tshwj xeeb

Qee lub sij hawm cov yam ntxwv ua tau zoo ntawm DBMS thiab nws cov kev txwv tau teev nyob rau hauv cov nqe lus ntawm kev sau / nyeem dhau los thiab latency. Qhov no muab cov ntsiab lus dav dav ntawm cov txheej txheem tseem ceeb, tab sis thaum ntsuas qhov ua tau zoo ntawm DBMS tshiab, txoj hauv kev ntau dua yog cais cov kev ua haujlwm tseem ceeb (rau txhua qhov kev nug thiab / lossis kev lag luam). Piv txwv:

  • Sau cov ntawv hla dhau thiab latency thaum ntxig ib kab tshiab rau hauv lub rooj X (nrog 50 lab kab) nrog cov kev txwv tshwj xeeb thiab kab padding hauv cov rooj sib tham.
  • Ncua sijhawm hauv kev nthuav tawm cov phooj ywg ntawm cov phooj ywg ntawm ib tus neeg siv thaum qhov nruab nrab ntawm cov phooj ywg yog 500.
  • Latency hauv retrieving saum 100 nkag los ntawm tus neeg siv keeb kwm thaum tus neeg siv ua raws 500 lwm tus neeg siv nrog X nkag hauv ib teev.

Kev ntsuam xyuas thiab kev sim yuav suav nrog cov xwm txheej tseem ceeb no kom txog thaum koj ntseeg siab tias cov ntaub ntawv ua tau raws li qhov yuav tsum tau ua. Ib txoj cai zoo sib xws ntawm tus ntiv tes xoo kuj tseem siv qhov kev sib cais no rau hauv tus account thaum sau cov latency metrics thiab txiav txim siab SLOs.

Yuav tsum paub txog siab cardinality thaum sau cov ntsuas rau txhua qhov haujlwm. Siv cov ntaub ntawv teev tseg, sau cov xwm txheej, lossis kev sib faib tracing kom tau txais cov ntaub ntawv kho qhov tsis zoo. Hauv tsab xov xwm "Xav Debug Latency?Β» koj tuaj yeem paub koj tus kheej nrog ncua debugging txoj kev.

Nested muas yuav txaus ntshai

Tsis yog txhua txhua DBMS txhawb nqa kev lag luam nested, tab sis thaum lawv ua, xws li kev lag luam tuaj yeem ua rau muaj kev xav tsis thoob uas tsis yooj yim los txheeb xyuas (uas yog, nws yuav tsum pom tseeb tias muaj qee yam tsis zoo).

Koj tuaj yeem zam tsis txhob siv cov kev lag luam nested siv cov neeg siv cov tsev qiv ntawv uas tuaj yeem ntes thiab hla lawv. Yog tias kev ua lag luam nested tsis tuaj yeem tso tseg, saib xyuas tshwj xeeb hauv lawv qhov kev siv kom tsis txhob muaj qhov xwm txheej xav tau uas ua tiav kev lag luam raug rho tawm vim yog cov nested.

Encapsulating kev hloov pauv hauv cov txheej txheem sib txawv tuaj yeem ua rau qhov kev npaj txhij txog kev ua lag luam nested, thiab los ntawm tus lej nyeem tau qhov pom, nws tuaj yeem ua rau nws nyuaj rau kev nkag siab tus neeg sau qhov kev xav. Ua tib zoo saib ntawm qhov program hauv qab no:

with newTransaction():
   Accounts.create("609-543-222")
   with newTransaction():
       Accounts.create("775-988-322")
       throw Rollback();

Yuav ua li cas yog qhov tso zis ntawm cov cai saum toj no? Nws puas yuav thim rov qab ob qho kev lag luam, lossis tsuas yog sab hauv? Yuav ua li cas yog tias peb cia siab rau ntau txheej ntawm cov tsev qiv ntawv uas encapsulate tsim kev lag luam rau peb? Peb puas tuaj yeem txheeb xyuas thiab txhim kho cov xwm txheej zoo li no?

Xav txog cov ntaub ntawv txheej nrog ntau yam haujlwm (piv txwv li. newAccount) twb tau siv nyob rau hauv nws tus kheej muas. Yuav ua li cas yog tias koj khiav lawv raws li ib feem ntawm theem siab ntawm kev lag luam logic uas khiav hauv nws tus kheej kev lag luam? Dab tsi yuav yog qhov kev sib cais thiab kev sib haum xeeb hauv qhov no?

function newAccount(id string) {
  with newTransaction():
      Accounts.create(id)
}

Hloov chaw ntawm kev tshawb nrhiav cov lus teb rau cov lus nug tsis kawg, nws yog qhov zoo dua kom tsis txhob muaj kev sib pauv nested. Tom qab tag nrho, koj cov ntaub ntawv txheej tuaj yeem ua tau yooj yim ua haujlwm siab yam tsis tau tsim nws tus kheej kev lag luam. Tsis tas li ntawd, kev lag luam logic nws tus kheej muaj peev xwm pib ua lag luam, ua haujlwm ntawm nws, ua lag luam lossis rho tawm kev lag luam.

function newAccount(id string) {
   Accounts.create(id)
}
// In main application:
with newTransaction():
   // Read some data from database for configuration.
   // Generate an ID from the ID service.
   Accounts.create(id)
   Uploads.create(id) // create upload queue for the user.

Kev ua lag luam yuav tsum tsis txhob muab khi rau lub xeev daim ntawv thov

Qee lub sij hawm nws yog ntxias siv daim ntawv thov xeev hauv kev hloov pauv qee qhov txiaj ntsig lossis tweak cov lus nug tsis tau. Qhov tseem ceeb nuance los xav txog yog qhov tseeb ntawm daim ntawv thov. Cov neeg siv khoom feem ntau rov pib ua lag luam thaum muaj teeb meem hauv network. Yog tias qhov kev hloov pauv ces nyob ntawm lub xeev uas tau hloov pauv los ntawm qee qhov txheej txheem, nws tuaj yeem xaiv tus nqi tsis raug nyob ntawm qhov muaj peev xwm ntawm cov ntaub ntawv sib tw. Kev lag luam yuav tsum txiav txim siab txog qhov pheej hmoo ntawm cov ntaub ntawv haiv neeg hauv daim ntawv thov.

var seq int64
with newTransaction():
    newSeq := atomic.Increment(&seq)
    Entries.query(newSeq)
    // Other operations...

Cov kev sib pauv saum toj no yuav nce tus lej sib npaug txhua zaus nws raug tua, tsis hais qhov kawg tshwm sim. Yog tias qhov kev cog lus ua tsis tiav vim muaj teeb meem hauv network, qhov kev thov yuav raug ua nrog tus lej sib txawv thaum koj sim dua.

Query planners tuaj yeem qhia koj ntau txog cov ntaub ntawv

Query planners txiav txim siab yuav ua li cas cov lus nug yuav raug ua tiav hauv cov ntaub ntawv. Lawv kuj txheeb xyuas qhov kev thov thiab ua kom zoo rau lawv ua ntej xa lawv. Cov phiaj xwm tsuas tuaj yeem muab qee qhov kev kwv yees ua tau raws li cov cim qhia ntawm lawv qhov chaw pov tseg. Piv txwv li, txoj kev tshawb nrhiav zoo tshaj plaws rau cov lus nug hauv qab no yog dab tsi?

SELECT * FROM articles where author = "rakyll" order by title;

Cov txiaj ntsig tuaj yeem rov qab los ntawm ob txoj hauv kev:

  • Tag nrho lub rooj scan: Koj tuaj yeem saib txhua qhov nkag hauv lub rooj thiab xa cov ntawv xa rov qab nrog lub npe sib xws, thiab tom qab ntawd xaj lawv.
  • Index scan: Koj tuaj yeem siv qhov ntsuas ntsuas kom pom cov ID sib xws, tau cov kab ntawd, thiab tom qab ntawd xaj lawv.

Cov lus nug npaj txoj haujlwm yog los txiav txim siab seb lub tswv yim twg yog qhov zoo tshaj plaws. Nws tsim nyog xav txog tias cov lus nug cov phiaj xwm tsuas yog muaj peev xwm twv ua ntej xwb. Qhov no tuaj yeem ua rau kev txiav txim siab tsis zoo. DBAs lossis cov neeg tsim khoom siv tau los kuaj xyuas thiab kho cov lus nug tsis zoo. Cov qauv tshiab ntawm DBMS tuaj yeem teeb tsa cov lus nug cov phiaj xwm, thiab kev kuaj tus kheej tuaj yeem pab thaum hloov kho cov ntaub ntawv yog tias qhov tshiab version ua rau muaj teeb meem kev ua haujlwm. Cov lus nug qeeb qeeb, cov ntaub ntawv qhia txog qhov teeb meem latency, lossis lub sijhawm ua tiav cov txheeb cais tuaj yeem pab txheeb xyuas cov lus nug uas xav tau kev ua kom zoo.

Qee qhov kev ntsuas uas tau nthuav tawm los ntawm tus txheej txheem nug yuav raug lub suab nrov (tshwj xeeb tshaj yog thaum kwv yees latency lossis CPU sijhawm). Ib qho zoo ntxiv rau cov teem caij yog cov cuab yeej rau kev taug qab thiab taug qab txoj kev ua tiav. Lawv tso cai rau koj kuaj xyuas cov teeb meem no (alas, tsis yog txhua tus DBMSs muab cov cuab yeej zoo li no).

Kev tsiv teb tsaws chaw online yog qhov nyuaj tab sis ua tau

Online migration, nyob migration, los yog real-time migration txhais tau tias tsiv ntawm ib tug database mus rau lwm yam tsis muaj downtime los yog cov ntaub ntawv kev noj nyiaj txiag. Kev tsiv teb tsaws chaw nyob yog yooj yim dua yog tias qhov kev hloov pauv tshwm sim hauv tib DBMS / cav. Qhov xwm txheej yuav nyuaj dua thaum nws tsim nyog txav mus rau DBMS tshiab nrog cov kev ua tau zoo sib txawv thiab cov txheej txheem xav tau.

Muaj cov qauv kev tsiv teb tsaws chaw online sib txawv. Nov yog ib qho ntawm lawv:

  • Qhib ob qhov nkag hauv ob lub databases. Cov ntaub ntawv tshiab nyob rau theem no tsis muaj tag nrho cov ntaub ntawv, tab sis tsuas yog lees txais cov ntaub ntawv tshiab. Thaum koj paub meej txog qhov no, koj tuaj yeem txav mus rau kauj ruam tom ntej.
  • Qhib kev nyeem ntawv los ntawm ob lub databases.
  • Configure lub system kom nyeem ntawv thiab sau ntawv tau ua feem ntau ntawm cov ntaub ntawv tshiab.
  • Tsis txhob sau rau cov ntaub ntawv qub thaum txuas ntxiv nyeem cov ntaub ntawv los ntawm nws. Nyob rau theem no, cov ntaub ntawv tshiab tseem tsis muaj qee cov ntaub ntawv. Lawv yuav tsum tau theej los ntawm cov ntaub ntawv qub.
  • Cov ntaub ntawv qub yog nyeem nkaus xwb. Luam cov ntaub ntawv uas ploj lawm los ntawm cov ntaub ntawv qub mus rau qhov tshiab. Tom qab kev tsiv teb tsaws tiav lawm, hloov txoj hauv kev mus rau cov ntaub ntawv tshiab, thiab nres qhov qub thiab tshem tawm ntawm qhov system.

Yog xav paub ntxiv, kuv xav kom hu rau Tshooj, uas qhia txog Stripe txoj kev tsiv teb tsaws chaw raws li tus qauv no.

Ib qho kev nce ntxiv hauv cov ntaub ntawv suav nrog kev nce ntxiv hauv qhov tsis muaj kev cia siab

Kev loj hlob ntawm cov ntaub ntawv ua rau cov teeb meem tsis tuaj yeem cuam tshuam nrog nws cov nplai. Qhov ntau peb paub txog cov qauv sab hauv ntawm cov ntaub ntawv, qhov zoo dua peb tuaj yeem kwv yees seb nws yuav ntsuas li cas. Txawm li cas los xij, qee lub sijhawm tseem tsis tuaj yeem pom tau.
Raws li lub hauv paus loj hlob, cov kev xav yav dhau los thiab kev cia siab hais txog cov ntaub ntawv ntim thiab cov kev xav tau ntawm lub network bandwidth yuav dhau los. Qhov no yog thaum cov lus nug tshwm sim ntawm kev tsim kho loj, kev txhim kho kev ua haujlwm loj, rov xav txog kev xa tawm, lossis kev tsiv mus rau lwm qhov DBMSs kom tsis txhob muaj teeb meem.

Tab sis tsis txhob xav tias kev paub zoo ntawm cov qauv sab hauv ntawm cov ntaub ntawv uas twb muaj lawm tsuas yog qhov tsim nyog. Cov nplai tshiab yuav coj nrog lawv tsis paub tshiab. Cov ntsiab lus mob tsis txaus ntseeg, kev faib cov ntaub ntawv tsis sib xws, qhov teeb meem tsis txaus ntseeg ntawm bandwidth thiab kho vajtse, kev tsheb khiav mus ib txhis thiab cov ntu tshiab hauv lub network yuav yuam kom koj rov xav txog koj txoj hauv kev database, cov qauv ntaub ntawv, qauv xa tawm, thiab cov ntaub ntawv loj.

...

Thaum lub sij hawm kuv pib xav txog kev tshaj tawm tsab xov xwm no, twb muaj tsib yam khoom ntxiv ntawm kuv daim ntawv teev thawj. Tom qab ntawd tuaj tus lej loj tswv yim tshiab txog dab tsi ntxiv tuaj yeem them. Yog li ntawd, tsab xov xwm kov txog qhov teeb meem tsawg tshaj plaws uas yuav tsum tau ua kom siab tshaj plaws. Txawm li cas los xij, qhov no tsis tau txhais hais tias lub ntsiab lus tau tas lawm thiab kuv yuav tsis rov qab los rau hauv kuv cov ntaub ntawv yav tom ntej thiab yuav tsis hloov pauv rau qhov tam sim no.

PS

Nyeem kuj ntawm peb blog:

Tau qhov twg los: www.hab.com

Ntxiv ib saib