Description:
Connected clients doesn't get any errors on primary node change event, hanging indefinitely.
How to repeat:
Create a cluster with 3 nodes, start mysql router, connect to R/W instance via socket or port, run a write query, shutdown R/W node during query execution.
Expected behaviour:
Client gets a connection error, reconnection is possible.
Real behaviour:
Client hangs, no errors for about 10-15 minutes, new clients can connect to new R/W instance.
Cluster status:
mysql-js> var c = dba.getCluster('devCluster')
mysql-js> c.status()
{
"clusterName": "devCluster",
"defaultReplicaSet": {
"name": "default",
"primary": "192.168.122.12:3306",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"192.168.122.11:3306": {
"address": "192.168.122.11:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"192.168.122.12:3306": {
"address": "192.168.122.12:3306",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"192.168.122.13:3306": {
"address": "192.168.122.13:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
}
}
}
}
MySQL router log, address of R/W instance correctly changed (192.168.122.12->192.168.122.13):
18:45:01 DEBUG Replicaset 'default' has 3 members in metadata, 2 in status table
18:45:01 WARNING Member 192.168.122.12:3306 (33a131ee-7087-11e7-bbbb-5254005ea589) defined in metadata n actual replicaset
18:45:01 DEBUG End updating replicaset for 'default'
18:45:01 INFO Changes detected in cluster 'devCluster' after metadata refresh
18:45:01 INFO Metadata for cluster 'devCluster' has 1 replicasets:
18:45:01 INFO 'default' (3 members, single-master)
18:45:01 INFO 192.168.122.11:3306 / 33060 - role=HA mode=RO
18:45:01 INFO 192.168.122.12:3306 / 33060 - role=HA mode=n/a
18:45:01 INFO 192.168.122.13:3306 / 33060 - role=HA mode=RW
18:45:06 INFO Connected with metadata server running on 192.168.122.11:3306
18:45:06 DEBUG Updating metadata information for cluster 'devCluster'
18:45:06 DEBUG Updating replicaset status from GR for 'default'
18:45:06 DEBUG Replicaset 'default' has 3 members in metadata, 2 in status table
Clients are connecting via MySQLDB python module and mysql client:
mysql -u root --socket /tmp/myrouter/mysql.sock -p --reconnect
db = MySQLdb.connect(
unix_socket="/tmp/myrouter/mysql.sock",
# host='127.0.0.1',
# port=6446,
user="root",
passwd="123",
db="test",
connect_timeout = 6)
MySQL router config:
[DEFAULT]
logging_folder=/tmp/myrouter/log
runtime_folder=/tmp/myrouter/run
data_folder=/tmp/myrouter/data
keyring_path=/tmp/myrouter/data/keyring
master_key_path=/tmp/myrouter/mysqlrouter.key
[logger]
level = DEBUG
[metadata_cache:devCluster]
router_id=1
bootstrap_server_addresses=mysql://192.168.122.11:3306,mysql://192.168.122.12:3306,mysql://192.168.122.13:3306
user=mysql_router1_3bocarc7njs2
metadata_cluster=devCluster
ttl=5
[routing:devCluster_default_rw]
#bind_address=0.0.0.0
#bind_port=6446
socket=/tmp/myrouter/mysql.sock
destinations=metadata-cache://devCluster/default?role=PRIMARY
mode=read-write
protocol=classic
max_connect_errors = 1
destination_connect_timeout = 2
client_connect_timeout = 2
[routing:devCluster_default_ro]
bind_address=0.0.0.0
bind_port=6447
socket=/tmp/myrouter/mysqlro.sock
destinations=metadata-cache://devCluster/default?role=SECONDARY
mode=read-only
protocol=classic
[routing:devCluster_default_x_rw]
bind_address=0.0.0.0
bind_port=64460
socket=/tmp/myrouter/mysqlx.sock
destinations=metadata-cache://devCluster/default?role=PRIMARY
mode=read-write
protocol=x
[routing:devCluster_default_x_ro]
bind_address=0.0.0.0
bind_port=64470
socket=/tmp/myrouter/mysqlxro.sock
destinations=metadata-cache://devCluster/default?role=SECONDARY
mode=read-only
protocol=x
Software versions:
CentOS Linux release 7.3.1611 (Core)
Router:
mysqlrouter -v
MySQL Router v2.1.4 on Linux (64-bit) (GPL community edition)
Cluster:
mysql -v
Server version: 5.7.19-log MySQL Community Server (GPL)
Suggested fix:
It seems that similar bug was already referenced in https://bugs.mysql.com/bug.php?id=81548 ( https://github.com/mysql/mysql-router/pull/1 ).
According to commit description ( https://github.com/mysql/mysql-router/commit/dd0e8d2f9b041fd3d5f9cc52753e5aeec0c4410b ), fix was supposed to be applied in commit https://github.com/mysql/mysql-router/commit/cd5dc48b7bc67b14d64b923f43b1b081968fe73c , but it wasn't.