同事问三个节点的Galera Cluster中如果只剩一个节点了,那么还能提供读写服务吗?
分两种情况:
一、节点正常关闭的情况
如果集群中的两个节点都正常关闭,集群中剩余的一个节点还是可以提供读写服务的。
MariaDB [(none)]> SHOW STATUS WHERE Variable_name IN
( 'wsrep_local_state_uuid','wsrep_cluster_conf_id','wsrep_cluster_size', 'wsrep_cluster_status','wsrep_ready','wsrep_connected');
+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| wsrep_local_state_uuid | 874d8e7e-5980-11e8-8c23-83493ba049c2 |
| wsrep_cluster_conf_id | 30 |
| wsrep_cluster_size | 1 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_ready | ON |
+--------------------------+--------------------------------------+
二、节点异常退出的情况
如果集群中的两个节点都异常退出,集群中剩余的一个节点能提供读写服务吗?
a).写服务肯定是不能提供的。
b).集群中剩余的一个节点,能否提供读服务,取决于wsrep_dirty_reads的设置。
MariaDB [(none)]> show variables like 'wsrep_dirty_reads';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| wsrep_dirty_reads | OFF |
+-------------------+-------+
1 row in set (0.01 sec)
如果wsrep_dirty_reads设置为OFF,读取数据时会报ERROR 1047 (08S01)的错误。
MariaDB [(none)]> use test;
**ERROR 1047 (08S01): WSREP has not yet prepared node for application use**
如果wsrep_dirty_reads设置为ON,可以读数据,但不能写。
MariaDB [test]> show variables like 'wsrep_dirty_reads';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| wsrep_dirty_reads | ON |
+-------------------+-------+
1 row in set (0.00 sec)
MariaDB [test]> select * from t2;
+----+
| id |
+----+
| 1 |
| 2 |
+----+
2 rows in set (0.00 sec)
MariaDB [test]> insert into t2 values(3);
ERROR 1047 (08S01): WSREP has not yet prepared node for application use