最近一个朋友找到走起君,咨询走起君内存优化表如何作高可用的问题html
你们知道,内存优化表做为In-Memory OLTP功能是从SQL Server 2014开始引入,用来对抗Oracle 12C的In-Memory OLTP选件redis
不过SQL Server的In-Memory OLTP功能是彻底内置的功能,不像Oracle须要额外付费才能得到sql
因为是比较新的技术,可能你们对内存优化表仍是比较陌生,网上也鲜有内存优化表使用场景的文章数据库
朋友公司作的业务是跟蜂鸟配送相似的配送业务,整个配送系统平台天天订单量超过30W服务器
坐标问题并发
系统中某一个部分须要保存跑男的坐标性能
坐标须要保存到redis和数据库,一旦坐标更新也须要更新redis中的数据优化
刚开始朋友用传统表来保存坐标数据,可是很快遇到问题,传统表在更新的速度跟不上spa
后来改用内存优化表,使用了以后日志
刚开始上传坐标的接口,延迟很大,用了内存表,100毫秒之内,搞定
这些坐标是须要持久化的,而内存优化表是彻底支持ACID的,因此也不须要担忧数据丢失的问题
内存优化表更新速度快的另外一个缘由:无锁机制, 并发(如闩锁争用或阻塞)影响的应用程序迁移到内存中 OLTP 时,其性能会显著提升。
你们知道,内存优化表须要有一个非汇集哈希主键索引,大概的表结构是
每一个跑男占用一行记录
对应到redis里面你们应该都知道怎麽存储了吧,使用redis的散列类型来存储跑男的坐标
hmset 跑男ID X坐标 value Y坐标 value 跑男在线时间 value hmset 1 X坐标 12 Y坐标 10 跑男在线时间 60
由于数据库高可用的问题,朋友就购置了新服务器,用来搭建AlwaysOn,新服务器都用SSD固态硬盘
内存优化表的瓶颈主要在事务日志固化,虽然有延迟持久化,可是延迟持久化在乎外宕机的时候可能丢失部分数据
如今新服务器使用SSD固态硬盘以后,事务日志固化的瓶颈基本消失
使用新服务器以后,支撑30w/日订单是彻底没有问题的
另外一个问题是AlwaysOn问题
实际上,SQL Server 2014的AlwaysOn集群已经支持内存优化表,只是不支持在辅助副本上查询内存优化表数据,在故障转移以后
辅助副本上的内存优化表数据是彻底没有丢失的,SQL Server 2016对AlwaysOn集群的内存优化表作了改进,支持在辅助副本上查询内存优化表数据
总结
实际上,若是你们对内存优化表研究比较深刻的话,内存优化表实际上至关于把redis嵌入到SQL Server,再在上面加上事务等关系型数据库特性
由于二者实现的底层都是哈希表
注意:内存优化表跟redis同样,是纯内存操做的,因此机器内存不能过小,SQL Server在启动时候会把内存优化表数据库文件
里面的数据所有load入内存,朋友的redis服务器和SQL Server服务器都用的256G内存,内存还算足够
这篇文章写得比较粗糙,最后祝你们新年快乐!
参考文章
http://www.cnblogs.com/lyhabc/p/3691911.html
http://www.cnblogs.com/lyhabc/articles/4230547.html
https://msdn.microsoft.com/en-us/library/dn635118(v=sql.120)
若有不对的地方,欢迎你们拍砖o(∩_∩)o
本文版权归做者全部,未经做者赞成不得转载。