https://downloads.mysql.com/archives/shell/
https://downloads.mysql.com/archives/router/
mysql shell
cd /data/site/htmltoo.f/htmltoo.shell/mysql-shell-8.0.25-linux-glibc2.12-x86-64bit/bin/
./mysqlsh root@127.0.0.1:3301 --password=wdqdmm@r
-本地节点
dba.configureLocalInstance()
-检查cluster各个节点是否可用
dba.checkInstanceConfiguration("172.18.0.11:3306");
dba.checkInstanceConfiguration("172.18.0.12:3306");
dba.checkInstanceConfiguration("172.18.0.13:3306");
dba.checkInstanceConfiguration("172.18.0.14:3306");
-配置集群
dba.configureInstance("root@172.18.0.11:3306");
dba.configureInstance("root@172.18.0.12:3306");
dba.configureInstance("root@172.18.0.13:3306");
dba.configureInstance("root@172.18.0.14:3306");
-查看集群状态
shell.connect("172.18.0.11:3306");
shell.connect("172.18.0.12:3306");
shell.connect("172.18.0.13:3306");
shell.connect("172.18.0.14:3306");
-创建集群(默认)
var cluster = dba.createCluster('cluster');
-创建集群(多主集群)
var cluster = dba.createCluster('cluster', {'localAddress': '172.18.0.11', 'multiPrimary': true, 'force': true})
-如果现有MGR集群想要搭建InnoDB Cluster的话,可以通过dba.createCluster() 添加adoptFromGR参数,搭建的Cluster基于MGR是否为单写,因此使用adoptFromGR的同时无法使用multiPrimary选项。
var cluster = dba.createCluster('cluster', {adoptFromGR: true});
#获取集群对象
var cluster = dba.getCluster('cluster')
将另外添加进入:
cluster.addInstance('root@172.18.0.12:3306');
cluster.addInstance('root@172.18.0.13:3306');
cluster.addInstance('root@172.18.0.14:3306');
-查看状态 为ONLINE 说明集群安装成功:
cluster.status()
--集群节点状态
- ONLINE - 节点状态正常。
- OFFLINE - 实例在运行,但没有加入任何Cluster。
- RECOVERING - 实例已加入Cluster,正在同步数据。
- ERROR - 同步数据发生异常。
- UNREACHABLE - 与其他节点通讯中断,可能是网络问题,可能是节点crash。
- MISSING - 节点已加入集群,但未启动group replication
-会列出集群维护的指令
dba.help();
-列出详细指令的用法
dba.help('deploySandboxInstance')
# 日常使用的几个重要命令 (mysqlsh的JS语法)
dba.checkInstanceConfiguration("root@172.18.0.12:3306") #检查节点配置实例,用于加入cluster之前
dba.rebootClusterFromCompleteOutage('cluster'); #重启
var cluster = dba.rebootClusterFromCompleteOutage('cluster') #重启集群
dba.dropMetadataSchema(); #删除schema,删除集群元数据,当它无法恢复集群。无法撤消。
var cluster = dba.getCluster('cluster') #获取当前集群
cluster.checkInstanceState("root@172.18.0.12:3306") #检查cluster里节点状态
cluster.rejoinInstance("root@172.18.0.12:3306") #重新加入节点,我本地测试的时候发现rejoin一直无效,每次是delete后
cluster.dissolve({force:true}) #删除集群
cluster.addInstance("root@172.18.0.12:3306") #增加节点
cluster.removeInstance("root@172.18.0.12:3306") #删除节点
cluster.removeInstance('root@172.18.0.12:3306',{force:true}) #强制删除节点
cluster.dissolve({force:true}) #解散集群
cluster.describe(); #集群描述
cluster.setPrimaryInstance('172.18.0.12:3306') #切换指定主节点
-切换到多主模式
cluster.switchToMultiPrimaryMode()
-切换到单主模式
cluster.switchToSinglePrimaryMode('root@172.27.8.2:3306')
-更改集群设置
cluster.setOption('Cluster','cluster')
-更改集群实例设置
cluster.setInstanceOption('root@172.27.8.2:3306', 'exitStateAction', 'READ_ONLY')
# 节点服务器重启后未加入集群(重新加入集群)(多出现主节点)
-如果查询节点状态为:
"status": "(MISSING)"
-重新加入命令
shell.connect("root@172.18.0.11:3306");
var cluster = dba.getCluster();
cluster.rejoinInstance("root@172.18.0.11:3306")
cluster.rejoinInstance("root@172.18.0.12:3306")
-如果rejoinInstance失败,提示remove重新添加如下:
cluster.removeInstance('root@172.18.0.12:3306');
cluster.addInstance('root@172.18.0.12:3306');
# 集群中所有服务器重启,所有节点都offline,直接获取集群信息失败
-查询数据库
SELECT * FROM performance_schema.replication_group_members;
-仅显示单机 'MEMBER_STATE' = 'offline'
-使用
SELECT clusters.cluster_id,clusters.cluster_name from mysql_innodb_cluster_metadata.clusters;
-查找集群名称
-恢复集群
+------------+--------------+
| cluster_id | cluster_name |
+------------+--------------+
| 1 | Cluster |
+------------+--------------+
-指令如下:
shell.connect("root@172.18.0.11:3306");
dba.rebootClusterFromCompleteOutage('cluster');
---停止集群
\sql
stop group_replication;
# 查看线程列表
MySQL 172.16.16.10:3306 ssl JS > \sql show processlist;
---节点重启后,如果未加入集群,执行下面代码加入
mysqlsh --uri root@172.16.9.51:3306
dba.rebootClusterFromCompleteOutage(cluster)
var cluster = dba.getCluster();
cluster.rescan()
---集群所有节点发生重启
--当集群的所有节点都offline,直接获取集群信息失败,如何重新恢复集群
var cluster=dba.getCluster('cluster')
Dba.getCluster: This function is not available through a session to a standalone instance (RuntimeError)
dba.rebootClusterFromCompleteOutage('cluster')
--问题1
cluster=dba.getCluster(cluster);
Dba.getCluster: An open session is required to perform this operation. (RuntimeError)
-需要先连接到集群实例
shell.connect("root@127.0.0.1:3301");
--问题2
metadata exists, instance belongs to that metadata, but GR is not active
Dba.getCluster: This function is not available through a session to a standalone instance (metadata exists, instance belongs to that metadata, but GR is not active) (RuntimeError)
-此时可尝试重启集群:
dba.rebootClusterFromCompleteOutage(cluster);
-若依然不能解决,则使用cmd方式登录MySQL,然后启动该节点的group replication:
stop group_replication;
set global group_replication_bootstrap_group=on;
start group_replication;
set global group_replication_bootstrap_group=off;
--问题3
metadata exists, instance does not belong to that metadata, and GR is not active
-调用\connect连接到某个从节点,然后var cluster = dba.getCluster()时报:
Dba.getCluster: This function is not available through a session to a standalone instance (metadata exists, instance does not belong to that metadata, and GR is not active) (RuntimeError)
-此时可删除从节点元数据,重新加入集群中:
dba.dropMetadataSchema();
-执行过程中会报一个ERROR,提示是否禁用super_reade_only,输入y即可。
-对于非当前节点报的此错误,首先要\connect连接到错误节点。
mysql-router
cd /data/site/htmltoo.f/htmltoo.shell/mysql-router-8.0.25-linux-glibc2.12-x86_64/bin
./mysqlrouter --bootstrap root@127.18.0.11:3306 --user=root
---只需要在第一台机器安装mysqlrouter:
rpm -ivh mysql-router-8.0.25-1.el7.x86_64.rpm --nodeps --force
vim /etc/mysqlrouter/mysqlrouter.conf
-设置连接数: max_connections=1024
[DEFAULT]
logging_folder = /var/log/mysqlrouter/
plugin_folder = /usr/lib64/mysqlrouter
runtime_folder = /var/run/mysqlrouter
config_folder = /etc/mysqlrouter
[logger]
level = INFO
-目前就支持两种 : read-write 和 read-only
-read-write:用于高可用,用于可读可写
-read-only:用于负载均衡,只读
-当一台Master出现故障后另外一台Master或者Slave接管
[routing:ro]
bind_address = 0.0.0.0
bind_port=7001
destinations =172.25.9.1:3306,172.25.9.3:3306,172.25.9.4:3306
routing_strategy = round-robin
[routing:rw]
bind_address=0.0.0.0
bind_port=7002
destinations=172.25.9.1:3306,172.25.9.3:3306,172.25.9.4:3306
routing_strategy = first-available
[routing:read_write]
bind_address = 10.4.3.66
bind_port = 7001
mode = read-write
destinations = vm001:3306,vm002:3306,vm003:3306
protocol=classic
max_connections=1024
[routing:read_only]
bind_address = 10.4.3.66
bind_port = 7002
mode = read-only
destinations = vm001:3306,vm002:3306,vm003:3306
protocol=classic
max_connections=1024
[keepalive]
interval = 60
#重启mysqlrouter
systemctl restart mysqlrouter
#设置mysqlrouter开机自启
systemctl enable mysqlrouter
-配置Router
./mysqlrouter --bootstrap root@127.18.0.11:3306 --account=mysqlrouter --user=root
vim /etc/mysqlrouter/mysqlrouter.conf
mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf
-测试集群
1、宕掉主节点A后,会从另外两个中选择出一个作为主节点,且A恢复后,不会成为主节点。
2、使用客户端工具Navicat可以连接路由节点,IP:192.168.7.121,端口7001,用户名密码与实例节点一致。
3、JavaWeb应用程序,连接路由节点,且任意宕掉其中一个或两个实例节点后,应用程序不受影响。
4、在第一台机器创建一个数据库,其余两台会自动创建这个数据库
keepalived
yum install -y keepalived
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf
# MASTER节点
global_defs {
router_id MYSQL_ROUTER # 各节点统一ID
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_mysqlrouter {
script "/usr/bin/killall -0 /usr/bin/mysqlrouter" # 检测mysqlrouter是否在运行
interval 2
weight 2
fall 2
}
vrrp_instance VI_1 {
state MASTER # 主节点
interface ens192 # VIP绑定的网卡
virtual_router_id 33 # 各节点统一的虚拟ID
priority 102 # 数越高优先级越高
advert_int 1 # 检测间隔 1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.7.33 # VIP
}
track_script {
check_mysqlrouter # 检测脚本
}
}
# BACKUP节点(不同的配置)
state BACKUP # 备节点
priority 101 # 数值低于MASTER
systemctl restart keepalived