Toronto

MongoDB 2.6

metadata 存在Mongo DB
實際檔案必須放在圖一個shared storage

single mongo instance vs. sharding cluster instance
(1) 傳統的用法,一台機器直接起mongod就可以用,如果有
(2)

production一定要用三台Mongo config

application layer
Mongos as #1 MongoS: client

config layer: 放operation
Mongo config as #2, #3, #4

physical storage layer
Mongo store as #5, #6

replicated set數目建議跟sharding set數目一致

replicated set一次只有一個active,另外一個是副本等待狀況發生時接手

table <-> collection
<—> document

mogod決定要起哪些instance起來,可以是單機的,也可以吃多個參數指定說你要開哪些服務(mongo config, mongo store, mongoS)

實際上在開發的時候, application必須自己決定要怎麼做sharding(告訴他一些資訊, 因為他不知道你在mongo store放了哪些資料進去, 或是怎麼使用)

設定Mongo store sharding

習慣先把 Mongo store sharding做好(storage成員先確定好), 在往上mongoS才知道mongo config在哪

每一台Mongo store都要做
tar -zxcf mongo26.tgz
mv mongodb-linux-xxx mongo26
mv mongo26 /usr/local

mkdir /usr/local/mongo26/data

mkdir /usr/local/mongo26/data/shard1
mkdir /usr/local/mongo26/data/shard2

cd /usr/local/mongo26/bin
./mongod -shardsvr -repSet shard1 -port 27017 -dbpath /usr/local/mongo26/data/shard1/ -oplogsize 100 -logpath /usr/local/mongo26/data/shard1.log -logappend -fork -smallfiles

-port 27017 預設從這個port開始往下累加
-oplogsize MB單位
-fork 背景執行
-smallfiles 預設是一個寫完之後,倍數成長,此選項可以一個一個小檔慢慢寫

設定master/slave (從其中一台store操作皆可)
<MONGO_PATH>/bin/mongo -port 27017

config={_id:'shard1',members:[{_id=0, ..}], …}

_id=0 一定要設定, 不設定好像也不行
要用hostname之後就要用hostname, 用IP之後就要用IP

官方會自己決定哪一台當master,有自己的rules

rs.initiate(config)

以上設定好兩個sharding, 每個sharding上有兩份replSet
 

