背景
数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为“IT的心脏”。因此,让数据库安全、稳定、高效地运行已经成为IT管理者必须要面对的问题。数据库在底层架构层面需要满足以下几点建设要求:
安全和可靠:不能因为服务器的软硬件故障导致数据丢失和业务中断;
容灾:多数据中心间的数据库同步,某一个数据中心出现故障后,可以在另一个数据中心快速拉起业务;
读写分离(报表分离):把接口程序、报表程序、集成平台数据抽取、大数据运算等高消耗的查询语句分离到备机执行,从而避免对主服务器的性能消耗以及造成的阻塞和死锁;
负载均衡 : 需要多台服务器同时负载并发请求,降低单台服务器的压力,提升系统整体性能;
弹性扩展 : 通过增加服务器的方式应对数据量或者访问量增加带来的性能瓶颈。
AlwaysOn
AlwaysOn是SQL Server 从2012版本开始推出的多个实例间同步数据库的技术,借助Windows失败转群集实现高可用,主副本出现故障后,自动切换到辅助副本。辅助副本中数据库都是可以查询的,可用来实现读写分离、负载均衡等功能。
AlwaysOn中每个副本的SQL Server服务独立安装,使用每个副本自己存储介质内的数据库文件。在主副本写入数据时会产生日志,AlwaysOn捕获并传输日志到其他副本,并通过REDO技术完成日志到数据的转换,从而实现各副本中数据的一致性。有同步提交和异步提交两种同步方式,不同的副本可以使用不同的同步方式。
![](https://i-blog.csdnimg.cn/blog_migrate/26de9bcae63873f7957d42253ec5b0b8.png)
Moebius(莫比斯)
Moebius数据库多活集群是格瑞趋势为SQL Server数据库研发的能够同时满足可用性、数据安全、容灾、读写分离、负载均衡的一站式多活集群。集群的名字取自Moebius环,寓意无限扩展。
Moebius采用“share nothing”架构,每个节点的SQL Server服务独立安装,使用每个服务器自己存储介质内的数据库文件。不基于共享存储设备,也不基于磁盘镜像等功能,通过SQL Server的日志同步技术实现各节点中数据的一致性。在主节点写入数据时会产生日志,Moebius捕获并传输日志到其他节点,并通过REDO技术把日志转换成数据。因此每个节点的SQL Server服务都是启动的,数据都是“活”的。Moebius有实时和准实时两种同步方式,不同的节点可以使用不同的同步方式。
Moebius的调度引擎支持连接级和SQL语句级两种调度方式,通过规则的配置,在不改动或者少改动应用程序的前提下,透明的实现读写分离、负载均衡。
![](https://i-blog.csdnimg.cn/blog_migrate/91b9b9981ea2830b4847716e5a8f2f71.png)
封装
AlwaysOn依赖Windows失败转移群集(WSFC),WSFC又依赖很多Windows组件,概念多而且晦涩,还有很多隐蔽的参数,所以安装过程比较复杂,稍有不慎就会为以后的运维留下隐患,因此需要专业的DBA。
Moebius集成了格瑞趋势数百次安装经验,对AlwaysOn的安装过程进行了全面的封装,安装过程中自动配置WSFC等相关Windows功能组件和参数的最佳实践配置, 降低了安装过程中的复杂度,减少对专业DBA的依赖。
增强
登录账号
AlwaysOn不支持登录账号(属性、密码、角色、权限等)的同步,需要DBA手动维护。在实践过程中发现,辅助节点切换成主节点时,因为没有账号、密码不对、权限不对、数据库映射关系不对等导致业务系统无法正常使用的情况非常普遍,靠人工的方式保障每个节点上登录账号的一致性是很困难的。还有一个情况,很多DBA在同步账号的时候,在主节点生成脚本然后在辅助节点上执行,这种方式创建的账号SID在各节点间不一致,导致节点切换时数据库和账号映射关系不对,业务系统无法正常使用。
Moebius支持对登录账号创建、更改、删除整个生命周期的自动同步,保障登录账号在各个节点间的一致性。
作业
AlwaysOn不支持作业的同步,辅助节点切换成主节点时,因为没有作业、作业的内容不对、没有及时开启等原因导致业务数据混乱等问题。
Moebius支持对作业创建、更改、删除整个生命周期的自动同步,保障作业在各个节点间的一致性。而且自动根据节点的状态控制作业的运行状态,主节点的作业是运行的,辅助节点的作业是禁止的,防止作业在多个节点上重复执行。
链接服务器
AlwaysOn不支持链接服务器的同步,Moebius支持对链接服务器创建、更改、删除整个生命周期的自动同步,保障链接服务器在各个节点间的一致性。
系统数据库对象
很多业务系统会在系统库中存储对象,例如在master库中保存注册码的表、model库存储作为模板的对象等。这些对象不同步同样会造成业务系统无法正常使用。
Moebius支持对系统库中的表(结构和数据)、存储过程、视图、函数等常用对象的同步,可以对系统库名称,对象类型、对象名称等多个维度进行灵活的配置。
CDC
CDC(变更数据捕获)是SQL Server捕获数据变更的技术,把表的变更记录(INSERT、UPDATE、DELETE、DDL)保存在系统表中,供业务使用,第三方数据增量同步工具(DSG、GoldenGate等)都是封装的CDC,很多厂商的集成平台或者报表平台也是通过CDC实现增量数据的抽取。
AlwaysOn不支持CDC的同步,当辅助节点切换成主节点时,CDC会停止,DBA要通过复杂的操作才能让CDC继续。实践中发现,在AlwaysOn中使用CDC对DBA是个非常大的困扰,觉大多数DBA都不清楚CDC的实现原理,操作不好,最终只能选择重新初始化。
Moebius对CDC做了全面的封装,节点切换时,会自动在新的主节点上开启CDC,并且无缝衔接上次的捕获, 极大的方便了CDC的使用。
读写分离
在AlwaysOn下实现读写分离,应用程序建立数据库连接时使用的数据库连接字符串的配置中加上“ApplicationIntent=ReadOnly”关键词,SQL Server把该连接建立到AlwaysOn的辅助节点执行。前提是该连接里面所有的SQL语句都必须是只读的,如果有更新的SQL语句,就会报错。也就是说AlwaysOn的读写分离是连接级的,不是语句级的。很多人认为只要在数据库连接串中加好这个关键词,不需要改动应用程序就能实现读写分离了,这是个非常大的误区。应用程序要使用两个数据库连接串,一个读写的,一个只读的,确定是只读的功能使用这个只读的字符串建立连接。这个改造过程对于自己研发的功能来说是容易的,如果是购买的产品,难度就可想而知了。
Moebius的调度引擎支持语句级的解析,只需要修改应用程序的数据库连接串让应用程序连接到Moebius集群的端口,然后在Moebius中配置基于语句特征的相关规则就可以在不修改或者少修改应用程序的前提下实现读写分离,Moebius支持SQL语句、登录名、客户端主机名、应用程序名等多个维度进行规则的配置。
负载均衡
AlwaysOn从SQL Server 2016开始才支持负载均衡的功能,而且和读写分离的要求一样,需要应用程序的修改。在Moebius中,在读写分离的基础上启用负载均衡选项即可,而且没有SQL Server版本的限制。