1. 程式人生 > >基於Redis+MySQL+MongoDB儲存架構應用

基於Redis+MySQL+MongoDB儲存架構應用

摘  要: Redis+MySQL+MongoDB技術架構實現了本專案中大資料儲存和實時雲端計算的需求。使用MongoDB切片的水平動態新增,可在不中斷平臺業務系統的同時保障擴容後的查詢速度和雲端計算效能;依據切片鍵索引分片,位於各切片獨立進行計算,使大資料下的實時分析成為現實。對於高頻訪問的資料放在了Redis中,有效地降低磁碟I/O,使業務系統響應更為敏捷,滿足了高併發下應用服務的高呑吐要求。

  關鍵詞: 移動位置服務SaaS;Redis;MongoDB

  基於移動位置服務的應用是根據使用者所在位置提供的一種增值業務,主要通過移動定位技術獲得其當前所在位置,在電子地圖和業務平臺的支援下,提供位置相關的資訊服務。通過網際網路提供軟體服務的SaaS(Software as a Service)模式具有企業初期零投入,不需伺服器、系統研發等軟硬體投入等獨特的優點,為廣大中小企業解決前期資金投入不足的情況下開展資訊化建設,引入管理資訊系統提供了一個可行的模式。

  1 專案簡介

  基於此需求背景提出開發一種面向中小企業移動位置服務的SaaS平臺,幫助所有具有外勤、外巡、外服的戶外工作業務的中小企業降低成本,將定位技術與智慧手機客戶端相結合,利用運營商的GSM/WCDMA等無線網路,為企業提供在外工作人員的具體位置和行走軌跡,同時實現考勤簽到、快速審批、位置標註、語音群聊、資料上報、區域預警,更好地進行地理化分析、業績審視,快速響應客戶需求和有效管理員工,深度鞏固企業在市場中主體地位和增強企業核心競爭力。

  2 業務資料分析

  移動位置服務的SaaS平臺作為企業移動網際網路應用,應用過程將積累大量資料。其中包括:靜態資訊(手機號碼、註冊資訊、手機型號等);位置資訊(行動軌跡、速度、停留時間、地點屬性);與APP關聯的資料(訪問行為、社交行為、交易行為等);互動特點(報告頻率、資料型別與格式等)。其資料容量和特點較傳統業務有較大地變化。

  2.1 資料來源分析

  資料來源包括終端採集的資料和SaaS平臺數據,終端資料涵蓋了Android、IOS智慧終端和PC端,智慧終端是企業應用的資料採集器,是企業人在業務活動中“人體器官”的延伸。同時還有部分資料來源於PC端;另外系統執行過程中,會產生大量日誌資料。

  (1)終端採集的資料

  ①軌跡資料:以包括公司id、使用者id、經緯度、地址、定位時間、定位型別等資訊的一個數據樣本為例,預設30 s採集一次,假如企業員工預設工作時間8小時,每個員工每天條數為2 080條,假定使用者數為10 000,那麼每天有2 080萬條;單條資料佔用空間184 KB,10 000使用者一天佔用空間約為3 GB。

  ②常規業務資料:常規業務資料種類有考勤、工作計劃、工作日誌、申請、事件提醒、通知公告、銷售上報等;保守預計單條資料容量為512 KB,按每個使用者每天產生15條相關業務,其資料量為7 680 KB,10 000使用者一天產生資料量約為73 MB。

  ③即時聊天和工作微博資料:即時聊天和工作微博資料為非結構化資料,包含如下種類:語音、圖片、文字、位置分享等。保守預計單條圖片語音資料量為:   100 KB,按每個使用者每天產生30條,其資料量為3 000 KB,10 000使用者一天產生資料量約為28 GB。

  (2)平臺數據

  作為服務眾多企業的雲平臺,還有如下種類資料需要產生和管理:企業、企業組織、企業使用者、使用者通訊錄、使用者通訊錄個性化備註、群組名片等;平臺方面的資料暫且不作考量,與普遍的企業應用基本類似。

  2.2 資料特點分析

  (1)移動化。與PC應用相比較,移動應用資料採集的時空變化了,智慧終端不知疲倦,可以自動採集上報如位置等資訊;同時移動化使得采集資料的便捷性得到了極大提高,用手機拍照立即便可上傳,相比過去的照相機採集沒有空間限制也沒有連結PC上傳的限制。

  (2)非結構化。採集的圖片語音等媒體資料非結構化,例如採集門店的貨品陳列的圖片資料等,工作微博分享的資料文件化,與傳統結構化、需要事務支援的資料有明顯差異。

  (3)平臺級增量化。與以往企業級應用對應一家企業增量相比,平臺級資料增量化帶來的資料量巨大增加,通過上面的分析,10 000使用者每天會帶來大約30 GB的資料增量。30 GB資料有些均勻地提交到平臺,有些會以峰值的方式提交到平臺;考勤通常集中在上下班時段,而軌跡則均勻分佈在所有上班時間。

  針對以上資料分析,如何解決其大容量和非結構化資料特點面臨的儲存和處理的挑戰?通過技術選型和前期的測試資料對比,選用了Redis+MySQL+Mongodb架構的解決方案。

  3 相關技術

  3.1 Redis簡介

  Redis(Remote Dictionary Server)是一個使用ANSI C語言開發的開源的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和Slave,在同步資料時,Master和Slave都可以接收Client請求[2]。

  3.2 MongoDB及其自動分片簡介[3]

  MongoDB是一個基於分散式檔案儲存的資料庫[4]。由C++語言編寫。它支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料型別。MongoDB的特點是面向集合儲存,模式自由,支援動態查詢、完全索引、查詢、複製和故障轉移,自動處理碎片[5]。MongoDB的核心理念在於文件模型,它是MongoDB資料的基本單元,等價於關係型資料庫的行。MongoDB中的集合等價於關係型資料庫中的表。一個單一的MongoDB可以承載多個獨立的資料庫,每個資料庫可以擁有自己的集合和管理許可權。

  MongoDB的分片架構是指把資料分割成不同部分,在不同的機器上的儲存過程,通過分割資料到不同的伺服器上,使得無需使用更強大的機器來儲存更多的資料和處理更大的負載。MongoDB支援自動分片,叢集可以自動分割資料和資料的再均衡。MongoDB提供以下的分片技術:(1)對負載的變換和資料的分佈自動平衡;(2)動態新增額外伺服器;(3)無單點故障;(4)自動故障轉移[6]。

  4 技術實現

  4.1 架構功能角色

  Redis+MySQL+Mongodb架構對應功能角色如下。

  Redis:基於記憶體快取記憶體,儲存叢集中央會話,即時通訊離線訊息佇列,即時通訊重發訊息集合,使用者令牌生命週期管理,應用高頻訪問資料快取,HTML5模板資料快取,靜態應用資源快取。

  MySQL:進行事務資料儲存:相關企業帳號資料,企業常規業務資料,企業平臺交易資料。

  Mongodb:進行非結構化文件資料儲存:包括圖片、圖示、語音、工作微博文字以及結合位置資料的非結構化的文件資料,需要動態擴充套件無固定模式的資料,應用日誌資料,需要map-reduce計算的資料。

  4.2 可靠性和可用性保障措施

  為了保證生產系統資料可靠性和可用性,規避Redis+MySQL+Mongodb單點故障,分別作了主從備份,在此基礎上採用了KEEPALIVE,通過VRRP協議實現了故障的自動切換。Redis配置了主從,MySQL配置了主從,Mongodb配置了切片;詳細配置清單舉例如下。

  Redis主從配置需要在從配置檔案Redis.conf指定主IP和埠:slaveof 192.168.10.10 6379

  MySQL主從配置:

  主配置: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-port 10001-dbpath=/home/data/shard11/-logpath /home/data/shard11/mongodb.log--fork

  mongod-shardsvr-port 10002-dbpath=/home/data/shard12/-logpath

  …

  mongo 127.0.0.1:20000/admin

  配置分片必須要連結admin集合。連結成功後可以把分片加入叢集:

  db.runCommand({"addshard":"127.0.0.1:10001"})

  …

  db.runCommand({"addshard":"127.0.0.1:10004"})

  這樣就成功地把4個shard加入了分片。制定分片的規則如下:

  db.runCommand({"shardcollection":"kingfihser.tablename","key":{"primaryKey":1}})

  啟用分片的設定:db.runCommand({"enablesharding":"kingfisher"}),最後成功的配置了分片。

  4.3 詳細程式碼

  4.3.1 Redis實現案例

  在通訊中,作為釋出訂閱佇列使用,Web釋出訊息,進入Redis釋出訂閱頻道,通訊中心消費此頻道訊息,所有的資訊釋出都在Redis中進行,從而提高了響應的速度。

  public boolean sendMsg(String msg){

  boolean rebool=true;

  Jedis jedis=null;

  try{

  jedis=(Jedis)pool.getResource();

  jedis.publish("kingfisher.*",msg);

  }catch(Exception e){

  e.printStackTrace();

  rebool=false;

  }finally{

  pool.returnResource(jedis);

  }

  return rebool;

  }

  4.3.2 Mysql實現

  進行事務資料儲存:包括相關企業帳號資料,企業常規業務資料,企業與平臺交易資料。此部分的儲存計算採用HIBERNATE+SPRING方式實現。

  4.3.3 Mongodb實現案例

  (1)媒體資料利用GFS網格檔案子系統儲存。

  class fileservice(BaseHandler):

  def get(self):

  id=self.get_argument("id","")

  f=GridOut(self.mongo.fs,ObjectId(id))

  try:

  fn=f.filename.lower()

  …

  self.write(f.read())

  def post(self):

  …

  def delete(self):

  …

  (2)工作微博內容和二維空間索引,以及軌跡資料的索引和查詢。

  class listmark(BaseHandler):

  ′′′

  搜尋工作微博列表

  ′′′

  def get(self):

  self.set_header("Content-Type", "application/json")

  …

  class mark(BaseHandler):

  ′′′

  基於二維空間的搜尋

  ′′′

  def get(self):

  self.set_header("Content-Type","application/json")

  try:

  …

  (3).map-reduce計算做日誌分析。

  ′′′

  排程生成當天使用者訪問行為

  ′′′

  class currdayuser(BaseHandler):

  def get(self):

  …

  ′′′

  排程生成當天服務執行行為

  ′′′

  class currdayservice(BaseHandler):

  def get(self):

  目前這種儲存結構,解決了專案中大資料儲存和實時雲端計算的需求。使用了Mongodb切片的水平動態新增,可不中斷平臺業務系統的同時保障擴容後的查詢速度和雲端計算效能;依據切片鍵索引分片,計算位於各切片獨立進行,使大資料下的實時分析成為現實。對於高頻訪問的資料放在了Redis中,有效地降低了磁碟I/O,使業務系統響應更為敏捷,滿足了高併發下的應用服務的高吞吐要求。雖然大資料的儲存和計算變得簡單,但由於版本和技術在日新月異的變化,資料系統的管理工作並不輕鬆。在新架構下的運維管理還會遇到新的挑戰並需不斷優化完善。

  參考文獻

  [1] 田濤,常青,邱桂蘋,等.基於Redis的人本電子健康系統的設計與實現[J].電子世界,2013(24):137-138.

  [2] 曾超宇,李金香.Redis在快取記憶體系統中的應用[J].微型機與應用,2012(12):11-13.

  [3] 何杭鋒.基於FODO演算法MongoDB自動分片的改進[J].計算機技術與發展,2013(7):127-130.

  [4] 霍多羅夫,迪洛爾夫.MongoDB權威指南[M].程顯鋒譯北京:人民郵電出版社,2011.

  [5] 呂明育,李小勇.NoSQL資料庫與關係資料庫的比較分析[J].微型電腦應用,2011,27(10):55-57.

  [6] MongoDB features[OL]. http://www.cnblogs.com.[2011-06-01].