前言
MySQL 8.0.30,这个版本没有 MGR 方面的重大修改,为什么我说值得上车 MGR 呢?
GIPK
只因为 8.0.30 新增了 sql_generate_invisible_primary_key 参数,以下我简称为 GIPK 模式!
GIPK 模式下,创建表时如果没有显式定义主键会自动添加一个不可见主键索引,请参考以下两张表:
## sql_generate_invisible_primary_key=off 建的表mysql> SHOW CREATE TABLE auto_0\G
*************************** 1\. row ***************************
Table: auto_0
Create Table: CREATE TABLE `auto_0` (
`c1` varchar(50) DEFAULT NULL,
`c2` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
## sql_generate_invisible_primary_key=on 建的表
mysql> SHOW CREATE TABLE auto_1\G
*************************** 1\. row ***************************
Table: auto_1
Create Table: CREATE TABLE `auto_1` (
`my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
`c1` varchar(50) DEFAULT NULL,
`c2` int DEFAULT NULL,
PRIMARY KEY (`my_row_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
在官方没有设计这个功能之前,我早在 percona 工程师的博客上听过了这个设计构想,当时就觉得非常棒,可行度很高,官方现在在工程上实现了(老叶备注:实际上,阿里云RDS很早就实现了类似的功能)。这是一个伟大的设计。
- 自动创建不可见主键,关键点在于"INVISIBLE" 关键字,那么select * from xxx 出来的结果和之前是兼容的,不会多出来 my_row_id 列。
- 如果表本身有主键,那么 GIPK 就不会自动创建主键
- 如果建表时没有显式指定主键,建表时请勿包含列名叫my_row_id 的列,因为 GIPK 模式自动创建的不可见主键列固定就叫做 my_row_id ,会有冲突导致创建表失败
- GIPK 功能只在新建表时触发,如果表已经建了并且没有主键,请自行解决或重建表
他解决了大家卡住很多人上车 MGR 的一个硬性要求,表必须要有主键!
实际上,没有主键在主从架构甚至单机架构也是不建议的,现在 GIPK 这个特性可以让那些懒惰的开发再也无法阻拦 MGR 的崛起。
8.0.30 MGR 上车吧!
高可用架构
MySQL 活了那么久一直没有一个靠谱的高可用架构方案,所有的高可用架构都是第三方提供的,主流的例如 keepalived + 主从/双主架构、MHA 架构、orchestrator 架构,一直到 5.7.17 才出来第一个官方的高可用架构 MGR。
为什么我说前面那 3 个流行的架构不靠谱,我一个一个来说。
再来看 MGR,官方开发,能保证可靠稳定,不存在作者跑路现象,并且 MGR 是采用 paxso 仲裁的算法,三机架构就是三个节点投票,获得两票的可以选为主,一般正常使用不会脑裂。
MGR5.7 可以上车吗?
MySQL8.0 的 MGR 相对与 MySQL5.7 的 MGR 有以下优势,所以 MGR 对于 5.7 版本是不合适的。
以上表格没有花很多心思总结,实际上应该会有更多的对比项证明 5.7 不适合 MGR。重点是最后一个,导致 5.7 根本上车不了 MGR(老叶备注:如果非要在5.7版本上车MGR,强烈建议选择GreatSQL 5.7.36-39版本,相对于MySQL官方社区版有挺多改进和提升)。