Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 11. Előadás: Write concern, sharding
Write concern szerver lemez update CPU Alkalmazás Memória Adatok Napló w = 1; j = false
Write concern QUIZ w j 1 false Nem várjuk ki a napló felírását a lemezre gyors, kissé veszélyes true Kivárjuk a napló felírását a lemezre lassú Nem ajánlott, nincs semmiféle visszajelzés Feltételezve, hogy a lemez perszisztens, milyen w és j értékek kellenek, hogy az insert vagy update utasítás mindenképpen felírásra kerül a lemezre? w=0; j=0 w=1; j=1 w=2; j=0 w=1; j=0
Hálózati hibák (Network errors) Applikáció MongoDB w=1; j=1 insert – nincs gond, mert max duplicate key error-t ad.
Quiz: hálózati hibák (Network errors) Mi lehet az oka, ha egy alkalmazás hibaüzenetet kap akkor is, ha az írás sikeres volt. Pipáljuk a helyes megoldásokat. A hálózati TCP kapcsolat az alkalmazás és a szerver között reszettelt, miután a szerver megkapta az írást, de azelőtt, mielőtt a választ el tudta volna küldeni A MongoDB szerver leállt az írás bejövetele és a rá adott válasz között A hálózat meghibásodott az írás ideje és az az időpont között, míg a kliens megkapta a választ Az írás megszegett egy elsődleges kulcs megszorítást a kollekción
Bevezetés a replikációba Availability – üzemkészség, használhatóság Fault tolerance – hibatűrő képesség Replika – halmaz (replica set) Primary (elsődleges) Secondary(másodlagos) Secondary(másodlagos) mongod mongod mongod Appliká-ció Esik a szerver – választás következik
Replika halmaz választás - választhatóság Csomópont típusok a replikációs halmazban: Regular (szokásos) - szavaz Arbiter (bíró) - szavaz Delayed Regular(késleltetett szokásos) (P=0) szavaz Hidden (rejtett) (P=0) – elemzésre van - szavaz
Write consistency (írás konzisztencia) Primary (elsődleges) Secondary(másodlagos) Secondary(másodlagos) mongod mongod mongod R R R W Appliká-ció 8
Replika halmaz készítése mkdir -p /data/rs1 /data/rs2 /data/rs3 mongod --replSet m101 --logpath "1.log" --dbpath /data/rs1 --port 27017 --oplogSize 64 --fork –smallfiles mongod --replSet m101 --logpath "2.log" --dbpath /data/rs2 --port 27018 --oplogSize 64 --smallfiles –fork mongod --replSet m101 --logpath "3.log" --dbpath /data/rs3 --port 27019 --oplogSize 64 --smallfiles --fork
Replikáció használata config = { _id: "m101", members:[ { _id : 0, host : "localhost:27017" ,priority:0, slaveDelay:5}, { _id : 1, host : "localhost:27018"}, { _id : 2, host : "localhost:27019"} ]}; rs.initiate(config); rs.status(); Nem futtathatjuk a 27017-es porton, mert az nem lehet elsődleges szerver. mongo --port 27018 (rs.slaveOk())
Replikáció használata - Quiz Mely utasítás a mongo shell-ből az, amelyik megengedi az olvasást a másodlagos szerverről? db.isMaster() db.adminCommand({'readPreference':'Secondary"}) rs.setStatus("Primary") rs.slaveOk()
Replika-halmaz belső információk M - P M - S M - S oplog oplog oplog local adatbázisban van az oplog. Create collection és insert document külön utasítások. Oplog – capped collection, vagyis fix maximális mérete van, s a legrégibb információk elvesznek belőle.
Replika-halmaz belső információk Mely mondatok a következőkből igazak a replikáció szempontjából. Jelöljük azokat, amelyek igazak. Írhatunk az elsődleges vagy a másodlagos csomópontnak és az adatbázis továbbítja az írást az elsődleges szervernek. A replikáció támogatja a többfajta motor egyszerre való használatát. Például, egy mmapv1 elsődleges és egy wiredTiger másodlagos szervert Az oplog másolatai mind az elsődleges mind a másodlagos szervereken megjelenik. Olvasni lehet mind az elsődlegesről, mind a másodlagosról alapértelmezetten. Az oplog egy capped kollekció (max méretű, csak a legfrisseb beférő információt tárolja).
Failover and rollback Feltételezzük, hogy az elsődleges leesik, s vannak a saját oplogban olyan írási műveletek, amelyek a másodlagos szervereken nincsenek meg. Főleg az a másodlagos számít, amelyikből elsődleges lett. Ha a volt elsődleges visszaáll, megnézi az aktuális szerver oplogját, s rájön, hogy vannak olyan írási műveletek a saját oplogjában, amelyek nincsenek az új szerveren. Akkor ezeket visszaforgatja. Ennek a problémának kiküszöbölése olyanformán lehet, hogy addig nem írunk az elsődleges szerverre, míg a többi szerver több, mint fele nem írta be.
Failover and rollback - QUIZ Mi történik, ha egy csomópont visszatér, mint egy másodlagos szerver, és semmit se ismer fel az elsődleges oplog-ból? Az egész adatbázist átveszi az elsődlegesről. Egy visszaforgatás fog bekövetkezni. Az új csomópont offline-ban marad (nem lépik vissza a replika halmazba) Az új csomópont elkezdi számolni a Pi számot nagyon nagy tizedesnyi pontossággal.
Connecting to a replica set from pymongo import pymongo import sys c = pymongo.MongoClient(host= ["mongodb://localhost:27017", "mongodb://localhost:27018", "mongodb://localhost:27019"], replicaSet="m101", w=1, j=True) db = c.m101 people = db.people
Connecting to a replica set from pymongo try: print "inserting" people.insert_one({"name":"Andrew Erlichson", "favorite_color":"blue"}) print "inserting" people.insert_one({"name":"Richard Krueter", "favorite_color":"red"}) print "inserting" people.insert_one({"name":"Dwight Merriman", "favorite_color":"green"}) except Exception as e: print "Unexpected error:", type(e), e print "completed the inserts"
Mi történik amikor hiba következik be? P S S APP - pymongo Esik a szerver, az alkalmazás nem tud se írni, se olvasni.
Naiv kezelés import pymongo import sys import time c = pymongo.MongoClient(host=["mongodb://localhost:27017", "mongodb://localhost:27018", "mongodb://localhost:27019"], replicaSet="m101") db = c.m101 things = db.things things.delete_many({}) # remove all the docs in the collection for i in range(0,500): things.insert_one({'_id':i}) print "Inserted Document: " + str(i) time.sleep(.1)
Hiba felfedezése for i in range(0,500): try: things.insert_one({'_id':i}) print "Inserted Document: " + str(i) time.sleep(.1) except Exception as e: print "Exception ",type(e), e
Hiba megfelelő kezelése beszúráskor for i in range(0,500): for retry in range (3): try: things.insert_one({'_id':i}) print "Inserted Document: " + str(i) time.sleep(.1) break except pymongo.errors.AutoReconnect as e: print "Exception ",type(e), e print "Retrying.." time.sleep(5) except pymongo.errors.DuplicateKeyError as e: print "duplicate..but it worked"
Hiba megfelelő kezelése olvasáskor for i in range(0,500): for retry in range (3): try: things.find_one({'_id':i}) print "read document: " + str(i) time.sleep(.1) break except pymongo.errors.AutoReconnect as e: print "Exception ",type(e), e print "Retrying.." time.sleep(5)
Hiba megfelelő kezelése módosításkor for i in range(0,500): for retry in range (3): try: things.update_one({'_id':i}, '$inc':{'votes':1}}) print "Updated Document: " + str(i) time.sleep(.1) break except pymongo.errors.AutoReconnect as e: print "Exception ",type(e), e print "Retrying.." time.sleep(5)
Hiba kezelése módosításkor Idempotens módosítás Nem idempotens módosítás $set $inc $push Update jött létre: Újrafuttatjuk Ellenőrizzük azt, hogy megtörtént-e az update azelőtt Nem futtatjuk újra Idempotenssé alakítjuk át.
Write Concern újratöltve w j wtimeout w=1, 2, 3 j=1 w=1 – acknoledge a szervertől w=2 – acknoledge az egyik slavetől is. w=3 mindhárom eleme a replika-szetnek j=1 – journal a szerverre
Olvasási preferenciák Primary Primary preferred Secondary Secondary preferred Nearest Eventually consistent read (lehteségesen konzisztens olvasás).
Replikáció implikációjának szemléje Seed list – szerverek listája Write concern: w, j, wtimeout Read preferences Errors can happen
Bevezetés a shardingba Sharding – skálázhatóság megteremtése. s1 s2 s3 s4 s5 mongos Range based – intervallum alapú Shard key – shard kulcs chunk –darab App mongo Minden shard lehet egy replika halmaz (15 szerver)
Elkészíteni egy shard környezetet m m m m m m m m m mongos config server 27017 config server Range based Hash based config server
Sharding implikációk Minden dokumentum tartalmazza a shard kulcsot Shard kulcs nem változtatható meg Az index a shard kulcscsal kezdődik Nincs shard kulcs, mindent vizsgálj Nincs egyedi (unique) kulcs, ha nincs benne a shard kulcs
Choosing a Shard Key