Кассандра. Хэрэв та зөвхөн Oracle-ийг мэддэг бол яаж үхэхгүй байх вэ

Хөөе Хабр.

Намайг Миша Бутримов гэдэг, би Кассандрагийн талаар бага зэрэг яримаар байна. Миний түүх NoSQL өгөгдлийн сантай хэзээ ч уулзаж байгаагүй хүмүүст хэрэг болох болно - энэ нь хэрэгжүүлэх боломжууд болон таны мэдэх шаардлагатай олон бэрхшээлийг агуулдаг. Хэрэв та Oracle эсвэл бусад харилцааны мэдээллийн сангаас өөр юу ч хараагүй бол эдгээр зүйлс таны амийг аврах болно.

Кассандрагийн сайн зүйл юу вэ? Энэ нь сайн масштабтай, нэг ч доголдолгүй зохион бүтээсэн NoSQL мэдээллийн сан юм. Хэрэв та зарим мэдээллийн санд хэд хэдэн терабайт нэмэх шаардлагатай бол бөгж дээр зангилаа нэмэхэд хангалттай. Үүнийг өөр дата төв рүү өргөжүүлэх үү? Кластерт зангилаа нэмнэ үү. Боловсруулсан RPS-ийг нэмэгдүүлэх үү? Кластерт зангилаа нэмнэ үү. Энэ нь бас эсрэг чиглэлд ажилладаг.

Кассандра. Хэрэв та зөвхөн Oracle-ийг мэддэг бол яаж үхэхгүй байх вэ

Тэр өөр юунд сайн бэ? Энэ нь маш олон хүсэлтийг шийдвэрлэх тухай юм. Гэхдээ хэр их вэ? Секундэд 10, 20, 30, 40 мянган хүсэлт их биш. Бичлэг хийх секундэд 100 мянган хүсэлт - мөн. Секундэд 2 сая хүсэлт хадгалдаг гэсэн компаниуд бий. Тэд үүнд итгэх хэрэгтэй байх.

Зарчмын хувьд Кассандра харилцааны өгөгдлөөс нэг том ялгаа байдаг - энэ нь тэдэнтэй огт төстэй биш юм. Мөн үүнийг санах нь маш чухал юм.

Ижил харагдах бүх зүйл адилхан ажилладаггүй

Нэг удаа хамт ажилладаг хүн над дээр ирээд асуув: "Энд CQL Кассандра асуулгын хэл байна, энэ нь сонгох хэллэгтэй, хаана байна, байна, байна. Би захидал бичдэг, энэ нь ажиллахгүй байна. Яагаад?". Кассандраг харилцааны мэдээллийн сан гэж үзэх нь хүчирхийллийн амиа хорлох төгс арга юм. Би үүнийг сурталчлахгүй, Орост үүнийг хориглодог. Та зүгээр л буруу дизайн хийх болно.

Жишээлбэл, үйлчлүүлэгч манайд ирээд: “Телевизийн олон ангит киноны мэдээллийн сан, жорын лавлах мэдээллийн сан байгуулъя. Бид тэнд хоолны таваг, эсвэл телевизийн олон ангит кино, жүжигчдийн жагсаалттай байх болно." Бид баяртайгаар: "Явцгаая!" Гэж хэлдэг. Зүгээр л хоёр байт, хоёр тэмдэг илгээж, та дууслаа, бүх зүйл маш хурдан бөгөөд найдвартай ажиллах болно. Үйлчлүүлэгчид ирж гэрийн эзэгтэй нар ч эсрэгээрээ асуудлыг шийдэж байна гэж хэлэх хүртэл бүх зүйл сайхан байна: тэдэнд бүтээгдэхүүний жагсаалт байгаа бөгөөд тэд ямар хоол хийхийг хүсч байгаагаа мэдэхийг хүсч байна. Та үхсэн.

Учир нь Кассандра бол эрлийз мэдээллийн сан юм: энэ нь нэгэн зэрэг гол утгыг өгч, өгөгдлийг өргөн баганад хадгалдаг. Java эсвэл Kotlin дээр үүнийг дараах байдлаар тодорхойлж болно.

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Энэ нь эрэмбэлэгдсэн газрын зургийг агуулсан газрын зураг юм. Энэ газрын зургийн эхний түлхүүр нь Мөрийн товчлуур эсвэл Хуваалтын түлхүүр - хуваах түлхүүр юм. Аль хэдийн эрэмбэлэгдсэн газрын зургийн түлхүүр болох хоёр дахь түлхүүр нь Clustering түлхүүр юм.

