真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

sqlserver分片,mysql分片sql

SQL Update

把in里的數(shù)據(jù)分段處理。

站在用戶的角度思考問題,與客戶深入溝通,找到東源網(wǎng)站設計與東源網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋東源地區(qū)。

或者新建個表,把in里的數(shù)據(jù)批量插入進去再update ... where id in (select id from ...) ,批量插入這個操作的速度應該是有優(yōu)化辦法的,postgresql中有copy命令,其他的不太清楚了。

速度方面我想不到非常好的辦法

求大神指導各種不同格式的數(shù)據(jù)如何整理導入同一個報表?

這種情況最好使用專業(yè)報表軟件來處理。

推薦FineReport報表軟件。這是一種類Excel的報表工具,神似于Excel主界面的設計器、多sheet界面、完美導入Excel數(shù)據(jù)源、可輸出Excel等多種格式,而且支持多源分片,使雜亂無章的數(shù)據(jù)井然有序。

FineReport是純java報表軟件,天然支持多數(shù)據(jù)源(集),同一張報表的數(shù)據(jù)可同時來自多個數(shù)據(jù)表,多個不同的數(shù)據(jù)庫,或者多個不同的用戶自定義數(shù)據(jù)視圖,然后在報表中可直接相互運算形成最終的報表。

FineReport連接數(shù)據(jù)源的方式多種多樣,支持通過JDBC的方式直接連接數(shù)據(jù)庫,或通過JNDI的方式與應用服務器共享數(shù)據(jù)連接。支持的數(shù)據(jù)庫類型如Oracle、 DB2、SQLServer、MySQL等主流的數(shù)據(jù)庫,除此之外,自定義的程序數(shù)據(jù)源,文本數(shù)據(jù)源,Excel數(shù)據(jù)源,XML數(shù)據(jù)源等等都可以直接作為報表的數(shù)據(jù)源來進行設計工作,同時數(shù)據(jù)源還具有無限的擴展性,可以支持WebService, SOA等標準的數(shù)據(jù)。因此它可以完美解決你的問題。

如何利用索引提高SQLServer數(shù)據(jù)處理的效率

在良好的數(shù)據(jù)庫設計基礎上,能有效地使用索引是SQL Server取得高性能的基礎,SQL Server采用基于代價的優(yōu)化模型,它對每一個提交的有關(guān)表的查詢,決定是否使用索引或用哪一個索引。因為查詢執(zhí)行的大部分開銷是磁盤I/O,使用索引提高性能的一個主要目標是避免全表掃描,因為全表掃描需要從磁盤上讀表的每一個數(shù)據(jù)頁,如果有索引指向數(shù)據(jù)值,則查詢只需讀幾次磁盤就可以了。

所以如果建立了合理的索引,優(yōu)化器就能利用索引加速數(shù)據(jù)的查詢過程。但是,索引并不總是提高系統(tǒng)的性能,在增、刪、改操作中索引的存在會增加一定的工作量,因此,在適當?shù)牡胤皆黾舆m當?shù)乃饕牟缓侠淼牡胤絼h除次優(yōu)的索引,將有助于優(yōu)化那些性能較差的SQL Server應用。實踐表明,合理的索引設計是建立在對各種查詢的分析和預測上的,只有正確地使索引與程序結(jié)合起來,才能產(chǎn)生最佳的優(yōu)化方案。本文就SQL Server索引的性能問題進行了一些分析和實踐。

一、聚簇索引(clustered indexes)的使用

聚簇索引是一種對磁盤上實際數(shù)據(jù)重新組織以按指定的一個或多個列的值排序。由于聚簇索引的索引頁面指針指向數(shù)據(jù)頁面,所以使用聚簇索引查找數(shù)據(jù)幾乎總是比使用非聚簇索引快。每張表只能建一個聚簇索引,并且建聚簇索引需要至少相當該表120%的附加空間,以存放該表的副本和索引中間頁。建立聚簇索引的思想是:

1、大多數(shù)表都應該有聚簇索引或使用分區(qū)來降低對表尾頁的競爭,在一個高事務的環(huán)境中,對最后一頁的封鎖嚴重影響系統(tǒng)的吞吐量。

2、在聚簇索引下,數(shù)據(jù)在物理上按順序排在數(shù)據(jù)頁上,重復值也排在一起,因而在那些包含范圍檢查(between、、=、、=)或使用group by或order by的查詢時,一旦找到具有范圍中第一個鍵值的行,具有后續(xù)索引值的行保證物理上毗連在一起而不必進一步搜索,避免了大范圍掃描,可以大大提高查詢速度。

3、在一個頻繁發(fā)生插入操作的表上建立聚簇索引時,不要建在具有單調(diào)上升值的列(如IDENTITY)上,否則會經(jīng)常引起封鎖沖突。

4、在聚簇索引中不要包含經(jīng)常修改的列,因為碼值修改后,數(shù)據(jù)行必須移動到新的位置。

5、選擇聚簇索引應基于where子句和連接操作的類型。

聚簇索引的侯選列是:

1、主鍵列,該列在where子句中使用并且插入是隨機的。

2、按范圍存取的列,如pri_order 100 and pri_order 200。

3、在group by或order by中使用的列。

4、不經(jīng)常修改的列。

5、在連接操作中使用的列。

二、非聚簇索引(nonclustered indexes)的使用

SQL Server缺省情況下建立的索引是非聚簇索引,由于非聚簇索引不重新組織表中的數(shù)據(jù),而是對每一行存儲索引列值并用一個指針指向數(shù)據(jù)所在的頁面。換句話說非聚簇索引具有在索引結(jié)構(gòu)和數(shù)據(jù)本身之間的一個額外級。一個表如果沒有聚簇索引時,可有250個非聚簇索引。每個非聚簇索引提供訪問數(shù)據(jù)的不同排序順序。在建立非聚簇索引時,要權(quán)衡索引對查詢速度的加快與降低修改速度之間的利弊。另外,還要考慮這些問題:

1、索引需要使用多少空間。

2、合適的列是否穩(wěn)定。

3、索引鍵是如何選擇的,掃描效果是否更佳。

4、是否有許多重復值。

對更新頻繁的表來說,表上的非聚簇索引比聚簇索引和根本沒有索引需要更多的額外開銷。對移到新頁的每一行而言,指向該數(shù)據(jù)的每個非聚簇索引的頁級行也必須更新,有時可能還需要索引頁的分理。從一個頁面刪除數(shù)據(jù)的進程也會有類似的開銷,另外,刪除進程還必須把數(shù)據(jù)移到頁面上部,以保證數(shù)據(jù)的連續(xù)性。所以,建立非聚簇索引要非常慎重。非聚簇索引常被用在以下情況:

1、某列常用于集合函數(shù)(如Sum,....)。

2、某列常用于join,order by,group by。

3、查尋出的數(shù)據(jù)不超過表中數(shù)據(jù)量的20%。

三、覆蓋索引(covering indexes)的使用

覆蓋索引是指那些索引項中包含查尋所需要的全部信息的非聚簇索引,這種索引之所以比較快也正是因為索引頁中包含了查尋所必須的數(shù)據(jù),不需去訪問數(shù)據(jù)頁。如果非聚簇索引中包含結(jié)果數(shù)據(jù),那么它的查詢速度將快于聚簇索引。

