* assuming you are using ubuntu/debian
chef-server = 192.168.1.10
couchdb01 = 192.168.1.11
couchdb02 = 192.168.1.12
Enable chef-server couchdb to listen on all interfaces
root@chefserver:~# sed -i bak s/bind_address = 127.0.0.1/bind_address = 0.0.0.0/g /etc/couchdb/default.ini root@chefserver:~# /etc/init.d/couchdb restart
Install CouchDB on couchdb01/couchdb02 and set to listen on all interfaces
root@couchdb01:~# apt-get -y install couchdb root@couchdb01:~# /etc/init.d/couchdb stop root@couchdb01:~# sed -i bak s/bind_address = 127.0.0.1/bind_address = 0.0.0.0/g /etc/couchdb/default.ini root@couchdb01:~# /etc/init.d/couchdb start
Create the empty chef table on couchdb01/couchdb02
root@couchdb01:~# curl -X PUT http://localhost:5984/chef {"ok":true} root@couchdb02:~# curl -X PUT http://localhost:5984/chef {"ok":true}
Push the chef table from chef-server to couchdb01/02 and enable a continuous replication
To Couchdb02
root@chef-server:/var/lib/couchdb# curl -X POST http://localhost:5984/_replicate -H "Content-Type: application/json" -d '{"source":"chef","target":"http://192.168.1.12:5984/chef","continuous":true}' {"ok":true,"_local_id":"77f057c373dca43097fac542c367b24f"}
To Couchdb01
root@chef-server:~# curl -X POST http://localhost:5984/_replicate -H "Content-Type: application/json" -d '{"source":"chef","target":"http://192.168.1.11:5984/chef","continuous":true}' {"ok":true,"_local_id":"e926c9297e5776db862ae3c1be27bbde"}
Setup the multi-master replication for couchdb01/02
Enable continuous replication FROM couchdb01 to couchdb02
root@couchdb01:/var/lib/couchdb# curl -X POST http://localhost:5984/_replicate -H "Content-Type: application/json" -d '{"source":"chef","target":"http://192.168.1.12:5984/chef","continuous":true}' {"ok":true,"_local_id":"77f057c373dca43097fac542c367b24f"}
Enable continuous replication FROM couchdb02 to couchdb01
root@couchdb02:/var/lib/couchdb# curl -X POST http://localhost:5984/_replicate -H "Content-Type: application/json" -d '{"source":"chef","target":"http://192.168.1.11:5984/chef","continuous":true}' {"ok":true,"_local_id":"77f057c373dca43097fac542c367b24f"}
Install Apache and generate config on Chef Server
root@chefserver:~# apt-get -y install apache2 root@chefserver:~# mkdir -p /usr/share/chef-server/public root@chefserver:~# for i in rewrite proxy status proxy_http proxy_balancer headers ; do a2enmod $i ; done root@chefserver:~# cd /etc/apache2/sites-available root@chefserver:~# echo "Listen 5984" | tee -a chef_couchdb_loadbalancer root@chefserver:~# echo '<VirtualHost *:5984>' | tee -a chef_couchdb_loadbalancer root@chefserver:~# MYHOST=$(hostname -f) root@chefserver:~# echo "ServerName ${MYHOST}-couchdb" |tee -a chef_couchdb_loadbalancer root@chefserver:~# cat>>chef_couchdb_loadbalancer<<EOF <Proxy balancer://couchlb> BalancerMember http://192.168.1.11:5984 BalancerMember http://192.168.1.12:5984 </Proxy> ProxyPass / balancer://couchlb ProxyPassReverse / balancer://couchlb DocumentRoot /usr/share/chef-server/public LogLevel info ErrorLog /var/log/chef/chef_couchdb_apache2-error.log CustomLog /var/log/chef/chef_couchdb_apache2-access.log combined RewriteEngine On RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f RewriteRule ^/(.*)$ balancer://couchlb%{REQUEST_URI} [P,QSA,L] </VirtualHost> EOF
Stop Couchdb on Chef-Server
*This will stop the continuous replication to couchdb01/couchdb02
root@chefserver:~# /etc/init.d/couchdb stop
Start Apache load balancer on Chef-Server
root@chefserver:~# a2ensite chef_couchdb_loadbalancer root@chefserver:~# /etc/init.d/apache2 restart
Test your couchdb balancer:
http:://192.168.1.10:5984/_utils
You probably also want to edit your init scripts on couchdb01/02 to automatically restart the continuous replication upon start or restart
The replication does not persist after you stop a couchdb instance unless you explicitly issue the command again