Өгөгдлийн сангийн тархалтыг харуулахын тулд гурван зангилаа зуръя. Одоо та өгөгдлийг зангилаа болгон задлах талаар ойлгох хэрэгтэй. Учир нь хэрэв бид бүгдийг нэг дор цуглуулбал (дашрамд хэлэхэд мянга, хоёр мянга, тав байж болно - таны хүссэнээр) энэ нь үнэндээ хуваарилалтын тухай биш юм. Тиймээс бидэнд тоо буцаах математик функц хэрэгтэй байна. Зүгээр л тоо, ямар нэг мужид багтах урт int. Мөн бид нэг мужийг хариуцах нэг зангилаа, хоёр дахь нь хоёр дахь, n дэх нь n-ийг хариуцах болно.

Кассандра. Хэрэв та зөвхөн Oracle-ийг мэддэг бол яаж үхэхгүй байх вэ

Энэ дугаарыг хэш функц ашиглан авдаг бөгөөд үүнийг бидний хуваалтын түлхүүр гэж нэрлэдэг зүйлд ашигладаг. Энэ нь Үндсэн түлхүүрийн зааварт заасан багана бөгөөд энэ нь газрын зургийн эхний бөгөөд хамгийн үндсэн түлхүүр болох багана юм. Энэ нь ямар зангилаа ямар өгөгдлийг хүлээн авахыг тодорхойлдог. Кассандра дээр хүснэгтийг SQL-тэй бараг ижил синтаксаар үүсгэсэн:

CREATE TABLE users (
	user_id uu id,
	name text,
	year int,
	salary float,
	PRIMARY KEY(user_id)

)

Энэ тохиолдолд Үндсэн түлхүүр нь нэг баганаас бүрдэх бөгөөд энэ нь мөн хуваах түлхүүр юм.

Манай хэрэглэгчид хэрхэн ажиллах вэ? Зарим нь нэг зангилаа руу, зарим нь нөгөө рүү, зарим нь гуравдахь руу очно. Үр дүн нь Python-д толь бичиг гэгддэг газрын зураг гэгддэг энгийн хэш хүснэгт юм уу бид бүх утгыг уншиж, түлхүүрээр уншиж, бичих боломжтой энгийн Түлхүүр утгын бүтэц юм.

Кассандра. Хэрэв та зөвхөн Oracle-ийг мэддэг бол яаж үхэхгүй байх вэ

Сонгох: Шүүлтүүрийг бүрэн сканнердах үед зөвшөөрөх эсвэл юу хийхгүй байх

Сонгосон мэдэгдлийг бичье: select * from users where, userid = . Энэ нь Oracle шиг харагдаж байна: бид сонго гэж бичээд, нөхцөлийг зааж өгөөд бүх зүйл ажилладаг, хэрэглэгчид үүнийг авдаг. Гэхдээ хэрэв та жишээлбэл, тодорхой төрсөн онтой хэрэглэгчийг сонговол Кассандра хүсэлтийг биелүүлж чадахгүй байна гэж гомдоллодог. Учир нь тэр бидний төрсөн жилийн талаарх мэдээллийг хэрхэн түгээдэг талаар огт мэдэхгүй - түүнд зөвхөн нэг багана түлхүүрээр заасан байдаг. Дараа нь тэр "За, би энэ хүсэлтийг биелүүлж чадна. Шүүлтүүрийг зөвшөөрөхийг нэмнэ үү." Бид удирдамжийг нэмээд бүх зүйл ажилладаг. Мөн энэ мөчид ямар нэг аймшигтай зүйл тохиолдох болно.

Туршилтын өгөгдөл дээр ажиллахад бүх зүйл хэвийн байна. Жишээлбэл, 4 сая бичлэгтэй үйлдвэрлэлд та хайлтыг гүйцэтгэхэд бүх зүйл бидний хувьд тийм ч сайн биш юм. Учир нь шүүлтүүрийг зөвшөөрөх нь Кассандра-д энэ хүснэгтийн бүх өгөгдлийг бүх зангилаа, бүх дата төвөөс (хэрэв энэ кластерт олон байгаа бол) цуглуулж, дараа нь шүүж авах боломжийг олгодог заавар юм. Энэ бол Full Scan-ийн аналог бөгөөд хэн ч үүнд сэтгэл хангалуун байдаггүй.

