Differences from a Stand-Alone MySQL Server¶
Length: xxx words; Published: October 20, 2014; Topic: General; Level: Beginner
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.
Server Differences
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.
Operating System Support¶
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.
Binary Log Support¶
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.
Unsupported Character Sets¶
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.
Note
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.
Differences in Table Configurations¶
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.
Storage Engine Support¶
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';
or, like
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.
Note
In general, non-transactional storage engines cannot be supported in multi-master replication.
Tables without Primary Keys¶
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.
Note
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.
Table Locking¶
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.
Query Logs¶
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.
Differences in Transactions
There are some differences in how Galera Cluster handles transactions from MySQL, such as XA transactions and limitations on transaction size.
Distributed Transaction Processing¶
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.
Transaction Size¶
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.
You can avoid situations of this kind using the wsrep_max_ws_rows and the wsrep_max_ws_size parameters. Limit the transaction rows to 128 KB and the transaction size to 1 GB.
If necessary, you can increase these limits.
Transaction Commits¶
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.