grant all privileges on . to 'root'@'%' > GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata. TO root@'%' WITH GRANT OPTION;
GRANT> CREATE USER ON . TO root@'%' WITH GRANT OPTION;
GRANT SELECT ON .* TO root@'%' WITH GRANT OPTION;
flush privileges;
mysqlsh
[root@db1 ~]# mysqlsh
检查mysql 配置文件 (3台主机都要操作此步骤)
dba.checkInstanceConfiguration('root@db1:3306')
+----------------------------------+---------------+----------------+--------------------------------------------------+
| Variable | Current Value | Required Value | Note |
+----------------------------------+---------------+----------------+--------------------------------------------------+
| binlog_checksum | CRC32 | NONE | Update the server variable or restart the server |
| binlog_format | MIXED | ROW | Update the server variable or restart the server |
| enforce_gtid_consistency | OFF | ON | Restart the server |
| gtid_mode | OFF | ON | Restart the server |
| log_slave_updates | 0 | ON | Restart the server |
| master_info_repository | FILE | TABLE | Restart the server |
|> | transaction_write_set_extraction | OFF | XXHASH64 | Restart the server |
+----------------------------------+---------------+----------------+--------------------------------------------------+
修复mysql 配置文件, 必须用 root(3台主机都要操作此步骤)
dba.configureLocalInstance('root@db1:3306')
Please provide the password for 'root@db1:3306':
Detecting the configuration file...
Found configuration file at standard location: /etc/my.cnf
Do you want to modify this file? [Y|n]: [Y|n]: Y
重启mysql
重新检查 (3台主机都要操作此步骤)
dba.checkInstanceConfiguration('root@db1:3306')
Please provide the password for 'root@db1:3306':
Validating instance...
The instance 'db1:3306' is valid for Cluster usage
{
"status": "ok"
}
登陆
mysqlsh --uri root@db1:3306
创建集群 main
mysql-js> var cluster = dba.createCluster('main')
A new InnoDB cluster will be created on instance 'hequan@db1:3306'.
Creating InnoDB cluster 'main' on 'hequan@db1:3306'...
Adding Seed Instance...
Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.
退出之后,再查看节点信息
var cluster = dba.getCluster();
cluster.status();
Mysql-route 设置
此命令会更新 /etc/mysqlrouter/mysqlrouter.conf 中的配置信息, 可以是别的机器 这里选择的为db2
[root@db2 ~]# mysqlrouter --bootstrap root@db1:3306 --user mysqlrouter
Please enter MySQL password for root:
WARNING: The MySQL server does not have SSL configured and metadata used by the router may be transmitted unencrypted.
Bootstrapping system MySQL Router instance...
MySQL Router has now been configured for the InnoDB cluster 'main'.
The following connection information can be used to connect to the cluster.
Classic MySQL protocol connections to cluster 'main':
Read/Write Connections: localhost:6446 读写
Read/Only Connections: localhost:6447 只读
X protocol connections to cluster 'main':
Read/Write Connections: localhost:64460
Read/Only Connections: localhost:64470
Existing configurations backed up to /etc/mysqlrouter/mysqlrouter.conf.bak
[root@db2 ~]# systemctl start mysqlrouter
查看端口
[root@db2 ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:64460 0.0.0.0: LISTEN 2958/mysqlrouter
tcp 0 0 0.0.0.0:6446 0.0.0.0: LISTEN 2958/mysqlrouter
tcp 0 0 0.0.0.0:6447 0.0.0.0: LISTEN 2958/mysqlrouter
tcp 0 0 0.0.0.0:64470 0.0.0.0: LISTEN 2958/mysqlrouter
验证
mysql -u root -h 127.0.0.1 -P 6446 -p
select @@port;
select @@hostname;
故障模拟
##关闭 db1 数据库,自动切换如下:
"topology": {
"db1:3306": {
"address": "db1:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "(MISSING)"
},
"db2:3306": {
"address": "db2:3306",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"db3:3306": {
"address": "db3:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
}
##重启db2 ,执行命令
mysql> show databases;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> show databases;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection> Current database: NONE
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| db1 |
+------------+
##重启节点后,需要手动加入
"db2:3306": {
"address": "db2:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "(MISSING)"
cluster.rejoinInstance('root@db2:3306')
The instance 'db2:3306' was successfully added to the MySQL Cluster.
所有节点都重启了,重新加入
mysqlsh --uri root@db1:3306
mysql-js> var cluster = dba.rebootClusterFromCompleteOutage();
Reconfiguring the default cluster from complete outage...
The instance 'db2:3306' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y|N]: y
The instance 'db3:3306' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y|N]: y
The cluster was successfully rebooted.
报错总结:
##如果节点在加入集群前,执行了写操作,加入集群时会报错
ERROR: Error joining instance to cluster: 'db2:3306' - Query failed. MySQL Error (3092): The server is not configured properly to be an active member of the group. Please see more details on error log.. Query: START group_replication (RuntimeError)
##登陆 db2 数据库 执行 reset master;