Хэрэв бидэнд зөвхөн ID-ээр нь хэрэглэгчид хэрэгтэй байсан бол бид үүнийг хийх болно. Гэхдээ заримдаа бид өөр асуулга бичиж, сонголтод бусад хязгаарлалт тавих хэрэгтэй болдог. Тиймээс бид санаж байна: энэ бүгд хуваах түлхүүртэй газрын зураг боловч дотор нь эрэмбэлэгдсэн газрын зураг байдаг.

Түүнд бас түлхүүр бий бөгөөд үүнийг бид Clustering Key гэж нэрлэдэг. Энэ түлхүүр нь эргээд бидний сонгосон багануудаас бүрдэх бөгөөд үүний тусламжтайгаар Кассандра өгөгдлийг хэрхэн физик байдлаар ангилж, зангилаа бүр дээр байрлуулахыг ойлгодог. Өөрөөр хэлбэл, зарим хуваалтын түлхүүрүүдийн хувьд Clustering товчлуур нь өгөгдлийг энэ мод руу хэрхэн оруулах, тэнд ямар газар авахыг хэлж өгөх болно.

Энэ бол үнэхээр мод, харьцуулагчийг зүгээр л дууддаг бөгөөд бид тодорхой багануудыг объект хэлбэрээр дамжуулдаг бөгөөд үүнийг баганын жагсаалт болгон зааж өгдөг.

