2014年11月29日 星期六

MongoDB使用一年小小心得

過去一年,重新投入軟體開發的懷抱,因為工作需要,有很多時間都需要接觸MongoDB,遙想四年前,還是各家NoSQL大戰,在那個勝負不明的時期,就有小試了一下MongoDB,只是沒想到他能夠撐那麼久,並且讓那麼多公司採用,還頗讓人驚訝的。

MongoDB是NoSQL中偏向document-level的一隻, 先講講優點好了

1. scheme-less 算是他最大的好處,以往開發程式,為了決定資料的scheme,常常要花一番工夫,而當之後要改scheme,又是另外一個麻煩的事情,更者關聯式資料庫常常會陷入要不要正規化的矛盾中,對於一些小型程式要做快速開發算是額外的overhead。

 2. 容易上手,MongoDB的query的語法設計的非常好,加上對於不同程式語言的Driver都有一定要求,簡單的command如find,update,delete都非常容易實現,而且也不容易有SQL injection的問題,不過使用PHP或Perl的人可能會詬病使用 $ 當作運算元。

 3. 容易水平擴充,由於一開始的設計就是為了能夠很好的scale,MongoDB在處理replica(複製),sharding(資料庫分割)方面算是下了不少工夫, 在sharding部分採用自己設計的Bson index, 而不像一般資料庫用incremental的id,就是為了能夠很好的自動處理sharding, 雖然早期被人詬病auto sharding很不給力,不過到了2.4後多了hash index,成功地解決了這個問題。

 4. Fail over的機制完備,在使用官方推薦的replica set狀態下,三台機器中,當Primay機器下線後,會自動選出新的Primary機器。

接著是討論一下缺點

1. scheme-less聽起來好像很不錯,但是其實scheme-less是scheme-plus,需要在每個document中塞入data的scheme,相對上面是浪費空間,所以MongoDB官方才會推薦,要把key設越短越好,以節省硬碟還有記憶體的使用量。

2. 不同的scheme塞入同一張collection內,容易造成Disk和Memory的Fragmentation,進而使效率降低,不同版本的資料還需要在程式邏輯端去避開,強烈建議scheme在脫離prototype後,一定要有固定的格式。

 3. Mongodb完全靠Mmap處理檔案操作,並沒有對Disk IO操作或是容量有什麼過多的設計,而對於硬碟空間就是浪費過多,加上Index tree是傳統B-tree結構,在硬碟的讀寫上沒有做任何優化,導致request增加,就需要對硬體做升級。

4. 一樣是B-tree的問題,當資料量大到一定時,讀寫就會變慢,就不得不做sharding或是將硬體升級,另外range query並沒有辦法做最佳化,需要常常做range query操作的資料,要好好考慮是否使用MongoDB

5. 目前2.4支援collection lock,lock系統也是MongoDB的濫傷,從一推出的Global lock,過了四五年了,還沒進化到document level的lock,就寫入而言就是只有悲劇可言,目前的Roadmap是說2.8就會把這個解掉。

2014年4月24日 星期四

Flask Note 1

想要來寫個Flask筆記, 這個系列會把一些看到, 或是曾經使用過的技術給記錄下來

環境需求:python2.7以上, python套件pip & virtualenv安裝

0. 建立virtualenv環境, 使用virturlenv目的就是為了建立一個乾淨的開發環境, 可以去掌握你撰寫的python程式跟其他package的相依性, 利於你的程式部署到其他機器上
$ pip install virtualenv
Requirement already satisfied (use --upgrade to upgrade): virtualenv in /Library/Python/2.7/site-packages
Cleaning up...
$ virtualenv .env
New python executable in .env/bin/python
Installing Setuptools..............................................................................................................................................................................................................................done.
Installing Pip.....................................................................................................................................................................................................................................................................................................................................done.
$ source .env/bin/activate #進入virtualenv環境
(.env) $
1. 在virtual environment 下安裝 Flask
$ virtualenv .env
(.env) $ pip install flask
2. 產生app instance
from flask import Flask
app = Flask(__name__)
3. 建立Route
from flask import Flask
app = Flask(__name__) 

@app.route('/')
def index():
    return 'Hello World !!!'

@app.route('/user/<name>/')
def user(name):
    return 'hello %s' % name

if __name__ == '__main__':
    app.run(debug=True);
4. run script by python interpreter
$(.env) python hello.py
*Running on http://127.0.0.1:5000/
*Restarting with reloader
接下來可以打開瀏覽器輸入http://127.0.0.1:5000/看看
還有http://127.0.0.1:5000/user/test
       http://127.0.0.1:5000/user/world

2014年3月29日 星期六

平庸的惡

1960年以色列情報單位"摩薩德"在阿根廷綁架了阿道夫·艾希曼(Adolf Eichmann)。

在以色列的法庭上, 艾希曼被指控是屠殺600萬猶太人的劊子手, 因為當年他是負責
猶太人問題最終方案的指揮官, 並且將一批批的猶太人送進了集中營和處死。

但看過相當多的資料後, 尤其是"阿倫特"為了這場審判而寫的"平凡的邪惡:
艾希曼耶路撒冷大審紀實", 發現艾希曼其實總體來說並不是一個惡人,
特別是以他自己的角度出發, 他自己宣稱只是依照上級指示,
甚至說自己對猶太人並沒有任何的仇恨。

「我發現以服從和接受指令為基礎的生活, 確實是一種舒適的生活。這種生活
讓一個人對思考的需要減到最小。」艾希曼在受審時說了, 在他的認知中,
自己只是個普通公務員, 每天盡責的處理上級交代的事。

阿倫特下的結論是這種平庸的惡會產生, 都是因為停止思考, 而進而使良知停擺。
此種良知危機將會導致惡的生成, 那麼更根本的問題, 應該是追問何以人會拒絕思考?

自己的感想是, 就算是在民主社會下面, 也是看得到許多平庸的惡,
許多人如果不關心國家事務, 很容易就被有心人士操控或是洗腦,
又抑或是為了利益或是權力, 而內化成停止思考, 停止去考慮其他人的福祉。