但是由于覆蓋索引的索引項比較多,要占用比較大的空間。而且update操作會引起索引值改變。所以如果潛在的覆蓋查詢并不常用或不太關(guān)鍵,則覆蓋索引的增加反而會降低性能。

四、索引的選擇技術(shù)

p_detail是住房公積金管理系統(tǒng)中記錄個人明細的表,有890000行,觀察在不同索引下的查詢運行效果,測試在C/S環(huán)境下進行,客戶機是IBM PII350(內(nèi)存64M),服務器是DEC Alpha1000A(內(nèi)存128M),數(shù)據(jù)庫為SYBASE11.0.3。

1、 select count(*) from p_detail where

op_date’19990101’ and op_date’

19991231’ and pri_surplus1300

2、 select count(*),sum(pri_surplus1) from p_detail

where op_date’19990101’ and

pay_month between‘199908’ and’199912’

不建任何索引查詢1 1分15秒

查詢2 1分7秒

在op_date上建非聚簇索引查詢1 57秒

查詢2 57秒

在op_date上建聚簇索引查詢1 1秒

查詢2 52秒

在pay_month、op_date、pri_surplus1上建索引查詢1 34秒

查詢2 1秒

在op_date、pay_month、pri_surplus1上建索引查詢1 1秒

查詢2 1秒

從以上查詢效果分析,索引的有無,建立方式的不同將會導致不同的查詢效果,選擇什么樣的索引基于用戶對數(shù)據(jù)的查詢條件,這些條件體現(xiàn)于where從句和join表達式中。一般來說建立索引的思路是:

(1)主鍵時常作為where子句的條件,應在表的主鍵列上建立聚簇索引,尤其當經(jīng)常用它作為連接的時候。

(2)有大量重復值且經(jīng)常有范圍查詢和排序、分組發(fā)生的列,或者非常頻繁地被訪問的列,可考慮建立聚簇索引。

(3)經(jīng)常同時存取多列,且每列都含有重復值可考慮建立復合索引來覆蓋一個或一組查詢,并把查詢引用最頻繁的列作為前導列,如果可能盡量使關(guān)鍵查詢形成覆蓋查詢。

(4)如果知道索引鍵的所有值都是唯一的,那么確保把索引定義成唯一索引。

(5)在一個經(jīng)常做插入操作的表上建索引時,使用fillfactor(填充因子)來減少頁分裂,同時提高并發(fā)度降低死鎖的發(fā)生。如果在只讀表上建索引,則可以把fillfactor置為100。

(6)在選擇索引鍵時,設法選擇那些采用小數(shù)據(jù)類型的列作為鍵以使每個索引頁能夠容納盡可能多的索引鍵和指針,通過這種方式,可使一個查詢必須遍歷的索引頁面降到最小。此外,盡可能地使用整數(shù)為鍵值,因為它能夠提供比任何數(shù)據(jù)類型都快的訪問速度。

五、索引的維護

上面講到,某些不合適的索引影響到SQL Server的性能,隨著應用系統(tǒng)的運行,數(shù)據(jù)不斷地發(fā)生變化,當數(shù)據(jù)變化達到某一個程度時將會影響到索引的使用。這時需要用戶自己來維護索引。索引的維護包括:

1、重建索引

隨著數(shù)據(jù)行的插入、刪除和數(shù)據(jù)頁的分裂,有些索引頁可能只包含幾頁數(shù)據(jù),另外應用在執(zhí)行大塊I/O的時候,重建非聚簇索引可以降低分片,維護大塊I/O的效率。重建索引實際上是重新組織B-樹空間。在下面情況下需要重建索引:

(1)數(shù)據(jù)和使用模式大幅度變化。

(2)排序的順序發(fā)生改變。

(3)要進行大量插入操作或已經(jīng)完成。

(4)使用大塊I/O的查詢的磁盤讀次數(shù)比預料的要多。

(5)由于大量數(shù)據(jù)修改,使得數(shù)據(jù)頁和索引頁沒有充分使用而導致空間的使用超出估算。

(6)dbcc檢查出索引有問題。

當重建聚簇索引時,這張表的所有非聚簇索引將被重建。

2、索引統(tǒng)計信息的更新

當在一個包含數(shù)據(jù)的表上創(chuàng)建索引的時候,SQL Server會創(chuàng)建分布數(shù)據(jù)頁來存放有關(guān)索引的兩種統(tǒng)計信息:分布表和密度表。優(yōu)化器利用這個頁來判斷該索引對某個特定查詢是否有用。但這個統(tǒng)計信息并不動態(tài)地重新計算。這意味著,當表的數(shù)據(jù)改變之后,統(tǒng)計信息有可能是過時的,從而影響優(yōu)化器追求最有工作的目標。因此,在下面情況下應該運行update statistics命令:

(1)數(shù)據(jù)行的插入和刪除修改了數(shù)據(jù)的分布。

(2)對用truncate table刪除數(shù)據(jù)的表上增加數(shù)據(jù)行。

(3)修改索引列的值。

六、結(jié)束語

實踐表明,不恰當?shù)乃饕坏谑聼o補,反而會降低系統(tǒng)的執(zhí)行性能。因為大量的索引在插入、修改和刪除操作時比沒有索引花費更多的系統(tǒng)時間。例如下面情況下建立的索引是不恰當?shù)模?/p>

1、在查詢中很少或從不引用的列不會受益于索引,因為索引很少或從來不必搜索基于這些列的行。

2、只有兩個或三個值的列,如男性和女性(是或否),從不會從索引中得到好處。

另外,鑒于索引加快了查詢速度,但減慢了數(shù)據(jù)更新速度的特點??赏ㄟ^在一個段上建表,而在另一個段上建其非聚簇索引,而這兩段分別在單獨的物理設備上來改善操作性能。

想要系統(tǒng)學習java到底要學習哪些知識

一、java基礎

學習任何一門編程語言,首先要學習的是基礎語法,開啟Java學習的第一步,當然就是深入掌握計算機基礎、編程基礎語法,面向?qū)ο螅?、IO流、線程、并發(fā)、異常及網(wǎng)絡編程,這些我們稱之為JavaSE基礎。當你掌握了這些內(nèi)容之后,你就可以做出諸如:電腦上安裝的迅雷下載軟件、QQ聊天客戶端、考勤管理系統(tǒng)等桌面端軟件。

JavaSE基礎是Java中級程序員的起點,是幫助你從小白到懂得編程的必經(jīng)之路。

在Java基礎板塊中有6個子模塊的學習:

基礎語法,可幫助你建立基本的編程邏輯思維;

面向?qū)ο?,以對象方式去編寫?yōu)美的Java程序;

集合,后期開發(fā)中存儲數(shù)據(jù)必備技術(shù);

IO,對磁盤文件進行讀取和寫入基礎操作;

多線程與并發(fā),提高程序效率;

異常,編寫代碼邏輯更加健全;

網(wǎng)絡編程,應用服務器學習基礎,完成數(shù)據(jù)的遠程傳輸。

學習該階段,可以完成一些簡單的管理系統(tǒng)、坦克大戰(zhàn)游戲、QQ通信等。

