RT: Wie werde ich Altlasten wieder los?
Unser RT läuft seit nunmehr 8 Jahren und es sind einiges an Daten bereits im System gelandet, wie wird man sowas aber wieder los? Klaro, RTx-Shredder.
Vorab ein paar Infos zu unserem RT:
- Priv. Users: ~50.000
- Unpriv Users: ~8.500.000 (davon etwa 70% Spammer)
- Queues: ~1500
- Tickets: ~3.000.000
- DB Size: ~300GB
Da wir gerade mitten in der Migration von RT 3.6.5 zu RT 3.8.6 sind und bei der Migration etliche Datenbank Aktionen auszuführen sind, haben wir uns entschlossen unsere DB ein wenig zu verschlanken. Wir wollten erstmal alle Ticket im Status “DELETED” aus dem System haben und danach bezogen auf die Queue auch diverse Status “RESOLVED” Tickets entfernen (wo es uns Aufgrund gesetzlicher Regelungen möglich ist)
Nach der Installation des RTx-Shredder aus dem CPAN Archiv von Ruz legten wir fleissig los (PS: die Doku dazu ist wie gewohnt zum kotzen) und waren recht schnell ernüchtert da wir pro Ticket etwa 1 Minute in unserem Live System brauchten – wo lag das Problem?
Problem: In der RTx-Shredder Doku steht nirgendwo offensichtlich dass man DB Indexe setzen muss, erst nach ein wenig lesen (perldoc) findet man Hinweise darauf – da sollte Ruslan aber doch ein wenig eindeutiger drauf hin weisen.
OK, kommen wir zu den Ergebnissen auf unserem Test System
Vorraussetzungen:
- 1 x Server, MySQL, Apache local installiert
- 1 x RT 3.6.9 installiert, RTx-Shredder von CPAN installiert
- 1 x RT 3.8.6 mit RT-Shredder installiert (RT-Shredder ist Teil vom RT seit 3.8.x)
- mit dem rt-filler script aus dem BPS SVN ein paar Queues (1000) und User (50.000) angelegt und dann Tickets erzeugt (500.000).
- Die Tickets sind nur sehr grundlegend erzeugt, kein richtiger Content, keine Attachments, keine Links
Ergebnisse mit RT 3.6.5 – löschen von 10 Tickets
Aus dem: perldoc /opt/rt3/local/lib/RTx/Shredder.pm:
Database indexes
To speed up shredding you can add several indexes to your DB.
- CREATE INDEX SHREDDER_CGM1 ON CachedGroupMembers(MemberId, GroupId, Disabled);
- CREATE INDEX SHREDDER_CGM2 ON CachedGroupMembers(ImmediateParentId, MemberId);
- CREATE UNIQUE INDEX SHREDDER_GM1 ON GroupMembers(MemberId, GroupId);
- CREATE INDEX SHREDDER_TXN1 ON Transactions(ReferenceType, OldReference);
- CREATE INDEX SHREDDER_TXN2 ON Transactions(ReferenceType, NewReference);
- CREATE INDEX SHREDDER_TXN3 ON Transactions(Type, OldValue);
- CREATE INDEX SHREDDER_TXN4 ON Transactions(Type, NewValue);
If shredding is slow anyway then you have to get list of slow queries, for example mysql has special options to turn on log of slow queries, queries that takes more than one second can be considered as slow, then send the log to the “AUTHOR”.
Database transactions support
Since RTx-Shredder-0.03_01 extension uses database transactions and should be much safer to run on production servers.
Foreign keys
Mainstream RT doesn’t use FKs, but at least I posted DDL script that creates them in mysql DB, note that if you use FKs then this two valid keys don’t allow delete Tickets because of bug in MySQL:
- ALTER TABLE Tickets ADD FOREIGN KEY (EffectiveId) REFERENCES Tickets(id);
- ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (Via) REFERENCES CachedGroupMembers(id);
<http://bugs.mysql.com/bug.php?id=4042>
1. Tickets löschen mit den Standard Einstellungen
real 0m29.477s user 0m6.638s sys 0m0.323s
2. Tickets löschen mit gesetzten Indexen
real 0m10.041s user 0m6.612s sys 0m0.354s
3. Tickets löschen mit auskommentierten RT::Logger in Shredder/Record.pm und Indexen gesetzt
real 0m9.475s user 0m6.196s sys 0m0.317s
Ergebnisse mit RT 3.8.6 – löschen von 10 Tickets
Achtung: Im Shredder von 3.8.x finden sich leider keine Hinweise mehr auf die DB Indexe! Ich habe extra nochmal in der DB nachgesehen, die wurden auch nicht gesetzt, statt dessen steht im perldoc Shredder.pm folgendes:
Database transactions support
Since 0.03_01 RT::Shredder uses database transactions and should be much safer to run on production servers.
Foreign keys
Mainstream RT doesn’t use FKs, but at least I posted DDL script that creates them in mysql DB, note that if you use FKs then this two valid keys don’t allow delete Tickets because of bug in MySQL:
- ALTER TABLE Tickets ADD FOREIGN KEY (EffectiveId) REFERENCES Tickets(id);
- ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (Via) REFERENCES CachedGroupMembers(id);
<http://bugs.mysql.com/bug.php?id=4042>
Achtung: Diese Werte würde ich nicht einfach übernehmen, da es, zumindest in meiner Test Installation, nicht das Löschen von Tickets deaktivierte sondern ich nicht mehr in der Lage war Tickets zu erstellen!
Ich habe mir dann doch lieber wieder die Index Empfehlungen aus dem CPAN Shredder installiert! (siehe weiter unten)
1. Tickets löschen mit Shredder default Einstellungen
real 1m10.415s user 0m11.384s sys 0m0.735s
2. Tickets löschen mit auskommentierten RT::Logger in Shredder/Record.pm
real 1m7.595s user 0m10.439s sys 0m0.615s
3. Tickets löschen nach DB Index Erzeugung
real 0m48.338s user 0m10.489s sys 0m0.677s
Indexe:
- CREATE INDEX SHREDDER_CGM1 ON CachedGroupMembers(MemberId, GroupId, Disabled);
- CREATE INDEX SHREDDER_CGM2 ON CachedGroupMembers(ImmediateParentId, MemberId);
- CREATE UNIQUE INDEX SHREDDER_GM1 ON GroupMembers(MemberId, GroupId);
- CREATE INDEX SHREDDER_TXN1 ON Transactions(ReferenceType, OldReference);
- CREATE INDEX SHREDDER_TXN2 ON Transactions(ReferenceType, NewReference);
- CREATE INDEX SHREDDER_TXN3 ON Transactions(Type, OldValue);
- CREATE INDEX SHREDDER_TXN4 ON Transactions(Type, NewValue);
Vergleich der Shredder und Ergebnisse
Ohne Index:
RT 3.6.9: 0m 29.477s
RT 3.8.6: 1m 10.415s
Mit Index und ohne Log Ausgabe:
RT 3.6.9: 0m 9.475s
RT 3.8.6: 0m 48.338s
Unterm Strich bleibt da nur zu hoffen, dass Ruz sich das Problem einmal ansieht und bis wir endlich mit RT 3.8.x live sind das auch behoben ist.
Categorie: RT, Tags: Database, Index, MySQL, RT, Shredder
Updated at November 27, 2009 by admin, write at November 27, 2009 by admin | Log in
Hi Torsten,
ich habe vor kurzem bei uns auch einen Upgrade von 3.6.3 auf 3.8.6 gemacht. Allerdings ist unsere DB nicht so groß wie bei Euch. Daher war eine Aufräumaktion nicht notwendig. Trotzdem hatte ich anschließend mal den Shredder ausprobiert und direkt einen Bug gefunden. Eigentlich sollte er nur einen User löschen, hat aber noch zusätzlich ein Ticket gelöscht (http://rt3.fsck.com/Ticket/Display.html?id=14170). Daher wäre ich mit dem Shredder vorsichtig und würde mir genau ansehen, was er gelöscht hat
Die schlechte Performance vom Shredder ist mir auch direkt aufgefallen. Teilweise existieren die im CPAN Modul genannten Indexe schon in der DB. Nur auf der Tabelle Transactions existieren die Index nicht. Ich habe bei Ruslan mal nachgefragt warum.
Gruß Chris