本文不讨论分布式关系型内存数据库系统的常规技术要点。只是基于笔者2021年实际参与的,分布式关系型数据库产品研发后期到电信行业核心级应用部署及上线正式运行的经历,从保障系统7*24小时不间断服务角度,探讨如何实现分布式关系型内存数据库系统的长期可持续运行性。
2020年下半年,随着国产化数据库的蓬勃发展趋势,我司电信行业大客户在某省的核心数据库(Oracle),计划更换为我司自主研发的分布式关系型内存数据库。
数据库系统,作为电信行业的7*24小时不间断服务的核心系统,在迁移到内存数据库后,其实只是C4小机上的一个应用,意味着只要数据库应用不重启、所在主机不宕机,其内存占用将会持续增长,C4单机内存已经接近顶配(无法再增加),当内存使用率达到90%甚至接近100%时,主机存在宕机的风险。传统的磁盘数据库,在数据库空间使用比率较高时,可以通过数据清理、增加数据文件等方式予以缓解,相较而言,内存数据库会给运维人员带来更大的运维压力。
经过21年4月~7月初,约3个多月的试运行和多轮分析,我们基本掌握了内存数据库的运维要点,首先确保多占用的内存空间,能及时回收到表级可复用空间;然后通过整表工具将表级可复用空间回收到数据库级可复用空间;其次日常加强清理各类历史及垃圾数据,确保数据库级可复用空间充足(单节点不少于80G),理论上可实现内存数据库的良性运转,详见如下措施和策略。
核心数据库经过多轮瘦身、数据迁移至内存库后,数据+索引的总容量大约在6.3T,起初计划7分片、主备容3副本,每分片初始占用内存约900G,已占到C4单机总内存(1.5T)的60%,为稳妥起见,正式运行前扩为8分片,初始内存占用率降到单机53%左右。
日常新业务开发过程中,不可避免要新增表,原则是尽量限制新增表,需经过评审方可新增,新增表的同时需要提供相应表生命周期管理策略,包括且不限于:分表策略(按日、按月还是按年分表;是否按账户尾号分表、10分表还是50分表)、分表迁移历史库及清理策略(保留3+1还是6+1:3+1是指保留当前月及前3个月,之前的月份分表迁移到历史库,6+1同理)等等。
针对过期的历史月份分表,定期(一般按月)安排迁移至历史磁盘库并同步删除当前库表,释放出的内存空间会回收到数据库级可复用空间。
日常业务开发测试运维过程中,难免会新增临时表,一般建议新增临时表时,都选择使用特定表空间,根据需要安排定期(按周、按月)删除,释放出的内存空间会回收到数据库级可复用空间。
以上种种批量数据处理场景,在数据处理完毕后,相应数据表空间、索引表空间内存新增使用量都比较大,虽然表级可复用空间可供该表后续的数据记录使用,但是如果后续数据量变化不大的情况下,这些内存空间占用就会存在一定的浪费。
借鉴Oracle的收缩表(shrink)功能,我们安排新增了针对内存数据库表的整表功能,将表中数据和索引集中存储,释放多余的内存空间,整表过程中释放的内存空间,回收到数据库级可复用空间。
另外,日常整哪些表、什么时候整也是有讲究的,我们研究了整表相关策略,建议在每月月末月初出账前一周开始,在每天的业务闲时(在整表过程中涉及到数据搬迁操作,可能会对业务有一定影响)安排整表,按照 【(实际数据占用内存空间/表占用内存空间)* 表占用内存空间】大小倒排序,依次整前100或200张表,实操下来,效果还是很明显的。
上图是5月下旬到7月上旬内存使用趋势跟踪,基本符合我们的预期和判断,该内存库于2021年9月中旬正式割接上线。
以上是笔者本人2021年牵头的实践总结,虽然数据库单机偶尔也会存在异常宕机情况,但是凭着主备容三副本高可用能力,以及相对完善的运维保障措施,目前该内存数据库集群已经在客户生产系统中持续运行了近2年时间,另外我司国产数据库产品也在专业团队负责下,目前进一步研发演进中,未来可期!
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
是否有可能:before_filter:authenticate_user!||:authenticate_admin! 最佳答案 before_filter:do_authenticationdefdo_authenticationauthenticate_user!||authenticate_admin!end 关于ruby-on-rails-before_filter运行多个方法,我们在StackOverflow上找到一个类似的问题: https://
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和