技術(shù)樹

二、數(shù)據(jù)庫

互聯(lián)網(wǎng)最具價值的是數(shù)據(jù),任何編程語言都需要解決數(shù)據(jù)存儲問題,而數(shù)據(jù)存儲的關(guān)鍵技術(shù)是數(shù)據(jù)庫。MySQL和Oracle都是廣受企業(yè)歡迎的數(shù)據(jù)庫管理系統(tǒng)。Java程序和數(shù)據(jù)庫通信的最常見技術(shù)是JDBC,Druid和C3P0。學習這些數(shù)據(jù)庫技術(shù)后,可以掌握數(shù)據(jù)庫運維技術(shù)、復雜業(yè)務表結(jié)構(gòu)設計規(guī)范、工作中常見的SQL操作、軟件數(shù)據(jù)存儲等。

數(shù)據(jù)庫不僅僅是Java開發(fā)工程師的必學課程,也是其他語言都需要掌握的技能。用于對交互過程中客戶的數(shù)據(jù)進行存儲。

該板塊包括關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫。

例如:MySQL、oracle、redis、MongoDB等。數(shù)據(jù)庫學習完畢后,可以將數(shù)據(jù)存儲到數(shù)據(jù)庫中,也可以通過SQL語句從數(shù)據(jù)庫中查詢數(shù)據(jù),結(jié)合Java項目可以實現(xiàn)動態(tài)站點的數(shù)據(jù)的保存。

技術(shù)樹

三、前端技術(shù)

瀏覽器展示給用戶看到的網(wǎng)頁就是前端,前端有三大基礎技術(shù)分別為Html、CSS、JavaScript,這些學完后,為了做出更好、更炫的交互式體驗效果,我們還需要學習jQuery、ElementUI、Vue、Ajax,以及打包工具webpack。學完這些技術(shù)后,我們可以開發(fā)微信小程序、響應式網(wǎng)站、移動端網(wǎng)站、開發(fā)類似京東一樣的B2B2C商城、管理后臺等。

Javaweb階段包括前端、數(shù)據(jù)庫和動態(tài)網(wǎng)頁。Javaweb是互聯(lián)網(wǎng)項目的入門課程,是學習后面高進階課程的基礎。

首先,我們先看一下前端板塊。該板塊主要包括如下幾個模塊:

HTML5,網(wǎng)頁制作標記語言;

CSS,對HTML制作網(wǎng)頁進行美化;

JavaScript,嵌入在頁面中的腳本語言,具備邏輯性;

Vue,前端框架,簡化了與服務器端交互的操作,用戶良好的交互體驗是必不可少的。

學習前端技術(shù)后,可以完成類似京東、淘寶的前端工程的編寫。

技術(shù)樹

四、動態(tài)網(wǎng)頁

掌握前端技術(shù)只能做靜態(tài)網(wǎng)站,但它頁面數(shù)據(jù)一成不變,而動態(tài)網(wǎng)站可以根據(jù)數(shù)據(jù)庫中變更的數(shù)據(jù)實現(xiàn)不同的內(nèi)容展示,應用更廣泛,因此程序員必須要學會做動態(tài)網(wǎng)站。使用Java做動態(tài)網(wǎng)站,我們需要學習Servlet、Filter、Session、Cookie、JSP、EL表達式、JSTL等做動態(tài)網(wǎng)站的完整知識體系,學完可研發(fā)出OA系統(tǒng)、內(nèi)容網(wǎng)站、BBS等。

動態(tài)網(wǎng)頁是中級程序員服務器端編程的基礎,是高級框架學習的必備課程,后期學習的框架、服務底層都是基于動態(tài)網(wǎng)頁技術(shù)之上的。

該板塊包括Javaweb核心技術(shù)、包括Servlet、Request、Response、Cookie和Session等,通過這些技術(shù)的學習可以完成動態(tài)站點開發(fā),可更好的完成服務器端與客戶的交互,讓頁面的數(shù)據(jù)“動”起來,做出小型的應用系統(tǒng)。

技術(shù)樹

五、編程強化

前面學了JavaSE基礎,但它在企業(yè)級應用中程序處理業(yè)務的效率并不高、擴展差,編程強化是對JavaSE基礎的加強,將針對性的提高程序處理業(yè)務的執(zhí)行效率、增強程序擴展性。編程強化將加強多線程高級學習,涉及線程內(nèi)存、線程通信等技術(shù)。學完以后,能增加一個中級程序員的知識儲備,無論在面試過程中還是將來技術(shù)的深入打一個良好的基礎。

編程強化是對解決實際問題方面做一個深入的了解和應用,是對JavaSE基礎的加強,對后期自動以框架和對一些服務框架的底層理解做支撐。

編程強化板塊主要包括如下幾個模塊:多線程高級、涉及線程內(nèi)存、線程通信等;JVM優(yōu)化,對JVM底層進行調(diào)優(yōu)來提高項目執(zhí)行效率;NIO,同步非阻塞IO來提高效率。

學習該階段,可以對原有項目進行優(yōu)化從而使程序更快更穩(wěn)定。

技術(shù)樹

六、軟件項目管理

公司開發(fā)都是團隊協(xié)同開發(fā),為更好的掌握實際開發(fā),我們還需要學習常用的項目管理平臺、版本控制器、項目構(gòu)建工具以及自動化部署工具。項目開發(fā)一定是有版本升級的,管理好項目進度和版本需要Git、Maven、Sonar這樣的系統(tǒng)平臺。學習完軟件項目管理后,將掌握整個項目實際開發(fā)過程以及整個項目開發(fā)過程中所使用協(xié)同開發(fā)工具。

JavaSE基礎是Java中級程序員的起點,是幫助你從小白到懂得編程的必經(jīng)之路。

在Java基礎板塊中有6個子模塊的學習:基礎語法,可幫助你建立基本的編程邏輯思維;面向?qū)ο螅詫ο蠓绞饺ゾ帉憙?yōu)美的Java程序;集合,后期開發(fā)中存儲數(shù)據(jù)必備技術(shù);IO,對磁盤文件進行讀取和寫入基礎操作;多線程與并發(fā),提高程序效率;異常,編寫代碼邏輯更加健全;網(wǎng)絡編程,應用服務器學習基礎,完成數(shù)據(jù)的遠程傳輸。

學習該階段,可以完成一些簡單的管理系統(tǒng)、坦克大戰(zhàn)游戲、QQ通信等。

技術(shù)樹

七、熱門技術(shù)框架

Javaweb掌握后,已經(jīng)具備企業(yè)中實際項目的開發(fā)能力了,但它開發(fā)效率低,代碼量大,開發(fā)周期長、開發(fā)成本高。企業(yè)中廣泛使用一些優(yōu)秀的框架技術(shù)來解決上述問題,因此我們還需要學習框架技術(shù),項目開發(fā)中主流的Java框架技術(shù)有SpringMVC、Spring、MyBatis、MyBatis Plus、SpringData等。這些框架技術(shù)都是一個優(yōu)秀程序員所必備的技能。

