First of all some questions:

Has anybody out there startet to implement a higher availability of MoinMoin?
      I have some ideas for this topic, because in my company MoinMoin just starts to become mission-critical :-) .

But is this feature really important? Who needs this feature too?

Basic Scenario

My (after 2 days of thinking) favourity scenario is this:

  1. MasterServer, EditingSystem

    • There is one MasterServer, where editing happens

    • And we will have a HotStandby-MasterServer, which is inactive and becomes active, when s.o. makes him so, because the MasterServer has crashed

    • Synchronisation between the two servers could be made by some rsync-Scripts.
      • More precise: Synchronisation between Master and HotStandbyMaster is unidirectional, but the "HSM" has the same configuration than the Active Master (like Cisco CSS)

  2. SlaveServer, LiveSystem

    • There can be multiple SlaveServers, maybe two or three, synchronised by rsync with the Master, but without any Editing-Function.

    • ReadOnly should be realized by reducing the allowed ACLs to "read".

    • The EditButton is a Link to the MasterServer with normal ACLs.

    • Slaves could be accessed by DNS-Round-Robin or by a dedicated LoadBalancer-Architecture.

Implementation-Ideas:

After some days of installing 2 UML-instances i'm ready to implement the idea described above. But there are some details i dislike:

Now, my idea is this:

Some other aspects:

I think, if we have implemented this, we have a healthy margin (have a lead) over other engines like MediaWiki or TWiki. And i think, this could boost the acceptance from moinmoin in bigger companies.

I think the best solution would be to put all the wikis behind a load balancer that can route request according to the url, such as Pound. Then filter all urls that have action=edit and all urls with method POST to the master wiki. All other wikis will get only GET and other read-only actions.

Maybe (after moin is fixed and no GET will change data) you can even route only POST to the master wiki. One can edit the page on one wiki, preview, but the last save will go automatically and transparently to the master wiki. All the wikis will have the same url.

If you go with this solution, then any wiki can act as master, and any other wiki can act as master standby. When a wiki save its data - edit/delete/rename/attach, it will save the data on its own copy, and update all other wikis in the group.

When a master wiki fail, the load balancer will route the request to another wiki and it will become master automatically. When it will save data, it will update all other wikis.

To implement, you have to use a common list of all wikis in the group, so each wiki can update all other wikis. You can put this list on a shared file system, or on a local web server.

If you want to go with the wiki solution, it will be much more work. You will have to catch all the action that change the data and hack all the links to those actions.

To synchronize the wikis in realtime, you will have to add code to the parts that change data, so instead of one page save, you will save the same file to multiple wikis. This can be done with wikirpc, or with direct access to the file system of the other wikis.

Implementation-Steps

Today i hacked the sync.sh-Script together, works with rsync and works with 2 (virtual, UML-) Systems. Slave syncronizes his files with the master periodically. And i extend the system-messages (in i18n/de.py, because i'm workin' in germany) on the two systems, which informs the surfers that they work on a cluster-infrastructure.
But that was not very fine. Would Shared Storage be a solution?

I'm really unsure what to do at this point...
  Waiting for inspiration ;-)

Discussion

What do you mean?


CategoryFeatureRequest

MoinMoin: FeatureRequests/MoinMoinHighAvailability (last edited 2007-10-29 19:19:21 by localhost)