When faced with these types of challenges is my first step is to look into OSS packages and how can they be combined into an actual solution. It helps me understand the underlying technologies and challenges.
ZRM Backup
I have reviewed Zmanda's Recovery Manager for MySQL Community Edition in the Fall 2008 issue of MySQL magazine. It remains one of my favorite backup tools for MySQL since it greatly simplifies the task and configuration of MySQL backups taking care of most of the details. Its flexible reporting capabilities came in handy for this project as I'll explain later. Some of the key settings:export BKUP_SET=`hostname -s`-logical
mysql-zrm-reporter --where backup-set=$BKUP_SET --type html \ --show backup-status-info >/dir/to/backup/$BKUP_SET/report.html
where /dir/to/backup could be mounted on a NFS server/dir/to/backup/$BKUP_SET/<timestamp>/
Please check the ZRM for MySQL documentation for details on its configuration and operation. Use the report format that best suits your needs, ZRM provides plenty of options and if none fits your needs exactly, you can still generate your own.
lighttpd HTTP Server
As a web server, lighty adds very little overhead so it can run on the same MySQL server and the backups can be served directly from it. If this is not acceptable and the backups are stored in an NFS volume, lighty can be installed on the NFS server, the configuration will remain very similar to the one I describe here.For this example I’ll assume that the MySQL server host is named dbhost, in which case the /etc/lighttpd/lighttpd.conf file should include:
server.modules = ( "mod_alias", "mod_access", "mod_accesslog" ) ## Default root directory set to the main backup set server.document-root = "/dir/to/backup/dbhost-logical/" ## Set one alias per backup type alias.url = ( "/logical/" => "/dir/to/backup/dbhost-logical/") alias.url += ( "/incremental/" => "/dir/to/backup/dbhost-incremental/") ## Enable logs for diagnosis server.errorlog = "/var/log/lighttpd/error.log" accesslog.filename = "/var/log/lighttpd/access.log" server.port = 8088 ## virtual directory listings enabled dir-listing.activate = "enable" ## enable debugging to facilitate diagnosis debug.log-request-header = "enable" debug.log-response-header = "enable" debug.log-request-handling = "enable" debug.log-file-not-found = "enable"
The server.document-root and alias.url settings should match the main directories for the ZRM backup sets.
Make sure that the user and / or group defined for the lighttpd process have proper permissions to access the backup set directory tree. The backups will be available as a directory listing when using the following URLs: http://dbhost:8088/logical/ or http://dbhost:8088/incremental/. Clicking on the report.html file in those directories (see the previous section in the article), the users have access to the backup reports and verify if any of them had errors. The files are also accessible using wget.
If you need to enable tighter security, lighty supports https and LDAP authentication the details are in its documentation and it takes less than 10 minutes to setup.
monit Monitoring
When you need a service to be running 24/7, monit is a great tool in the Linux arsenal to achieve it. It monitors a number of system and services variables and it will start, stop and/or restart any service under a number of conditions. For this POC, the goal is to keep lighty running, restarting it after an eventual crash. We are using the following configuration:check process lighttpd with pidfile "/var/run/lighttpd.pid" alert some@yourorg.com NOT { instance, pid, ppid, action } start program = "/etc/init.d/lighttpd start" with timeout 60 seconds stop program = "/etc/init.d/lighttpd stop" with timeout 30 seconds if 2 restarts within 3 cycles then timeout if failed port 8088 protocol http with timeout 15 seconds within 3 cycles then restart
If the process crashes or port 8088 becomes unresponsive, monit will (re)start lighty automatically.
Conclusion (sort of)
Implement all these tools in a new server takes less than 1 hour. During the the first couple of implementations I learned a lot about how the packages interacted, security issues and users’ needs and expectations. As the users started looking into the solution, they also came up with newer use cases.While we look for a more suitable solution, these free (as in freedom and beer) packages provided us with the opportunity to learn while still achieving our goals and delivering results to our users. Now we know what to look for if we decide to evaluate an open core or commercial solution.