使用Javaweb進行企業(yè)級開發(fā)是完全可以的,但是開發(fā)效率比較低,所以對常用的邏輯操作進行封裝就形成了框架,因此框架是企業(yè)開發(fā)的入門技能。

熱門框架板塊主流框架有如下幾個:Spring框架,占據(jù)統(tǒng)治地位,其生態(tài)系統(tǒng)涉及各個方面解決方案;MyBatis框架,使用ORM思想對數(shù)據(jù)庫進行操作。

該板塊學習后,就可以進行真實企業(yè)級項目開發(fā)了,做出的項目也會更加符合企業(yè)要求。

技術(shù)樹

八、分布式架構(gòu)

需要用到分布式微服務的技術(shù)。學習完該階段課程,可以具備大型SOA架構(gòu)和微服務架構(gòu)能力,能掌握大型微服務項目必備技術(shù)和實際經(jīng)驗。企業(yè)發(fā)展過程中,業(yè)務量和用戶量逐漸增加,為了保證系統(tǒng)的可用性,系統(tǒng)越做越復雜,研發(fā)人員增多,大家很難共同維護一個復雜的系統(tǒng),往往修改部分內(nèi)容,導致牽一發(fā)而動全身,所以我們需要升級系統(tǒng)架構(gòu),

隨著互聯(lián)網(wǎng)的發(fā)展,業(yè)務的復雜性和用戶的體驗性都需要提高,所以分布式架構(gòu)出現(xiàn)了。該板塊主要講解的是分布式架構(gòu)的相關(guān)解決方案。

主要包括如下模塊:Dubbo,高性能的 RPC 服務發(fā)布和調(diào)用框架;SpringBoot,簡化Spring應用的初始搭建以及開發(fā)過程;Spring Cloud,一系列框架的有序集合,如服務發(fā)現(xiàn)注冊、配置中心、負載均衡、斷路器、數(shù)據(jù)監(jiān)控等。

該板塊的學習,可以具備大型互聯(lián)網(wǎng)項目開發(fā)的必備技術(shù)和實際經(jīng)驗,為進入BATJ打下基礎

技術(shù)樹

九、服務器中間件

在分布式系統(tǒng)架構(gòu)中,服務與服務之間的異步通信,是非常常見的需求之一,消息中間件的誕生正是為了解決這類問題。目前市面上的主流消息中間件有RabbitMQ、RocketMQ、Kafka,我們將學習這3個消息中間件,實現(xiàn)分布式項目中的異步通信。學習完這些后,可以實現(xiàn)分布式項目的異步通信、分布式應用日志收集、分布式事務等。

中間件板塊是大型互聯(lián)網(wǎng)項目中必備的。服務中間件可以幫助各子模塊間實現(xiàn)互相訪問,消息共享或統(tǒng)一訪問等功能。其包括遠程服務框架中間件,例如阿里(Apache)的RPC框架Dubbo等;消息隊列中間件,例如:阿里巴巴開源分布式中間件RocketMQ、高吞吐量消息發(fā)布和流處理服務Kafka等。

學習服務中間件是中級JavaEE工程師必要技術(shù),也是JavaEE架構(gòu)師必須精通的技術(shù)。

技術(shù)樹

十、服務器技術(shù)

程序開發(fā)完成后,我們把它們打包部署到服務器中運行,所以我們需要學習常見的服務器技術(shù),常見的服務器有Linux和Window server,Linux性能高,是當前主流。我們寫好的項目需要用一個軟件運行起來,這個軟件叫web容器,我們需要在服務器上安裝web容器來發(fā)布項目,當前主流的web容器有tomcat、jetty、nginx、undertow。

不管是使用原生Javaweb進行開發(fā),還是使用框架進行開發(fā),項目最終需要對外發(fā)布才能供全世界的人訪問到,而服務器板塊就可以解決這個問題,所以服務器是項目發(fā)布的必要技術(shù)。該板塊包括虛擬化和web應用服務器的學習,主要包括如下幾個模塊:Vmware,虛擬機軟件;Linux,專門用于服務器的系統(tǒng);Nginx,集群部署時反向代理服務器;Tomcat,項目發(fā)布時主要使用的服務器。

該板塊學習后,我們就可以把開發(fā)好的項目發(fā)布到服務器中,然后供你的小伙伴遠程訪問了,超酷!

技術(shù)樹

十一、容器技術(shù)

具備了服務器操作系統(tǒng)及web容器,我們就可以部署單機的站點,在分布式系統(tǒng)中,幾十上百的服務,如果使用單機這種部署方式,會投入很高的人力,同時出錯的幾率也大。所以服務器虛擬化技術(shù)Docker也稱為如今的必備技術(shù)了,Docker可以幫助運維人員實行快速部署,批量維護.使用Kubernetes實現(xiàn)自動化部署、大規(guī)模可伸縮、應用容器管理。

容器化技術(shù)是近兩年超級火的一個專題,通過容器化技術(shù)可以對環(huán)境進行打包,方便移植,大大提高了開發(fā)效率。該板塊包括容器化技術(shù)Docker和其平臺管理引擎Kubernetes,其中,Docker 是一個開源的應用容器引擎,可以打包應用以及依賴包到一個可移植的鏡像中,然后發(fā)布到任何流行的Linux或Windows 機器上,也可以實現(xiàn)虛擬化。而Kubernetes是一個開源的,用于管理云平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單并且高效。通過該板塊的學習,你可以通過上述技術(shù)快速搭建環(huán)境,節(jié)省開發(fā)時間,提高開發(fā)效率。

技術(shù)樹

十二、業(yè)務解決方案

企業(yè)開發(fā)中會遇到一些通用的業(yè)務場景,諸如:搜索引擎、緩存、定時任務、工作流、報表導出、日志管理、系統(tǒng)監(jiān)控等,那么這些通用的解決方案也有現(xiàn)成優(yōu)秀的免費開源中間件,可供使用。諸如:ElasticSearch、Lucene、Solr、redis、MongoDB、slf4J、ECharts、Quartz、POI等。業(yè)務解決方案課程的業(yè)務方案和技術(shù)難點,解決了企業(yè)開發(fā)中90%以上的痛點和難點。

雖然我們已經(jīng)具備了基礎技術(shù)和高階技術(shù),但是要想與企業(yè)開發(fā)相接軌,還需要對實際項目的業(yè)務解決方案進行探究。而此版塊就是在實際業(yè)務場景中的真實解決方案集合,常用的業(yè)務解決方案有如下:搜索業(yè)務場景解決方案、日志收集與分析場景解決方案、工作流引擎場景解決方案、任務調(diào)度場景解決方案、地圖開發(fā)平臺場景解決方案、支付開放平臺場景解決方案、圖表可視化場景解決方案。通過分析實際業(yè)務來學習這個解決方案技術(shù)集,完全可以達到中級甚至高級工程師水平。

技術(shù)樹

java學習路線大陸傳送門

websphere 分布式計算和架構(gòu)是怎么實現(xiàn)的

介紹

分布式計算簡單來說,是把一個大計算任務拆分成多個小計算任務分布到若干臺機器上去計算,然后再進行結(jié)果匯總。 目的在于分析計算海量的數(shù)據(jù),從雷達監(jiān)測的海量歷史信號中分析異常信號(外星文明),淘寶雙十一實時計算各地區(qū)的消費習慣等。

