上一篇文章提到 MySQL 集群方案,除了(分布式系统的ID )里提到的通过 ID 分片外,官方有许多集群方案,这篇文章介绍几个。
InnoDB Cluster (MySQL 7+) MySQL Router 之前的文章mysql配置主从分离 但是没有说怎么做高可用,MySQL Router 即是扮演这个角色,在 master 不可用的时候,选择一台 slaver 充当主。MySQL Router 原理类似 LVS,有一个 VIP 暴露给应用层,而应用层不需要知道内部数据库服务器的增减。注意 Router 本身不提供高可用,可以通过 keepalived 提供。
配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 [mysql@hdp2~]$more /etc/mysqlrouter.conf [DEFAULT] logging_folder = /home/mysql/mysql-router-2.1.6/log plugin_folder = /home/mysql/mysql-router-2.1.6/lib/mysqlrouter config_folder = /home/mysql/mysql-router-2.1.6/config runtime_folder = /home/mysql/mysql-router-2.1.6/run data_folder = /home/mysql/mysql-router-2.1.6/data [logger] level = INFO [routing:basic_failover] bind_address = 172.16.1.125 bind_port = 7001 mode = read-write destinations = 172.16.1.126:3306,172.16.1.127:3306 [routing:load_balance] bind_address = 172.16.1.125 bind_port = 7002 mode = read-only destinations = 172.16.1.126:3306,172.16.1.127:3306
配置字段[routing:basic_failover]部分对应写服务器(master)规则,对应SQL: INSERT, UPDATE…,[routing:load_balance]部分对应读服务器(slave)规则,对应SQL: SELECT。如果有其他集群,还可以继续配置。
mode字段可选值有 read-write和read-only
read-write 表示前一个服务器失败后,按照顺序启用后一个服务器。所有的请求都集中在一个服务器。如果前一个服务器恢复了,也不会加回到路由表。只能重启 Router。
read-only 表示一个服务器失败后,会按照顺序启用后一个服务器。所有的请求会按照顺序分配到各个服务器。如果前一个服务器恢复了,可以加回到路由表。
由此可知,写服务只能选择 read-write。如果读服务对一致性有高要求,也应该选择 read-write,如果没有高要求,可以选择 read-only。
查看路由
1 2 3 4 5 6 7 C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.125 -P7001 -e "show variables like 'server_id'" mysql: [Warning] Using a password on the command line interface can be insecure. +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 127 | +---------------+-------+
集群配置
服务器(至少3台):svr1, svr2, svr3
配置文件 my.cnf
修改不同机器的名称或IP;
server_id使用不同编号;
loose-group_replication_group_name使用UUID形式,集群中机器使用同一个UUID;
loose-group_replication_single_primary_mode在单主模式中为ON,在多主模式中为OFF。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [mysqld] pid-file = /var/run/mysqld/mysqld.pidsocket = /var/run/mysqld/mysqld.sockdatadir = /var/lib/mysqllog-error = /var/log/mysql/error.logbind-address = 0.0 .0.0 server_id = 1 gtid_mode = ON enforce_gtid_consistency = ON master_info_repository = TABLErelay_log_info_repository = TABLEtransaction_write_set_extraction = XXHASH64binlog_checksum = NONElog_slave_updates = ON log_bin = binlogbinlog_format = ROWrelay-log = svr-relay-binloose-group_replication_group_name = a38e32fd-5 fb6-11 e8-ad7a-00259015 d941loose-group_replication_start_on_boot = OFF loose-group_replication_local_address = svr1:33061 loose-group_replication_group_seeds = svr1:33061 ,svr2:33061 ,svr3:3306 loose-group_replication_bootstrap_group = OFF loose-group_replication_allow_local_disjoint_gtids_join = ON loose-group_replication_single_primary_mode = OFF loose-group_replication_enforce_update_everywhere_checks = ON
创建集群
1 2 3 4 5 6 7 8 9 10 11 12 $ sudo -i mysqlsh --uri=user@svr1:3306 mysql-js> dba.checkInstanceConfiguration('user@svr1:3306' ) mysql-js> var cluster = dba.createCluster('mysqlCluster' ) mysql-js> var cluster = dba.createCluster('mysqlCluster' , {multiMaster:true }) mysql-js> cluster.addInstance('user@svr2:3306' ) mysql-js> cluster.addInstance('user@svr3:3306' ) mysql-js> var cluster = dba.getCluster() mysql-js> cluster.status();
NDB Cluster NDB Cluster 的采用的是 NDB 引擎,和InnoDB最大的区别是隔离级别只支持 Read Committed。因为InnoDB的默认隔离级别是 Repeatable Read,所以在设计数据库和迁移数据库的时候要格外注意这点。NDB Cluster 官方提供了专门的安装引导,这里就不详细说明了。
PS
其实是看到 MySQL Fabric 方案才想写这篇文章的,不过从官方网站上看,好像 Fabric 方案已经被废弃了。
参考资料:适用MySQL Router实现高可用 MySQL InnoDB Cluster配置 通过例子理解mysql事务的4种隔离级别