最近,Oracle 宣布 MySQL 8.2 正式可用,包括对读写分离的支持。这一备受期待的特性已经在最新的创新版本中引入,有助于优化数据库性能和提升可扩展性。
读写分离使应用程序能够将所有写入流量定向到读写(主要或源)实例,将所有读取流量定向到只读实例,这些实例是 InnoDB Cluster 的附属实例,或者是 Replica Cluster 的主实例或附属实例。
MySQL 社区经理 Frederic Descamps 解释说:我们在副本之间分配读取流量,但这需要在应用程序中通过某种方式来管理:将写入流量指向某个地方,将读取流量指向其他地方。MySQL 8.2 的 MySQL Router 现在能够识别读取和写入流量,并将它们路由到 InnoDB Cluster 的主实例,或者将写入流量路由到异步复制源,将读取流量路由到附属实例或副本。
使用读写分离,每个客户端会话可以与一个 read_write 和一个read_only 目标通信,路由器会将每个查询分类为读取或写入,并将其定向到适当的后端。
Percona 创始人兼开源布道师 Peter Zaitsev 表示: 这是 MySQL 8.2 的一项重大特性!不过尚不清楚在这种情况下对读取是否有一致性级别的保证。是否可以读取过时的数据?如果可以,过时多久?客户端使用读写端口(默认为 6450)连接到 MySQL,如果进行读取,连接将到达副本(附属),如果启动了事务,它们将到达复制源(主实例)。
在大规模应用中,我们将读操作分发到副本之间,但这需要在应用程序中进行管理:将写操作指向某处,将读操作指向另外的地方。
在MySQL 8.2中,MySQL路由器现在能够识别读操作和写操作,并将它们路由到InnoDB集群的主实例,或将写操作路由到异步复制源,而将读操作路由到非主实例或副本。
为了说明这一点,我部署了最简单的架构:MySQL InnoDB ReplicaSet。
MySQL InnoDB ReplicaSet
这只是一个复制源实例和一个(或多个)异步复制副本
这是MySQL Shell中ReplicaSet对象的状态:
启动MySQL Router 8.2
让我们配置(引导)MySQL Router:
mysqlrouter --bootstrap root@127.0.0.1:3306 --user mysqlrouter
我们还可以在MySQL Shell ReplicaSet对象中看到路由器:
使用读/写端口连接到MySQL(6450):
可以看到,默认情况下,如果我们执行读操作,会连接到副本(或者非主实例),但如果我们启动一个事务,将连接到复制源(主实例),这个过程会在同一个连接中自动完成,并且不需要应用更改端口。
我们还可以看到在使用只读事务时的区别:
我们可以在MySQL Router的配置文件中看到为R/W分割生成的设置:
[routing:bootstrap_rw_split]
bind_address=0.0.0.0
bind_port=6450
destinations=metadata-cache://myreplica/?role=PRIMARY_AND_SECONDARY
routing_strategy=round-robin
protocol=classic
connection_sharing=1
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
access_mode=auto
您还可以在会话中使用命令
ROUTER SET access_mode=
定义要访问的实例类型:
结论
MySQL Router 8.2支持读写分离。这对于优化数据库性能和可伸缩性来说是一个很有价值的特性,而不必在应用程序中进行任何更改。
-
此配置允许您将所有读流量定向到只读实例,将所有写流量定向到读写实例。 -
此功能不仅增强了整体用户体验,还简化了数据库管理和部署。
读写实例是主实例或源实例。只读实例是副本(InnoDB Cluster次实例、ReplicaSet次实例或Replication Cluster中的次实例)。
享受MySQL,没有更多的借口不把工作负载分散到副本!
原文始发于微信公众号(开源技术小栈):「译文」MySQL 8.2 正式发布,原生支持读写分离!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/247957.html