海量計算最開始的方案是提高單機計算性能,如大型機,后來由于數(shù)據(jù)的爆發(fā)式增長、單機性能卻跟不上,才有分布式計算這種妥協(xié)方案。 因為計算一旦拆分,問題會變得非常復雜,像一致性、數(shù)據(jù)完整、通信、容災、任務調(diào)度等問題也都來了。

舉個例子,產(chǎn)品要求從數(shù)據(jù)庫中100G的用戶購買數(shù)據(jù),分析出各地域的消費習慣金額等。 如果沒什么時間要求,程序員小明就寫個對應的業(yè)務處理服務程序,部署到服務器上,讓它慢慢跑就是了,小明預計10個小時能處理完。 后面產(chǎn)品嫌太慢,讓小明想辦法加快到3個小時。

平常開發(fā)中類似的需求也很多,總結(jié)出來就是,數(shù)據(jù)量大、單機計算慢。 如果上Hadoop、storm之類成本較高、而且有點大才小用。 當然讓老板買更好的服務器配置也是一種辦法。

利用分片算法

小明作為一個有追求有理想的程序員,決定用介于單機計算和成熟計算框架的過度解決方案,這樣成本和需求都能滿足了。 分布式計算的核心在于計算任務拆分,如果數(shù)據(jù)能以水平拆分的方式,分布到5臺機器上,每臺機器只計算自身的1/5數(shù)據(jù),這樣即能在3小時內(nèi)完成產(chǎn)品需求了。

如上所述,小明需要把這些數(shù)據(jù)按照一定維度進行劃分。 按需求來看以用戶ID劃分最好,由于用戶之間沒有狀態(tài)上的關(guān)聯(lián),所以也不需要事務性及二次迭代計算。 小明用簡單的hash取模對id進行劃分。

f(memberid) % 5 = ServerN

這樣程序可以分別部署到5臺機器上,然后程序按照配置只取對應余數(shù)的用戶id,計算出結(jié)果并入庫。 這種方式多機之間毫無關(guān)聯(lián),不需要進行通信,可以避免很多問題。 機器上的程序本身也不具備分布式的特性,它和單機一樣,只計算自身獲取到的數(shù)據(jù)即可,所以如果某臺機器上程序崩潰的話,處理方式和單機一樣,比如記錄下處理進度,下次從當前進度繼續(xù)進行后續(xù)計算。

利用消息隊列

使用分片方式相對比較簡單,但有如下不足之處。

它不具有負載均衡的能力,如果某臺機器配置稍好點,它可能最先計算完,然后空閑等待著。也有可能是某些用戶行為數(shù)據(jù)比較少,導致計算比較快完成。

還有一個弊端就是每臺機器上需要手動更改對應的配置, 這樣的話多臺機器上的程序不是完全一樣的,這樣可以用遠程配置動態(tài)修改的辦法來解決。

小明這種方式引入了個第三方,消息隊列。 小明先用一個單獨的程序把用戶信息推送到消息隊列里去,然后各臺機器分別取消費這個隊列。 于是就有了3個角色:

推送消息的,簡稱Master。

消息隊列,這里以Rabbitmq為例。

各個處理程序,簡稱Worker或Slave都行。

雖然僅僅引入了個第三方,但它已經(jīng)具備了分布式計算的很多特性。

計算任務分發(fā)。 Master把需要計算的用戶數(shù)據(jù),不斷的推送消息隊列。

程序一致性。 Worker訂閱相同的消息隊列即可,無需更改程序代碼。

任意擴容。 由于程序完全一樣,意味著如果想要加快速度,重復部署一份程序到新機器即可。 當然這是理論上的,實際當中會受限于消息隊列、數(shù)據(jù)庫存儲等。

容災性。 如果5臺中某一臺程序掛了也不影響,利用Rabbitmq的消息確認機制,機器崩潰時正在計算的那一條數(shù)據(jù)會在超時,在其他節(jié)點上進行消費處理。

Hadoop簡介

Hadoop介紹已經(jīng)相當多了,這里簡述下比如:”Hadoop是一套海量數(shù)據(jù)計算存儲的基礎平臺架構(gòu)”,分析下這句話。

其中計算指的是MapReduce,這是做分布式計算用的。

存儲指的是HDFS,基于此上層的有HBase、Hive,用來做數(shù)據(jù)存儲用的。

平臺,指可以給多個用戶使用,比如小明有一計算需求,他只需要按照對應的接口編寫業(yè)務邏輯即可,然后把程序以包的形式發(fā)布到平臺上,平臺進行分配調(diào)度計算等。 而上面小明的分布式計算設計只能給自己使用,如果另外有小華要使用就需要重新寫一份,然后單獨部署,申請機器等。Hadoop最大的優(yōu)勢之一就在于提供了一套這樣的完整解決方案。

下面找了介紹Hadoop的概覽圖,跟小明的設計做對比下:

圖中“大數(shù)據(jù)計算任務” 對應小明的100G用戶數(shù)據(jù)的計算任務。

”任務劃分“ 對應Master和消息隊列。

“子任務” 對應Worker的業(yè)務邏輯。

”結(jié)果合并“ 對應把每個worker的計算結(jié)果入庫。

“計算結(jié)果” 對應入庫的用戶消費習慣數(shù)據(jù)。

PS:為了方便描述,把小明設計的分布式計算,叫做小和尚。

MapReduce

由于MapReduce計算輸入和輸出都是基于HDFS文件,所以大多數(shù)公司的做法是把mysql或sqlserver的數(shù)據(jù)導入到HDFS,計算完后再導出到常規(guī)的數(shù)據(jù)庫中,這是MapReduce不夠靈活的地方之一。 MapReduce優(yōu)勢在于提供了比較簡單的分布式計算編程模型,使開發(fā)此類程序變得非常簡單,像之前的MPI編程就相當復雜。

狹隘的來講,MapReduce是把計算任務給規(guī)范化了,它可以等同于小和尚中Worker的業(yè)務邏輯部分。 MapReduce把業(yè)務邏輯給拆分成2個大部分,Map和Reduce,可以先在Map部分把任務計算一半后,扔給Reduce部分繼續(xù)后面的計算。 當然在Map部分把計算任務全做完也是可以的。 關(guān)于Mapreduce實現(xiàn)細節(jié)部分不多解釋,有興趣的同學可以查相關(guān)資料或看下樓主之前的C#模擬實現(xiàn)的博客【探索C#之微型MapReduce】。

如果把小明產(chǎn)品經(jīng)理的需求放到Hadoop來做,其處理流程大致如下:

把100G數(shù)據(jù)導入到HDFS

按照Mapreduce的接口編寫處理邏輯,分Map、Reduce兩部分。

把程序包提交到Mapreduce平臺上,存儲在HDFS里。

平臺中有個叫Jobtracker進程的角色進行分發(fā)任務。 這個類似小和尚的Master負載調(diào)度管理。

如果有5臺機器進行計算的話,就會提前運行5個叫TaskTracker的slave進程。 這類似小和尚worker的分離版,平臺把程序和業(yè)務邏輯進行分離了, 簡單來說就是在機器上運行個獨立進程,它能動態(tài)加載、執(zhí)行jar或dll的業(yè)務邏輯代碼。

