MySQL partitionieren?

MySQL partitionieren?

am 18.06.2007 18:25:30 von rabe

Hallo zusammen,

für ein UUG-Projekt[1] haben wir einen FreeBSD-Jailserver
aufgesetzt mit dem Ziel, mehrere unabhängige Userlands zu
bekommen (root-rechte!).

Um gemeinsamen RAM zu sparen soll nicht, (aber könnte) in
jedem Jail ein eigener mysqld laufen, sondern ein gemeinsamer
mysqld mit ausreichend viel Speicher, der gemeinsam genutzt wird (ca 320MB).

Das Problem ist nun, dass mysqld nicht ohne weiteres "partitioniert"
werden kann, d.h. ich kann nicht beliebig viele unabhängige
"root"-Accounts mit entsprechenden Superuser-Rechten haben.

Ich habe inzwischen herausgefunden, dass ich einem user "foo"
das erzeugen von eigenen Datenbanken erlauben kann, die alle
"foo_%" heissen dürfen, in mysql.db entsprechend:

Host='xyz', User='foo', Db='foo_%', ... alles andere auf 'Y'.

foo@xyz kann somit nicht nur auf alle Datenbanken foo_% zugreifen,
die es gibt, sondern auch beliebige Datenbanken anlegen, die so
heissen. Praktisch.

Nur wie kann ich dem User "foo" erlauben, eigene "unter-user" anzulegen,
die zB "foo_www", "foo_bar" oder "foo_privat" heissen?

Mein erster Ansatz wäre, ein zentrales Webfrontend zu entwickln
(oder zu nutzen), das jedem "Kunden" (Vereinsmitglied) seine eigene /
individuelle Benutzerverwaltung ermöglicht.

Lieber wäre mir, wenn MySQL die Rechteverwaltung abstrahiert und
intern die Datenbanken/Tabellen/etc auf unabhängigen Namespaces
transparent abbildet, so dass es aus Sicht der "Kunden" mehrere
"root"-User gibt (jedem sein eigener) und auch mehrere "mysql"-Schemata
coexistieren können.

Theoretisch wäre denkbar, dass man in jedem Jail einen eigenen
schlanken mysqld-Prozess laufen lässt, der den zentralen (fetten)
Server die Arbeit machen lässt, transparent für den mysql-client
im Jail

Gibt es hier Ansätze, wie man sowas lösen könnte?


Gruß
Raphael Becker

PS:
[1] http://wiki.uugrn.org/wiki/Top.uugrn.org/Jailkonzept bzw. [2]
[2] http://wiki.uugrn.org/wiki/Intern.uugrn.org/MySQL

PPS: Ich spreche hier von "Kunden" um den Begriff "User" nicht zu überladen.
Gemeint sind Menschen, die mehrere "User" haben können.
Das ganze ist Non-commercial ;)

Re: MySQL partitionieren?

am 19.06.2007 11:03:51 von Axel Schwenke

"Raphael H. Becker" wrote:



> Das Problem ist, dass mysqld nicht ohne weiteres "partitioniert"
> werden kann, d.h. ich kann nicht beliebig viele unabhängige
> "root"-Accounts mit entsprechenden Superuser-Rechten haben.
>
> Ich habe inzwischen herausgefunden, dass ich einem user "foo"
> das erzeugen von eigenen Datenbanken erlauben kann, die alle
> "foo_%" heissen dürfen, in mysql.db entsprechend:
>
> Host='xyz', User='foo', Db='foo_%', ... alles andere auf 'Y'.
>
> foo@xyz kann somit nicht nur auf alle Datenbanken foo_% zugreifen,
> die es gibt, sondern auch beliebige Datenbanken anlegen, die so
> heissen. Praktisch.
>
> Nur wie kann ich dem User "foo" erlauben, eigene "unter-user" anzulegen,
> die zB "foo_www", "foo_bar" oder "foo_privat" heissen?

Kannst du so detailliert nicht. Aber es gibt ein CREATE USER Recht.
Und ein GRANT Recht - wer das hat, kann anderen Usern Rechte geben
(aber nicht mehr, als er selber hat).

http://dev.mysql.com/doc/refman/5.0/en/create-user.html
http://dev.mysql.com/doc/refman/5.0/en/grant.html

> Mein erster Ansatz wäre, ein zentrales Webfrontend zu entwickln
> (oder zu nutzen), das jedem "Kunden" (Vereinsmitglied) seine eigene /
> individuelle Benutzerverwaltung ermöglicht.

Man sollte das mit den Datenbank-Accounts nicht übertreiben.
Im Normalfall hat man eher "1 Account pro Applikation" statt
"1 Account pro User" - wenn "User" = "natürliche Person".

Webhoster lösen das typischerweise so, daß sie jedem User seine
eigene Datenbank geben, in der er schalten und walten darf.
Viele existierende Web-Applikation sind darauf eingestellt, ihren
Tabellen ein Prefix zu verpassen und kommen dann damit zurecht,
sich mit anderen eine Datenbank teilen zu müssen. Ist nicht schön
(vor allem vom Security-Standpunkt) aber funktioniert.


XL