How To Optimize WordPress Performance With MySQL Replication On Ubuntu 14.04
In this tutorial, we will teach you how to scale up your WordPress MySQL database server setup using master-slave database replication and the HyperDB plugin for WordPress. Adding more database servers to your environment in this manner allows your WordPress application to read from multiple database servers, increasing read performance.
MySQL replication reaps the most performance benefits for a system that processes frequent reads and infrequent writes, like most WordPress installations. By using a single-master with multiple-slave setup, you can add more slaves to scale your system, until you run out of network bandwidth or your master cannot handle the update load. If you wish, you can add more than one slaves by repeating the “slave” portions of the replication sections of this tutorial.
We are assuming that your setup includes two load balanced WordPress application servers that connect to a separate MySQL database server (see the prerequisites for a tutorial on how to set that up). It is not strictly necessary to have load balanced application servers to follow this tutorial, but your MySQL database server should be separate from your application servers.
Before continuing with this tutorial, you should have completed two tutorials or have a similar environment:
After following those tutorials, to set up WordPress with two load balanced web application servers and a separate database server, you should have four VPSs. Because we will be dealing with several VPSs, for reference purposes, we will call your four existing VPSs the following:
haproxy-www: Your HAProxy server for layer 4 load balancing your WordPress web application servers. This is the entry point into your website
wordpress-1: Your first WordPress web application server
wordpress-2: Your second WordPress web application server
mysql-1: Your MySQL server for WordPress
That is, your environment should look something like this:
In addition to your current environment, we will require one additional VPS during this tutorial. We will call it:
mysql-2: Your slave MySQL database server
When we are finished with this tutorial, you will have two database servers will be replicating in a master-slave configuration. Your WordPress servers will selectively write to your master and read from both your master and slave databases, by use of the HyperDB WordPress plugin. Your final environment should look something like this:
Keep in mind that you do not need to have load balanced application servers (wordpress-1/wordpress-2) to follow this tutorial, and that you can add more slave databases if you want.
Set Up MySQL Master-Slave Replication
Before we can configure our WordPress application to read from multiple database servers, we need to set up our MySQL replication.
Create MySQL Slave VPS, mysql-2
You will want to create a new VPS that will act as the MySQL slave server–for reference purposes, we will call this servermysql-2. The slave will be configured to replicate all of the databases of your master MySQL server, including your WordPress database.
Save and quit. To put these changes into effect, restart mysql with the following command:
sudo service mysql restart
Connect to to the MySQL console with the following command, then enter the password when prompted:
mysql -u root -p
Create a user that will be used by our slave MySQL servers for replication purposes. We will call this userrepl. Be sure to replace therepl_passwordwith your own, strong password. The%specifies that the source IP for this user can be anything, but you may substitute the%with the private IP address of your slave MySQL server,mysql-2, to restrict connections with this user to that particular server:
<pre> CREATE USER ‘repl’@’<span class=“highlight”>%</span>’ IDENTIFIED BY ’<span class=“highlight”>repl_password</span>’; GRANT REPLICATION SLAVE ON.TO 'repl’@’%’; </pre>
Do not exit the MySQL console yet!
Export a Backup Of MySQL Master
Next, we will want to export a backup of the MySQL master database, to import into our slave database so it will be identical before we start replication. We need to lock the database so we can do a data dump. In your MySQL console onmysql-1, run this:
FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON; EXIT
Now, from your command shell, run the following command to export a backup of the databases on your master MySQL server to a file calledmasterdump.sql:
If that statement ran properly, run this command to initiate the slave connection:
Yourmysql-2server should be connected as a slave now! Run the following command to check that the replication is working:
SHOW SLAVE STATUS\G
Revoke Write Privileges From Slave Users
This is optional because the HyperDB plugin can be configured to only read from your slave database server, but you may want revoke the write privileges from yourwordpressuserdatabase users on your slave database (because updates to your slave will not be replicated to your master, if you accidentally update your slave somehow).
On mysql-2, from your MySQL console run the following statement to list your database users:
You should see output similar to the above code block. You may view privileges for each user with the following command:
<pre> SHOW GRANTS FOR <span class=“highlight”>wordpressuser</span>@<span class=“highlight”>wordpress1IP</span>; </pre>
In this example, we have onewordpressuserfor each WordPress server, so we will revoke theinsert,update, anddeleteprivileges from each of them (“wordpress” is the name of our database in this example):
<pre> REVOKE INSERT, UPDATE, DELETE ON <span class=“highlight”>wordpress</span>.* FROM ’<span class=“highlight”>wordpressuser</span>’@’<span class=“highlight”>wordpress1privateIP</span>’; REVOKE INSERT, UPDATE, DELETE ON <span class=“highlight”>wordpress</span>.* FROM ’<span class=“highlight”>wordpressuser</span>’@’<span class=“highlight”>wordpress2privateIP</span>’; FLUSH PRIVILEGES; </pre>
Now your MySQL replication setup is complete. Let’s move on to setting up WordPress to use both database servers properly.
Install and Configure HyperDB
We will use HyperDB to determine where to send updates (your master database) and read requests (your master and slave). Let’s download it to your home directory from the WordPress Plugin Directory (also install zip/unzip to unarchive it):
It should be unarchived to a directory called “hyperdb”, in your home directory. Copy the sample configuration file to your WordPress installation (substitute the highlighted with your WordPress installation path), and open it for editing:
<pre> cp ~/hyperdb/db-config.php <span class=“highlight”>/var/www/example.com</span>/ vi <span class=“highlight”>/var/www/example.com</span>/db-config.php</pre>
Look for thesecond occurrenceofDB_HOST, which should be directly after some comments that describe setting up a slave and it should look exactly like the following:
<pre> $wpdb->adddatabase(array( 'host’ => <span class=“highlight”>DBHOST</span>, // If port is other than 3306, use host:port. 'user’ => DBUSER, 'password’ => DBPASSWORD, 'name’ => DB_NAME, 'write’ => 0,'read’ => 1,'dataset’ => 'global’,'timeout’ => 0.2,));</pre>
The first occurrence of DBHOST defines the master database server, and the second occurrence defines the slave database server (denoted by the'write' => 0,). Replace the second occurrence of `DBHOSTwithDBSLAVE1`:
<pre> 'host’ => <span class=“highlight”>DBSLAVE1</span>, // If port is other than 3306, use host:port. </pre>
Save and exit. Next you will want to defineDB_SLAVE_1in your wp-config.php, which HyperDB will use as a slave database host. Open wp-config.php for editing:
<pre> vi <span class=“highlight”>/var/www/example.com</span>/wp-config.php </pre>
Find the line that definesDB_HOSTand add the following line under it, substituting your slave’s private IP address (mysql-2):
Now your WordPress read requests will be served by both your master and slave databases, while updates will be sent to your master (which will then be replicated to your slave).
Now that you have completed your MySQL replication and HyperDB setup, your database environment will be able to handle increased read traffic i.e. more concurrent users! Remember that you can add more MySQL slaves if you want to scale your database serving capacity even more.
It seems your Local OS is Unix, so try the former one.
For those who don't know whatpscp.exeis and don't know where it is, you can always go toputtyofficial websiteto download it. And then open a CMD prompt, go to the pscp.exe directory where you put it. Then execute the command as provided above
My local OS is Windows. I downloaded the pscp.exe from the putty website. I tried opening it up and nothing came up. Also, I tried the command you listed above and was given: pscp.exe comman not found. Also tried it without the .exe and resulted in the same error.– VincentMay 31 '15 at 3:57
Open a CMD prompt, and go to the pscp.exe directory where you put it. Then execute the command as provided above.– mainframerMay 31 '15 at 4:01
using scp on a mac has to be provided ./ parameter to signify that the file has to be downloaded in the current folder on mac machine.– Sarang ManjrekarJul 2 '18 at 11:11
With Windows Subsystem for Linux (WSL, basically Ubuntu on Windows) you can now also open up Bash if your Local OS is Windows, and just use scp. Pro-tip: you can access your Windows file system from WSL. It's under /mnt/c. So you can do something like this:scp username@remoteHost:/remote/dir/file.txt /mnt/c– gijswijsApr 25 '19 at 3:42
As of the 2018 Autumn update, Windows 10 now comes with OpenSSH and is on PATH. This means you can use thescpcommand on Windows 10, too.– jauntSep 23 '19 at 20:45