Although Galera Cluster is built on providing write-set replication to MySQL and related database systems, there are certain key differences between how it handles and the standard standalone MySQL server.
Using a server with Galera Cluster is not the same as one with MySQL. Galera Cluster does not support the same range of operating systems as MySQL, and there are differences in how it handles binary logs and character sets.
Galera Cluster requires that you use Linux or a similar UNIX-like operating system. Binary packages are not supplied for FreeBSD, Solaris and Mac OS X. There is no support available for Microsoft Windows.
Do not use the binlog-do-db and binlog-ignore-db options.
These binary log options are only supported for DML statements. They provide no support for DDL statements. This creates a discrepancy in the binary logs and will cause replication to abort.
Do not use the character_set_server with UTF-16, UTF-32 or UCS-2.
When you use rsync for State Snapshot Transfer, the use of these unsupported character sets can cause the server to crash.
This is also a problem when you use automatic donor selection in your cluster, as the cluster may choose to use rsync on its own.
There are certain features and configurations available in MySQL that do not work as expected in Galera Cluster, such as storage engine support, certain queries and the query cache.
Galera Cluster requires the InnoDB storage engine. Writes made to tables of other types, including the system mysql-* tables, do not replicate to the cluster.
That said, DDL statements do replicate at the statement level, meaning that changes made to the mysql-* tables do replicate that way.
What this means is that if you were to issue a statement like
CREATE USER 'stranger'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON strangedb.* TO 'stranger'@'localhost';
the changes made to the mysql-* tables would replicate to the cluster. However, if you were to issue a statement like
INSERT INTO mysql.user (Host, User, Password) VALUES ('localhost', 'stranger', 'password');
the changes would not replicate.
In general, non-transactional storage engines cannot be supported in multi-master replication.
Do not use tables without a primary key.
When tables lack a primary key, rows can appear in different order on different nodes in your cluster. As such, queries like SELECT...LIMIT... can return different results. Additionally, on such tables the DELETE statement is unsupported.
If you have a table without a primary key, it is always possible to add an AUTO_INCREMENT column to the table without breaking your application.
Galera Cluster does not support table locking, as they conflict with multi-master replication. As such, the LOCK TABLES and UNLOCK TABLES queries are not supported. This also applies to lock functions, such as GET_LOCK() and RELEASE_LOCK()... for the same reason.
You cannot direct query logs to a table. If you would like to enable query logging in Galera Cluster, you must forward the logs to a file.
log_output = FILE
Use general_log and general_log_file to choose query logging and to set the filename for your log file.
There are some differences in how Galera Cluster handles transactions from MySQL, such as XA transactions and limitations on transaction size.
The standard MySQL server provides support for distributed transaction processing using the Open Group XA standard. This feature is not available for Galera Cluster, given that it can lead to possible rollbacks on commit.
Although Galera Cluster does not explicitly limit the transaction size, the hardware you run it on does impose a size limitation on your transactions. Nodes process write-sets in a single memory-resident buffer. As such, extremely large transactions, such as LOAD DATA can adversely effect node performance.
If necessary, you can increase these limits.
Galera Cluster uses at the cluster-level optimistic concurrency control, which can result in transactions that issue a COMMIT aborting at that stage.
For example, say that you have two transactions that will write to the same rows, but commit on separate nodes in the cluster and that only one of them can successfully commit. The commit that fails is aborted, while the successful one replicates.
When aborts occur at the cluster level, Galera Cluster gives a deadlock error.
code (Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)
If you receive this error, restart the failing transaction. It will then issue on its own, without another to put it into conflict.