En rejse med MongoDB

Traditionelle SQL databaser, som MySQL, Postgresql og Microsoft SQL server, har fået en ny konkurrent. Skalerbarhed og Big Data får folk til at kigge efter alternativer. Folk løber tilsyneladende lidt for tit ind i problemer med at skaler deres SQL løsninger. Pludselig er deres applikationer vokset fra dem, og der skal skaleres op til mere data. Databaser kan blive så komplekse, at man hellere hakker noget spaghetti kode sammnen, for at løse problemet hurtigt
Derfor er NoSQL databaser noget der vokser og bliver mere populært.

Jeg har minimalt erfaring med Big Data og NoSQL. Big Data finder jeg uhyre fascinerende, og samtidig også skræmmende (men det er en anden post). Samtidig er jeg også et nysgerrigt menneske, når det kommer til IT. Jeg elsker at lege.

I mit nye job, er vi også løbet i nogle udfordringer med traditionelle SQL server. Derfor har vi valgt at bruger MongoDB til et projekt, hvor vi har meget udskiftelig data. Stort set bruger vi kun databasen som en container, indtil dataen ryger et andet sted.

Min umiddelbare oplevelse med MongoDB, er blandede. MongoDB er feature stærk, og har en ret simpel konfig. Vi fik sat en server hutigt op og fik den i brug på ingen tid, men vi skulle også bruge noget data sikkerhed. Traditionel backup virkede omsonst, da dataen i MongoDB max vil være der en uges tid, og så er den væk. Samtidig er det en mission critical service, som er afhængig af MongoDB.

Det vi så gjorde var, at lave vores stand alone MongoDB til Master / Slave. Det var ligetil. Der er master slave parameter i mongodb.conf.
Problemet her er dog, at vi ikke har noget fail over. Ryger master ned, så kunne vi ikke bare lige automatisk få en fail over.

Løsningen var dog ligetil. Et replica set. I sin apps connection string, kan man specificere flere servere, som kan bruges til fail over.
Kort fortalt består et replicaset, af en Primary, og så en flok secondaries. I vores setup har vi en primary og to secondaries. Vi har konstant real time backup af vores data, og skulle primary ryge ned, så vælger de to seconadies en ny primary, og vores app forbinder automatisk der til. Easy, ikke sandt?

Wrong.

Her er det hvor oplevelserne med MongoDB bliver EKSTREMT mudret. MongoDBs dokumentation er ekstremt mangefuld. Vi fandt et hav af guides til opsætning af replica set, og langt de fleste af dem var mangefulde. Det tog mig meget lang tid at få det til at fungere.

Men her kan jeg kort opsumere hvad vi gjorde for at få det til at fungere.
Vi installere vores primary MongoDB instans. I mongodb.conf sikre jeg mig, at auth = true, er udkommenteret.
Næste skridt er at forbinde til mongo


mongo
>
> use admin
switched to db admin
> db.addUser( { user : "admin", pwd : "kode", roles : "userAdminAnyDatabase" } )

Når det er gjort, kan du lave databaser som du lyster. Kommentere auth = true ind igen.

Næste skridt er at sætte secondaries op. Det er bare at installere dem. Her var det jeg oprindeligt løb i problemer, da jeg konfigurede dem med en administrator. Det er vigtigt, at de ikke har nogen locale database, når primary begynder at skubbe sin konfig ud.

For at Secondaries kan læse fra Primary, så skal de autoriseres. Der bruger vi keyFile. I en terminal skriv

openssl rand -base64 741

og kopiere det indhold i en fil (jeg bruger /srv/keyfile) og chown mongodb:mongodb på filen, og chmod 400. I mongodb.conf (på alle instanser) tilføjer du keyFile = /srv/keyfile
Dernæst, på alle instanser igen, tilføjer du replSet = mitreplset i mongodb.conf

Genstart alle instaner, så de starter op med keyfile og replset. Forbind til din primary, og initialiser replica settet

mongo > use admin
> db.auth('admin','kode')
> rs.initiate()

Dermed starter man sit replica set. Nu skal der tilføjes medlemmer. Det er EKSTREMT vigtigt, at de bliver tilføjet med DNS, og ikke IP.


> rs.add('secondary1.example.dk:27017')
> rs.add('secondary2.example.dk:27017')

Køb rs.status() på primary, og så vil du se, at dit replica set nu har tre members. Det burde du ihvertfald.

Det har taget mig virkeligt lang tid at få det her til at fungere ordentligt. Alt for meget dårlig dokumentation. MongoDB er spændende. Det virker som et ekstremt stærkt værktøj. Men det er ikke til alt. Vi har gang i nogle spændende projekter her, og det glæder jeg mig meget til at dykke mere ned i. Især ned i MongoDB.
Det starter

Leave a Reply

Your email address will not be published. Required fields are marked *