run config db instances (#2-#4)

三台都要做
tar -zxcf mongo26.tgz
mv mongodb-linux-xxx mongo26
mv mongo26 /usr/local

cd /usr/local/mongo26
mkdir -p data/config

cd /bin
./mongod -configsvr -repSet shard1 -port 27017 -dbpath /usr/local/mongo26/data/config/ -oplogsize 100 -logpath /usr/local/mongo26/data/config/config.log -logappend -fork -smallfiles

現在有一台mongoS連近來, 決定這三台當Mongo config
之後的mongoS連進來就必須設定一樣。

當有mongoS設定不同,會衝突,必須重開,重設定

client端的mongoS

上面兩個設定只是把東西建起來
現在起一個mongoS,來把底下的mongo config server接起來
 

附錄

noSQL 為了scale
rdms 為了資料的關聯性 (但scale差, 因為花在太多effort在維持資料的關聯性)

UMongo:提供圖形介面, 管理MongoDB
 
 
 
 
 

Toronto

  • Nginx
  • Virtual File System

VFS 可以scale out
不管client在哪一台都可以拿到她想要的檔案
所以底層檔案系統必須是shared file-based/object-based system
 
 
再安裝VFS之前, 要先設定一些設定檔
1. 設定property
MongoDB
在single-mode無須設定shard
所以再設定property的時候, 必須指明"是否為cluster" (value >= 1)

cosa.database.iscluster

是攸關write concern (再查這是什麼? 好像是寫入時必須確認已經寫入才回傳成功)
設為cluster mode的時候, 寫入會變慢, 因為要寫入的資料變多了
 
2. 設定key
確保系統在某一些需要自我修復的情況下, 能夠自行把資料回復回來用的
在VFS裡面, 所需要的資料是使用者的密碼
所以當遺失密碼, 其他資料也無法取回
在這個地方設定的目的在於, 當忘記密碼時, 讓她有機會重新設定他的密碼

anywat, 這個動作不是破解這個加密

 
安裝notification server
這是推播的服務
所以要裝rabbitmq (3.3.4-1)

1. 設定rabbitmq
rabbitmq 推播系統

設定vhost id
設定user account
(option) 指定 admin 為 administator

這一步是因為rabbitmq有提供Web UI, 但只能用具administrator權限的帳號登入

設定 權限全開
 
 
安裝tomcat
 
 
Deploy Directory Server
fluentd:紀錄log
 
 
Deploy VFS

 
cafm:toronro的UI
 
 
Deploy Log Server
 
 
Deploy Nginx Server
Nginx的前置設定
設了一個名字叫toronto-vfs, 有兩台server (之後request是從這兩台採run-robin挑選)
toronto-dir
toronto-notify
toronto-log

設定 certification / location
 

 

Toronto

強調安全性, 所以當初他們在設計的時候就是設計成自己也看不懂這樣

  • 檔名整個hash
  • User底下的檔案也是混砸在一下

 
這也意味者, 如果底層的MongoDB掛掉, 那就byebye了
 

MongoDB 常用指令

登入mongoS

cd /usr/local/mongo26/bin
./mongo 140.92.25.40:30000/admin

列出群集內的shard

db.getSiblingDB("admin").runCommand({listShards: 1})
use config
db.shards.find()

 
 

Toronto 開發環境

Eclipse Mars

裝套件:subclipse
eclipse> help> install software> 

Subclipse
http://subclipse.tigris.org/update_1.12.x

 
window> show view> *svn*
新增檔案庫位置
要check out VFS,在vfs資料夾右鍵,「取出為」,例:vfs_demo

用視角JavaEE去看他,
error是因為少import很多東西,看這個網頁把相關component抓下來
http://140.92.25.164/COSA_2_0

https://140.92.25.166/toronto
common-utils> tag> v1.1> 右鍵「取出為」,取名為demo_xxx
fluentd-client> tag> v1.1> 右鍵「取出為」,取名為demo_xxx

https://140.92.25.166/notification
notification-client> notificationClient> tag> v1.1> 右鍵「取出為」,取名為demo_xxx
auth-lib> vfs-auth-client> tag> v1.1> 右鍵「取出為」,取名為demo_xxx

Properties
java build path> project> 將上面新增的library勾選
 

Note: notification進去裡面把 dependency section砍掉

 
打包
右鍵「Export」> WAR file
 

Test
JUnit 以function為單位做測試
獨立一個test source code,來寫測試檔

JMeter
  

Note

directory —-> 打包非常麻煩,hogon才會包
 
 

程式架構

vfs

group處理toronto 上的private group, 將使用者分類方便做share (有點像FB的好友分類),system group (public group)

restful所有restAPI之入口, trace code可從這邊開始看起 (所有user可用到的功能)

vfs 裡面六支程式是所有toronto最重要的code

vfs.cluster 不是很重要, 當初設計成cluster的情況下, 程式碼在執行的情況下可以決定一些事情, 因為toronto 是multitenant的環境
在tenant放檔案的時候, 本來有打算要讓不同tenant的user要把檔案放在哪裡, 但後來沒什麼再用

vfs.component (大雜燴) 比較接近是外掛的東西, 不是toronto的核心功能, 一些附加的功能

vfs.compoent.chunk (chunk upload)上傳一個檔案, 如果一個檔案很大的時候, 可以把檔案切成很多份, 一個一個chunk傳上去之後, 在merge回一個檔案

vfs.component.ldapgroup/ldapuser sync 在AD上外部的user

vfs.component.notification 與notifacation溝通的行為

vfs.component.share
在vfs底下remoteshareOperation (寫了但還沒用到, 一些federated 概念的東西)
在vfs底下shareOperation
其他麻煩的事情會在share這個folder底下, 像是權限問題, 管理者share一個檔案讀/寫權限給owner,ower可以在share權限給其他人, (receiver),稱為ownerShare, 如果receiver在share給其他人則稱 receiverShare

vfs.database 欄位內容

vfs.exception exception

vfs.fsck 就linux fsck, 每次開機都會檢查一次, 確認database上使用者的資訊有沒有不正確, 資料不一致? (因為沒客戶, 所以沒有嚴謹的QA測試, 所以不確定其能力是否強大)

vfs.utility 底下, 只有vfs會用到的才放進來

vfs-commons-utils

cosa.properties
每次開始都會 init properties 把 property預設的內容寫進去

cosa.resource 當使用者進來時, 把某些資訊keep在memory, 結束時要kill掉

Create Folder

virtualObjectService.java

taskId 是for fsck看得log

input: tenant id /userName/ dest.

轉成path object方便將 parent path 與 檔名拆解

share operation用意在於, 如果一個資料夾是你建立的, 你share給其他人用, 其他人在這個資料夾底下新增的檔案, 其qouta都會是吃你的所以必須為share operation

.insert() 將資料寫入db

後續的動作就是在檢查有沒有發生 collision

每個instance都不知道彼此的存在

Q: 如何避免 別人同時也在做一樣的事情?
A: 不管三七二十一先做了再說, 做完再檢查是否發生collision, 如果有就roll back

Upload file的時候會有version的更新
mongodb 提供的find and modify ,不像一般要更新資料要先find record取出之後, 再做update的動作
這樣有可能在這之間其實record已經被其他人update過了, 這邊提供的是atomic的
(從database level去檢查modify time, 做一些檢查機制)

log subsystem這個service其實是方便使用者看log, 不是紀錄log
實際上寫log的動作, 不是由log server來做, 而是每一台各自塞進Mongodb (先寫進local的一個file, fluend再從裡面讀出來寫入mongo

vfs_auth_lib (小功能)

vfs-commons-utils (操作mongodb)

querybuilder

propertiesCenter 寫在mongodb裡

 

 

除非特別註明,本頁內容採用以下授權方式: Creative Commons Attribution-ShareAlike 3.0 License