解析天翼云RDS数据库只读实例
转载: 王普 ctyun的1001种玩法
很多用户对负载均衡已经很熟悉了,当并发请求增大到单台应用服务器无法满足业务需求时,可以增加应用服务器,通过负载均衡器将应用请求分发至多台应用服务器上,在提高并发负载能力的同时,实现应用服务器的容错。
但是有可能在上了负载均衡后仍然存在性能问题,特别是在进行数据提交或者修改的时候,提交后只看到请等候的图标转了一圈又一圈。这就有可能不是应用服务器的并发能力不足了,而是瓶颈在数据库。
那是不是也可以弄多台数据库服务器然后通过负载均衡器来提升性能呢?答案是肯定的,但是数据库不像应用服务器,简单地将数据库复制出一个实例就行了,这涉及到数据库的一致性问题,多个实例之间必须保持数据一致,不然就会出现去银行办业务在1号柜台存了钱,到2号柜台一查发现账上没钱,那就尴尬了。
所以数据库集群往往需要多个实例共享同一个存储,而且实例之间还需要互相协同通气才行,典型如Oracle RAC就是这样工作的。
其它关系型数据库的典型集群模式是高可用集群,比如微软SQLServer故障转移集群,工作时只有主实例提供服务,当主实例出现故障时自动将任务切换至备实例。
还有一种数据库集群模式是分式布数据库集群,类似于分布式存储一样将数据库分片存储和运行在多台服务器上。这就有点复杂了,本文就不细说。
天翼云RDS数据库有单机版和高可用版本,那是不是高可用版本的性能就是是单机版的两倍,可以用来解决性能问题呢?
很遗憾,高可用版本解决的是单实例的单点故障问题,两个实例一个为在线状态另一个为待机状态,当在线实例故障时,集群将自动切换至待机实例,这对于性能没有任何的提升,反而因为主备实例之间需要进行数据同步,相比单机实例甚至会损失一点点性能(采用同步或半同步方式时)。
要解决高并发带来的数据库性能问题,就需要创建只读实例,将数据库的读操作和写操作负荷分担到不同的实例上来提高性能。读操作是指执行select等数据查询语言,写操作指执行insert、update、delete等数据操作语言。
天翼云RDS数据库MySQL版及PostgreSQL版支持在创建主实例后创建只读实例。微软SQLServer版不支持创建只读实例,不在今天的讨论范围内。
只读实例故名思义,即只能执行数据读取操作不能执行数据写入操作的实例。数据库的写入操作只能向主实例写入,写入成功后数据库集群自动将新写入的数据同步到只读实例上,这样从只读实例上就可以读取到新的数据。
它的架构如图所示:
只读实例如何创建
进入天翼云RDS控制台,进入实例管理,点击主实例所在的行右边的“创建只读”按钮,按照向导完成只读实例创建。
天翼云RDS数据库支持最多创建5个只读实例。
只读实例如何计费
只读实例可以根据需要随时创建或删除,当前只读实例只支持按需计费。
只读实例如何使用
创建只读实例后,每个只读实例有一个单独的IP地址,如果创建了两个只读实例再加上主实例,则一共有三个数据库实例地址。应用服务器如何连接这三个地址则成了一个问题。
目前主要有两种解决方法:
第一种方法是改造应用,由应用来决定连接哪个数据库实例。常用的办法是在应用程序中编写一个数据库连接类,写操作自动连接到主实例,读操作随机连接到一个只读实例。
第二种方法是使用数据库中间件。在云主机上安装一个数据库中间件,数据库中间件上配置读写操作分别连接哪个数据库实例。应用服务器改为连接数据库中间件,而不再直接连接RDS数据库实例。
常见的数据库中间件有MyCat、proxySQL、MySQL Proxy、MaxScale等等,数据库中间件在这里就像一个负载均衡器。
在实际生产环境中一般数据库中间件也需要部署为集群模式,防止数据中间件出现单点故障。一个典型的数据库中间件架构如下图所示,组合KeepAlived、Haproxy等实现数据库中间件的高可用和高并发。
创建只读实例后还能不能向主实例执行查询操作**
完全没有问题
能不能向只读实例写入数据
不行,向只读实例执行写入操作会失败。
比如向MySQL数据库只读实例发起写操作,数据库就会提示
The MySQL server is running with the --read-only option so it cannot execute this statement