©
This document uses PHP Chinese website manual Release
Note: Version requirement and status
Work on supporting MySQL Fabric started in version 1.6. Please, consider the support to be of pre-alpha quality. The manual may not list all features or feature limitations. This is work in progress.
Sharding is the only use case supported by the plugin to date.
Note: MySQL Fabric concepts
Please, check the MySQL reference manual for more information about MySQL Fabric and how to set it up. The PHP manual assumes that you are familiar with the basic concepts and ideas of MySQL Fabric.
MySQL Fabric is a system for managing farms of MySQL servers to achive High Availability and optionally support sharding. Technically, it is a middleware to manage and monitor MySQL servers.
Clients query MySQL Fabric to obtain lists of MySQL servers, their state and their roles. For example, clients can can request a list of slaves for a MySQL Replication group and whether they are ready to handle SQL requests. Another example is a cluster of sharded MySQL servers where the client seeks to know which shard to query for a given table and shard key. If configured to use Fabric, the plugin uses XML RCP over HTTP to obtain the list at runtime from a MySQL Fabric host. The XML remote procedure call itself is done in the background and transparent from a developers point of view.
Instead of listing MySQL servers directly in the plugins configuration file it contains a list of one or more MySQL Fabric hosts
Example #1 Plugin config: Fabric hosts instead of MySQL servers
{ "myapp": { "fabric": { "hosts": [ { "host" : "127.0.0.1", "port" : 8080 } ] } } }
Users utilize the new functions mysqlnd_ms_fabric_select_shard() and mysqlnd_ms_fabric_select_global() to switch to the set of servers responsible for a given shard key. Then, the plugin picks an appropriate server for running queries on. When doing so, the plugin takes care of additional load balancing rules set.
The below example assumes that MySQL Fabric has been setup to shard the table test.fabrictest using the id column of the table as a shard key.
Example #2 Manual partitioning using SQL hints
<?php
$mysqli = new mysqli ( "myapp" , "user" , "password" , "database" );
if (! $mysqli )
die( sprintf ( "[%d] %s\n" , mysqli_connect_errno (), mysqli_connect_error ()));
mysqlnd_ms_fabric_select_global ( $mysqli , "test.fabrictest" );
if (! $mysqli -> query ( "CREATE TABLE test.fabrictest(id INT NOT NULL PRIMARY KEY)" ))
die( sprintf ( "[%d] %s\n" , $mysqli -> errno , $mysqli -> error ));
mysqlnd_ms_fabric_select_shard ( $mysqli , "test.fabrictest" , 10 );
if (!( $res = $mysqli -> query ( "INSERT INTO fabrictest(id) VALUES (10)" )))
die( sprintf ( "[%d] %s\n" , $mysqli -> errno , $mysqli -> error ));
mysqlnd_ms_fabric_select_shard ( $mysqli , "test.fabrictest" , 10 );
if (!( $res = $mysqli -> query ( "SELECT id FROM test WHERE id = 10" )))
die( sprintf ( "[%d] %s\n" , $mysqli -> errno , $mysqli -> error ));
?>
The example creates the sharded table, inserts a record and reads the record thereafter. All SQL data definition language (DDL) operations on a sharded table must be applied to the so called global server group. Prior to creatingor altering a sharded table, mysqlnd_ms_fabric_select_global() is called to switch the given connection to the corresponsing servers of the global group. Data manipulation (DML) SQL statements must be sent to the shards directly. The mysqlnd_ms_fabric_select_shard() switches a connection to shards handling a certain shard key.