2014年10月9日
#
今天啟動(dòng)Tomcat啟動(dòng)不了,報(bào)以下錯(cuò): org.apache.catalina.core.StandardContext startInternal SEVERE: Error listenerStart org.apache.catalina.core.StandardContext startInternal SEVERE: Context [/******] startup failed due to previous errors 網(wǎng)上找了N多文章,都沒(méi)有切中要害。 后來(lái)在國(guó)外網(wǎng)站上搜到一個(gè)方法 http://grails.1312388.n4.nabble.com/Deployment-problems-td4628710.html。 我試了一下,是可以的。方案如下。 Tomcat報(bào)的錯(cuò)太含糊了,什么錯(cuò)都沒(méi)報(bào)出來(lái),只提示了Error listenerStart。為了調(diào)試,我們要獲得更詳細(xì)的日志。可以在WEB-INF/classes目錄下新建一個(gè)文件叫l(wèi)ogging.properties,內(nèi)容如下 Java代碼

- handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
-
- ############################################################
- # Handler specific properties.
- # Describes specific configuration info for Handlers.
- ############################################################
-
- org.apache.juli.FileHandler.level = FINE
- org.apache.juli.FileHandler.directory = ${catalina.base}/logs
- org.apache.juli.FileHandler.prefix = error-debug.
-
- java.util.logging.ConsoleHandler.level = FINE
- java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
這樣,我們?cè)賳?dòng)tomcat時(shí),就會(huì)在logs目錄下生成一個(gè)更詳細(xì)的日志error-debug.2012-05-31.log。 我們進(jìn)去看看什么錯(cuò)吧。 我碰到的錯(cuò)誤是FileNotFoundException.大家碰到的錯(cuò)應(yīng)該各式各樣都有,所以就要具體問(wèn)題具體分析了。 tomcat的logging文檔具體可參考http://tomcat.apache.org/tomcat-7.0-doc/logging.html
每秒查詢率QPS是對(duì)一個(gè)特定的查詢服務(wù)器在規(guī)定時(shí)間內(nèi)所處理流量多少的衡量標(biāo)準(zhǔn),在因特網(wǎng)上,作為域名系統(tǒng)服務(wù)器的機(jī)器的性能經(jīng)常用每秒查詢率來(lái)衡量。
原理:每天80%的訪問(wèn)集中在20%的時(shí)間里,這20%時(shí)間叫做峰值時(shí)間
公式:( 總PV數(shù) * 80% ) / ( 每天秒數(shù) * 20% ) = 峰值時(shí)間每秒請(qǐng)求數(shù)(QPS)
機(jī)器:峰值時(shí)間每秒QPS / 單臺(tái)機(jī)器的QPS = 需要的機(jī)器
問(wèn):每天300w PV 的在單臺(tái)機(jī)器上,這臺(tái)機(jī)器需要多少Q(mào)PS?
答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
問(wèn):如果一臺(tái)機(jī)器的QPS是58,需要幾臺(tái)機(jī)器來(lái)支持?
答:139 / 58 = 3
現(xiàn)在敏捷開(kāi)發(fā)是越來(lái)越火了,人人都在談敏捷,人人都在學(xué)習(xí)Scrum和XP...
為了不落后他人,于是我也開(kāi)始學(xué)習(xí)Scrum,今天主要是對(duì)我最近閱讀的相關(guān)資料,根據(jù)自己的理解,用自己的話來(lái)講述Scrum中的各個(gè)環(huán)節(jié),主要目的有兩個(gè),一個(gè)是進(jìn)行知識(shí)的總結(jié),另外一個(gè)是覺(jué)得網(wǎng)上很多學(xué)習(xí)資料的講述方式讓初學(xué)者不太容易理解;所以我決定寫(xiě)一篇掃盲性的博文,同時(shí)試著也與園內(nèi)的朋友一起分享交流一下,希望對(duì)初學(xué)者有幫助。
什么是敏捷開(kāi)發(fā)?
敏捷開(kāi)發(fā)(Agile Development)是一種以人為核心、迭代、循序漸進(jìn)的開(kāi)發(fā)方法。
怎么理解呢?首先,我們要理解它不是一門(mén)技術(shù),它是一種開(kāi)發(fā)方法,也就是一種軟件開(kāi)發(fā)的流程,它會(huì)指導(dǎo)我們用規(guī)定的環(huán)節(jié)去一步一步完成項(xiàng)目的開(kāi)發(fā);而這種開(kāi)發(fā)方式的主要驅(qū)動(dòng)核心是人;它采用的是迭代式開(kāi)發(fā);
為什么說(shuō)是以人為核心?
我們大部分人都學(xué)過(guò)瀑布開(kāi)發(fā)模型,它是以文檔為驅(qū)動(dòng)的,為什么呢?因?yàn)樵谄俨嫉恼麄€(gè)開(kāi)發(fā)過(guò)程中,要寫(xiě)大量的文檔,把需求文檔寫(xiě)出來(lái)后,開(kāi)發(fā)人員都是根據(jù)文檔進(jìn)行開(kāi)發(fā)的,一切以文檔為依據(jù);而敏捷開(kāi)發(fā)它只寫(xiě)有必要的文檔,或盡量少寫(xiě)文檔,敏捷開(kāi)發(fā)注重的是人與人之間,面對(duì)面的交流,所以它強(qiáng)調(diào)以人為核心。
什么是迭代?
迭代是指把一個(gè)復(fù)雜且開(kāi)發(fā)周期很長(zhǎng)的開(kāi)發(fā)任務(wù),分解為很多小周期可完成的任務(wù),這樣的一個(gè)周期就是一次迭代的過(guò)程;同時(shí)每一次迭代都可以生產(chǎn)或開(kāi)發(fā)出一個(gè)可以交付的軟件產(chǎn)品。
關(guān)于Scrum和XP
前面說(shuō)了敏捷它是一種指導(dǎo)思想或開(kāi)發(fā)方式,但是它沒(méi)有明確告訴我們到底采用什么樣的流程進(jìn)行開(kāi)發(fā),而Scrum和XP就是敏捷開(kāi)發(fā)的具體方式了,你可以采用Scrum方式也可以采用XP方式;Scrum和XP的區(qū)別是,Scrum偏重于過(guò)程,XP則偏重于實(shí)踐,但是實(shí)際中,兩者是結(jié)合一起應(yīng)用的,這里我主要講Scrum。
什么是Scrum?
Scrum的英文意思是橄欖球運(yùn)動(dòng)的一個(gè)專(zhuān)業(yè)術(shù)語(yǔ),表示“爭(zhēng)球”的動(dòng)作;把一個(gè)開(kāi)發(fā)流程的名字取名為Scrum,我想你一定能想象出你的開(kāi)發(fā)團(tuán)隊(duì)在開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),大家像打橄欖球一樣迅速、富有戰(zhàn)斗激情、人人你爭(zhēng)我搶地完成它,你一定會(huì)感到非常興奮的。
而Scrum就是這樣的一個(gè)開(kāi)發(fā)流程,運(yùn)用該流程,你就能看到你團(tuán)隊(duì)高效的工作。
【Scrum開(kāi)發(fā)流程中的三大角色】
產(chǎn)品負(fù)責(zé)人(Product Owner)
主要負(fù)責(zé)確定產(chǎn)品的功能和達(dá)到要求的標(biāo)準(zhǔn),指定軟件的發(fā)布日期和交付的內(nèi)容,同時(shí)有權(quán)力接受或拒絕開(kāi)發(fā)團(tuán)隊(duì)的工作成果。
流程管理員(Scrum Master)
主要負(fù)責(zé)整個(gè)Scrum流程在項(xiàng)目中的順利實(shí)施和進(jìn)行,以及清除擋在客戶和開(kāi)發(fā)工作之間的溝通障礙,使得客戶可以直接驅(qū)動(dòng)開(kāi)發(fā)。
開(kāi)發(fā)團(tuán)隊(duì)(Scrum Team)
主要負(fù)責(zé)軟件產(chǎn)品在Scrum規(guī)定流程下進(jìn)行開(kāi)發(fā)工作,人數(shù)控制在5~10人左右,每個(gè)成員可能負(fù)責(zé)不同的技術(shù)方面,但要求每成員必須要有很強(qiáng)的自我管理能力,同時(shí)具有一定的表達(dá)能力;成員可以采用任何工作方式,只要能達(dá)到Sprint的目標(biāo)。
Scrum流程圖

//------------------------
下面,我們開(kāi)始講具體實(shí)施流程,但是在講之前,我還要對(duì)一個(gè)英文單詞進(jìn)行講解。
什么是Sprint?
Sprint是短距離賽跑的意思,這里面指的是一次迭代,而一次迭代的周期是1個(gè)月時(shí)間(即4個(gè)星期),也就是我們要把一次迭代的開(kāi)發(fā)內(nèi)容以最快的速度完成它,這個(gè)過(guò)程我們稱(chēng)它為Sprint。
如何進(jìn)行Scrum開(kāi)發(fā)?
1、我們首先需要確定一個(gè)Product Backlog(按優(yōu)先順序排列的一個(gè)產(chǎn)品需求列表),這個(gè)是由Product Owner 負(fù)責(zé)的;
2、Scrum Team根據(jù)Product Backlog列表,做工作量的預(yù)估和安排;
3、有了Product Backlog列表,我們需要通過(guò) Sprint Planning Meeting(Sprint計(jì)劃會(huì)議) 來(lái)從中挑選出一個(gè)Story作為本次迭代完成的目標(biāo),這個(gè)目標(biāo)的時(shí)間周期是1~4個(gè)星期,然后把這個(gè)Story進(jìn)行細(xì)化,形成一個(gè)Sprint Backlog;
4、Sprint Backlog是由Scrum Team去完成的,每個(gè)成員根據(jù)Sprint Backlog再細(xì)化成更小的任務(wù)(細(xì)到每個(gè)任務(wù)的工作量在2天內(nèi)能完成);
5、在Scrum Team完成計(jì)劃會(huì)議上選出的Sprint Backlog過(guò)程中,需要進(jìn)行 Daily Scrum Meeting(每日站立會(huì)議),每次會(huì)議控制在15分鐘左右,每個(gè)人都必須發(fā)言,并且要向所有成員當(dāng)面匯報(bào)你昨天完成了什么,并且向所有成員承諾你今天要完成什么,同時(shí)遇到不能解決的問(wèn)題也可以提出,每個(gè)人回答完成后,要走到黑板前更新自己的 Sprint burn down(Sprint燃盡圖);
6、做到每日集成,也就是每天都要有一個(gè)可以成功編譯、并且可以演示的版本;很多人可能還沒(méi)有用過(guò)自動(dòng)化的每日集成,其實(shí)TFS就有這個(gè)功能,它可以支持每次有成員進(jìn)行簽入操作的時(shí)候,在服務(wù)器上自動(dòng)獲取最新版本,然后在服務(wù)器中編譯,如果通過(guò)則馬上再執(zhí)行單元測(cè)試代碼,如果也全部通過(guò),則將該版本發(fā)布,這時(shí)一次正式的簽入操作才保存到TFS中,中間有任何失敗,都會(huì)用郵件通知項(xiàng)目管理人員;
7、當(dāng)一個(gè)Story完成,也就是Sprint Backlog被完成,也就表示一次Sprint完成,這時(shí),我們要進(jìn)行 Srpint Review Meeting(演示會(huì)議),也稱(chēng)為評(píng)審會(huì)議,產(chǎn)品負(fù)責(zé)人和客戶都要參加(最好本公司老板也參加),每一個(gè)Scrum Team的成員都要向他們演示自己完成的軟件產(chǎn)品(這個(gè)會(huì)議非常重要,一定不能取消);
8、最后就是 Sprint Retrospective Meeting(回顧會(huì)議),也稱(chēng)為總結(jié)會(huì)議,以輪流發(fā)言方式進(jìn)行,每個(gè)人都要發(fā)言,總結(jié)并討論改進(jìn)的地方,放入下一輪Sprint的產(chǎn)品需求中;
下面是運(yùn)用Scrum開(kāi)發(fā)流程中的一些場(chǎng)景圖:

上圖是一個(gè) Product Backlog 的示例。

上圖就是每日的站立會(huì)議了,參會(huì)人員可以隨意姿勢(shì)站立,任務(wù)看板要保證讓每個(gè)人看到,當(dāng)每個(gè)人發(fā)言完后,要走到任務(wù)版前更新自己的燃盡圖。

任務(wù)看版包含 未完成、正在做、已完成 的工作狀態(tài),假設(shè)你今天把一個(gè)未完成的工作已經(jīng)完成,那么你要把小卡片從未完成區(qū)域貼到已完成區(qū)域。

每個(gè)人的工作進(jìn)度和完成情況都是公開(kāi)的,如果有一個(gè)人的工作任務(wù)在某一個(gè)位置放了好幾天,大家都能發(fā)現(xiàn)他的工作進(jìn)度出現(xiàn)了什么問(wèn)題(成員人數(shù)最好是5~7個(gè),這樣每人可以使用一種專(zhuān)用顏色的標(biāo)簽紙,一眼就可以從任務(wù)版看出誰(shuí)的工作進(jìn)度快,誰(shuí)的工作進(jìn)度慢)

上圖可不是撲克牌,它是計(jì)劃紙牌,它的作用是防止項(xiàng)目在開(kāi)發(fā)過(guò)程中,被某些人所領(lǐng)導(dǎo)。
怎么用的呢?比如A程序員開(kāi)發(fā)一個(gè)功能,需要5個(gè)小時(shí),B程序員認(rèn)為只需要半小時(shí),那他們各自取相應(yīng)的牌,藏在手中,最后攤牌,如果時(shí)間差距很大,那么A和B就可以討論A為什么要5個(gè)小時(shí)...
轉(zhuǎn)自:http://www.cnblogs.com/taven/archive/2010/10/17/1853386.html
先申明概念:
1、悲觀鎖,正如其名,它指的是對(duì)數(shù)據(jù)被外界(包括本系統(tǒng)當(dāng)前的其他事務(wù),以及來(lái)自外部系統(tǒng)的事務(wù)處理)修改持保守態(tài)度,因此,在整個(gè)數(shù)據(jù)處理過(guò)程中,將數(shù)據(jù)處于鎖定狀態(tài)。悲觀鎖的實(shí)現(xiàn),往往依靠數(shù)據(jù)庫(kù)提供的鎖機(jī)制(也只有數(shù)據(jù)庫(kù)層提供的鎖機(jī)制才能真正保證數(shù)據(jù)訪問(wèn)的排他性,否則,即使在本系統(tǒng)中實(shí)現(xiàn)了加鎖機(jī)制,也無(wú)法保證外部系統(tǒng)不會(huì)修改數(shù)據(jù))。
2、樂(lè)觀鎖( Optimistic Locking )
相對(duì)悲觀鎖而言,樂(lè)觀鎖機(jī)制采取了更加寬松的加鎖機(jī)制。悲觀鎖大多數(shù)情況下依靠數(shù)據(jù)庫(kù)的鎖機(jī)制實(shí)現(xiàn),以保證操作最大程度的獨(dú)占性。但隨之而來(lái)的就是數(shù)據(jù)庫(kù)性能的大量開(kāi)銷(xiāo),特別是對(duì)長(zhǎng)事務(wù)而言,這樣的開(kāi)銷(xiāo)往往無(wú)法承受。而樂(lè)觀鎖機(jī)制在一定程度上解決了這個(gè)問(wèn)題。樂(lè)觀鎖,大多是基于數(shù)據(jù)版本( Version )記錄機(jī)制實(shí)現(xiàn)。何謂數(shù)據(jù)版本?即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí),在基于數(shù)據(jù)庫(kù)表的版本解決方案中,一般是通過(guò)為數(shù)據(jù)庫(kù)表增加一個(gè) “version” 字段來(lái)實(shí)現(xiàn)。讀取出數(shù)據(jù)時(shí),將此版本號(hào)一同讀出,之后更新時(shí),對(duì)此版本號(hào)加一。此時(shí),將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫(kù)表對(duì)應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對(duì),如果提交的數(shù)據(jù)版本號(hào)大于數(shù)據(jù)庫(kù)表當(dāng)前版本號(hào),則予以更新,否則認(rèn)為是過(guò)期數(shù)據(jù)。
所以悲觀鎖和樂(lè)觀鎖最大的區(qū)別是是否一直鎖定資源,悲觀鎖在事物的全流程鎖定數(shù)據(jù),樂(lè)觀鎖不鎖定數(shù)據(jù)(用讀寫(xiě)鎖是阻塞事物,而用樂(lè)觀鎖則會(huì)導(dǎo)致回滾。這個(gè)是一種事物沖突后的不同鎖的表象)。樂(lè)觀鎖的最大特點(diǎn)是在最后檢查數(shù)據(jù)是否被修改,如果已被別人修改過(guò),則回滾數(shù)據(jù),避免臟數(shù)據(jù)。至于事物是否沖突和加鎖沒(méi)有直接聯(lián)系,該沖突的還是會(huì)沖突,不管你加悲觀鎖和樂(lè)觀鎖都會(huì)沖突。
悲觀鎖和樂(lè)觀鎖都是為了解決丟失更新問(wèn)題或者是臟讀。悲觀鎖和樂(lè)觀鎖的重點(diǎn)就是是否在讀取記錄的時(shí)候直接上鎖。悲觀鎖的缺點(diǎn)很明顯,需要一個(gè)持續(xù)的數(shù)據(jù)庫(kù)連接,這在web應(yīng)用中已經(jīng)不適合了。
一個(gè)比較清楚的場(chǎng)景
下面這個(gè)假設(shè)的實(shí)際場(chǎng)景可以比較清楚的幫助我們理解這個(gè)問(wèn)題:
a. 假設(shè)當(dāng)當(dāng)網(wǎng)上用戶下單買(mǎi)了本書(shū),這時(shí)數(shù)據(jù)庫(kù)中有條訂單號(hào)為001的訂單,其中有個(gè)status字段是’有效’,表示該訂單是有效的;
b. 后臺(tái)管理人員查詢到這條001的訂單,并且看到狀態(tài)是有效的
c. 用戶發(fā)現(xiàn)下單的時(shí)候下錯(cuò)了,于是撤銷(xiāo)訂單,假設(shè)運(yùn)行這樣一條SQL: update order_table set status = ‘取消’ where order_id = 001;
d. 后臺(tái)管理人員由于在b這步看到狀態(tài)有效的,這時(shí),雖然用戶在c這步已經(jīng)撤銷(xiāo)了訂單,可是管理人員并未刷新界面,看到的訂單狀態(tài)還是有效的,于是點(diǎn)擊”發(fā)貨”按鈕,將該訂單發(fā)到物流部門(mén),同時(shí)運(yùn)行類(lèi)似如下SQL,將訂單狀態(tài)改成已發(fā)貨:update order_table set status = ‘已發(fā)貨’ where order_id = 001
觀點(diǎn)1:只有沖突非常嚴(yán)重的系統(tǒng)才需要悲觀鎖;
分析:這是更準(zhǔn)確的說(shuō)法;
“所有悲觀鎖的做法都適合于狀態(tài)被修改的概率比較高的情況,具體是否合適則需要根據(jù)實(shí)際情況判斷。”,表達(dá)的也是這個(gè)意思,不過(guò)說(shuō)法不夠準(zhǔn)確;的確,之所以用悲觀鎖就是因?yàn)閮蓚€(gè)用戶更新同一條數(shù)據(jù)的概率高,也就是沖突比較嚴(yán)重的情況下,所以才用悲觀鎖。
觀點(diǎn)2:最后提交前作一次select for update檢查,然后再提交update也是一種樂(lè)觀鎖的做法
分析:這是更準(zhǔn)確的說(shuō)法;
的確,這符合傳統(tǒng)樂(lè)觀鎖的做法,就是到最后再去檢查。但是wiki在解釋悲觀鎖的做法的時(shí)候,’It is not appropriate for use in web application development.’, 現(xiàn)在已經(jīng)很少有悲觀鎖的做法了,所以我自己將這種二次檢查的做法也歸為悲觀鎖的變種,因?yàn)檫@在所有樂(lè)觀鎖里面,做法和悲觀鎖是最接近的,都是先select for update,然后update
*****除了上面的觀點(diǎn)1和觀點(diǎn)2是更準(zhǔn)確的說(shuō)法,下面的所有觀點(diǎn)都是錯(cuò)誤的***********
觀點(diǎn)3:這個(gè)問(wèn)題的原因是因?yàn)閿?shù)據(jù)庫(kù)隔離級(jí)別是uncommitted read級(jí)別;
分析:這個(gè)觀點(diǎn)是錯(cuò)誤的;
這個(gè)過(guò)程本身就是在read committed隔離級(jí)別下發(fā)生的,從a到d每一步,尤其是d這步,并不是因?yàn)樽x到了未提交的數(shù)據(jù),僅僅是因?yàn)橛脩艚缑鏇](méi)有刷新[事實(shí)上也不可能做自動(dòng)刷新,這樣相當(dāng)于數(shù)據(jù)庫(kù)一發(fā)生改變立刻要刷新了,這需要監(jiān)聽(tīng)數(shù)據(jù)庫(kù)了,顯然這是簡(jiǎn)單問(wèn)題復(fù)雜化了];
觀點(diǎn)4:悲觀鎖是指一個(gè)用戶在更新數(shù)據(jù)的時(shí)候,其他用戶不能讀取這條記錄;也就是update阻塞讀才叫悲觀鎖;
分析:這個(gè)觀點(diǎn)是錯(cuò)的;
這在db2背景的開(kāi)發(fā)中尤其常見(jiàn);因?yàn)閐b2默認(rèn)就是update會(huì)阻塞讀;但是這是各個(gè)數(shù)據(jù)庫(kù)對(duì)讀寫(xiě)的時(shí)候上鎖的并發(fā)處理實(shí)現(xiàn)不一樣。但這根本不是悲觀鎖樂(lè)觀鎖的區(qū)別。Oracle可以做到寫(xiě)不阻塞讀僅僅是因?yàn)樽隽硕喟姹静l(fā)控制(Multiversion concurrency control), http://en.wikipedia.org/wiki/Multiversion_concurrency_control;但是在Oracle里面,一樣可以做樂(lè)觀鎖和悲觀鎖的控制。這本質(zhì)上是應(yīng)用層面的選擇。
觀點(diǎn)5:Oracle實(shí)際上用的就是樂(lè)觀鎖
分析:這個(gè)觀點(diǎn)是錯(cuò)的;
前面說(shuō)了,Oracle的確可以做到寫(xiě)不阻塞讀,但是這不是悲觀鎖和樂(lè)觀鎖的問(wèn)題。這是因?yàn)閷?shí)現(xiàn)了多版本并發(fā)控制。按照wiki的定義,悲觀鎖和樂(lè)觀鎖是在應(yīng)用層面選擇的。Oracle的應(yīng)用只要在第二步做了select for update,就是悲觀鎖的做法;況且Oracle在任何隔離級(jí)別下,除了分布式事務(wù)兩階段提交的短暫時(shí)間,其他所有情況下都不存在寫(xiě)阻塞讀的情況,如果按照這個(gè)觀點(diǎn)的話那Oracle已經(jīng)不能做悲觀鎖了-_-
觀點(diǎn)6:不需要這么麻煩,只需要在d這步,最后提交更新的時(shí)候再做一個(gè)普通的select檢查一下就可以;[就是double check的做法]
分析:這個(gè)觀點(diǎn)是錯(cuò)的。
這個(gè)做法其實(shí)在http://www.hetaoblog.com/database-lost-update-pessimistic-lock/,’3. 傳統(tǒng)悲觀鎖做法的變通’這節(jié)已經(jīng)說(shuō)明了,如果要這么做的話,仍然需要在最后提交更新前double check的時(shí)候做一個(gè)select for update, 否則select結(jié)束到update提交前的時(shí)間仍然有可能記錄被修改;
觀點(diǎn)7:應(yīng)該盡可能使用悲觀鎖;
分析:這個(gè)觀點(diǎn)是錯(cuò)的;
a. 根據(jù)悲觀鎖的概念,用戶在讀的時(shí)候(b這步)就會(huì)將記錄鎖住,直到更新結(jié)束的時(shí)候才會(huì)將鎖釋放,所以整個(gè)鎖的過(guò)程時(shí)間比較長(zhǎng);
b. 另外,悲觀鎖需要有一個(gè)持續(xù)的數(shù)據(jù)庫(kù)連接,這在當(dāng)今的web應(yīng)用中已經(jīng)幾乎不存在;wiki上也說(shuō)了, 悲觀鎖‘is not appropriate for use in web application development.’
所以,現(xiàn)在大部分應(yīng)用都應(yīng)該是樂(lè)觀鎖的;
轉(zhuǎn)自:http://zhidao.baidu.com/link?url=MUOUg59oz7-FKwz-zuUviGryfw9J4V63Pd2iWWErorwUpyeL85rznlmYaGDHXjH_ChywA3R1m9XNpx4k7RCCT3rNofjkCxIBYHdsvwr2bVy
JDK1.5以后,在鎖機(jī)制方面引入了新的鎖-Lock,在網(wǎng)上的說(shuō)法都比較籠統(tǒng),結(jié)合網(wǎng)上的信息和我的理解這里做個(gè)總結(jié)。 java現(xiàn)有的鎖機(jī)制有兩種實(shí)現(xiàn)方式,J.DK1.4前是通過(guò)synchronized實(shí)現(xiàn),JDK1.5后加入java.util.concurrent.locks包下的各種lock(以下簡(jiǎn)稱(chēng)Lock) 先說(shuō)說(shuō)代碼層的區(qū)別。 synchronized:在代碼里,synchronized類(lèi)似“面向?qū)ο?#8221;,修飾類(lèi)、方法、對(duì)象。 Lock:不作為修飾,類(lèi)似“面向過(guò)程”,在方法中需要鎖的時(shí)候lock,在結(jié)束的時(shí)候unlock(一般都在finally塊里)。 例如代碼: Java代碼

- public void method1() {
- synchronized(this){//舊鎖,無(wú)需人工釋放
- System.out.println(1);
- }
- }
-
- public void method2() {
- Lock lock = new ReentrantLock();
- lock.lock();//上鎖
- try{
- System.out.println(2);
- }finally{
- lock.unlock();//解鎖
- }
- }
其次說(shuō)說(shuō)性能。 相關(guān)的性能測(cè)試網(wǎng)上已經(jīng)有很多,這里也直接拿來(lái)主義,給出結(jié)論: 在并發(fā)高是,luck性能優(yōu)勢(shì)很明顯,在低并發(fā)時(shí),synchronized也能取得優(yōu)勢(shì)。具體的臨界范圍比較難定論,下面會(huì)討論。 現(xiàn)在來(lái)分析它們具體的區(qū)別。 鎖都是 原子性 的,也可以理解為鎖是否在使用的標(biāo)記,并且比較和設(shè)置這個(gè)標(biāo)記的操作是原子性的,不同硬件平臺(tái)上的jdk實(shí)現(xiàn)鎖的相關(guān)方法都是native的(比如park/unpark),所以不同平臺(tái)上鎖的精確度的等級(jí)由這些native的方法決定。所以網(wǎng)上經(jīng)常可以看見(jiàn)的結(jié)論是“Lock比synchronized有更精確的原子操作”說(shuō)的也是native方法(不得不感慨C才是硬件王道)。 下面繼續(xù)討論怎么由代碼層到native的過(guò)程。 1、所有對(duì)象都自動(dòng)含有單一的鎖,JVM負(fù)責(zé)跟蹤對(duì)象被加鎖的次數(shù)。如果一個(gè)對(duì)象被解鎖,其計(jì)數(shù)變?yōu)?。在任務(wù)(線程)第一次給對(duì)象加鎖的時(shí)候,計(jì)數(shù)變?yōu)?。每當(dāng)這個(gè)相同的任務(wù)(線程)在此對(duì)象上獲得鎖時(shí),計(jì)數(shù)會(huì)遞增。 只有首先獲得鎖的任務(wù)(線程)才能繼續(xù)獲取該對(duì)象上的多個(gè)鎖。每當(dāng)任務(wù)離開(kāi)時(shí),計(jì)數(shù)遞減,當(dāng)計(jì)數(shù)為0的時(shí)候,鎖被完全釋放。synchronized就是基于這個(gè)原理,同時(shí)synchronized靠某個(gè)對(duì)象的單一鎖技術(shù)的次數(shù)來(lái)判斷是否被鎖,所以無(wú)需(也不能)人工干預(yù)鎖的獲取和釋放。如果結(jié)合方法調(diào)用時(shí)的棧和框架(如果對(duì)方法的調(diào)用過(guò)程不熟悉建議看看http://wupuyuan.iteye.com/blog/1157548),不難推測(cè)出synchronized原理是基于棧中的某對(duì)象來(lái)控制一個(gè)框架,所以對(duì)于synchronized有常用的優(yōu)化是鎖對(duì)象不鎖方法。實(shí)際上synchronized作用于方法時(shí),鎖住的是“this”,作用于靜態(tài)方法/屬性時(shí),鎖住的是存在于永久帶的CLASS,相當(dāng)于這個(gè)CLASS的全局鎖,鎖作用于一般對(duì)象時(shí),鎖住的是對(duì)應(yīng)代碼塊。在HotSpot中JVM實(shí)現(xiàn)中,鎖有個(gè)專(zhuān)門(mén)的名字:對(duì)象監(jiān)視器。 當(dāng)多個(gè)線程同時(shí)請(qǐng)求某個(gè)對(duì)象監(jiān)視器時(shí),對(duì)象監(jiān)視器會(huì)設(shè)置幾種狀態(tài)用來(lái)區(qū)分請(qǐng)求的線程 Contention List:所有請(qǐng)求鎖的線程將被首先放置到該競(jìng)爭(zhēng)隊(duì)列,是個(gè)虛擬隊(duì)列,不是實(shí)際的Queue的數(shù)據(jù)結(jié)構(gòu)。Entry List:EntryList與ContentionList邏輯上同屬等待隊(duì)列,ContentionList會(huì)被線程并發(fā)訪問(wèn),為了降低對(duì)ContentionList隊(duì)尾的爭(zhēng)用,而建立EntryList。,Contention List中那些有資格成為候選人的線程被移到Entry List Wait Set:那些調(diào)用wait方法被阻塞的線程被放置到Wait Set OnDeck:任何時(shí)刻最多只能有一個(gè)線程正在競(jìng)爭(zhēng)鎖,該線程稱(chēng)為OnDeck Owner:獲得鎖的線程稱(chēng)為Owner !Owner:釋放鎖的線程 2、Lock不同于synchronized面向?qū)ο螅跅V械目蚣芏皇悄硞€(gè)具體對(duì)象,所以Lock只需要在棧里設(shè)置鎖的開(kāi)始和結(jié)束(lock和unlock)的地方就行了(人工必須標(biāo)明),不用關(guān)心框架大小對(duì)象的變化等等。這么做的好處是Lock能提供無(wú)條件的、可輪詢的、定時(shí)的、可中斷的鎖獲取操作,相對(duì)于synchronized來(lái)說(shuō),synchronized的鎖的獲取是釋放必須在一個(gè)模塊里,獲取和釋放的順序必須相反,而Lock則可以在不同范圍內(nèi)獲取釋放,并且順序無(wú)關(guān)。java.util.concurrent.locks下的鎖類(lèi)很類(lèi)似,依賴于java.util.concurrent.AbstractQueuedSynchronizer,它們把所有的Lock接口操作都轉(zhuǎn)嫁到Sync類(lèi)上,這個(gè)類(lèi)繼承了AbstractQueuedSynchronizer,它同時(shí)還包含子2個(gè)類(lèi):NonfairSync 和FairSync 從名字上可以看的出是為了實(shí)現(xiàn)公平和非公平性。AbstractQueuedSynchronizer中把所有的的請(qǐng)求線程構(gòu)成一個(gè)隊(duì)列(一樣也是虛擬的),具體的實(shí)現(xiàn)可以參考http://blog.csdn.net/chen77716/article/details/6641477#,這里我就不復(fù)制了。 3、從jdk的源代碼來(lái)看,Lock和synchronized的源碼基本相同,區(qū)別主要在維護(hù)的同步隊(duì)列上。再往下深究就到了native方法了。 4、還有個(gè)改進(jìn)我也想說(shuō)下,其實(shí)很重要的。線程分阻塞(wait)和非阻塞狀態(tài),阻塞狀態(tài)由操作系統(tǒng)(linux、windows等)完成,當(dāng)前一個(gè)被“鎖”的線程執(zhí)行完畢后,有可能在后續(xù)的線程隊(duì)列里還沒(méi)分配出一個(gè)獲取鎖而被“喚醒”的非阻塞線程,即所有線程還都是阻塞狀態(tài)時(shí),就被系統(tǒng)調(diào)度(進(jìn)入內(nèi)核的線程是阻塞的),這樣會(huì)導(dǎo)致內(nèi)核在用戶態(tài)和內(nèi)核態(tài)之間來(lái)回接換,嚴(yán)重影響鎖的性能。在jdk1.6以前主要靠自旋鎖來(lái)解決,原理是在前一個(gè)線程結(jié)束后,爭(zhēng)用線程可以做一個(gè)空循環(huán),繼續(xù)占有CPU,等待取鎖的機(jī)會(huì)。當(dāng)然這樣做顯然也是浪費(fèi)時(shí)間,只是在兩種浪費(fèi)中選取浪費(fèi)少的…… jdk1.6后引入了偏向鎖,當(dāng)線程第一次獲得了監(jiān)視對(duì)象,之后讓監(jiān)視對(duì)象“偏向”這個(gè)線程,之后的多次調(diào)用則可以避免CAS操作,等于是置了一臨時(shí)變量來(lái)記錄位置(類(lèi)似索引比較)。詳細(xì)的就涉及到匯編指令了,我也就沒(méi)太深究,偏向鎖性能優(yōu)于自旋鎖,但是還是沒(méi)有達(dá)到HotSpot認(rèn)為的最佳時(shí)間(一個(gè)線程上下文切換的時(shí)間)。 綜合來(lái)看對(duì)于所有的高并發(fā)情況,采用Lock加鎖是最優(yōu)選擇,但是由于歷史遺留等問(wèn)題,synchronized也還是不能完全被淘汰,同時(shí),在低并發(fā)情況下,synchronized的性能還是比Lock好的。 原帖地址:http://wupuyuan.iteye.com/blog/1158655
之所以起這樣一個(gè)題目是因?yàn)楹芫靡郧拔以?jīng)寫(xiě)過(guò)一篇介紹TIME_WAIT的文章,不過(guò)當(dāng)時(shí)基本屬于淺嘗輒止,并沒(méi)深入說(shuō)明問(wèn)題的來(lái)龍去脈,碰巧這段時(shí)間反復(fù)被別人問(wèn)到相關(guān)的問(wèn)題,讓我覺(jué)得有必要全面總結(jié)一下,以備不時(shí)之需。
討論前大家可以拿手頭的服務(wù)器摸摸底,記住「ss」比「netstat」快:
shell> ss -ant | awk ' NR>1 {++s[$1]} END {for(k in s) print k,s[k]} '
如果你只是想單獨(dú)查詢一下TIME_WAIT的數(shù)量,那么還可以更簡(jiǎn)單一些:
shell> cat /proc/net/sockstat
我猜你一定被巨大無(wú)比的TIME_WAIT網(wǎng)絡(luò)連接總數(shù)嚇到了!以我個(gè)人的經(jīng)驗(yàn),對(duì)于一臺(tái)繁忙的Web服務(wù)器來(lái)說(shuō),如果主要以短連接為主,那么其TIME_WAIT網(wǎng)絡(luò)連接總數(shù)很可能會(huì)達(dá)到幾萬(wàn),甚至十幾萬(wàn)。雖然一個(gè)TIME_WAIT網(wǎng)絡(luò)連接耗費(fèi)的資源無(wú)非就是一個(gè)端口、一點(diǎn)內(nèi)存,但是架不住基數(shù)大,所以這始終是一個(gè)需要面對(duì)的問(wèn)題。
為什么會(huì)存在TIME_WAIT?
TCP在建立連接的時(shí)候需要握手,同理,在關(guān)閉連接的時(shí)候也需要握手。為了更直觀的說(shuō)明關(guān)閉連接時(shí)握手的過(guò)程,我們引用「The TCP/IP Guide」中的例子:

TCP Close
因?yàn)門(mén)CP連接是雙向的,所以在關(guān)閉連接的時(shí)候,兩個(gè)方向各自都需要關(guān)閉。先發(fā)FIN包的一方執(zhí)行的是主動(dòng)關(guān)閉;后發(fā)FIN包的一方執(zhí)行的是被動(dòng)關(guān)閉。主動(dòng)關(guān)閉的一方會(huì)進(jìn)入TIME_WAIT狀態(tài),并且在此狀態(tài)停留兩倍的MSL時(shí)長(zhǎng)。
穿插一點(diǎn)MSL的知識(shí):MSL指的是報(bào)文段的最大生存時(shí)間,如果報(bào)文段在網(wǎng)絡(luò)活動(dòng)了MSL時(shí)間,還沒(méi)有被接收,那么會(huì)被丟棄。關(guān)于MSL的大小,RFC 793協(xié)議中給出的建議是兩分鐘,不過(guò)實(shí)際上不同的操作系統(tǒng)可能有不同的設(shè)置,以Linux為例,通常是半分鐘,兩倍的MSL就是一分鐘,也就是60秒,并且這個(gè)數(shù)值是硬編碼在內(nèi)核中的,也就是說(shuō)除非你重新編譯內(nèi)核,否則沒(méi)法修改它:
#define TCP_TIMEWAIT_LEN (60*HZ)
如果每秒的連接數(shù)是一千的話,那么一分鐘就可能會(huì)產(chǎn)生六萬(wàn)個(gè)TIME_WAIT。
為什么主動(dòng)關(guān)閉的一方不直接進(jìn)入CLOSED狀態(tài),而是進(jìn)入TIME_WAIT狀態(tài),并且停留兩倍的MSL時(shí)長(zhǎng)呢?這是因?yàn)門(mén)CP是建立在不可靠網(wǎng)絡(luò)上的可靠的協(xié)議。例子:主動(dòng)關(guān)閉的一方收到被動(dòng)關(guān)閉的一方發(fā)出的FIN包后,回應(yīng)ACK包,同時(shí)進(jìn)入TIME_WAIT狀態(tài),但是因?yàn)榫W(wǎng)絡(luò)原因,主動(dòng)關(guān)閉的一方發(fā)送的這個(gè)ACK包很可能延遲,從而觸發(fā)被動(dòng)連接一方重傳FIN包。極端情況下,這一去一回,就是兩倍的MSL時(shí)長(zhǎng)。如果主動(dòng)關(guān)閉的一方跳過(guò)TIME_WAIT直接進(jìn)入CLOSED,或者在TIME_WAIT停留的時(shí)長(zhǎng)不足兩倍的MSL,那么當(dāng)被動(dòng)關(guān)閉的一方早先發(fā)出的延遲包到達(dá)后,就可能出現(xiàn)類(lèi)似下面的問(wèn)題:
- 舊的TCP連接已經(jīng)不存在了,系統(tǒng)此時(shí)只能返回RST包
- 新的TCP連接被建立起來(lái)了,延遲包可能干擾新的連接
不管是哪種情況都會(huì)讓TCP不再可靠,所以TIME_WAIT狀態(tài)有存在的必要性。
如何控制TIME_WAIT的數(shù)量?
從前面的描述我們可以得出這樣的結(jié)論:TIME_WAIT這東西沒(méi)有的話不行,不過(guò)太多可能也是個(gè)麻煩事。下面讓我們看看有哪些方法可以控制TIME_WAIT數(shù)量,這里只說(shuō)一些常規(guī)方法,另外一些諸如SO_LINGER之類(lèi)的方法太過(guò)偏門(mén),略過(guò)不談。
ip_conntrack:顧名思義就是跟蹤連接。一旦激活了此模塊,就能在系統(tǒng)參數(shù)里發(fā)現(xiàn)很多用來(lái)控制網(wǎng)絡(luò)連接狀態(tài)超時(shí)的設(shè)置,其中自然也包括TIME_WAIT:
shell> modprobe ip_conntrack shell> sysctl net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait
我們可以嘗試縮小它的設(shè)置,比如十秒,甚至一秒,具體設(shè)置成多少合適取決于網(wǎng)絡(luò)情況而定,當(dāng)然也可以參考相關(guān)的案例。不過(guò)就我的個(gè)人意見(jiàn)來(lái)說(shuō),ip_conntrack引入的問(wèn)題比解決的還多,比如性能會(huì)大幅下降,所以不建議使用。
tcp_tw_recycle:顧名思義就是回收TIME_WAIT連接。可以說(shuō)這個(gè)內(nèi)核參數(shù)已經(jīng)變成了大眾處理TIME_WAIT的萬(wàn)金油,如果你在網(wǎng)絡(luò)上搜索TIME_WAIT的解決方案,十有八九會(huì)推薦設(shè)置它,不過(guò)這里隱藏著一個(gè)不易察覺(jué)的陷阱:
當(dāng)多個(gè)客戶端通過(guò)NAT方式聯(lián)網(wǎng)并與服務(wù)端交互時(shí),服務(wù)端看到的是同一個(gè)IP,也就是說(shuō)對(duì)服務(wù)端而言這些客戶端實(shí)際上等同于一個(gè),可惜由于這些客戶端的時(shí)間戳可能存在差異,于是乎從服務(wù)端的視角看,便可能出現(xiàn)時(shí)間戳錯(cuò)亂的現(xiàn)象,進(jìn)而直接導(dǎo)致時(shí)間戳小的數(shù)據(jù)包被丟棄。參考:tcp_tw_recycle和tcp_timestamps導(dǎo)致connect失敗問(wèn)題。
tcp_tw_reuse:顧名思義就是復(fù)用TIME_WAIT連接。當(dāng)創(chuàng)建新連接的時(shí)候,如果可能的話會(huì)考慮復(fù)用相應(yīng)的TIME_WAIT連接。通常認(rèn)為「tcp_tw_reuse」比「tcp_tw_recycle」安全一些,這是因?yàn)橐粊?lái)TIME_WAIT創(chuàng)建時(shí)間必須超過(guò)一秒才可能會(huì)被復(fù)用;二來(lái)只有連接的時(shí)間戳是遞增的時(shí)候才會(huì)被復(fù)用。官方文檔里是這樣說(shuō)的:如果從協(xié)議視角看它是安全的,那么就可以使用。這簡(jiǎn)直就是外交辭令啊!按我的看法,如果網(wǎng)絡(luò)比較穩(wěn)定,比如都是內(nèi)網(wǎng)連接,那么就可以嘗試使用。
不過(guò)需要注意的是在哪里使用,既然我們要復(fù)用連接,那么當(dāng)然應(yīng)該在連接的發(fā)起方使用,而不能在被連接方使用。舉例來(lái)說(shuō):客戶端向服務(wù)端發(fā)起HTTP請(qǐng)求,服務(wù)端響應(yīng)后主動(dòng)關(guān)閉連接,于是TIME_WAIT便留在了服務(wù)端,此類(lèi)情況使用「tcp_tw_reuse」是無(wú)效的,因?yàn)榉?wù)端是被連接方,所以不存在復(fù)用連接一說(shuō)。讓我們延伸一點(diǎn)來(lái)看,比如說(shuō)服務(wù)端是PHP,它查詢另一個(gè)MySQL服務(wù)端,然后主動(dòng)斷開(kāi)連接,于是TIME_WAIT就落在了PHP一側(cè),此類(lèi)情況下使用「tcp_tw_reuse」是有效的,因?yàn)榇藭r(shí)PHP相對(duì)于MySQL而言是客戶端,它是連接的發(fā)起方,所以可以復(fù)用連接。
說(shuō)明:如果使用tcp_tw_reuse,請(qǐng)激活tcp_timestamps,否則無(wú)效。
tcp_max_tw_buckets:顧名思義就是控制TIME_WAIT總數(shù)。官網(wǎng)文檔說(shuō)這個(gè)選項(xiàng)只是為了阻止一些簡(jiǎn)單的DoS攻擊,平常不要人為的降低它。如果縮小了它,那么系統(tǒng)會(huì)將多余的TIME_WAIT刪除掉,日志里會(huì)顯示:「TCP: time wait bucket table overflow」。
需要提醒大家的是物極必反,曾經(jīng)看到有人把「tcp_max_tw_buckets」設(shè)置成0,也就是說(shuō)完全拋棄TIME_WAIT,這就有些冒險(xiǎn)了,用一句圍棋諺語(yǔ)來(lái)說(shuō):入界宜緩。
…
有時(shí)候,如果我們換個(gè)角度去看問(wèn)題,往往能得到四兩撥千斤的效果。前面提到的例子:客戶端向服務(wù)端發(fā)起HTTP請(qǐng)求,服務(wù)端響應(yīng)后主動(dòng)關(guān)閉連接,于是TIME_WAIT便留在了服務(wù)端。這里的關(guān)鍵在于主動(dòng)關(guān)閉連接的是服務(wù)端!在關(guān)閉TCP連接的時(shí)候,先出手的一方注定逃不開(kāi)TIME_WAIT的宿命,套用一句歌詞:把我的悲傷留給自己,你的美麗讓你帶走。如果客戶端可控的話,那么在服務(wù)端打開(kāi)KeepAlive,盡可能不讓服務(wù)端主動(dòng)關(guān)閉連接,而讓客戶端主動(dòng)關(guān)閉連接,如此一來(lái)問(wèn)題便迎刃而解了。
參考文檔:
- tcp短連接TIME_WAIT問(wèn)題解決方法大全(1)——高屋建瓴
- tcp短連接TIME_WAIT問(wèn)題解決方法大全(2)——SO_LINGER
- tcp短連接TIME_WAIT問(wèn)題解決方法大全(3)——tcp_tw_recycle
- tcp短連接TIME_WAIT問(wèn)題解決方法大全(4)——tcp_tw_reuse
- tcp短連接TIME_WAIT問(wèn)題解決方法大全(5)——tcp_max_tw_buckets
1、常規(guī)網(wǎng)絡(luò)訪問(wèn)限制:
a、線上運(yùn)營(yíng)設(shè)備的SSH端口不允許綁定在公網(wǎng)IP地址上,開(kāi)發(fā)只能登錄開(kāi)發(fā)機(jī)然后通過(guò)內(nèi)網(wǎng)登錄這些服務(wù)器;
b、開(kāi)發(fā)機(jī)、測(cè)試機(jī)的SSH端口可以綁定在公網(wǎng)IP地址上,SSH端口(22)可以考慮改為非知名端口;
c、線上運(yùn)營(yíng)設(shè)備、開(kāi)發(fā)機(jī)、測(cè)試機(jī)的防火墻配置,公網(wǎng)只做80(HTTP)、8080(HTTP)、443(HTTPS)、SSH端口(僅限開(kāi)發(fā)機(jī)、測(cè)試機(jī))對(duì)外授權(quán)訪問(wèn);
d、線上運(yùn)營(yíng)設(shè)備、開(kāi)發(fā)機(jī)、測(cè)試機(jī)除第c點(diǎn)以外所有服務(wù)端口禁止綁定在公網(wǎng)IP地址上,尤其是3306端口(MySQL);
2、DB保護(hù),
a、DB服務(wù)器不允許配置公網(wǎng)IP(或用防火墻全部禁止公網(wǎng)訪問(wèn));
b、DB的root賬戶不用于業(yè)務(wù)訪問(wèn),回收集中管理,開(kāi)放普通賬戶做業(yè)務(wù)邏輯訪問(wèn),對(duì)不同安全要求的庫(kù)表用不同的賬戶密碼訪問(wèn);
c、程序不要把DB訪問(wèn)的賬戶密碼寫(xiě)到配置文件中,寫(xiě)入代碼或啟動(dòng)時(shí)遠(yuǎn)程到配置中心拉取(此方法比較重,可暫不考慮)。
d、另:DB備份文件可以考慮做加密處理;
3、系統(tǒng)安全:
a、設(shè)備的root密碼回收集中管理,給開(kāi)發(fā)提供普通用戶帳號(hào);
b、密碼需要定期修改,有強(qiáng)度要求;
4、業(yè)務(wù)訪問(wèn)控制:
a、業(yè)務(wù)服務(wù)邏輯和運(yùn)營(yíng)平臺(tái),盡量不要提供對(duì)用戶表和訂單表的批量訪問(wèn)接口,如果運(yùn)營(yíng)平臺(tái)確實(shí)有這樣的需求,需要對(duì)特定賬戶做授權(quán);
安全的代價(jià)是不方便、效率會(huì)下降,需要尋找平衡點(diǎn)。
轉(zhuǎn)自http://www.witwebs.com/aliyun-mount-init/
阿里云的服務(wù)器,國(guó)內(nèi)訪問(wèn)速度,穩(wěn)定性一直都是不錯(cuò)的。至少我在使用的過(guò)程中,還未碰到什么問(wèn)題。我將自己在使用主機(jī)過(guò)程的安裝和環(huán)境配置做一個(gè)詳細(xì)的介紹。僅供新手朋友參考!當(dāng)我們?cè)谫?gòu)買(mǎi)到阿里云服務(wù)器之后,會(huì)獲得相應(yīng)的IP地址和管理密碼。
主要介紹Linux的數(shù)據(jù)盤(pán)的格式化和掛載。
大致步驟是: 登陸Linux > 查看硬盤(pán)狀況 > 分區(qū)數(shù)據(jù)盤(pán) > 格式化數(shù)據(jù)盤(pán) > 掛載新分區(qū)
將會(huì)用到的命令如下:
df -h 查看已掛載硬盤(pán)信息
fdisk -l 查看磁盤(pán)信息,未掛載的也會(huì)列出來(lái)
fdisk /dev/xvdb 對(duì)數(shù)據(jù)盤(pán)進(jìn)行分區(qū),回車(chē)之后,繼續(xù) 根據(jù)提示,依次輸入”n” ,”p”,“1”,兩次回車(chē),“wq”, 分區(qū)就開(kāi)始了,很快就會(huì)完成
mkfs .ext3 /dev/xvdb1 命令對(duì)新分區(qū)進(jìn)行格式化
echo ‘/dev/xvdb1 /www ext3 defaults 0 0′ >> /etc/fstab 添加分區(qū)信息
mount -a 命令掛載新分區(qū)
1:通過(guò)Linux SSH 登陸軟件登陸你的linux。登陸之后輸入命令:df -lh 的界面如圖:

2:輸入命令: fdisk -l 查看磁盤(pán)狀況,可以看到有數(shù)據(jù)盤(pán): /dev/xvdb 而用df沒(méi)有查看到這個(gè)磁盤(pán)。所以需要另外掛載。

3: 用 fdisk /dev/xvdb 對(duì)數(shù)據(jù)盤(pán)進(jìn)行分區(qū)。根據(jù)提示,輸入 n, p, 1, 回車(chē),回車(chē), wq。
完成之后,再用 fdisk -l,就可以看到顯示的信息和之前有不同了。

4:格式化磁盤(pán)。 mkfs .ext3 /dev/xvdb1 ,格式化磁盤(pán)。完成之后,就可以來(lái)掛載分區(qū)了。

5, 掛載分區(qū),首先建立一個(gè)目錄用來(lái)掛載分區(qū)。比如: mkdir /www
然后把分區(qū)信息加入到fstab中:一次執(zhí)行:
echo ‘/dev/xvdb1 /www ext3 defaults 0 0′ >> /etc/fstab 添加分區(qū)信息
mount -a 命令掛載新分區(qū)
最后用 df -h 命令查看,將會(huì)發(fā)現(xiàn)數(shù)據(jù)盤(pán)。

OK,希望能幫到各位。
1、需要先安裝gcc和tcl
yum install gcc
yum install tcl
2、下載并安裝redis
cd /opt
wget http://download.redis.io/releases/redis-3.0.0.tar.gz
tar -zxvf /opt/redis-3.0.0.tar.gz
cd /opt/redis-3.0.0
make
make test
make PREFIX=/opt/redis-3.0.0 install
注:PREFIX一定要大寫(xiě),裝好后,會(huì)生成/opt/redis-3.0.0/bin目錄,里面有啟動(dòng)命令之類(lèi)的文件。
3、啟動(dòng)與關(guān)閉
redis啟動(dòng)
/opt/redis-3.0.0/bin/redis-server /opt/redis-3.0.0/redis.conf
redis關(guān)閉
/opt/redis-3.0.0/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
客戶端啟動(dòng)
/opt/redis-3.0.0/bin/redis-cli
set name test
get name
4、參數(shù)修改
/opt/redis-3.0.0/redis.conf文件修改
#后臺(tái)運(yùn)行,可以ctrl+c不至于退出
daemonize yes
關(guān)于錯(cuò)誤提示
(1)編輯/etc/sysctl.conf ,最下面加一行vm.overcommit_memory=1,然后sysctl -p 使配置文件生效
(2)sysctl vm.overcommit_memory=1
注:如果使用了云服務(wù)器,要記得打開(kāi)6379端口,否則無(wú)法遠(yuǎn)程訪問(wèn)
1、svnadmin create /opt/svn/yiss/app/ios1、apache里的httpd.conf配置如下:
每個(gè)庫(kù)單獨(dú)
<Location /yiss/app/ios>#這個(gè)是ios項(xiàng)目url上的訪問(wèn)上下文,對(duì)應(yīng)http://IP/yiss/app/ios/
DAV svn
SVNPath /opt/svn/yiss/app/ios#這個(gè)是svn庫(kù)的絕對(duì)路徑
AuthType Basic#校驗(yàn)方式
AuthName "please input username/password"#提示信息
AuthUserFile /opt/svn/passwd#密碼文件絕對(duì)路徑
AuthzSVNAccessFile /opt/svn/authz#權(quán)限文件絕對(duì)路徑
Require valid-user
</Location>
<Location /yiss/app/android>#安卓項(xiàng)目訪問(wèn)上下文
DAV svn
SVNPath /opt/svn/yiss/app/android
AuthType Basic
AuthName "please input username/password"
AuthUserFile /opt/svn/passwd
AuthzSVNAccessFile /opt/svn/authz
Require valid-user
</Location>
<Location /yiss/web/buildscript>
DAV svn
SVNPath /opt/svn/yiss/web/buildscript
AuthType Basic
AuthName "please input username/password"
AuthUserFile /opt/svn/passwd
AuthzSVNAccessFile /opt/svn/authz
Require valid-user
</Location>
2、首先要?jiǎng)?chuàng)建/opt/svn/yiss/app目錄和/opt/svn/yiss/web
然后用命令創(chuàng)建svn庫(kù)
svnadmin create /opt/svn/yiss/app/ios
svnadmin create /opt/svn/yiss/app/android
svnadmin create /opt/svn/yiss/web/buildscript
3、創(chuàng)建apache用戶和密碼,會(huì)提示重復(fù)輸入2次確認(rèn)。想改密碼就多次輸入,以最后一次輸入的為準(zhǔn)。
htpasswd /opt/svn/passwd wxq
htpasswd /opt/svn/passwd caowei
......
4、配置權(quán)限組/opt/svn/authz
[groups]
admin=wxq
web=caowei,luocan,houlei,gengzhuo,huangwei,wuhaiying,leo
app=ssh,golden,shawn,leo
#admin組用戶可以訪問(wèn)所有目錄
[/]
@admin=rw
#ios,android,srv,doc,buildscript這些都是庫(kù)名,這里創(chuàng)建了3個(gè)庫(kù)
[ios:/]
@app=rw
[android:/]
@app=rw
[buildscript:/]
@admin=rw
5、給目錄及子目錄授權(quán),否則會(huì)報(bào)403forbidden無(wú)權(quán)限
chmod 777 /opt/svn -R
6、重啟svn,啟動(dòng)的時(shí)候要以根啟動(dòng),如果以某個(gè)svn庫(kù)啟動(dòng),則其他庫(kù)無(wú)法啟動(dòng)。
killall svnserve
svnserve -d -r /opt/svn/yiss
7、重啟apache
/opt/apache/bin/apachectl restart
8、瀏覽測(cè)試
http://115.231.94.x/yiss/app/ios/
http://115.231.94.x/yiss/app/android/
http://115.231.94.x/yiss/web/buildscript/
LoadModule auth_basic_module modules/mod_auth_basic.so #基本認(rèn)證模塊
LoadModule auth_digest_module modules/mod_auth_digest.so #使用MD5的用戶驗(yàn)證模塊
LoadModule authn_file_module modules/mod_authn_file.so #使用文本文件的用戶驗(yàn)證
LoadModule authn_alias_module modules/mod_authn_alias.so #在原有的驗(yàn)證方法上提供拓展的驗(yàn)證
LoadModule authn_anon_module modules/mod_authn_anon.so #允許匿名訪問(wèn)已驗(yàn)證的區(qū)域
LoadModule authn_dbm_module modules/mod_authn_dbm.so #使用數(shù)據(jù)庫(kù)文件驗(yàn)證
LoadModule authn_default_module modules/mod_authn_default.so #認(rèn)證的撤銷(xiāo)模塊
LoadModule authz_host_module modules/mod_authz_host.so #基于主機(jī)名(或IP)的組授權(quán)
LoadModule authz_user_module modules/mod_authz_user.so #用戶授權(quán)
LoadModule authz_owner_module modules/mod_authz_owner.so #依照文件擁有者的授權(quán)
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so #使用明文文件的組授權(quán)
LoadModule authz_dbm_module modules/mod_authz_dbm.so #使用數(shù)據(jù)庫(kù)的組授權(quán)
LoadModule authz_default_module modules/mod_authz_default.so #授權(quán)的撤銷(xiāo)模塊
LoadModule ldap_module modules/mod_ldap.so #LDAP提供其它LADP的連接接和緩存服務(wù)模塊
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so #允許使用一個(gè)LDAP的目錄來(lái)存放HTTP基本授權(quán)文件
LoadModule include_module modules/mod_include.so #服務(wù)器端解析HTML語(yǔ)法的模塊
LoadModule log_config_module modules/mod_log_config.so #記錄服務(wù)器請(qǐng)求日志
LoadModule logio_module modules/mod_logio.so #記錄每個(gè)請(qǐng)求的I/O字節(jié)數(shù)
LoadModule env_module modules/mod_env.so #設(shè)置傳遞給CGI腳本和SSI頁(yè)面的環(huán)境?
LoadModule ext_filter_module modules/mod_ext_filter.so #在遞交給客戶端以前通過(guò)外部程序發(fā)送相應(yīng)本體
LoadModule mime_magic_module modules/mod_mime_magic.so #通過(guò)查看一個(gè)文件的一些內(nèi)容判斷MIME類(lèi)別
LoadModule expires_module modules/mod_expires.so #根據(jù)用戶的特別設(shè)定來(lái)生成失效和隱藏控制的http頭信息
LoadModule deflate_module modules/mod_deflate.so #傳送給客戶端以前壓縮數(shù)據(jù)
LoadModule headers_module modules/mod_headers.so #定制響應(yīng)和回復(fù)的HTTP頭的內(nèi)容
LoadModule usertrack_module modules/mod_usertrack.so #在一個(gè)站點(diǎn)上跟蹤用戶的登錄信息
LoadModule setenvif_module modules/mod_setenvif.so #允許經(jīng)過(guò)客戶編碼請(qǐng)求來(lái)設(shè)定環(huán)境變量
LoadModule mime_module modules/mod_mime.so #通過(guò)文件的一些屬性判讀MIME類(lèi)型
LoadModule dav_module modules/mod_dav.so #基于WEB的創(chuàng)作和版本?
LoadModule status_module modules/mod_status.so #提供服務(wù)器運(yùn)行信息
LoadModule autoindex_module modules/mod_autoindex.so #自動(dòng)列出一個(gè)目錄的索引表(類(lèi)似于UNIX上的ls和DOS下的dir)
LoadModule info_module modules/mod_info.so #提供服務(wù)配置的一個(gè)綜合概況
LoadModule dav_fs_module modules/mod_dav_fs.so #為mod_dav提供文件系統(tǒng)支持
LoadModule vhost_alias_module modules/mod_vhost_alias.so #為虛擬主機(jī)提供動(dòng)態(tài)配置
LoadModule negotiation_module modules/mod_negotiation.so #為內(nèi)容判斷提供支持
LoadModule dir_module modules/mod_dir.so #為“/”結(jié)尾的重定向和目錄文件索引
LoadModule actions_module modules/mod_actions.so #提供了基于請(qǐng)求和媒體類(lèi)型的CGI腳本執(zhí)行的支持
LoadModule speling_module modules/mod_speling.so #嘗試糾正用戶輸入錯(cuò)誤的網(wǎng)址
LoadModule userdir_module modules/mod_userdir.so #用戶特定目錄
LoadModule alias_module modules/mod_alias.so #提供主機(jī)文件系統(tǒng)不同部分的文件樹(shù)映射為URL
LoadModule rewrite_module modules/mod_rewrite.so #提供在運(yùn)行中基于規(guī)則的地址重寫(xiě)的支持
LoadModule proxy_module modules/mod_proxy.so #基于HTTP1.1協(xié)議的網(wǎng)關(guān)或代理服務(wù)器
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #負(fù)載均衡的mod_proxy拓展
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so #為mod_proxy提供的ftp支持模塊
LoadModule proxy_http_module modules/mod_proxy_http.so #為mod_proxy提供的http支持模塊
LoadModule proxy_connect_module modules/mod_proxy_connect.so #mod_proxy的連接處理拓展模塊
LoadModule cache_module modules/mod_cache.so #目錄隱藏在URL外?
LoadModule suexec_module modules/mod_suexec.so #允許CGI腳本使用特定的用戶和組運(yùn)行
LoadModule disk_cache_module modules/mod_disk_cache.so #管理內(nèi)容隱藏存放來(lái)適合URL的工具?
LoadModule file_cache_module modules/mod_file_cache.so #在內(nèi)存中緩存一個(gè)文件列表
LoadModule mem_cache_module modules/mod_mem_cache.so #隱藏內(nèi)容于URL
LoadModule cgi_module modules/mod_cgi.so #執(zhí)行CGI腳本
1.安裝apr和apr-util
apr, apr-util: http://apr.apache.org/
tar zxvf apr-1.5.1.tar.gz
cd apr-1.5.1
./configure --prefix=/opt/apr
make && make install
tar zxvf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4
./configure --prefix=/opt/apr-util --with-apr=/opt/apr/
make && make install
2.安裝apache下載地址:http://www.apache.org/dist//httpd/httpd-2.2.27.tar.gz
cd /opt
tar -zxvf httpd-2.4.10.tar.gz
cd /opt/httpd-2.4.10
./configure --prefix=/opt/apache --with-apr=/opt/apr/ --with-apr-util=/opt/apr-util/ --with-pcre=/opt/pcre --enable-so --enable-dav --enable-dav-fs
make && make install
其中,–enable-dav允許Apache提供DAV協(xié)議支持;–enable-so允許運(yùn)行時(shí)加載DSO模塊,前兩個(gè)參數(shù)是必須要加的,–prefix 是安裝的位置。如果configure通過(guò),接著執(zhí)行
數(shù)分鐘后就完事了,通過(guò) /opt/apache/bin/apachectl start 來(lái)啟動(dòng),在瀏覽器中訪問(wèn)IP比如本機(jī)訪問(wèn)127.0.0.1,如果出現(xiàn) It’s Works!,那么說(shuō)明安裝成功。
目錄授權(quán)
chmod 777 /opt/svn
chown -R daemon:daemon /opt/svn
3.安裝sqlite,http://www.sqlite.org/download.html
這里下載的是sqlite-autoconf-3080701.tar.gz,我下載到了/root/install并解壓
tar zxvf sqlite-autoconf-3080701.tar.gz
cd /root/install/sqlite-autoconf-3080701
./configure --prefix=/opt/sqlite
make && make install
4安裝SVN
http://subversion.apache.org/download/下載最新版本,老版本在http://archive.apache.org/dist/subversion/
tar -zxvf subversion-1.8.10.tar.gz
cd /opt/subversion-1.8.10
./configure --prefix=/opt/subversion --with-apr=/opt/apr --with-apr-util=/opt/apr-util --with-apxs=/opt/apache/bin/apxs --with-openssl --with-zlib --enable-maintainer-mode --with-sqlite=/opt/sqlite
有可能需要安裝zlib1:
configure: error: subversion requires zlib
去http://zlib.net/下載,http://zlib.net/zlib-1.2.8.tar.gz,上傳到/opt
cd /opt
tar zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure
make && make install
5.修改Apache配置,httpd.conf最下面追加,直接在根目錄下建密碼
cd /opt/apache/conf下載httpd.conf
這幾個(gè)是必須的模塊,出了問(wèn)題檢查一下有沒(méi)有加載
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule dav_module modules/mod_dav.so
#下面2個(gè)需要從該目錄拷貝過(guò)來(lái),并且引入,如果不引入無(wú)法和svn協(xié)同。
cp /opt/subversion/libexec/mod_authz_svn.so /opt/apache/modules
cp /opt/subversion/libexec/mod_dav_svn.so /opt/apache/modules
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
這個(gè)加到最下面用來(lái)和svn協(xié)同
<Location /svn>
DAV svn
SVNListParentPath on //很重要
SVNParentPath /opt/svn
AuthType Basic
AuthName "please input username/password"
AuthUserFile /opt/svn/passwd
AuthzSVNAccessFile /opt/svn/authz
Require valid-user
</Location>
6.svn倉(cāng)庫(kù)的創(chuàng)建和權(quán)限配置
mkdir -p /opt/svn/
創(chuàng)建apache賬戶,使通過(guò)apache訪問(wèn)url的時(shí)候可以瀏覽該目錄
新建一個(gè)文件需要-c,以后就不需要加了,passwd文件一定要用命令,明碼是不行的
htpasswd -c /opt/svn/passwd wxq
htpasswd /opt/svn/passwd caowei
另外需要建一個(gè)群組權(quán)限文件到/opt/svn/authz, @代表群組,這里聲明了一個(gè)admin組,admin組有讀寫(xiě)權(quán)限
[groups]
admin=wxq
[/]
@admin=rw
[home:/]
@admin=rw
創(chuàng)建子倉(cāng)庫(kù)
svnadmin create /opt/svn/home
7.啟動(dòng)/重啟/關(guān)閉apache
/opt/apache/bin/apachectl start
/opt/apache/bin/apachectl restart
/opt/apache/bin/apachectl stop
8.檢測(cè)SVN 端口
[root@localhost conf]#netstat -ln |grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN
停止重啟SVN
killall svnserve
svnserve -d -r /opt/svn
如果已經(jīng)有svn在運(yùn)行,可以換一個(gè)端口運(yùn)行
svnserve -d -r /opt/svn/ --listen-port 3391
查看版本
svnserve --version
查看是否安裝了svn
rpm -q subversion
查看是否安裝了httpd,可以使用httpd --version檢測(cè)是否已經(jīng)卸載
rpm -q httpd
maven是個(gè)項(xiàng)目管理工具,集各種功能于一身,下面介紹maven web項(xiàng)目在eclipse種的配置,并于tomcat集成。配置成功后,可以跟一般的web項(xiàng)目一樣調(diào)試。
一、準(zhǔn)備條件
1、安裝下載jdk
這里以jdk1.6為例
2、安裝eclipse
到eclipse官網(wǎng)下載 Eclipse IDE for Java EE Developers版本的eclipse
http://www.eclipse.org/
3、安裝tomcat6
4、安裝maven
5、安裝eclipse maven插件
這里以在線安裝的方式,安裝地址為:http://m2eclipse.sonatype.org/sites/m2e
二、配置
1、在eclipse中配置jdk安裝位置,tomcat安裝位置,maven安裝位置,為tomcat指定jdk
在此不詳述
2、在eclipse中新建一個(gè)maven項(xiàng)目
2-1、新建一個(gè)maven項(xiàng)目,選擇create a simple project ...

2-2、
點(diǎn)擊Next,進(jìn)入下一個(gè)

在此窗口下填寫(xiě)group id,artifact id,可以隨便寫(xiě)一個(gè),在Packaging中選擇war類(lèi)型
點(diǎn)擊下一步,在以下步驟中一直next,直到最后點(diǎn)擊finish
2-3、
右擊項(xiàng)目,選擇properites,打開(kāi)以下對(duì)話框

在此界面右邊導(dǎo)航欄選中 Project Facets,點(diǎn)擊超鏈接Convert Faceted from,進(jìn)入以下界面
2-4、

在Configuration中選擇custom
在下方的Project Facet的Dynamic Web Module中選擇2.5版本
在java中選擇1.6
注意:這些選擇可能根據(jù)tomcat版本變化而變化,就tomcat6來(lái)說(shuō)選擇以上選項(xiàng)是可以的
此步驟非常重要,只有操作了此步驟,右側(cè)導(dǎo)航欄才會(huì)有Deployment Assembly 鏈接
2-5
接下來(lái)點(diǎn)擊右邊面板的Runtime面板

可以看到下方中有tomcat,如果沒(méi)有,則點(diǎn)擊下面的new,新建一個(gè),新建后選中復(fù)選框,然后apply,ok
2-6、
在項(xiàng)目屬性面板中的作部導(dǎo)航欄選擇Deployment Assembly選項(xiàng),在右邊Web Deployment Assembly
如果看到以下的圖示,那么配置就完成了

這里解釋一下以上文件夾
src/main/java
該文件夾是存放java源碼的,發(fā)布項(xiàng)目時(shí)會(huì)將該文件夾下的class文件復(fù)制到WEB-INF/classes目錄下
src/main/resources
該文件夾一般放置配置文件,如xml,properties文件等,其實(shí)也可以放置java文件,只是一種約定罷了,發(fā)布項(xiàng)目時(shí)
該文件夾的文件也會(huì)復(fù)制到WEB-INF/class中
至于test,有些類(lèi)似,只不過(guò)這些是測(cè)試代碼,用過(guò)maven的應(yīng)該會(huì)知道這一點(diǎn)
src/main/webapp
maven中約定是把該文件夾當(dāng)成是普通web項(xiàng)目中的WebRoot目錄,看看右邊的deploy path,發(fā)布項(xiàng)目時(shí)
是發(fā)布到根目錄/了。該文件夾在建成的maven web項(xiàng)目中,在其內(nèi)尚沒(méi)有WEB-INF/classes,WEB-INF/lib文件夾
需要手工建立
注意:有時(shí)候由于某種原因,你打開(kāi)的以上視圖可能是下面這樣的,

其實(shí),這樣也是可以運(yùn)行項(xiàng)目,調(diào)試項(xiàng)目的,但是,如果你運(yùn)行該項(xiàng)目的pom.xml文件時(shí)就會(huì)報(bào)錯(cuò),為什么呢,
因?yàn)閙aven會(huì)把src/main/webapp文件當(dāng)成是普通web項(xiàng)目中的WebRoot,而該你的配置里面(上圖)卻
沒(méi)有配置,故而會(huì)報(bào)錯(cuò)。
怎么辦呢,分2步
1、選中 WebContent,remove掉它
2、新建一個(gè),Source文件夾為src/main/webapp,deploy path為 /
點(diǎn)擊apply,ok即可。
最后還必須將maven庫(kù)映射到WEB-INF/lib下,具體操作如下,點(diǎn)擊add按鈕,進(jìn)入下圖

選擇java build path entries,點(diǎn)擊next,進(jìn)入下圖

選擇Maven Dependencies,點(diǎn)擊finish,最終如下圖

如果不把Maven Dependencies映射到WEB-INF/lib,則在服務(wù)端如servlet中用到maven中的庫(kù)時(shí),則會(huì)提示找不到類(lèi)(雖然你在編寫(xiě)代碼時(shí)沒(méi)有紅xx,但是運(yùn)行程序時(shí)卻會(huì)找不到類(lèi))
三、運(yùn)行
在eclipse的server視圖中添加你的項(xiàng)目,右鍵選擇的tomcat服務(wù)器,選擇add and remove,添加剛才新建的web工程,效果如下圖

在src/main/java中建立一個(gè)servlet,在src/main/webapp中建立一個(gè)jsp
啟動(dòng)tomcat,訪問(wèn)你的servlet和jsp,在servlet中你可以定斷點(diǎn),可以調(diào)試。
http://zk1878.iteye.com/blog/1222330
在linux下怎么安裝.bin的文件。
或者 第一步: sh ./j2sdk-1_4_2-nb-3_5_1-bin-linux.bin 回答YES 第二步: rpm **** |
如何查看是否開(kāi)啟慢查:可看到慢查的設(shè)定時(shí)間,最下幾行
SHOW VARIABLES LIKE '%_query_%';
重新生成慢查詢?nèi)罩疚募挥弥貑?/div>
mysqladmin -u root -p flush-logs(網(wǎng)上都說(shuō)這種,其實(shí)不行)
正確的做法:
1、分析慢查日志輸出到digest.log
/usr/local/bin/percona-toolkit-2.2.11/bin/pt-query-digest /data/mysql-slow.log >/data/mysql-digest/digest$(date +%Y-%m-%d-%H:%M).log
2、直接刪除mysql-slow.log
rm -fr /data/mysql-slow.log
3、備份并重新生成日志文件:
touch /data/mysql-slow.log
chmod 777 /data/mysql-slow.log
4、重新開(kāi)啟日志記錄:
SET GLOBAL slow_query_log = ON;
5、等待就行了,經(jīng)試驗(yàn)有效
常用工具集:
1、服務(wù)器摘要
2、服務(wù)器磁盤(pán)監(jiān)測(cè)
3、mysql服務(wù)狀態(tài)摘要
- pt-mysql-summary -- --user=root --password=root
4、慢查詢?nèi)罩痉治鼋y(tǒng)計(jì)
- pt-query-digest /data/logs/mysql/mysql-slow.log
5、表同步工具,和mk-tables-sync功能一樣, 用法上 稍有不一樣 ,--print的結(jié)果更詳細(xì)
- pt-table-sync --execute --print --no-check-slave --database=world h='127.0.0.1' --user=root --password=123456 h='192.168.0.212' --user=root --password=123456
6、主從狀態(tài)監(jiān)測(cè),提供給它一臺(tái)mysql服務(wù)器的IP用戶名密碼,就可以分析出整個(gè)主從架構(gòu)中每臺(tái)服務(wù)器的信息,包括但不限于mysql版本,IP地址,server ID,mysql服務(wù)的啟動(dòng)時(shí)間,角色(主/從),Slave Status(落后于主服務(wù)器多少秒,有沒(méi)有錯(cuò)誤,slave有沒(méi)有在運(yùn)行)。
- [root@RHCE6 ~]# pt-slave-find --host=localhost --user=rhce6 --password=rhce6
- localhost
- Version 5.5.23-log
- Server ID 1
- Uptime 05:16:10 (started 2012-08-08T09:32:03)
- Replication Is not a slave, has 1 slaves connected, is not read_only
- Filters
- Binary logging STATEMENT
- Slave status
- Slave mode STRICT
- Auto-increment increment 1, offset 1
- InnoDB version 1.1.8
- +- 192.168.0.168
- Version 5.5.23-log
- Server ID 10
- Uptime 38:19 (started 2012-08-08T14:09:54)
- Replication Is a slave, has 0 slaves connected, is not read_only
- Filters
- Binary logging STATEMENT
- Slave status 0 seconds behind, running, no errors
- Slave mode STRICT
- Auto-increment increment 1, offset 1
- InnoDB version 1.1.8
7、mysql死鎖監(jiān)測(cè)
- pt-deadlock-logger h='127.0.0.1' --user=root --password=123456
8.主鍵沖突檢查
- pt-duplicate-key-checker --database=world h='127.0.0.1' --user=root --password=123456
9.監(jiān)測(cè)從庫(kù)的復(fù)制延遲 ###經(jīng)過(guò)測(cè)試 運(yùn)行這個(gè)命令會(huì)使從庫(kù)上的sql線程異常掛掉
- pt-slave-delay --host 192.168.0.206 --user=root --password=123456
更多介紹參考http://www.zhaokunyao.com/archives/3245,命令的使用可以通過(guò)--help獲知
percona-toolkit簡(jiǎn)介
percona-toolkit是一組高級(jí)命令行工具的集合,用來(lái)執(zhí)行各種通過(guò)手工執(zhí)行非常復(fù)雜和麻煩的mysql和系統(tǒng)任務(wù),這些任務(wù)包括:
l 檢查master和slave數(shù)據(jù)的一致性
l 有效地對(duì)記錄進(jìn)行歸檔
l 查找重復(fù)的索引
l 對(duì)服務(wù)器信息進(jìn)行匯總
l 分析來(lái)自日志和tcpdump的查詢
l 當(dāng)系統(tǒng)出問(wèn)題的時(shí)候收集重要的系統(tǒng)信息
percona-toolkit源自Maatkit 和Aspersa工具,這兩個(gè)工具是管理mysql的最有名的工具,現(xiàn)在Maatkit工具已經(jīng)不維護(hù)了,請(qǐng)大家還是使用percona-toolkit吧!這些工具主要包括開(kāi)發(fā)、性能、配置、監(jiān)控、復(fù)制、系統(tǒng)、實(shí)用六大類(lèi),作為一個(gè)優(yōu)秀的DBA,里面有的工具非常有用,如果能掌握并加以靈活應(yīng)用,將能極大的提高工作效率。
二、percona-toolkit工具包安裝
0.準(zhǔn)備工作,先安裝:
yum install -y perl-CPAN perl-Time-HiRes
1. 軟件包下載
訪問(wèn)http://www.percona.com/downloads/percona-toolkit/下載最新版本的Percona Toolkit 或者通過(guò)如下命令行來(lái)獲取最新的版本:
wget percona.com/get/percona-toolkit.tar.gz
wget percona.com/get/percona-toolkit.rpm
我這里選擇直接從網(wǎng)站上找到最新版本下載:
cd /usr/local/bin
wget http://www.percona.com/downloads/percona-toolkit/2.2.11/percona-toolkit-2.2.11.tar.gz
2. 軟件包安裝
percona-toolkit的編譯安裝方式
/usr/local/bin
tar xzvf percona-toolkit-2.2.11.tar.gz
cd percona-toolkit-2.2.11
perl Makefile.PL
make
make test
make install
主站蜘蛛池模板:
亚洲av激情无码专区在线播放|
日韩精品无码免费一区二区三区|
免费A级毛片在线播放不收费|
亚洲精品宾馆在线精品酒店|
国内免费高清在线观看|
亚洲中文字幕在线无码一区二区|
91青青青国产在观免费影视|
亚洲视频在线播放|
免费无遮挡无码永久视频|
亚洲国产精品国自产电影|
久久一区二区三区免费播放|
亚洲另类激情综合偷自拍|
性无码免费一区二区三区在线
|
色多多A级毛片免费看|
人人狠狠综合久久亚洲高清|
男女污污污超污视频免费在线看|
亚洲精品国自产拍在线观看|
yellow视频免费看|
亚洲精品国精品久久99热一|
国产免费一区二区三区不卡|
亚洲国产人成网站在线电影动漫
|
24小时日本在线www免费的|
亚洲日本va一区二区三区|
日本不卡在线观看免费v|
阿v免费在线观看|
亚洲综合色在线观看亚洲|
在线观看免费视频一区|
久久久久亚洲av无码专区蜜芽|
13一14周岁毛片免费|
亚洲国产成人99精品激情在线|
青青青青青青久久久免费观看|
天天综合亚洲色在线精品|
亚洲AV无码乱码在线观看|
2022国内精品免费福利视频|
亚洲国产综合无码一区|
97青青草原国产免费观看|
亚洲香蕉久久一区二区|
免费观看国产精品|
a在线免费观看视频|
亚洲精品在线电影|
免费无码又爽又高潮视频|