梦幻诛仙2菜地:MySQL應用架構優化-實時數據處理(1)

  • A+
所屬分類:MySQL python

1.1.?場景

在和開發人員做優化的時候,討論最多的應該是結合應用場景編寫出合適的SQL。并培訓開發應該如何編寫SQL讓MySQL的性能盡量好。但是有一些的場景對于SQL的優化是行不通的。

打個比方,產品有這樣的需求:針對每個商品實時顯示銷售者的銷售量,并且按銷售量做排序,還要實現 分頁。這個需求看上去很簡單,實現起來也很容易。無非就是對三張表(seller、goods、orders)進行查詢、聚合、排序。但是對于上億訂單量來說,這樣查詢簡直就是一個噩夢。

分析:這邊主要是需要按銷售量來進行排序,這樣的操作在這里就比較可怕。如果沒有這個的話,我們的按下面步驟來寫SQL,MySQL跑起來就很爽:

  • 按分頁需求,先查出銷售者的個數(如:100個銷售著,去10個)。
  • 通過1取出的銷售者到orders中查詢訂單并GROUP BY。
  • 通過2中的orders中的goods id 取出商品信息。

可惜的是我們不是產品,不能按照我們的意愿來。當然,最好的辦法就是說服產品,干掉類似這樣的需求?;蚋謀湟恢址絞嚼詞迪終庵行棖?,如:不要實時的展示??墑撬搗泛投ピ諭飛系娜頌負穩菀裝?,也許是關注的東西是不一樣的吧。

1.2.?解決方案

首先要說明一些,像這樣統計的計算能不實時就不實時。我們應該把OLAP的操作和OLTP的操作盡量解耦。來做。如白天我們關注的是OLTP(就是大家普通在用的應用程序),晚上我們關注的OLAP(Hadoop實現)。

這是我們的奇葩需求需要實時,所以Hadoop都是用不上的了。這時我們就需要用氣實時計算的系統。現在業界應該有兩個實時計算系統比較流行:Storm、Spark。這邊我選用了使用Storm來作為我們的方案。這邊選擇Storm的原因主要也就是之前接觸過,比較熟悉上手比較快。

當然這邊我們要需要用到其他的主鍵:

  • Logstash:主要也就是用來收集日志。這邊我們將交易一筆訂單記錄都會化成json格式輸出到日志文件中。之前也考慮過使用Flume,但是Flume沒有Logstash來的實時。
  • Kafka:主要是為了接受Logstash傳過來的信息,并將它持久化和提供給Storm來使用。說明一下:有些系統會將Kafka放入程序就使用,就是說訂單完成時將訂單json信息直接發送給Kafka。我們這邊多一層Logstash的目的是為了讓應用系統和Kafka進行解耦。如果Kafka掛掉或者網絡出現問題。不會影響到應用系統的正常運行。
  • Storm:接收Kafka中的信息進行分析計算出想要的數據。
  • MongoDB:主要是為了存儲從Storm中分析完的數據。
  • Zookeeper:用來管理Kafka和Storm用的。

在使用這樣的架構之前希望大家能理解一下“實時”這個概念:其實無論在什么應用程序中基本沒有實時能完成的。只是電腦運行的快,讓你誤認為是實時的。所以,這邊我們還是準實時。

實時理解的圖:

mysql

 

1.3.?實時計算架構部署圖

mysql

1.4.?架構部署

1.4.1.?環境說明

部署演示使用的是VirtualBox虛擬機,總共啟用了5臺虛擬機(可以根據自己的機器配置而定,我的配置:i3、12G內存、固態硬盤250G)。

系統應用部署信息

操作系統 IP 部署軟件 端口
Centos7.2 10.10.10.11 Logstash
Kafka 9092
~ 10.10.10.12 MongoDB 27017、27018、27019
~ 10.10.10.21 Zookeeper 2181、3887
Storm
~ 10.10.10.22 Zookeeper 2181、3887
Storm
~ 10.10.10.23 Zookeeper 2181、3887
Storm

這邊我就不部署Jetty了,到時候我使用變相的方式來向日志文件中輸入json格式數據。

22.4.2.?統一配置

這邊5臺機子的有統一的hosts文件,并且都需要配置好JDK:

22.4.3.?部署Zookeeper

因為這邊我們部署的是Zookeeper集群因此在3臺機子上的操作步驟都是一樣的:這邊我以操作其中一臺(10.10.10.21?storm_1)機子為例。

  • 到官網下載軟件(zookeeper-3.4.6.tar.gz)
  • 將軟件解壓到 /usr/local/ 目錄下

  • Zookeeper配置文件

如果沒有/usr/local/zookeeper-3.4.6/conf/zoo.cfg配置文件則新建一個。

  • 創建相關需要的目錄

  • 創建myid文件

下面的命令應該在不同的機器上執行

  • 啟動Zookeeper

分表在三臺機子上都要執行下面命令

  • 查看Zookeeper狀態

  • 客戶端鏈接Zookeeper進行驗證

以上就算是部署好了Zookeeper集群了。

22.4.4.?部署Kafka

按照前面規劃的我們應該將Kafka部署在(10.10.10.12?normal_12)機子上。

  • 到官網下載Kafka(10-0.9.0.0.tgz)
  • 將Kafka解壓到/usr/local目錄下,并從命令為kafka

  • 設置Kafka配置文件

 

  • 創建Kafka相關目錄

  • 啟動Kafka

  • 創建test topic

  • 查看創建的topic

  • 新建一個session,開啟Kafka消費者客戶端

  • 新建一個session,開啟Kafka生產者客戶端,并生產一個消息。

在消費者的session中能看到同時也出現了 “this?is?message?1”這個消息

22.4.5.?部署Logstash

按照前面規劃的我們應該將Kafka部署在(10.10.10.12?normal_12)機子上。這邊我們使用Logstash監聽/tmp/orders.log文件,并且將Kafka作為它的輸出。

  • 到官網下載Logstash(logstash-2.3.1.tar.gz)
  • 將Logstash解壓到/usr/local/目錄下

  • 設置Logstash配置文件

  • 啟動Logstash agent

  • 向/tmp/orders.log中輸入一個json字符串

再之前啟動的Kafka消費者客戶端會出現如下消息

22.4.6.?部署MongoDB

這邊我們MongoDB部署在(10.10.10.12?normal_12)機子上。并且采用的是復制的形式。

  • 官網下載MongoDB(mongodb-linux-x86_64-rhel70-3.2.5.tgz)
  • 解壓MongoDB到/usr/local/目錄下

  • 創建MongoDB的相關目錄

  • 分別在/u01/mongodb_27017、/u01/mongodb_27018、/u01/mongodb_27019中創建配置文件和啟動腳本
  • /u01/mongodb_27017中的配置文件和啟動腳本

  • /u01/mongodb_27018中的配置文件和啟動腳本

  • /u01/mongodb_27019中的配置文件和啟動腳本

  • 啟動MongoDB

  • 初始化復制

 

由于篇幅問題《MySQL應用架構優化-實時數據處理(2)》中將將講述其他環境搭建過程

 

昵稱: HH

QQ: 275258836
ttlsa群交流溝通(QQ群②: 6690706 QQ群③: 168085569 QQ群④: 415230207(新) 微信公眾號: ttlsacom)

感覺本文內容不錯,讀后有收獲?

逛逛衣服店,鼓勵作者寫出更好文章。

weinxin
微信公眾號
掃一掃關注運維生存時間公眾號,獲取最新技術文章~

發表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前評論:1   其中:訪客  1   博主  0

    • 匿名 9

      啊發順豐