ProxySQL support for Galera
How to enable support for Galera
To enable support for Galera it’s necessary to:
- Launch ProxySQL with monitoring enabled (without providing the
-M
command line flag). - Configure properly the table
mysql_galera_hostgroups
.
Configure ProxySQL
Global variables
Global variables to control timeout and interval check:
mysql> select * from global_variables where variable_name like '%monitor_galera%';
+----------------------------------------------------+----------------+
| variable_name | variable_value |
+----------------------------------------------------+----------------+
| mysql-monitor_galera_healthcheck_interval | 1000 |
| mysql-monitor_galera_healthcheck_timeout | 600 |
| mysql-monitor_galera_healthcheck_max_timeout_count | 3 |
+----------------------------------------------------+----------------+
3 rows in set (0.01 sec)
Configuration table
In ProxySQL’s Admin, there is a table that holds the definition for the Galera hostgroups that are required to be managed.
mysql> SHOW CREATE TABLE mysql_galera_hostgroups\G
*************************** 1. row ***************************
table: mysql_galera_hostgroups
Create Table: CREATE TABLE mysql_galera_hostgroups (
writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,
backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL,
reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0),
offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0),
active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,
max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1,
writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1,2)) NOT NULL DEFAULT 0,
max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0,
comment VARCHAR,
UNIQUE (reader_hostgroup),
UNIQUE (offline_hostgroup),
UNIQUE (backup_writer_hostgroup))
1 row in set (0.00 sec)
Column Name | Description |
---|---|
writer_hostgroup | The id of the hostgroup that will contain all the members that are writer. |
backup_writer_hostgroup | If the group is running in multi-primary mode, there are multi writers (read_only=0) but if the amount of these writer is larger than the max_writers, the extra nodes are located in this backup writer group. |
reader_hostgroup | The id of the hostgroup that will contain all the members that are reader: nodes that have read_only=1 will be assigned to this hostgroup. |
offline_hostgroup | When ProxySQL’s monitoring determines a host is offline, it will be put such host into the offline_hostgroup. |
active | Boolean value (0 or 1), when enabled, ProxySQL monitors the hostgroups and moves accordingly the server in the appropriate hostgroups. |
max_writers | Limit the amount of nodes in the writer hostgroup: nodes in excess of this value will be put into the backup_writer_hostgroup. |
writer_is_also_reader | Flag with three possible values: (0, 1, 2). – writer_is_also_reader=0: nodes in the writer_hostgroup and in the backup_writer_hostgroup wont be in reader hostgroup. – writer_is_also_reader=1: nodes in writer_hostgroup and backup_writer_hostgroup are also in reader hostgroup. – writer_is_also_reader=2 : nodes in backup_writer_hostgroup are also in reader_hostgroup. We can also define the action taken for the nodes in terms of the |
max_writers | Limit the amount of nodes in the writer hostgroup: nodes in excess of this value will be put into the backup_writer_hostgroup. |
To conform with ProxySQL’s Admin 3 layers configuration system, 3 tables exist:
mysql_galera_hostgroups
: In memory config.runtime_mysql_galera_hostgroups
: Runtime config.disk.mysql_galera_hostgroups
: Persistent config.
Galera monitor node flowchart
This chart describes the conditions and final monitoring actions taken over a node based on its current state and current cluster state:
Cluster monitor cluster flowchart
This chart describes how the cluster state changes when a change is detected in one node, or when configuration is changed:
Node promotion order
Each time a promotion operation is required to happen, nodes are sorted based on that fixed criteria, and then, the first node is selected. The selection order used when promoting a node between hostgroups is 'ORDER BY weight DESC, hostname DESC, port DESC'
. This is for example the selection order used when a new writer node enters the cluster (or it’s again available) and the process of selecting a new writer takes place.
SST considerations
Since v2.1.0
ProxySQL honors Galera variable wsrep_sst_donor_rejects_queries
, when true, this variable prevents a DONOR node from receiving client sessions during a blocking SST. ProxySQL will honor this behavior in the following scenario:
During a SST a DONOR node that is not a desync ‘read_only’ node where WSREP_LOCAL_RECV_QUEUE
is bigger than max_transactions_behind
, and wsrep_sst_donor_rejects_queries
is false, will continue to operate normally. If this node is a ‘read_only’ node having WSREP_LOCAL_RECV_QUEUE
bigger than max_transactions_behind
, it will be moved to the OFFLINE_HOSTGROUP
.
As previously stated, ProxySQL only prevents a node from being moved to the OFFLINE_HOSTGROUP when the previously described conditions holds and the node is in DONOR state. To further clarify this, after an SST, a DONOR node can transition into JOINED state before reaching the SYNC state, the speed of this transition depends on how fast the node can catch up with the cluster, ProxySQL won’t prevent any node in the JOINED state from being moved to the OFFLINE_HOSTGROUP.
Writers selection
The nodes to be placed as writers in the writer hostgroup are deterministically selected from the currently available cluster nodes based on weight + hostname + port
. You can check how this selection is exercised in the different flowcharts. The same selection is used when the node is going to be set initially in a target hostgroup, or for deciding whether a server already present in a hostgroup should be replaced or not.
Writers selection – Failovers
The server to replace a writer during a failover is selected using the same previously described policy. This is true for when the server is going to be initially replaced to the failover, and also when the server original status is recovered. The event of the previous failover has no impact in the selection of the next target writer.
Deterministic monitoring actions based on current cluster state is a common monitoring policy explained in more detail in the FAQ.
Extra writers with SHUNNED status
It’s normal for extra writers to appear as SHUNNED
in the writer hostgroup, this is expected behavior. For example, assuming max_writers=1
, this is a normal state that will take place after a failover for the replacement writer. After the original writer status is recovered, the deterministic selection (if no config has been changed) will target the previous writer as the new candidate writer, thus imposing the SHUNNED
state on the current one.
This status is imposed as an effort for keeping transitions as smooth as possible for clients. If instead the server was completely remove from the writer_hosgtroup
, that would kill all the current connections to that server, instead setting it as SHUNNED
preserves currently opened connections. This way the transition from one primary writer to another is completely transparent to clients which have already running transactions in the current writer.
Extra info
For a tutorial on how to get started into Galera configuration, please refer to this blogpost.