Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB

Nuper dixi tibi quomodo, utens receptaculis vexillum proventus in observantia SQL legere queries ex PostgreSQL database. Hodie loquemur quomodo fieri potest efficacius memoria in database, sine ullo "torquet" in config - simpliciter, recte ordinando notitia fluit.

Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB

#1. Sectioning

Articulus quomodo et quare valet ordinare? applicatas partitionibus "in doctrina" iam hic loquemur de usu applicandi aliquos aditus nostros magna opera pro centum servientibus PostgreSQL.

"Res dierum praeteritionis..."

Initio, sicut quaelibet MVP, consilium nostrum sub onere satis levi incepit - vigilantia tantum duodecim servientium criticorum peractum est, omnes tabulae inter se compactae erant. ac magis atque iterum uno aliquid conaremur tables 1.5TB in magnitudineintelleximus quod, licet hoc modo vivere posset, valde incommodum erat.

Tempora paene ut epicis temporibus erant, variae versiones PostgreSQL 9.x pertinebant, ita omnes partitiones faciendae erant "manually" - per mensa hæreditatem et triggers profectus est dynamic EXECUTE.

Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB
Solutio inde evenit satis universale quod ad omnes tabulas transferri posset.

  • Mensa inani "capitis" parentis declarata est, quae omnia descripsit index necessaria et triggers.
  • Commentarius de huius sententia in mensa "radicis" facta est, et interne utens profectus felis BEFORE INSERT recordum "physice" in sectione inquisita inseri. Si nihil tale adhuc, exceptum et prehendimus.
  • … ab usura CREATE TABLE ... (LIKE ... INCLUDING ...) creatus est in mensa parentis secundum exemplum sectioni cum restrictione in desideravit dateut cum notitia reddat, lectio nonnisi in eo perficitur.

PG10: primo conatus

Sed partitio hereditatis historice non aptior fuit ad tractandum de activa scribentium rivo vel multitudine infantum partitionum. Exempli gratia, memorare potes algorithmum ad sectionem requisitam eligendam habuisse quadratae complexionemquod cum sectionibus 100+ operatur, ipse intelligis quomodo...

In PG10 hoc statu valde optimized est ad sustentationem fovendam patria partitionibus. Ergo statim post migrationem ceptaculum adhibere conati sumus, sed...

Cum euenit fodiendo per manus manuali, mensa partita in hac versione est:

  • non support index descriptiones
  • non triggers support in eo
  • non potest esse alicuius "degener"
  • non support INSERT ... ON CONFLICT
  • non potest generare sectionem automatice

Accepto dolore frontis ictum cum rastro, intelleximus id sine applicatione immutato fieri posse, et in sex menses ulteriorem inquisitionem distulisse.

PG10: secundo casu

Ita coepimus singulatim orta problemata solvere;

  1. Quia triggers et ON CONFLICT Invenimus nos adhuc eis hic et ibi indigere, ut medium fecerimus ad operandum eos ineundo mensam.
  2. Abiecisse "fuso" in triggers - id est, ex EXECUTE.
  3. Seorsim tulerunt eam template mensam cum omnibus indicibusut ne adsit quidem in procuratorio tabellae.

Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB
Tandem post haec omnia tabulam principalem nativam partitavimus. Creatio novae sectionis adhuc conscientiae applicationis relinquitur.

"Sawing" dictionaries

Sicut in quavis ratione analytica, nos etiam habuimus facta et secet; (dictionaries). In nobis in hac facultate agebant, e.g. template corpus similes interrogationes tardae vel textus ipsius interrogationis.

"Res" in die iam diu secatae sunt, itaque sectiones iam datas placide delevimus, nec nobis molesti sunt. Difficultas cum dictionariis...

Non dico multum esse, sed proxime 100TB de "facta" consecuta in 2.5TB dictionario. Non potes commode aliquid ex tali mensa delere, non potes illud tempore congruo comprimere, et scribendo sensim tardior factus est.

