How To Set Up A Load-Balanced MySQL Cluster With MySQL 5.1 - Page 4
7 Start The Load Balancer And Do Some Testing
Now we can start our two load balancers for the first time:
mysql-lb1.example.com / mysql-lb2.example.com:
/etc/init.d/ldirectord stop
/etc/init.d/heartbeat start
If you don't see errors, you should now reboot both load balancers.If you do see errors go to the end of this tutorial I might know whats the problem :) [Chapter 8]
mysql-lb1.example.com / mysql-lb2.example.com:
shutdown -r now
After the reboot we can check if both load balancers work as expected :
mysql-lb1.example.com / mysql-lb2.example.com:
ip addr sh eth0
The active load balancer should list the virtual IP address (10.0.1.10):
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:45:fc:f8 brd ff:ff:ff:ff:ff:ff inet 10.0.1.31/24 brd 192.168.0.255 scope global eth0 inet 10.0.1.10/24 brd 192.168.0.255 scope global secondary eth0 |
The hot-standby should show this:
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:16:c1:4e brd ff:ff:ff:ff:ff:ff inet 10.0.1.32/24 brd 192.168.0.255 scope global eth0 |
mysql-lb1.example.com / mysql-lb2.example.com:
ldirectord ldirectord.cf status
Output on the active load balancer:
ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 1603 |
Output on the hot-standby:
ldirectord is stopped for /etc/ha.d/ldirectord.cf |
mysql-lb1.example.com / mysql-lb2.example.com:
ipvsadm -L -n
Output on the active load balancer:
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.1.10:3306 wrr -> 10.0.1.33:3306 Route 1 0 0 -> 10.0.1.34:3306 Route 1 0 0 |
Output on the hot-standby:
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn |
mysql-lb1.example.com / mysql-lb2.example.com:
/etc/ha.d/resource.d/LVSSyncDaemonSwap master status
Output on the active load balancer:
master running (ipvs_syncmaster pid: 1766) |
Output on the hot-standby:
master stopped (ipvs_syncbackup pid: 1440) |
If your tests went fine, you can now try to access the MySQL database from a totally different server in the same network (10.0.1.x) using the virtual IP address 10.0.1.10:
mysql -h 10.0.1.10 -u ldirector -p
(Please note: your MySQL client must at least be of version 4.1; older versions do not work with MySQL 5.)
You can now switch off one of the MySQL cluster nodes for test purposes; you should then still be able to connect to the MySQL database.
8 Annotations and hints
Errors with ldirectord:/etc/init.d/ldirectord stop
/etc/init.d/heartbeat start
Stopping ldirectord Error [] reading file /etc/ha.d/ldirectord.cf at line 8: >Unknown command service=mysql
This error is due to formatting, it took me some time to figure it out.
The serivce= mysql is probably connected to /etc/services which is correct.
If you have libmysqlclient15 or 14 installed, fixing right formatting will do the trick like here:
vi /etc/heartbeat/ldirectord.cf
# Global Directives checktimeout=10 checkinterval=2 autoreload=no logfile="local0" quiescent=yes #after virtual=... make TABS (or double spaces) in every line virtual = 10.0.1.10:3306 service = mysql real = 10.0.1.33:3306 gate real = 10.0.1.34:3306 gate checktype = negotiate login = "ldirector" passwd = "ldirector" database = "ldirectordb" request = "SELECT * FROM connectioncheck" scheduler = wrr |
And that should be it.
There are some important things to keep in mind when running a MySQL cluster:
1.If you have your databases and you want to use them in MySQL cluster please read this as it will guide you through how to change ENGINE=MyISAM to NDBCLUSTER.
2. Adding user to mysql database and changing GRANTS must be done on all data nodes since mysql database is MyISAM/InoDB. You can of course convert it's engine.
3.All data is stored in RAM! as a default, but Therefore you need lots of RAM on your cluster nodes. The formula how much RAM you need on each node goes like this:
(SizeofDatabase × NumberOfReplicas × 1.1 ) / NumberOfDataNodes
So if you have a database that is 1 GB of size, you would need 1.1 GB RAM on each node!
4.The cluster management node listens on port 1186, and anyone can connect. So that's definitely not secure, and therefore you should run your cluster in an isolated private network! Since it would be harder to manage it may be a good idea to make changes to /etc/hosts.deny or prepare iptables based firewall.
5.It's a good idea to have a look at the MySQL Cluster FAQ: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-faq.html and also at the MySQL Cluster documentation: http://dev.mysql.com/doc/refman/5.1/en/ndbcluster.html
Links
- MySQL: http://www.mysql.com/
- MySQL Cluster documentation: http://dev.mysql.com/doc/refman/5.1/en/ndbcluster.html
- MySQL Cluster FAQ: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-faq.html
- Ultra Monkey: http://www.ultramonkey.org/
- The High-Availability Linux Project: http://www.linux-ha.org/
- MySQL 5.1 Cluster Replication http://blog.dbadojo.com/2007/08/mysql-51-ndb-cluster-replication-on-ec2.html
- How to stress test my MySQL Cluster 5.1 http://blogs.techrepublic.com.com/howdoi/?p=133