可以将其解释为整个集群的备份,提供了容灾的能力,如果主集群由于数据中心丢失或网络连接丢失而变得不可用,可以使副本集群处于活动状态以恢复服务的可用性
限制:
- 正常的复制延迟或网络分区可能意味着在主集群遇到问题时,部分或全部副本集群与主集群不完全一致。在这些情况下,如果触发紧急故障转移,任何未复制或发散的事务都面临丢失的风险。如果不能容忍故障转移期间发生任何事务或数据丢失,请考虑使用单个 InnoDB Cluster 以及跨多个数据中心部署的成员服务器,而不是使用 InnoDB ClusterSet 作为解决方案
- InnoDB ClusterSet仅支持异步复制,不能使用半同步复制
- InnoDB ClusterSet 部署只能包含单个读写主集群
实验环境
主机名/IP | 角色 |
server01/192.168.1.201 | 主集群-主 |
server02/192.168.1.202 | 主集群-辅 |
server03/192.168.1.203 | 主集群-辅 |
server04/192.168.1.204 | 副本集群-主 |
server05/192.168.1.205 | 副本集群-辅 |
server06/192.168.1.206 | 副本集群-辅 |
server07/192.168.1.207 | mysqlrouter |
ALL NODES(除server07)
添加映射
vim /etc/hosts
192.168.1.201 server01
192.168.1.202 server02
192.168.1.203 server03
192.168.1.204 server04
192.168.1.205 server05
192.168.1.206 server06
192.168.1.207 server07
安装mysql存储库
wget wget https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb
dpkg -i mysql-apt-config_0.8.32-1_all.deb
apt update -y
安装mysql
apt install mysql-server -y
配置允许外部访问mysql
vim /etc/mysql/mysql.conf.d/mysql.conf
[mysqld]
bind-address=0.0.0.0
重启服务
systemctl restart mysql
安装mysql shell
apt install mysql-shell -y
创建集群服务配置账户
mysqlsh mysql://root@localhost:3306
\js
dba.configureInstance('root@localhost:3306',{clusterAdmin:"'clusteradmin'@'%'"});
检查实例是否符合集群要求
dba.checkInstanceConfiguration('clusteradmin@localhost:3306');
server01
创建一个名为testCluster的集群
mysqlsh -u clusteradmin -p
\js
var cluster = dba.createCluster('testCluster')
查看集群信息
cluster.status()
将两个实例添加到集群
cluster.addInstance('clusteradmin@192.168.1.202:3306')
cluster.addInstance('clusteradmin@192.168.1.203:3306')
从其他节点验证
mysqlsh -u root -p -h 192.168.1.202
\js
var cluster = dba.getCluster('testCluster')
cluster.status()
创建一个名为testclusterset的ClusterSet
myclusterset = cluster.createClusterSet('testclusterset')
创建副本集群
cluster2 = myclusterset.createReplicaCluster("clusteradmin@192.168.1.204:3306", "clustertwo", {recoveryProgress: 1, timeout: 10})
将两个实例添加进副本集群
cluster2.addInstance('clusteradmin@192.168.1.205:3306')
cluster2.addInstance('clusteradmin@192.168.1.206:3306')
查看ClusterSet状态
myclusterset.status()
查看更详细的状态信息
myclusterset.status({extended: 1})
查看拓扑
myclusterset.describe()
server07
添加映射
vim /etc/hosts
192.168.1.201 server01
192.168.1.202 server02
192.168.1.203 server03
192.168.1.204 server04
192.168.1.205 server05
192.168.1.206 server06
192.168.1.207 server07
安装mysql存储库
wget wget https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb
dpkg -i mysql-apt-config_0.8.32-1_all.deb
apt update -y
安装mysqlrouter
apt-get install mysql-router-community
引导路由
mysqlrouter --bootstrap clusteradmin@192.168.1.201:3306 --account=router1 --account-create=always
成功引导后配置文件将会在/etc/mysqlrouter/mysqlrouter.conf,只需要保留
[routing:bootstrap_rw_split]
bind_address=0.0.0.0
bind_port=6450
destinations=metadata-cache://testclusterset/?role=PRIMARY_AND_SECONDARY
routing_strategy=round-robin
protocol=classic
connection_sharing=1
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
access_mode=auto
其他的诸如[routing:bootstrap_rw]、[routing:bootstrap_ro]、[routing:bootstrap_x_rw]、[routing:bootstrap_x_ro]都可以注释掉,这些都是使用不同端口进行读写分离的配置块
重启服务
systemctl restart mysqlrouter
查看路由信息
myclusterset.listRouters()
myclusterset.routingOptions()
拓展
切换主集群
var myclusterset=dba.getClusterSet()
myclusterset.setPrimaryCluster('clustertwo')
进行紧急故障转移,可以强制将副本集群指定为主集群
myclusterset.forcePrimaryCluster()
停止向 ClusterSet 的主集群写入流量。副本集群不接受写入,因此此操作对它们没有影响
myclusterset.fenceWrites()
恢复写入流量
myclusterset.unfenceWrites()
隔离集群以及该集群中的所有只读副本,阻止所有流量
myclusterset.fenceAllTraffic()
如果您使用.fenceAllTraffic()隔离了集群的所有流量,则必须重新启动集群
dba.rebootClusterFromCompleteOutage()
移除ClusterSet
myclusterset.removeCluster('clusterone')
集群重新加入ClusterSet
myclusterset.rejoinCluster('clustertwo')