Jobtracker把任務分發(fā)到TaskTracker后,TaskTracker把開始動態(tài)加載jar包,創(chuàng)建個獨立進程執(zhí)行Map部分,然后把結(jié)果寫入到HDFS上。

如果有Reduce部分,TaskTracker會創(chuàng)建個獨立進程把Map輸出的HDFS文件,通過RPC方式遠程拉取到本地,拉取成功后,Reduce開始計算后續(xù)任務。

Reduce再把結(jié)果寫入到HDFS中

從HDFS中把結(jié)果導出。

這樣一看好像是把簡單的計算任務給復雜化了,其實如果只有幾臺計算任務的話,使用Mapreduce確實是殺雞用牛刀了。 如果有TB、PB級別的數(shù)據(jù)、跑在成百上千臺計算節(jié)點上,Mapreduce的優(yōu)勢才會體現(xiàn)出來。 其計算框架圖架構(gòu)如下:

離線計算

通常稱Mapreduce及小和尚這種計算為離線計算,因為它對已經(jīng)持久化的文件數(shù)據(jù)進行計算,不能實時響應。 還有個原因就是它的處理速度比較慢,它的輸入和輸出源都是基于HDFS設計,如果數(shù)據(jù)不是一開始就寫入到HDFS上,就會涉及到數(shù)據(jù)導入導出,這部分相對耗費時間。 而且它的數(shù)據(jù)流動是基于文件系統(tǒng)的,Map部分輸出的數(shù)據(jù)不是直接傳送到Reduce部分,而是先寫入HDFS再進行傳送。

處理速度慢也是Mapreduce的不足之處,促使了后面實時計算的誕生。

另外個缺點是Mapreduce的計算任務流比較單一,它只有Map、Reduce兩部分。 簡單的可以只寫一部分邏輯來解決,如果想拆分成多個部分,如邏輯A、邏輯B、邏輯C等, 而且一部分計算邏輯依賴上一次計算結(jié)果的話,MapReduce處理起來就比較困難了。 像storm框架解決此類問題的方案,也稱為流式計算,下一章繼續(xù)補充。

網(wǎng)絡 之 三次握手&四次揮手 介紹

要了解三次握手四次揮手的過程,就需要對TCP的報頭以及有限狀態(tài)機的概念有所了解,本文將介紹TCP報頭的字段的含義,以及有限狀態(tài)機各個狀態(tài)的意義,最后對三次握手和四次揮手的過程做介紹

TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。在簡化的計算機網(wǎng)絡OSI模型中,它完成第四層傳輸層所指定的功能,用戶數(shù)據(jù)報協(xié)議(UDP)是同一層內(nèi)另一個重要的傳輸協(xié)議。在因特網(wǎng)協(xié)議族(Internet protocol suite)中,TCP層是位于IP層之上,應用層之下的中間層。不同主機的應用層之間經(jīng)常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。

這里將介紹TCP報頭的特性以及TCP報頭各個字段的含義

.工作在傳輸層面向連接協(xié)議

.全雙工協(xié)議

.半關(guān)閉

.錯誤檢查

.將數(shù)據(jù)打包成段,排序

.確認機制

.數(shù)據(jù)恢復,重傳

.流量控制,滑動窗口

.擁塞控制,慢啟動和擁塞避免算法

.源端口、目標端口 :計算機上的進程要和其他進程通信是要通過計算機端口的,而一個計算機端口某個時刻只能被一個進程占用,所以通過指定源端口和目標端口,就可以知道是哪兩個進程需要通信。源端口、目標端口是用16位表示的,可推算計算機的端口個數(shù)為2^16個

. 序列號 :表示本報文段所發(fā)送數(shù)據(jù)的第一個字節(jié)的編號。在TCP連接中所傳送的字節(jié)流的每一個字節(jié)都會按順序編號。由于序列號由32位表示,所以每2^32個字節(jié),就會出現(xiàn)序列號回繞,再次從0 開始

. 確認號 :表示接收方期望收到發(fā)送方下一個報文段的第一個字節(jié)數(shù)據(jù)的編號。也就是告訴發(fā)送發(fā):我希望你(指發(fā)送方)下次發(fā)送的數(shù)據(jù)的第一個字節(jié)數(shù)據(jù)的編號是這個確認號

. 數(shù)據(jù)偏移 :表示TCP報文段的首部長度,共4位,由于TCP首部包含一個長度可變的選項部分,需要指定這個TCP報文段到底有多長。它指出TCP 報文段的數(shù)據(jù)起始處距離TCP 報文段的起始處有多遠。該字段的單位是32位(即4個字節(jié)為計算單位),4位二進制最大表示15,所以數(shù)據(jù)偏移也就是TCP首部最大60字節(jié)

. URG :表示本報文段中發(fā)送的數(shù)據(jù)是否包含緊急數(shù)據(jù)。后面的緊急指針字段(urgent pointer)只有當URG=1時才有效

. ACK :表示是否前面的確認號字段是否有效。ACK=1,表示有效。只有當ACK=1時,前面的確認號字段才有效。TCP規(guī)定,連接建立后,ACK必須為1,帶ACK標志的TCP報文段稱為確認報文段

. PSH :提示接收端應用程序應該立即從TCP接收緩沖區(qū)中讀走數(shù)據(jù),為接收后續(xù)數(shù)據(jù)騰出空間。如果為1,則表示對方應當立即把數(shù)據(jù)提交給上層應用,而不是緩存起來,如果應用程序不將接收到的數(shù)據(jù)讀走,就會一直停留在TCP接收緩沖區(qū)中

. RST :如果收到一個RST=1的報文,說明與主機的連接出現(xiàn)了嚴重錯誤(如主機崩潰),必須釋放連接,然后再重新建立連接?;蛘哒f明上次發(fā)送給主機的數(shù)據(jù)有問題,主機拒絕響應,帶RST標志的TCP報文段稱為復位報文段

. SYN :在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1,帶SYN標志的TCP報文段稱為同步報文段

. FIN :表示通知對方本端要關(guān)閉連接了,標記數(shù)據(jù)是否發(fā)送完畢。如果FIN=1,即告訴對方:“我的數(shù)據(jù)已經(jīng)發(fā)送完畢,你可以釋放連接了”,帶FIN標志的TCP報文段稱為結(jié)束報文段

. 窗口大小 :表示現(xiàn)在充許對方發(fā)送的數(shù)據(jù)量,也就是告訴對方,從本報文段的確認號開始允許對方發(fā)送的數(shù)據(jù)量

. 校驗和 :提供額外的可靠性

. 緊急指針 :標記緊急數(shù)據(jù)在數(shù)據(jù)字段中的位置

. 選項部分 :其最大長度可根據(jù)TCP首部長度進行推算。TCP首部長度用4位表示,選項部分最長為:(2^4-1)*4-20=40字節(jié)

常見選項 :

.最大報文段長度:MaxiumSegment Size,MSS

.窗口擴大:Windows Scaling

.時間戳:Timestamps

.a 最大報文段長度

指明自己期望對方發(fā)送TCP報文段時那個數(shù)據(jù)字段的長度。默認是536字節(jié)。數(shù)據(jù)字段的長度加上TCP首部的長度才等于整個TCP報文段的長度。MSS不宜設的太大也不宜設的太小。若選擇太小,極端情況下,TCP報文段只含有1字節(jié)數(shù)據(jù),在IP層傳輸?shù)臄?shù)據(jù)報的開銷至少有40字節(jié)(包括TCP報文段的首部和IP數(shù)據(jù)報的首部)。這樣,網(wǎng)絡的利用率就不會超過1/41。若TCP報文段非常長,那么在IP層傳輸時就有可能要分解成多個短數(shù)據(jù)報片。在終點要把收到的各個短數(shù)據(jù)報片裝配成原來的TCP報文段。當傳輸出錯時還要進行重傳,這些也都會使開銷增大。因此MSS應盡可能大,只要在IP層傳輸時不需要再分片就行。在連接建立過程中,雙方都把自己能夠支持的MSS接入這一字段。MSS只出現(xiàn)在SYN報文中。即:MSS出現(xiàn)在SYN=1的報文段中

.b 窗口擴大

為了擴大窗口,由于TCP首部的窗口大小字段長度是16位,所以其表示的最大數(shù)是65535。但是隨著時延和帶寬比較大的通信產(chǎn)

生(如衛(wèi)星通信),需要更大的窗口來滿足性能和吞吐率,所以產(chǎn)生了這個窗口擴大選項

.c 時間戳

可以用來計算RTT(往返時間),發(fā)送方發(fā)送TCP報文時,把當前的時間值放入時間戳字段,接收方收到后發(fā)送確認報文時,把這個時間戳字段的值復制到確認報文中,當發(fā)送方收到確認報文后即可計算出RTT。也可以用來防止回繞序號PAWS,也可以說可以用來區(qū)分相同序列號的不同報文。因為序列號用32為表示,每2^32個序列號就會產(chǎn)生回繞,那么使用時間戳字段就很容易區(qū)分相同序列號的不同報文

2.3 TCP協(xié)議PORT

.傳輸層通過port號,確定應用層協(xié)議

.Port number:

. tcp :0-65535,傳輸控制協(xié)議,面向連接的協(xié)議;通信前需要建立虛擬鏈路;結(jié)束后拆除鏈路.

. udp :0-65535,User Datagram Protocol,無連接的協(xié)議.

. IANA :互聯(lián)網(wǎng)數(shù)字分配機構(gòu)(負責域名,數(shù)字資源,協(xié)議分配)

0-1023:系統(tǒng)端口或特權(quán)端口(僅管理員可用) ,眾所周知,永久的分配給固定的系統(tǒng)應用使用,22/tcp(ssh), 80/tcp(http), 443/tcp(https)

1024-49151:用戶端口或注冊端口,但要求并不嚴格,分配給程序注冊為某應用使用,1433/tcp(SqlServer),1521/tcp(oracle),

3306/tcp(mysql),11211/tcp/udp(memcached)

49152-65535:動態(tài)端口或私有端口,客戶端程序隨機使用的端口

其范圍的定義:/proc/sys/net/ipv4/ip_local_port_range

有限狀態(tài)機,(英語:Finite-state machine, FSM),又稱有限狀態(tài)自動機,簡稱狀態(tài)機,是表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學模型。

常見的計算機就是使用有限狀態(tài)機作為計算模型的:對于內(nèi)存的不同狀態(tài),CPU通過讀取內(nèi)存值進行計算,更新內(nèi)存中的狀態(tài)。CPU還通過消息總線接受外部輸入設備(如鍵盤、鼠標)的指令,計算后更改內(nèi)存中的狀態(tài),計算結(jié)果輸出到外部顯示設備(如顯示器),以及持久化存儲在硬盤。

TCP協(xié)議也存在有限狀態(tài)機的概念,TCP 協(xié)議的操作可以使用一個具有 11 種狀態(tài)的有限狀態(tài)機來表示

.CLOSED 沒有任何連接狀態(tài)

.LISTEN 偵聽狀態(tài),等待來自遠方TCP端口的連接請求

.SYN-SENT 在發(fā)送連接請求后,等待對方確認

.SYN-RECEIVED 在收到和發(fā)送一個連接請求后,等待對方確認

.ESTABLISHED 代表傳輸連接建立,雙方進入數(shù)據(jù)傳送狀態(tài)

.FIN-WAIT-1 主動關(guān)閉,主機已發(fā)送關(guān)閉連接請求,等待對方確認

.FIN-WAIT-2 主動關(guān)閉,主機已收到對方關(guān)閉傳輸連接確認,等待對方發(fā)送關(guān)閉傳輸連接請求

.TIME-WAIT 完成雙向傳輸連接關(guān)閉,等待所有分組消失

.CLOSE-WAIT 被動關(guān)閉,收到對方發(fā)來的關(guān)閉連接請求,并已確認

.LAST-ACK 被動關(guān)閉,等待最后一個關(guān)閉傳輸連接確認,并等待所有分組消失

.CLOSING 雙方同時嘗試關(guān)閉傳輸連接,等待對方確認

.客戶端通過connect系統(tǒng)調(diào)用主動與服務器建立連接connect系統(tǒng)調(diào)用首先給服務器發(fā)送一個同步報文段,使連接轉(zhuǎn)移到SYN_SENT狀態(tài)。

.此后connect系統(tǒng)調(diào)用可能因為如下兩個原因失敗返回:

.1、如果connect連接的目標端口不存在(未被任何進程監(jiān)聽),或者該端口仍被處于TIME_WAIT狀態(tài)的連接所占用(見后文),則服務器將給客戶端發(fā)送一個復位報文段,connect調(diào)用失敗。

.2、如果目標端口存在,但connect在超時時間內(nèi)未收到服務器的確認報文段,則connect調(diào)用失敗。

.connect調(diào)用失敗將使連接立即返回到初始的CLOSED狀態(tài)。如果客戶端成功收到服務器的同步報文段和確認,則connect調(diào)用成功返回,連接轉(zhuǎn)移至ESTABLISHED狀態(tài)

.當客戶端執(zhí)行主動關(guān)閉時,它將向服務器發(fā)送一個結(jié)束報文段FIN,同時連接進入FIN_WAIT_1狀態(tài)。若此時客戶端收到服務器專門用于確認目的的確認報文段,則連接轉(zhuǎn)移至FIN_WAIT_2狀態(tài)。當客戶端處于FIN_WAIT_2狀態(tài)時,服務器處于CLOSE_WAIT狀態(tài),這一對狀態(tài)是可能發(fā)生半關(guān)閉的狀態(tài)。此時如果服務器也關(guān)閉連接(發(fā)送結(jié)束報文段),則客戶端將給予確認并進入TIME_WAIT狀態(tài)

.客戶端從FIN_WAIT_1狀態(tài)可能直接進入TIME_WAIT狀態(tài)(不經(jīng)過FIN_WAIT_2狀態(tài)),前提是處于FIN_WAIT_1狀態(tài)的服務器直接收到帶確認信息的結(jié)束報文段(而不是先收到確認報文段,再收到結(jié)束報文段)

注意,客戶端先發(fā)送一個FIN給服務端,自己進入了FIN_WAIT_1狀態(tài),這時等待接收服務端的報文,該報文會有三種可能:

a 只有服務端的ACK,只收到服務器的ACK,客戶端會進入FIN_WAIT_2狀態(tài),后續(xù)當收到服務端的FIN時,回應發(fā)送一個ACK,會進入到TIME_WAIT狀態(tài),這個狀態(tài)會持續(xù)2MSL(TCP報文段在網(wǎng)絡中的最大生存時間,RFC 1122標準的建議值是2min).客戶端等待2MSL,是為了當最后一個ACK丟失時,可以再發(fā)送一次。因為服務端在等待超時后會再發(fā)送一個FIN給客戶端,進而客戶端知道ACK已丟失

b 只有服務端的FIN,回應一個ACK給服務端,進入CLOSING狀態(tài),然后接收到服務端的ACK時,進入TIME_WAIT狀態(tài)

c 同時收到服務端的ACK和FIN,直接進入TIME_WAIT狀態(tài)

.收到服務器ACK后,客戶端處于FIN_WAIT_2狀態(tài),此時需要等待服務器發(fā)送結(jié)束報文段,才能轉(zhuǎn)移至TIME_WAIT狀態(tài),否則它將一直停留在這個狀態(tài)。如果不是為了在半關(guān)閉狀態(tài)下繼續(xù)接收數(shù)據(jù),連接長時間地停留在FIN_WAIT_2狀態(tài)并無益處。連接停留在FIN_WAIT_2狀態(tài)的情況可能發(fā)生在:客戶端執(zhí)行半關(guān)閉后,未等服務器關(guān)閉連接就強行退出了。此時客戶端連接由內(nèi)核來接管,可稱之為孤兒連接(和孤兒進程類似)。

.Linux為了防止孤兒連接長時間存留在內(nèi)核中,定義了兩個內(nèi)核參數(shù):

./proc/sys/net/ipv4/tcp_max_orphans 指定內(nèi)核能接管的孤兒連接數(shù)目

./proc/sys/net/ipv4/tcp_fin_timeout指定孤兒連接在內(nèi)核中生存的時間

TCP協(xié)議中的三次握手和四次揮手

客戶機端的三次握手和四次揮手

服務器端的三次握手和四次揮手

1 client 首先發(fā)送一個連接試探,此時ACK=0,表示確認號無效,SYN=1表示這是一個請求連接或連接接受報文,同時表示這個數(shù)據(jù)包不攜帶數(shù)據(jù),seq=x表示此時client自己數(shù)據(jù)的初始序號是x,這時候client進入syn_sent狀態(tài),表示客戶端等等服務器的回復

2 server 監(jiān)聽到連接請求報文后,如同意建立連接,則向client發(fā)送確認,將TCP報文首部的SYN和ACK都置為1,因為client上一個請求連接的報文中seq=x,所以服務器端這次就發(fā)ack=x+1,表示服務器端希望客戶端下一個報文段的第一個數(shù)據(jù)字節(jié)序號是x+1,同時表示x為止的所有數(shù)據(jù)都已經(jīng)正確收到了,其中,此時服務器端發(fā)送seq=y表示server自己的初始序號是y,這時服務器進入了SYN_RCVD狀態(tài),表示服務器已經(jīng)收到了客戶端的請求,等待client的確認。

3 client收到確認后還要再次給服務器端發(fā)送確認,同時攜帶要發(fā)給server的數(shù)據(jù)。ACK=1表示確認號ack=y+1有效,client這時的序號seq為x+1

一旦client確認后,這個TCP連接的client 和 server 都直接進入到established狀態(tài),可以發(fā)起http請求了

4.2 四次揮手詳解

第一次揮手:client向server,發(fā)送FIN報文段,表示關(guān)閉數(shù)據(jù)傳送,此時ACK=0,seq=u,表示客戶端此時數(shù)據(jù)的報文序號是u,此時,client進入FIN_WAIT_1狀態(tài),表示沒有數(shù)據(jù)要傳輸了

第二次揮手:server收到FIN報文段后進入CLOSE_WAIT狀態(tài)(被動關(guān)閉),然后發(fā)送ACK確認,表示同意你關(guān)閉請求了,主機到主機的數(shù)據(jù)鏈路關(guān)閉,同時發(fā)送seq=v,表示此時server端的數(shù)據(jù)包字節(jié)序號是v,ack=u+1,表示希望client發(fā)送的下一個包的序號是u+1,表示確認了序號u之前的包都已經(jīng)收到,客戶端收到server的ACK報文后,進入FIN_WAIT_2狀態(tài)

第三次揮手:server等待client發(fā)送完數(shù)據(jù),發(fā)送FIN=1,ACK=1到client請求關(guān)閉,server進入LAST_ACK狀態(tài)。此時發(fā)送的seq有變化,因為上一個ACK的后server端可能又發(fā)送了一些數(shù)據(jù),說以數(shù)據(jù)字節(jié)序號發(fā)送了變化,為w,但是ack還是保持不變

第四次揮手:client收到server發(fā)送的FIN后,回復ACK確認到server,client進入TIME_WAIT狀態(tài)。發(fā)送ack=w+1,表示希望服務器下個發(fā)送的報文的字節(jié)序號是w+1,確認了服務器之前發(fā)送的w字節(jié)都已經(jīng)正確收到,發(fā)送seq=u+1表示當前client的字節(jié)序號是u+1.server收到client的ACK后就關(guān)閉連接了,狀態(tài)為CLOSED。client等待2MSL,仍然沒有收到server的回復,說明server已經(jīng)正常關(guān)閉了,client關(guān)閉連接。

其中,MSL(Maximum Segment Lifetime):報文最大生存時間,是任何報文段被丟棄前在網(wǎng)絡內(nèi)的最長時間。當client回復server的FIN后,等待(2-4分鐘),即使兩端的應用程序結(jié)束。

TIME_WAIT狀態(tài)需要經(jīng)過2MSL(最大報文段生存時間)才能返回到CLOSE狀態(tài)的原因是如果client直接進入CLOSED狀態(tài),由于IP協(xié)議不可靠性或網(wǎng)絡問題,導致client最后發(fā)出的ACK報文未被server接收到,那么server在超時后繼續(xù)向client重新發(fā)送FIN,而client已經(jīng)關(guān)閉,那么找不到向client發(fā)送FIN的連接,server這時收到RST并把錯誤報告給高層,不符合TCP協(xié)議的可靠性特點。如果client直接進入CLOSED狀態(tài),而server還有數(shù)據(jù)滯留在網(wǎng)絡中,當有一個新連接的端口和原來server的相同,那么當原來滯留的數(shù)據(jù)到達后,client認為這些數(shù)據(jù)是新連接的。等待2MSL確保本次連接所有數(shù)據(jù)消失。

當客戶端等待2MSL后服務器端沒有再次發(fā)送確認的報文后,client認為該次斷開連接已經(jīng)正常結(jié)束,client進入closed狀態(tài)。四次揮手正式結(jié)束


文章名稱:sqlserver分片,mysql分片sql
轉(zhuǎn)載來于:http://weahome.cn/article/dssdeps.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部