[week 14] 後端基礎:資料庫& 系統設計 - HackMD
文章推薦指數: 80 %
非關聯式資料庫,例如mongodb;與之對應的是關聯式資料庫,例如之前實作PHP 留言板使用的MySQL。
沒有Schema,可以想像成存JSON 資料進Database; 使用key-value 儲存 ...
Published
LinkedwithGitHub
Like
Bookmark
Subscribe
######tags:`Back-End``systemdesign``database`
#[week14]後端基礎:資料庫&系統設計
>本篇為「程式導師實驗計畫:Lesson8-2之資料庫」這門課程的學習筆記。
如有錯誤歡迎指正。
##學習目標
-瞭解NoSQL和SQL的差別
-瞭解什麼是ACID原則
-什麼是Transaction(交易)
-為什麼需要Lock(資料鎖定)
-瞭解什麼是GooglePublicDNS
-瞭解什麼是系統設計
---
##NoSQL(NotOnlySQL)
非關聯式資料庫,例如[mongodb](https://www.mongodb.com/cloud/atlas/lp/try2?utm_source=google&utm_campaign=gs_apac_taiwan_search_brand_atlas_desktop&utm_term=mongodb&utm_medium=cpc_paid_search&utm_ad=e&utm_ad_campaign_id=6498554090&gclid=Cj0KCQjwuL_8BRCXARIsAGiC51A2fnn8cy0JQPdfGGGCluss0PuBCG96x3-NzTfSE9jy0ibAJMTLy1IaAhApEALw_wcB);與之對應的是關聯式資料庫,例如之前實作PHP留言板使用的MySQL。
1.沒有Schema,可以想像成存JSON資料進Database
2.使用key-value儲存
3.不支援JOIN,因為是非關聯式資料庫
4.通常用來存一些結構不固定的資料,例如:log
###NoSQL跟SQL的差別在哪裡?
SQL(StructuredQueryLanguage),中文為「結構化查詢語言」,是一種專門用來管理與查詢「關聯式資料庫」的程式語言。
與之相對的是NoSQL(NotOnlySQL),「非關聯式資料庫」,也就是不限定為關聯式資料庫的資料庫管理系統。
以下是關聯式與非關聯式資料庫的差別:
####關聯式資料庫(RDBMS)
-全名:RelationalDatabaseManagementSystem
-以SQL語言操作
-儲存方式:使用不同table存取不同類型的內容
-特性:資料之間保有相關性,也避免不相關的資料互相干擾
-常見程式:MySQL、PostgreSQL、MicrosoftSQLServer
-例如:會員資料庫,其中明確關聯是會員ID
####非關聯式資料庫(NoSQL)
-全名:NotOnlySQL
-不限定使用SQL語言
-儲存方式:使用key-value儲存資料,且沒有Schema,可想像成把JSON資料存進資料庫
-特性:彈性較高,通常用來存一些結構不固定的資料,因此不支援JOIN
-常見程式:mongoDB
-例如:存取log日誌、社交網站上的大量資訊(文章被分享、按讚數等)
參考資料:
-[了解NoSQL不可不知的5項觀念](https://www.ithome.com.tw/news/92506)
-[NoSQL(非關聯式)資料庫如何運作?](https://aws.amazon.com/tw/nosql/)
---
##Transaction交易
-可解釋為一筆交易。
-例如:A轉帳100元給B,要確保A少20元的同時B多了20元。
實際應用:
1.轉帳
2.購物(一次買多個品項)
3.其他一次牽扯到多個query的操作
##ACID原則
為了保證Transaction的正確性,執行資料庫事務須符合的四個特性:
在執行資料庫事務時,為了保證Transaction(交易)的正確性,必須符合ACID四個特性:
1.原子性atomicity:全部失敗or全部成功
-例如:小明轉帳100元給小美,成功的話小明-100元,小美+100元;失敗的話資料不會有任何變化。
2.一致性consistency:維持資料的一致性
-例如:交易前後,錢的總數均不會改變。
3.隔離性isolation:多筆交易不會互相影響,也就是不能同時變動同一個值
-例如:小明只有100元,如果要同時轉帳100元給小美和小華,會產生負值這樣的系統錯誤。
因此交易時使用需要Lock鎖,鎖定交易資料,即可避免同時修改到同一個值。
4.持久性durability:交易成功之後,寫入的資料不會不見
參考資料:
-[如何理解數據庫事務中的一致性的概念?](https://www.zhihu.com/question/31346392)
###如何在MySQL執行Transaction
一個Transaction可同時執行多個SQL,以下列程式碼為例:
```php=
$conn->autocommit(FALSE);//避免每次自動變成transaction
$conn->begin_transaction();//開始transaction
$conn->query("updatefrommoneysetamount=20");
$conn->query("updatefrommoneysetsum=10");
$conn->commit();//當發出commit後才會執行
```
---
##Lock資料鎖定
資料庫的交易資料鎖定。
當多筆交易在讀取或寫入資料時,彼此會相互影響。
因此為了交易的並行性與獨立性,需透過做「記號」來標記該資料狀態正在被讀取或寫入,其他交易則根據該記號決定能否執行其他操作,而這個記號就是所謂的lock(交易鎖定)。
但由於鎖定後會需要等待執行,也須考慮到效能上的損耗。
程式碼範例如下:
```php=
$conn->autocommit(FALSE);
$conn->begin_transaction();
$conn->query("SELECTamountfromproductswhereid=1forupdate");
//加上forupdate:更新後就會把這行鎖起來,沒有指定欄位的話會鎖住Schema
$conn->commit();
```
###什麼情況需要Lock鎖
舉例來說,當某個商品限定數量,造成搶購時可能會發生「超賣」情形,此現象又稱作racecondition(競爭危害)。
若能在交易時加上lock,即可避免同時讀取和寫入同一筆資料時產生的資料衝突,避免系統發生錯誤。
參考資料:
-[資料庫的交易鎖定Locks](https://www.qa-knowhow.com/?p=383)
---
##再探DNS
在課程[第四週的網路基礎概論](https://github.com/heidiliu2020/This-is-Codediary/blob/master/week4_%E7%B6%B2%E8%B7%AF%E5%9F%BA%E7%A4%8E%E6%A6%82%E8%AB%96.md)時我們也曾提過DNS(域名系統)。
-全名是DomainNameSystem
-負責將域名轉換成IP位置。
可將DNS伺服器作為一個分散式資料庫
-域名(Domain):即常用的網址。
google.com就是一個域名,類似景點名稱
-IP位置:每個主機都有個IP位置,是網路溝通的地址。
由四個數字組成,範圍是0~255
-功能類似網路上的電話簿,我們在搜尋網站的同時,是由DNS提供將網站名稱(域名)轉成號碼(IP位置)的目錄服務
###Google有提供的公開的DNS,對Google的好處以及對一般大眾的好處?
####對Google的好處
-透過搜尋引擎來蒐集大數據,藉以分析使用者行為,以應用於商業目的
-日後可提供更符合該使用地區的資料,或是投放更精準的廣告
####對一般大眾的好處
-使用免費
-提升網路安全性,例如:擋下惡意網站訊息
-加速瀏覽體驗:可能增加上網速度
-直接取得DNS查詢結果:因為已經快取,就不需查詢上層DNS記錄
---
##系統設計
系統設計為了能夠穩定地提供高效率的服務,其實必須不斷思考,當使用者增加,需要擴展系統來增進效能時,可能遇到哪些問題、解決方式還有其優缺點。
通常會由下列兩個觀點作切入:
-擴展性(Scalability):每當投入更多的資源,例如多增加一台伺服器,系統的效能(performance)也能成比例地增加。
-可用性(Availability):系統任何時候都要能回應使用者的請求,簡單來說,就是希望系統掛掉的時間越少越好。
以下是有關系統設計的名詞解釋:
###LoadBalancer(負載平衡器)
提供類似路由器的功能,幫忙自動分配新進來的請求要導到哪一台Server。
###主從模式(Master-slave)
資料的變動一律透過Master完成,它會再將結果同步到各個slave。
這種設計特別適合讀取的頻率大於寫入的系統。
例如購物網站。
可大幅減少資料庫的負擔。
###Stickysessions(會話保持)
解決LoadBalancer遺失狀態的問題,將用戶端與服務器之間建立的多個連接,都發送到相同的服務器進行處理。
###SinglePointofFailure(單點故障)
系統中一旦失效,就會讓整個系統無法運作的部件,例如負載均衡器就是脆弱的單點,解決方法如引入冗餘來故障轉移。
###資料庫快取
資料庫的傳輸速度,是影響整個系統效能最大的因素,因此存取資料庫其實是一個高成本的行為。
為了減少對資料庫的存取,我們可利用「快取(Cache)」,也就是將曾經查詢過的結果保存起來。
通常會再加上有效期限,過期後快取結果就消失。
藉由快取機制,可大幅降低資料庫的負擔,使應用程式伺服器處理請求的速度更快,進而提升整個系統的效能。
##hw1:短網址系統設計
請你畫出一張短網址服務的後端系統架構圖,越詳細越好,可以考慮到如何增進效能、scaling以及備份資料。
沒靈感的話可參考:短网址(shortURL)系统的原理及其实现,或是用「短網址系統設計」之類的關鍵字去搜尋。
---
最後完成的短網址系統設計示意圖如下:
![](https://i.imgur.com/ODL6mPz.png)
參考資料:
-[系統設計101—大型系統的演進(上)](https://medium.com/%E5%BE%8C%E7%AB%AF%E6%96%B0%E6%89%8B%E6%9D%91/backend-architecture-101-5c425e760a13)
-[CS75(Summer2012)Lecture9ScalabilityHarvardWebDevelopmentDavidMalan](https://www.youtube.com/watch?v=-W9F__D3oY4)
-[Scalability_系統設計筆記1](http://www.ayqy.net/blog/scalability_%e7%b3%bb%e7%bb%9f%e8%ae%be%e8%ae%a1%e7%ac%94%e8%ae%b01/)
-[負載均衡常見問題之會話保持-粘滯會話(StickySessions)](https://www.itread01.com/articles/1475241626.html)
×
Signin
Email
Password
Forgotpassword
or
Byclickingbelow,youagreetoourtermsofservice.
SigninviaFacebook
SigninviaTwitter
SigninviaGitHub
SigninviaDropbox
SigninviaGoogle
NewtoHackMD?Signup
延伸文章資訊
- 1了解NoSQL不可不知的5項觀念 - iThome
採用Column設計的NoSQL資料庫會比只用Key-Value資料架構的資料庫更有彈性,減少資料存取程式的開發難度。 因為NoSQL資料庫沒有Schema架構,所以,也 ...
- 2NoSQL 非關聯式資料庫- Key-Value Database - 吳統雄
所有關聯式資料庫的通用查詢語言是SQL,所以NoSQL 就表示不用關聯式資料庫的結構、表格分析設計法、與根據主鍵(primary keys)的查詢,故也可稱為「非關聯式資料庫」。 Key- ...
- 3NoSQL入門介紹及主要類型資料庫說明 - TPIsoftware
- 每一筆資料包含一組鍵值(key-value),在key與value間建立映射關係,透過key可以直接存取value。 - 在關聯式資料庫中主要以Table(表格)儲存資料,而資料 ...
- 4鍵-值儲存- 維基百科,自由的百科全書
鍵-值資料庫,或鍵-值儲存,是設計用來儲存、檢索和管理關聯陣列的資料儲存範式,關聯陣列是現今更常稱為「字典」或雜湊表的一種資料結構。字典包含對物件或記錄的一個 ...
- 5[week 14] 後端基礎:資料庫& 系統設計 - HackMD
非關聯式資料庫,例如mongodb;與之對應的是關聯式資料庫,例如之前實作PHP 留言板使用的MySQL。 沒有Schema,可以想像成存JSON 資料進Database; 使用key-valu...