CREATE TABLE users_by_year_salary_id (
	user_id uuid,
	name text,
	year int,
	salary float,
	PRIMARY KEY((year), salary, user_id)

Анхдагч түлхүүр зааварт анхаарлаа хандуулаарай; түүний эхний аргумент (манай тохиолдолд жил) нь үргэлж хуваалтын түлхүүр юм. Энэ нь нэг буюу хэд хэдэн баганаас бүрдэж болно, энэ нь хамаагүй. Хэрэв хэд хэдэн багана байгаа бол түүнийг дахин хаалтанд буулгах шаардлагатай бөгөөд ингэснээр хэлний урьдчилсан боловсруулагч үүнийг анхдагч түлхүүр бөгөөд түүний ард бусад бүх багана нь Clustering түлхүүр гэдгийг ойлгох болно. Энэ тохиолдолд тэдгээр нь харагдах дарааллаар нь харьцуулагчаар дамжих болно. Өөрөөр хэлбэл, эхний багана нь илүү ач холбогдолтой, хоёр дахь нь бага ач холбогдолтой гэх мэт. Жишээлбэл, бидний бичих арга нь өгөгдлийн ангиудын талбаруудтай тэнцүү байна: бид талбаруудыг жагсааж, тэдгээрийн хувьд аль нь том, аль нь жижиг болохыг бичдэг. Кассандрагийн хувьд эдгээр нь харьцангуйгаар өгөгдлийн ангийн талбарууд бөгөөд үүнд зориулж бичсэн тэнцүүг ашиглах болно.

Бид ангиллыг тогтоож, хязгаарлалт тавьдаг

Түлхүүрийг үүсгэх үед эрэмбэлэх дараалал (буурах, өсөх, юу ч байсан) тавигддаг бөгөөд дараа нь өөрчлөх боломжгүй гэдгийг санах хэрэгтэй. Энэ нь өгөгдлийг хэрхэн ангилах, хэрхэн хадгалахыг физик байдлаар тодорхойлдог. Хэрэв та кластерын түлхүүр эсвэл эрэмбэлэх дарааллыг өөрчлөх шаардлагатай бол шинэ хүснэгт үүсгэж, түүнд өгөгдөл дамжуулах шаардлагатай болно. Энэ нь одоо байгаатай ажиллахгүй.

Кассандра. Хэрэв та зөвхөн Oracle-ийг мэддэг бол яаж үхэхгүй байх вэ

Бид хүснэгтээ хэрэглэгчдээр дүүргэж, тэд эхлээд төрсөн он, дараа нь зангилаа бүр дээр цалин, хэрэглэгчийн ID-аар нь цагирагт унасныг харав. Одоо бид хязгаарлалт тавих замаар сонгож болно.

Манай ажлын нэг дахин гарч ирнэ where, and, мөн бид хэрэглэгчидтэй болж, бүх зүйл дахин сайхан болно. Гэхдээ хэрэв бид Clustering key-ийн зөвхөн нэг хэсгийг нь ашиглахыг оролдвол Кассандра тэр даруй манай газрын зураг дээр тэг харьцуулагчийн талбартай энэ объект болон энэ нэгийг олохгүй байна гэж гомдоллох болно. тэр зүгээр л тавьсан байсан , - тэр хаана хэвтэж байна. Би энэ зангилаанаас бүх өгөгдлийг дахин татаж аваад шүүх хэрэгтэй болно. Энэ бол зангилаа доторх Full Scan-ийн аналог бөгөөд энэ нь муу юм.

Ямар ч тодорхойгүй нөхцөл байдалд шинэ хүснэгт үүсгэ

Хэрэв бид хэрэглэгчдийг ID, нас, цалингаар нь зорилтот түвшинд байлгахыг хүсвэл бид юу хийх ёстой вэ? Юу ч биш. Зөвхөн хоёр хүснэгтийг ашигла. Хэрэв та гурван өөр аргаар хэрэглэгчдэд хүрэх шаардлагатай бол гурван хүснэгт байх болно. Бид шураг дээр зай хэмнэж байсан үе өнгөрсөн. Энэ бол хамгийн хямд нөөц юм. Энэ нь хариу өгөх хугацаанаас хамаагүй бага зардалтай бөгөөд энэ нь хэрэглэгчдэд хохирол учруулж болзошгүй юм. Хэрэглэгч ямар нэг зүйлийг 10 минутын дотор хүлээж авахаас секундын дотор авах нь илүү тааламжтай байдаг.

Бид хэрэгцээгүй орон зай, хэвийн бус өгөгдлийг солилцож, сайн масштабтай, найдвартай ажиллах чадвартай болгодог. Эцсийн эцэст, гурван дата төвөөс бүрдэх кластер тус бүр нь таван зангилаатай, өгөгдөл хадгалах зөвшөөрөгдөх түвшний (юу ч алга болоогүй үед) нэг дата төвийн үхлийг бүрэн даван туулах чадвартай. Мөн үлдсэн хоёр нь тус бүр дээр хоёр зангилаа. Үүний дараа л асуудал эхэлнэ. Энэ бол нэлээд сайн илүүдэл бөгөөд хэд хэдэн нэмэлт SSD хөтчүүд болон процессорууд хэрэгтэй. Тиймээс хэзээ ч харилцаа холбоогүй, гадаад түлхүүрүүд байдаггүй, хэзээ ч SQL байдаггүй Кассандра-г ашиглахын тулд та энгийн дүрмийг мэдэх хэрэгтэй.

Бид таны хүсэлтийн дагуу бүх зүйлийг зохион бүтээдэг. Хамгийн гол нь өгөгдөл биш, харин програм түүнтэй хэрхэн ажиллах вэ гэдэг нь чухал юм. Хэрэв энэ нь өөр өөр өгөгдлийг өөр өөр аргаар эсвэл ижил өгөгдлийг өөр өөр аргаар хүлээн авах шаардлагатай бол бид үүнийг програмд ​​тохиромжтой байдлаар байрлуулах ёстой. Үгүй бол бид бүрэн сканнердсанд бүтэлгүйтэх бөгөөд Кассандра бидэнд ямар ч давуу тал өгөхгүй.

Өгөгдлийг хэвийн бус болгох нь хэвийн үзэгдэл юм. Бид ердийн маягтуудыг мартаж, харилцааны мэдээллийн сангүй болсон. Юмыг 100 удаа тавихад 100 удаа хэвтэнэ. Энэ нь зогсохоос хамаагүй хямд хэвээр байна.

Бид хуваах түлхүүрүүдийг ердийн байдлаар хуваарилахын тулд сонгоно. Түлхүүрийнхээ хэш нь нэг нарийн хязгаарт багтахыг бид хүсэхгүй байна. Өөрөөр хэлбэл, дээрх жишээнд төрсөн он нь муу жишээ юм. Бүр тодруулбал, манай хэрэглэгчид төрсөн он жилээр нь хэвийн тархсан бол сайн, хэрэв бид 5-р ангийн сурагчдын тухай ярьж байгаа бол муу - тэнд хуваалт тийм ч сайн биш байх болно.

Кластерын түлхүүр үүсгэх үе шатанд эрэмбэлэхийг нэг удаа сонгоно. Хэрэв өөрчлөх шаардлагатай бол бид хүснэгтээ өөр түлхүүрээр шинэчлэх шаардлагатай болно.

Хамгийн гол нь: Хэрэв бид ижил өгөгдлийг 100 өөр аргаар авах шаардлагатай бол 100 өөр хүснэгттэй болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх