導航:首頁 > 編程語言 > php分布式是什麼

php分布式是什麼

發布時間:2022-06-12 00:50:41

php的memcached分布式hash演算法,如何解決分布不均crc32這個演算法沒辦法把key值均勻的分布出去

memcached的總結和分布式一致性hash
當前很多大型的web系統為了減輕資料庫伺服器負載,會採用memchached作為緩存系統以提高響應速度。
目錄: (http://hounwang.com/lesson.html)
memchached簡介
hash
取模
一致性hash
虛擬節點
源碼解析
參考資料
1. memchached簡介
memcached是一個開源的高性能分布式內存對象緩存系統。
其實思想還是比較簡單的,實現包括server端(memcached開源項目一般只單指server端)和client端兩部分:
server端本質是一個in-memory key-value store,通過在內存中維護一個大的hashmap用來存儲小塊的任意數據,對外通過統一的簡單介面(memcached protocol)來提供操作。
client端是一個library,負責處理memcached protocol的網路通信細節,與memcached server通信,針對各種語言的不同實現分裝了易用的API實現了與不同語言平台的集成。
web系統則通過client庫來使用memcached進行對象緩存。
2. hash
memcached的分布式主要體現在client端,對於server端,僅僅是部署多個memcached server組成集群,每個server獨自維護自己的數據(互相之間沒有任何通信),通過daemon監聽埠等待client端的請求。
而在client端,通過一致的hash演算法,將要存儲的數據分布到某個特定的server上進行存儲,後續讀取查詢使用同樣的hash演算法即可定位。
client端可以採用各種hash演算法來定位server:
取模
最簡單的hash演算法
targetServer = serverList[hash(key) % serverList.size]
直接用key的hash值(計算key的hash值的方法可以自由選擇,比如演算法CRC32、MD5,甚至本地hash系統,如java的hashcode)模上server總數來定位目標server。這種演算法不僅簡單,而且具有不錯的隨機分布特性。
但是問題也很明顯,server總數不能輕易變化。因為如果增加/減少memcached server的數量,對原先存儲的所有key的後續查詢都將定位到別的server上,導致所有的cache都不能被命中而失效。
一致性hash
為了解決這個問題,需要採用一致性hash演算法(consistent hash)
相對於取模的演算法,一致性hash演算法除了計算key的hash值外,還會計算每個server對應的hash值,然後將這些hash值映射到一個有限的值域上(比如0~2^32)。通過尋找hash值大於hash(key)的最小server作為存儲該key數據的目標server。如果找不到,則直接把具有最小hash值的server作為目標server。
為了方便理解,可以把這個有限值域理解成一個環,值順時針遞增。
如上圖所示,集群中一共有5個memcached server,已通過server的hash值分布到環中。
如果現在有一個寫入cache的請求,首先計算x=hash(key),映射到環中,然後從x順時針查找,把找到的第一個server作為目標server來存儲cache,如果超過了2^32仍然找不到,則命中第一個server。比如x的值介於A~B之間,那麼命中的server節點應該是B節點
可以看到,通過這種演算法,對於同一個key,存儲和後續的查詢都會定位到同一個memcached server上。
那麼它是怎麼解決增/刪server導致的cache不能命中的問題呢?
假設,現在增加一個server F,如下圖
此時,cache不能命中的問題仍然存在,但是只存在於B~F之間的位置(由C變成了F),其他位置(包括F~C)的cache的命中不受影響(刪除server的情況類似)。盡管仍然有cache不能命中的存在,但是相對於取模的方式已經大幅減少了不能命中的cache數量。
虛擬節點
但是,這種演算法相對於取模方式也有一個缺陷:當server數量很少時,很可能他們在環中的分布不是特別均勻,進而導致cache不能均勻分布到所有的server上。
如圖,一共有3台server – 1,2,4。命中4的幾率遠遠高於1和2。
為解決這個問題,需要使用虛擬節點的思想:為每個物理節點(server)在環上分配100~200個點,這樣環上的節點較多,就能抑制分布不均勻。
當為cache定位目標server時,如果定位到虛擬節點上,就表示cache真正的存儲位置是在該虛擬節點代表的實際物理server上。
另外,如果每個實際server的負載能力不同,可以賦予不同的權重,根據權重分配不同數量的虛擬節點。
// 採用有序map來模擬環
this.consistentBuckets = new TreeMap();
MessageDigest md5 = MD5.get();//用MD5來計算key和server的hash值
// 計算總權重
if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )
this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];
} else if ( this.weights == null ) {
this.totalWeight = this.servers.length;
}
// 為每個server分配虛擬節點
for ( int i = 0; i < servers.length; i++ ) {
// 計算當前server的權重
int thisWeight = 1;
if ( this.weights != null && this.weights[i] != null )
thisWeight = this.weights[i];
// factor用來控制每個server分配的虛擬節點數量
// 權重都相同時,factor=40
// 權重不同時,factor=40*server總數*該server權重所佔的百分比
// 總的來說,權重越大,factor越大,可以分配越多的虛擬節點
double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );
for ( long j = 0; j < factor; j++ ) {
// 每個server有factor個hash值
// 使用server的域名或IP加上編號來計算hash值
// 比如server - "172.45.155.25:11111"就有factor個數據用來生成hash值:
// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor
byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );
// 每個hash值生成4個虛擬節點
for ( int h = 0 ; h < 4; h++ ) {
Long k =
((long)(d[3+h*4]&0xFF) << 24)
| ((long)(d[2+h*4]&0xFF) << 16)
| ((long)(d[1+h*4]&0xFF) << 8 )
| ((long)(d[0+h*4]&0xFF));
// 在環上保存節點
consistentBuckets.put( k, servers[i] );
}
}
// 每個server一共分配4*factor個虛擬節點
}
// 採用有序map來模擬環
this.consistentBuckets = new TreeMap();
MessageDigest md5 = MD5.get();//用MD5來計算key和server的hash值
// 計算總權重
if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )
this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];
} else if ( this.weights == null ) {
this.totalWeight = this.servers.length;
}
// 為每個server分配虛擬節點
for ( int i = 0; i < servers.length; i++ ) {
// 計算當前server的權重
int thisWeight = 1;
if ( this.weights != null && this.weights[i] != null )
thisWeight = this.weights[i];
// factor用來控制每個server分配的虛擬節點數量
// 權重都相同時,factor=40
// 權重不同時,factor=40*server總數*該server權重所佔的百分比
// 總的來說,權重越大,factor越大,可以分配越多的虛擬節點
double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );
for ( long j = 0; j < factor; j++ ) {
// 每個server有factor個hash值
// 使用server的域名或IP加上編號來計算hash值
// 比如server - "172.45.155.25:11111"就有factor個數據用來生成hash值:
// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor
byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );
// 每個hash值生成4個虛擬節點
for ( int h = 0 ; h < 4; h++ ) {
Long k =
((long)(d[3+h*4]&0xFF) << 24)
| ((long)(d[2+h*4]&0xFF) << 16)
| ((long)(d[1+h*4]&0xFF) << 8 )
| ((long)(d[0+h*4]&0xFF));
// 在環上保存節點
consistentBuckets.put( k, servers[i] );
}
}
// 每個server一共分配4*factor個虛擬節點
}
// 用MD5來計算key的hash值
MessageDigest md5 = MD5.get();
md5.reset();
md5.update( key.getBytes() );
byte[] bKey = md5.digest();

// 取MD5值的低32位作為key的hash值
long hv = ((long)(bKey[3]&0xFF) << 24) | ((long)(bKey[2]&0xFF) << 16) | ((long)(bKey[1]&0xFF) << 8 ) | (long)(bKey[0]&0xFF);

// hv的tailMap的第一個虛擬節點對應的即是目標server
SortedMap tmap = this.consistentBuckets.tailMap( hv );
return ( tmap.isEmpty() ) ? this.consistentBuckets.firstKey() : tmap.firstKey();
更多問題到問題求助專區(http://bbs.hounwang.com/)

❷ 什麼是PHP

PHP,一個嵌套的縮寫名稱,是英文超級文本預處理語言(PHP:Hypertext Preprocessor)的縮寫。PHP 是一種 HTML 內嵌式的語言,PHP與微軟的ASP頗有幾分相似,都是一種在伺服器端執行的嵌入HTML文檔的腳本語言,語言的風格有類似於C語言,現在被很多的網站編程人員廣泛的運用。PHP 獨特的語法混合了 C、Java、Perl 以及 PHP 自創新的語法。它可以比 CGI 或者 Perl 更快速的執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;與同樣是嵌入HTML文檔的腳本語言JavaScript相比,PHP在伺服器端執行,充分利用了伺服器的性能;PHP執行引擎還會將用戶經常訪問的PHP程序駐留在內存中,其他用戶再一次訪問這個程序時就不需要重新編譯程序了,只要直接執行內存中的代碼就可以了,這也是PHP高效率的體現之一。PHP具有非常強大的功能,所有的CGI或者JavaScript的功能PHP都能實現,而且支持幾乎所有流行的資料庫以及操作系統。
PHP 最初是1994年Rasmus Lerdorf創建的,剛剛開始只是一個簡單的用Perl語言編寫的程序,用來統計他自己網站的訪問者。後來又用C語言重新編寫,包括可以訪問資料庫。在1995年以Personal Home Page Tools (PHP Tools) 開始對外發表第一個版本,Lerdorf寫了一些介紹此程序的文檔,並且發布了PHP1.0。在這早期的版本中,提供了訪客留言本、訪客計數器等簡單的功能。以後越來越多的網站使用了PHP,並且強烈要求增加一些特性,比如循環語句和數組變數等等,在新的成員加入開發行列之後,在1995年中,PHP2.0發布了。第二版定名為PHP/FI(Form Interpreter)。PHP/FI加入了對mSQL的支持,從此建立了PHP在動態網頁開發上的地位。到了1996年底,有15000個網站使用 PHP/FI;時間到了1997年中,使用PHP/FI的網站數字超過五萬個。而在1997年中,開始了第三版的開發計劃,開發小組加入了 Zeev Suraski 及 Andi Gutmans,而第三版就定名為PHP3。2000年,PHP4.0又問世了,其中增加了許多新的特性。2004年7月,PHP5正式版本的發布,標志著一個全新的PHP時代的到來。它的核心是第二代Zend引擎,並引入了對全新的PECL模塊的支持。PHP5的最大特點是引入了面向對象的全部機制,並且保留了向下的兼容性。程序員不必再編寫缺乏功能性的類,並且能夠以多種方法實現類的保護。另外,在對象的集成等方面也不再存在問題。使用PHP5引進了類型提示和異常處理機制,能更有效的處理和避免錯誤的發生。
在不斷更新的同時,PHP5依然保留對舊有的PHP4程序可以運行於PHP5的平台上而不會出現較大問題。隨著MySQL資料庫的發展,PHP5還綁定了新的MySQLi擴展模塊,它提供了一些更加有效的方法和實用工具用於處理資料庫操作。這些方法大都以面向對象的方式實現,同時也極大地提高了基於資料庫的Web項目的執行速度。
另外,PHP5中還改進了創建動態圖片的功能,目前能夠支持多種圖片格式(如PNG、GIF、TTIF、JPGE等)。PHP5以及內置了對GD2庫的支持,因此安裝GD2庫(主要指UNIX系統中)也不再是件難事,這使得處理圖像十分簡單和高效。
大多數Web程序開發者依然將XML作為一個徹底的簡單資料庫使用。PHP5中也採用了一系列簡單易用、功能強大的方法處理XML文檔。
今天,已經有包括Yahoo.com和Amazon.com,,網路等在內的數百萬網站,以及眾多的開發人員和編程愛好者正在使用PHP。

❸ php 分布式怎麼開發

普通的Web開發,常用的模式就是用戶登錄之後,登錄狀態信息保存在Session中,用戶一些常用的熱數據保存在文件緩存中,用戶上傳的附件信息保存在Web伺服器的某個目錄上。這種方式對於一般的Web應用,使用很方便,完全能夠勝任。但是對於高並發的企業級網站,就應付不了了。需要採用Web集群實現負載均衡。

使用Web集群方式部署之後,首要調整的就是用戶狀態信息與附件信息。用戶狀態不能再保存到Session中,緩存也不能用本地Web伺服器的文件緩存,以及附件,也不能保存在Web伺服器上了。因為要保證集群裡面的各個Web伺服器,狀態完全一致。因此,需要將用戶狀態、緩存等保存到專用的緩存伺服器,比如Memcache。附件需要保存到雲存儲中。

Web負載均衡

Web負載均衡(Load Balancing),簡單地說就是給我們的伺服器集群分配「工作任務」,而採用恰當的分配方式,對於保護處於後端的Web伺服器來說,非常重要。

負載均衡的策略有很多,我們從簡單的講起。 
 
1. HTTP重定向 
 
當用戶發來請求的時候,Web伺服器通過修改HTTP響應頭中的Location標記來返回一個新的url,然後瀏覽器再繼續請求這個新url,實際上就是頁面重定向。通過重定向,來達到「負載均衡」的目標。

2. 反向代理負載均衡 
 
反向代理服務的核心工作主要是轉發HTTP請求,扮演了瀏覽器端和後台Web伺服器中轉的角色。因為它工作在HTTP層(應用層),也就是網路七層結構中的第七層,因此也被稱為「七層負載均衡」。可以做反向代理的軟體很多,比較常見的一種是Nginx。
Nginx是一種非常靈活的反向代理軟體,可以自由定製化轉發策略,分配伺服器流量的權重等。反向代理中,常見的一個問題,就是Web伺服器存儲的session數據。

3. IP負載均衡

IP負載均衡服務是工作在網路層(修改IP)和傳輸層(修改埠,第四層),比起工作在應用層(第七層)性能要高出非常多。原理是,他是對IP層的數據包的IP地址和埠信息進行修改,達到負載均衡的目的。這種方式,也被稱為「四層負載均衡」。常見的負載均衡方式,是LVS(Linux Virtual Server,Linux虛擬服務),通過IPVS(IP Virtual Server,IP虛擬服務)來實現。

❹ php是什麼意思

PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法。

它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標准通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多。

PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。

開發工具:

集成開發環境是一種集成了軟體開發過程中所需主要工具的集成開發環境,其功能包括但不僅限於代碼高亮、代碼補全、調試、構建、版本控制等。一些常見的PHP IDEs如下:

1、Zend Studio:商業版,Zend官方出品,基於eclipse

2、Eclipsewith PDT:免費

3、Coda:商業版,針對Mac用戶

4、NetBeans:免費,功能強大

5、PHP Storm:商業版

6、AptanaStudio:免費

7、PhpEd:商業版

8、KomodoIDE/Edit:IDE為商業版,Edit可免費使用

9、Adobe Dreamweaver:商業版

除去集成開發環境,具備代碼高亮功能的常見文本編輯器因其輕巧靈活也常被選作開發工具,例如:Notepad++、Editplus、SublimeText、Everedit(國人開發)等等。

(4)php分布式是什麼擴展閱讀:

PHP的特性包括:

1、PHP 獨特的語法混合了 C、Java、Perl 以及 PHP 自創新的語法。

2、PHP可以比CGI或者Perl更快速的執行動態網頁——動態頁面方面,與其他的編程語言相比,

PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成htmL標記的CGI要高許多;

PHP具有非常強大的功能,所有的CGI的功能PHP都能實現。

3、PHP支持幾乎所有流行的資料庫以及操作系統。

4、最重要的是PHP可以用C、C++進行程序的擴展。

PHP優勢:

1、開放源代碼

所有的PHP源代碼事實上都可以得到。

2、免費性

和其它技術相比,PHP本身免費且是開源代碼。

3、快捷性

程序開發快,運行快,技術本身學習快。嵌入於HTML:因為PHP可以被嵌入於HTML語言,它相對於其他語言。編輯簡單,實用性強,更適合初學者。

4、跨平台性強

由於PHP是運行在伺服器端的腳本,可以運行在UNIX、LINUX、WINDOWS、Mac OS、Android等平台

5、效率高

PHP消耗相當少的系統資源。

6、圖像處理

用PHP動態創建圖像,PHP圖像處理默認使用GD2。且也可以配置為使用image magick進行圖像處理。

7、面向對象

在php4,php5 中,面向對象方面都有了很大的改進,php完全可以用來開發大型商業程序。

8、專業專注

PHP支持腳本語言為主,同為類C語言。

技術應用:

1、偽靜態

2、靜態頁面生成

3、資料庫緩存

4、過程緩存

5、div+cssw3c標准

6、大負荷

7、分布式

8、flex

9、桌面程序應用(不擅長)

10、支持MVC模型

11、Smarty模版引擎

參考資料:

網路-PHP (超文本預處理器)

❺ php大型應用如何採用分布式架構

大型分布式架構都是靠多種語言和工具共同分工合作實現的。

不是一兩種工具或者語言能實現的,如果專指php那是沒有意義的,因為php本身只是一個單進程的東東,更別說分布式。

大規模的web應用以及分布式架構主要在於伺服器的整體架構:

1、web服務集群;

2、資料庫集群;

3、分布式緩存;

php充其量只是實現其中一個節點的某個具體的web應用。

SD框架支持長連接協議TCP,WebSocket,短連接協議HTTP,以及UDP。

通過配置開放不同的埠開發者可以輕松管理不同的協議,並且可以共用一套業務代碼,當然你可以通過智能路由進行代碼的隔離。

長連接可以配置不同的數據傳輸協議,比如二進制協議文本協議等等,通過框架提供的封裝器解包器介面可以自定義各種各種的協議封裝,並且各種協議之間可以自動轉換,比如你通過廣播發送一個信息,該信息流向不同客戶端,客戶端間採用不同協議,那麼框架會根據不同的埠自動轉換不同的協議封裝。

也可以通過Http給所有長連接客戶端發送推送消息,類似這種混合協議協作的業務在SD框架上會異常簡單。

(5)php分布式是什麼擴展閱讀:

普通的Web開發,常用的模式就是用戶登錄之後,登錄狀態信息保存在Session中,用戶一些常用的熱數據保存在文件緩存中,用戶上傳的附件信息保存在Web伺服器的某個目錄上。這種方式對於一般的Web應用,使用很方便,完全能夠勝任。但是對於高並發的企業級網站,就應付不了了。需要採用Web集群實現負載均衡。

使用Web集群方式部署之後,首要調整的就是用戶狀態信息與附件信息。用戶狀態不能再保存到Session中,緩存也不能用本地Web伺服器的文件緩存,以及附件,也不能保存在Web伺服器上了。因為要保證集群裡面的各個Web伺服器,狀態完全一致。

因此,需要將用戶狀態、緩存等保存到專用的緩存伺服器,比如Memcache。附件需要保存到雲存儲中,比如七牛雲存儲、阿里雲存儲、騰訊雲存儲等。

SD框架內大多數的對象都使用了對象池技術,對象池技術有利於系統內存的穩定,減少GC的次數,提高系統的運行效率,事實證明對象池對系統穩定做出了極大的貢獻。

開發者也可以使用這一套對象池技術,增加對對象的復用,減少GC和NEW的頻率,對系統毛刺現象和內存泄露方面都有很大的穩定性提升。

❻ php mysql分布式資料庫如何實現

當前做分布式的廠商有幾家,我知道比較出名的有「華為雲分布式資料庫DDM」和「阿里雲分布式資料庫」,感興趣可以自行搜素了解下。

分布式資料庫的幾點概念可以了解一下。

數據分庫:

以表為單位,把原有資料庫切分成多個資料庫。切分後不同的表存儲在不同的資料庫上。

以表中的數據行記錄為單位,把原有邏輯資料庫切分成多個物理資料庫分片,表數據記錄分布存儲在各個分片上。

路由分發:

在分布式資料庫中,路由的作用即將SQL語句進行解析,並轉發到正確的分片上,保證SQL執行後得到正確的結果,並且節約QPS資源。

讀寫分離:

資料庫中對計算和緩存資源消耗較多的往往是密集或復雜的SQL查詢。當系統資源被查詢語句消耗,反過來會影響數據寫入操作,進而導致資料庫整體性能下降,響應緩慢。因此,當資料庫CPU和內存資源佔用居高不下,且讀寫比例較高時,可以為資料庫添加只讀資料庫。

❼ 請問:什麼是分布式緩存系統 - PHP進階討論

我的理解,分布式緩存系統是為了解決資料庫伺服器和web伺服器之間的瓶頸。如果一個網站的流量很大,這個瓶頸將會非常明顯,每次資料庫查詢耗費的時間將會非常可觀。對於更新速度不是很快的網站,我們可以用靜態化來避免過多的資料庫查詢。對於更新速度以秒計的網站,靜態化也不會太理想,可以用緩存系統來構建。如果只是單台伺服器用作緩存,問題不會太復雜,如果有多台伺服器用作緩存,就要考慮緩存伺服器的負載均衡。

❽ php可以做集群和分布式運算嗎

用php吧,這個速度比較快,而且現在像taobao,Facebook等也都是用的php。
ASP現在用的不多了,ASP基本上都轉到asp.net了,.net如果很有實力的公司做也可以的,畢竟asp.net是微軟的東西

❾ php如何實現分布式

分布式和語言沒關系,取決於你的系統架構設計

❿ PHP主要是用來做什麼呢,和JAVA有什麼區別是

PHP主要使用來做網站以及Web應用開發的。跟JAVA區別如下:

一、語言優勢不同

1、PHP:即「超文本預處理器」,是一種通用開源腳本語言。在伺服器端執行的腳本語言。

2、JAVA:是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念。


二、語法不同

1、PHP:語法混合了C、Java、Perl以及 PHP 自創的語法。

2、JAVA:作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。

三、特點不同

1、PHP:利於學習,使用廣泛,主要適用於Web開發領域。

2、JAVA:具有簡單性、面向對象、分布式、健壯性、安全性、平台獨立與可移植性、多線程、動態性等特點。


閱讀全文

與php分布式是什麼相關的資料

熱點內容
phpsleep方法 瀏覽:430
時間同步伺服器ip地址6 瀏覽:926
鋼琴譜pdf下載 瀏覽:524
香港阿里雲伺服器怎麼封udp 瀏覽:875
APp買海鮮到哪裡 瀏覽:501
遼油社保app總提示更新怎麼辦 瀏覽:586
導入源碼教程視頻 瀏覽:613
天翼貸app在哪裡下載 瀏覽:186
app開發源碼查看器 瀏覽:516
程序員發展到了一個瓶頸 瀏覽:120
程序員去機房幹嘛 瀏覽:697
英雄訓練師怎麼看曾經伺服器 瀏覽:546
魔獸世界單機輸入gm命令 瀏覽:372
51單片機最大負跳距是多少 瀏覽:418
android聊天控制項 瀏覽:128
導致壓縮機壞的原因 瀏覽:295
如何多次選取文件夾 瀏覽:280
android編譯生成odex 瀏覽:233
我的世界聯機俠伺服器如何用指令 瀏覽:94
地鐵逃生戰斗伺服器為什麼進不了 瀏覽:572