当前位置: 首页 > 科技观察

基于Redis+MySQL+MongoDB存储架构应用

时间:2023-03-14 14:43:17 科技观察

Redis+MySQL+MongoDB技术架构,实现本项目大数据存储和实时云计算的需求。MongoDB分片横向动态添加,在不中断平台业务系统的情况下,保证扩容后的查询速度和云计算性能;根据分片键索引分片,每个分片独立计算,让大数据下的实时分析成为现实。将频繁访问的数据放在Redis中,有效降低磁盘I/O,使业务系统响应更快,满足高并发下应用服务的高吞吐需求。基于移动定位服务的应用是根据用户所在位置提供的增值服务。主要通过移动定位技术获取自身当前位置,在电子地图和商务平台的支持下,提供与位置相关的信息服务。通过互联网提供软件服务的SaaS(SoftwareasaService)模式,具有企业初期零投资、不需要服务器、系统研发等软硬件投入等独特优势。建设、引入管理信息系统提供了一种可行的模式。1项目介绍基于此需求背景,拟开发一款面向中小企业的移动定位服务SaaS平台,帮助所有中小企业外勤、外勤、外勤服务户外工作业务降低成本,将定位技术与智能手机客户端集成。结合运营商GSM/WCDMA等无线网络的使用,公司提供公司外工作人员的具体位置和行走轨迹,同时实现考勤签到、快速审批、位置标记、语音分组聊天、数据上报、区域预警。进行地域分析和绩效考核,快速响应客户需求和有效管理员工,深度巩固公司市场优势地位,提升公司核心竞争力。2业务数据分析移动位置服务SaaS平台是企业移动互联网应用,应用过程会积累大量的数据。其中包括:静态信息(手机号、注册信息、手机型号等);位置信息(动作轨迹、速度、停留时间、位置属性);与APP关联的数据(访问行为、社交行为、交易行为等);交互特征(报告频率、数据类型和格式等)。与传统服务相比,其数据容量和特性发生了很大变化。2.1数据源分析数据源包括终端采集的数据和SaaS平台数据。终端数据涵盖Android、IOS智能终端和PC终端。智能终端是企业应用的数据采集器,是商务人士在商务活动中的“人体器官”。扩大。同时,部分数据来自PC端;另外,系统运行过程中会产生大量的日志数据。(1)终端采集的数据①轨迹数据:以包含公司id、用户id、经纬度、地址、定位时间、定位类型等信息的数据样本为例,默认30秒采集一次。小时,每个员工每天有2080条记录,假设用户数为10000,则每天有2080万条记录;单条数据占用空间184KB,10000个用户一天占用空间3GB左右。②常规业务数据:常规业务数据类型包括考勤、工作计划、工作日志、申请、事件提醒、通知公告、销售报表等;保守估计单条数据容量为512KB,每个用户每天产生15条相关业务。其数据量为7680KB,10000个用户每天产生约73MB的数据。③即时聊天和工作微博数据:即时聊天和工作微博数据为非结构化数据,包括以下类型:语音、图片、文本、位置分享等,保守估计单张图片的语音数据量为100条知识库。如果每个用户每天产生30条,数据量为3000KB,10000个用户每天产生约28GB的数据。(2)平台数据作为服务于众多企业的云平台,需要生成和管理以下类型的数据:企业、企业组织、企业用户、用户通讯录、用户通讯录个性化便签、群组名片等;平台方面数据暂时不考虑,和普通企业应用基本类似。2.2数据特征分析(1)流动性。与PC应用相比,移动应用数据采集的时间和空间发生了变化。智能终端不知疲倦,可自动采集并上报位置等信息;同时,移动性大大提高了数据采集的便利性。手机拍照即刻上传,相比以往的相机采集,没有空间限制,也没有链接PC上传的限制。(2)非结构化。采集的图片、语音等媒体数据是非结构化的,例如门店陈列商品的图片采集等,工作微博共享数据的记录与传统的需要交易支持的结构化数据有很大区别。(3)平台级增量化。与以往一个企业增量对应的企业级应用相比,平台级数据增量带来的数据量大幅增加。根据以上分析,10000个用户每天会带来30GB左右的数据增量。30GB的数据,有的是均匀提交给平台,有的是峰值提交给平台;出勤通常集中在通勤时间,而轨迹平均分布在所有工作时间。针对以上数据分析,如何解决其大容量、非结构化数据特性所面临的存储和处理挑战?通过技术选型和前期测试数据对比,选择了Redis+MySQL+Mongodb架构的方案。3相关技术3.1Redis简介Redis(RemoteDictionaryServer)是一个使用ANSIC语言开发的开源Key-Value存储系统。它类似于目前流行的Memcached,都是基于内存(缓存)的数据存储方式。最重要的是Redis支持的数据类型更加丰富,为各个数据结构提供了丰富的操作。同时,Redis与Memcached的不同之处在于,它会将更新的数据异步持久化到硬盘或者将修改的操作写入日志文件。Redis虽然是Key/Value形式的数据库,但是吸收了一些关系型数据库的优点。例如,它可以保存Lists和Sets类型的数据,同时完成排序等高级功能。同时,它正在实现INCR(自增)、SETNX(Key不存在则创建并设置值)等函数来保证其操作的原子性。在此基础上,还实现了Master-Slave(主从)同步[2]。Redis主从复制的特点:(1)支持一个Master可以有多个Slave,Slave也可以接收其他Slave;(2)Master-slavereplication不会阻塞Master和Slave,Master和Slave都可以??同步数据ReceiveClientrequest[2]。3.2MongoDB及其自动分片简介[3]MongoDB是一个基于分布式文件存储的数据库[4]。用C++语言编写。它支持的数据结构非常松散,是一种类似于json的bson格式,因此可以存储更复杂的数据类型。MongoDB的特点是面向集合存储,自由模式,支持动态查询、全索引、查询、复制和故障转移,以及分片的自动处理[5]。MongoDB的核心概念在于文档模型,文档模型是MongoDB数据的基本单位,相当于关系数据库的行。MongoDB中的集合相当于关系数据库中的表。一个MongoDB可以承载多个独立的数据库,每个数据库可以有自己的采集和管理权限。MongoDB的sharding架构是指将数据分成不同的部分,将程序存储在不同的机器上,将数据拆分到不同的服务器上,这样就不需要使用更强大的机器来存储更多的数据和处理更大的负载。MongoDB支持自动分片,集群可以自动拆分数据和重新平衡数据。MongoDB提供了以下分片技术:(1)负载转换和数据分布的自动平衡;(2)动态添加附加服务器;(3)无单点故障;(4)自动故障转移[6]。4技术实现4.1架构功能角色Redis+MySQL+Mongodb架构对应的功能角色如下。Redis:基于内存缓存,保存集群中心会话,即时通讯离线消息队列,即时通讯重发消息收集,用户token生命周期管理,应用高频访问数据缓存,HTML5模板数据缓存,静态应用资源缓存。MySQL:用于交易数据存储:相关企业账户数据、企业常规业务数据、企业平台交易数据。Mongodb:非结构化文档数据存储:包括图片、图标、语音、工作微博文字和结合位置数据的非结构化文档数据,需要动态扩展数据,没有固定模式,应用日志数据,需要map-reduce计算数据。4.2可靠性和可用性保障措施为保证生产系统数据的可靠性和可用性,避免Redis+MySQL+Mongodb单点故障,分别做了主从备份。在此基础上,采用了KEEPALIVE,通过VRRP协议实现自动失效。转变。Redis配置主从,MySQL配置主从,Mongodb配置分片;详细配置清单如下。Redis主从配置需要在slave配置文件中指定masterIP和端口Redis.conf:slaveof192.168.10.106379MySQL主从配置:master配置:server-id=1;log-bin=mysql-bin;binlog-do-db=wqt_web从配置:server-id=2;log-bin=msyql-bin;master-host=192.168.10.3;master-user=slaveuser;master-password=gotop4001680756;master-port=3306;...Mongodb切片配置:mongod-shardsvr-port10001-dbpath=/home/data/shard11/-logpath/home/data/shard11/mongodb.log--forkmongod-shardsvr-port10002-dbpath=/home/data/shard12/-logpath...mongo127.0.0。1:20000/admin配置片段必须链接到admin集合。连接成功后,可以将分片添加到集群中:db.runCommand({"addshard":"127.0.0.1:10001"})...db.runCommand({"addshard":"127.0.0.1:10004"})这是成功的向分片中添加4个分片。分片的制定规则如下:db.runCommand({"shardcollection":"kingfihser.tablename","key":{"primaryKey":1}})激活分片设置:db.runCommand({"enablesharding":"kingfisher"}),***成功配置分片。4.3详细代码4.3.1Redis实现案例在通信中,作为发布订阅队列,Web发布消息,进入Redis发布订阅通道,通信中心从该通道消费消息。所有的信息发布都在Redis中进行,从而提高了响应速度。publicbooleansendMsg(Stringmsg){  booleanrebool=true;  Jedisjedis=null;  try{  jedis=(Jedis)pool.getResource();  jedis.publish("kingfisher.*",消息);  }catch(Exceptione){  e.printStackTrace();  rebool=false;  }最后{  pool.returnResource(jedis);  }  returnrebool;  }4.3.2Mysql实现交易数据存储:包括相关企业账户数据、企业常规业务数据、企业及平台交易数据。这部分的存储计算是通过HIBERNATE+SPRING实现的。4.3.3Mongodb实现案例(1)媒体数据使用GFS网格文件子系统存储。classfileservice(BaseHandler):  defget(self):  id=self.get_argument("id","")  f=GridOut(self.mongo.fs,ObjectId(id))  尝试:  fn=f.filename.lower()defdelete(self):  …(2)工作微博内容和二维空间索引,以及轨迹数据的索引和查询。classlistmark(BaseHandler):'''搜索职位微博列表''  defget(self):  self.set_header("Content-Type","application/json")  ...  classmark(BaseHandler):  '''基于二维空间搜索'''  defget(self):  self.set_header("Content-Type","application/json")  尝试:  …(3)。用于日志分析的map-reduce计算。'''调度生成当天用户访问行为'''classcurrdayuser(BaseHandler):defget(self):...'''调度生成当天服务运行行为'''  classcurrdayservice(BaseHandler):  defget(self):目前的存储结构解决了项目中大数据存储和实时云计算的需求。采用Mongodb切片横向动态添加,在不中断平台业务系统的情况下,保证扩容后的查询速度和云计算性能;根据分片键索引分片,在每个分片中独立进行计算,实现大数据下的实时分析。将频繁访问的数据放在Redis中,有效降低磁盘I/O,使业务系统响应更快,满足高并发下应用服务的高吞吐需求。虽然大数据的存储和计算变得简单,但由于版本和技术的不断变化,数据系统的管理并不容易。新架构下的运维管理会遇到新的挑战,需要不断优化。