|
導讀數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應... 數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。 以下是使用MYSQL服務的一些經驗,主要從以下幾個方面考慮的MYSQL服務規劃設計。 1 MYSQL服務的安裝/配置的通用性; MYSQL服務器的規劃 / mysql服務的安裝和服務的啟動: configure --prefix=/home/mysql 服務的啟動和停止 1 復制缺省的mysql/var/mysql到 /data/app_1/目錄下 2 MYSQLD的啟動腳本: 注釋: --pid-file="$rundir"/mysql.pid --socket="$rundir"/mysql.sock --datadir="$rundir"/var 修改不同的服務到不同的端口后,在rc.local文件中加入: /data/app_1/start_mysql.sh 3 MYSQLD的停止腳本:stop_mysql.sh [page_break] 使用這個腳本的好處在于: 1 多個服務啟動:只需要修改腳本中的--port=參數。單個目錄下的數據和服務腳本都是可以獨立打包的。 2 所有服務相應文件都位于/data/app_1/目錄下:比如:mysql.pid mysql.sock,當一臺服務器上啟動多個服務時,多個服務不會互相影響。但都放到缺省的/tmp/下則有可能被其他應用誤刪。 3 當硬盤1出問題以后,直接將硬盤2放到一臺裝好MYSQL的服務器上就可以立刻恢復服務(如果放到my.cnf里則還需要備份相應的配置文件)。 服務啟動后/data/app_1/下相應的文件和目錄分布如下: 查看所有的應用進程ID: 查看所有數據庫的錯誤日志: 個人建議:MYSQL的主要瓶頸在PORT的連接數上,因此,將表結構優化好以后,相應單個MYSQL服務的CPU占用仍然在10%以上,就要考慮將服務拆分到多個PORT上運行了。 服務的備份 盡量使用MYSQL DUMP而不是直接備份數據文件,以下是一個按weekday將數據輪循備份的腳本:備份的間隔和周期可以根據備份的需求確定 /home/mysql/bin/mysqldump -S/data/app_1/mysql.sock -umysql db_name | gzip -f>/path/to/backup/db_name.`data +%w`.dump.gz 注意: 1 在crontab中'%'需要轉義成'\%' 2 根據日志統計,應用負載最低的時候一般是在早上6點 先備份在本地然后傳到遠程的備份服務器上,或者直接建立一個數據庫備份帳號,直接在遠程的服務器上備份,遠程備份只需要將以上腳本中的-S /path/to/msyql.sock改成-h IP.ADDRESS即可。 數據的恢復和系統的升級 日常維護和數據遷移:在數據盤沒有被破壞的情況下硬盤一般是系統中壽命最低的硬件。而系統(包括操作系統和MYSQL應用)的升級和硬件升級,都會遇到數據遷移的問題。只要數據不變,先裝好服務器,然后直接將數據盤(硬盤2)安裝上,只需要將啟動腳本重新加入到rc.local文件中,系統就算是很好的恢復了。 應用的設計要點 1.非用數據庫不可嗎? 2.數據庫服務的主要瓶頸:單個服務的連接數對于一個應用來說,如果數據庫表結構的設計能夠按照數據庫原理的范式來設計的話,并且已經使用了最新版本的MYSQL,并且按照比較優化的方式運行了,那么最后的主要瓶頸一般在于單個服務的連接數,即使一個數據庫可以支持并發500個連接,最好也不要把應用用到這個地步,因為并發連接數過多數據庫服務本身用于調度的線程的開銷也會非常大了。所以如果應用允許的話:讓一臺機器多跑幾個MYSQL服務分擔。將服務均衡的規劃到多個MYSQL服務端口上:比如app_1 ==> 3301 app_2 ==> 3302...app_9 ==> 3309。一個1G內存的機器跑上10個MYSQL是很正常的。讓10個MYSQLD承擔1000個并發連接效率要比讓2個MYSQLD承擔1000個效率高的多。當然,這樣也會帶來一些應用編程上的復雜度; 3.使用單獨的數據庫服務器(不要和前臺WEB服務搶內存),MYSQL擁有更多的內存就可能能有效的進行結果集的緩存; 4.應用盡量使用PCONNECT和polling機制,用于節省MYSQL服務建立連接的開銷; 5.表的橫向拆分:讓最常被訪問的10%的數據放在一個小表里,90%的歷史數據放在一個歸檔表里,數據中間通過定期“搬家”和定期刪除無效數據來節省。這樣對于應用來說總是在10%數據中進行選擇,比較有利于數據的緩存,不要指望MYSQL中對單表記錄數在10萬級以上還有比較高的效率。 6.表的縱向拆分(過渡范化):將所有的定長字段(char, int等)放在一個表里,所有的變長字段(varchar,text,blob等)放在另外一個表里,2個表之間通過主鍵關聯,這樣,定長字段表可以得到很大的優化(甚至可以使用HEAP表類型,數據完全在內存中存取),這里也說明另外一個原則,對于我們來說,盡量使用定長字段可以通過空間的損失換取訪問效率的提高。MYSQL之所以支持多種表類型,實際上是針對不同應用提供了不同的優化方式; 7.仔細的檢查應用的索引設計,甚至在服務啟動中加入 --log-slow-queries[=file]用于跟蹤分析應用瓶頸。 全新的路由器不僅讓你更穩定快速地連接無線網絡,更可以讓家中的智能設備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!