Sicut dictionarium... in eo, singuli introitus exacte semel exhibeantur... et hoc verum est, sed!... Nemo nos prohibet habere separatum dictionarium singulis diebus! Imo hoc affert nugationem quandam, sed admittit;

  • scribentes injustitiam / legere citius ex minore magnitudine
  • minus memoriae per opus magis pacto index
  • copia minus notitia propter facultatem cito removere outdated

Ex toto complexu mensurarum CPU onus minuitur ~ XXX%, orbis onus by ~ L%:

Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB
Eodem tempore in datorum modo minus onere prorsus eadem scribere perstrinximus.

#2. Database evolutionis et refactoring

Ita constituimus quod habemus quisque diem suum habet sectionem with data. Profecto, CHECK (dt = '2018-10-12'::date) β€” et est clavis partitionis ac conditio monumenti in sectionem certam cadere.

Cum omnes relationes in ministerio nostro aedificatae sint in contextu certae aetatis, indices earum, quia tempora non partita omnia genera fuerunt. (Servus, diem, Consilium Template), (Servus, diem, Consilium node), (diem, Error classis, Servo)...

Nunc autem per singulas partes vivunt exemplaribus tuis quisque talis index... Et infra singulas partes date est assidue... Evenit ut nunc sumus in unoquoque indice tantum intrant constant ut unum ex agris, quod et volumen auget et tempus conquirit, sed nullum affert fructum. Relictis rastris ad se geras ...

Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB
Directio ipsum patet - simplex removere diem agrum ab omnibus indicibus in tabulis partita. Nostris libris, lucrum est fere 1TB/septimana!

Nunc notemus hunc terabytum adhuc aliquo modo notari oportuisse. Hoc est, et nos orbis nunc onerare minus! Haec pictura clare ostendit effectum ex purgatione, cui per hebdomadam devovimus;

Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB

#3. "Spatiando" ad apicem onus

Unus ex magnis molestiis systematibus onustis est superuacua synchronisation aliquas operationes non requirunt. Aliquando "quia non animadvertebant", interdum "facilius erat", sed citius aut postea carere debes.

Let's zoom in on the previous picture and see that we have a disk "Sumps" sub onere cum duplici amplitudine inter exempla proxima, quae evidenter "peraeque" accidere non debent cum tot operationibus;

Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB

Id consequatur facilis sit. Nos iam coepi magna prope M serversunumquodque procedit a filo logico separato, et quodlibet stamina cumulata informationes mittendi datorum ad quamdam frequentiam, aliquid simile;

setInterval(sendToDB, interval)

Quaestio hic in eo posita est omnia fila incipiant fere eodem temporeita tempora mittentes ad punctum fere semper coincidunt. Oops #2...

Fortunate, hoc satis facile est figere; addendo "temere" run-sursum tempus:

setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))

#4. Nos cache quod opus est

Quaestio tertia traditional highload non cache ubi est posset esse.

Exempli gratia, nos in terminis nodis consilii analysi fieri possemus (omnia haec Seq Scan on users) sed statim putant eos plerunque eosdem esse oblitos.

Immo, nihil scriptum est iterum datorum, haec intercludit felis INSERT ... ON CONFLICT DO NOTHING. Sed haec notitia adhuc datorum datorum attingit, nec necesse est legere ut reprehendo pro conflictu placeat. Oops #3...

Differentia in numero monumentorum datorum missis ante/postquam caching perspicitur:

Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB

Et hoc est gutta comitatus in repositione oneris;

Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB

in summa

"Terabyte-per-die" tantum sonat scary. Si omnia recte facis, hoc iustum est 2^40 bytes / 86400 seconds = ~12.5MB/sut etiam escritorio iDe cochleis tenebatur. πŸ™‚

Sed serio, etiam cum decuplo "skw" oneris interdiu, facile poteris occurrere capacitatibus SSDs modernorum.

Scribens in PostgreSQL sub lucem: 1 hospes, 1 dies, 1TB

Source: www.habr.com