當前做分布式的廠商有幾家,我知道比較出名的有“華為云分布式數據庫DDM”和“阿里云分布式數據庫”,感興趣可以自行搜素了解下。
創新互聯公司-專業網站定制、快速模板網站建設、高性價比黃梅網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式黃梅網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋黃梅地區。費用合理售后完善,10年實體公司更值得信賴。
分布式數據庫的幾點概念可以了解一下。
數據分庫:
以表為單位,把原有數據庫切分成多個數據庫。切分后不同的表存儲在不同的數據庫上。
以表中的數據行記錄為單位,把原有邏輯數據庫切分成多個物理數據庫分片,表數據記錄分布存儲在各個分片上。
路由分發:
在分布式數據庫中,路由的作用即將SQL語句進行解析,并轉發到正確的分片上,保證SQL執行后得到正確的結果,并且節約QPS資源。
讀寫分離:
數據庫中對計算和緩存資源消耗較多的往往是密集或復雜的SQL查詢。當系統資源被查詢語句消耗,反過來會影響數據寫入操作,進而導致數據庫整體性能下降,響應緩慢。因此,當數據庫CPU和內存資源占用居高不下,且讀寫比例較高時,可以為數據庫添加只讀數據庫。
memcached的總結和分布式一致性hash
當前很多大型的web系統為了減輕數據庫服務器負載,會采用memchached作為緩存系統以提高響應速度。
目錄: ()
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();
更多問題到問題求助專區()
根據自己多年銷售、運營服務器的經驗說一下
選擇云主機(云服務器)和選擇其他主機的方法類似,要選擇合適的云主機就需要對自己的網站情況以及云主機的各項配置
參數有一定了解,具體如下:
首先是網站的情況:
1、網站的類型:比如網站是靜態還是動態為主,使用的什么的網站程序,對運行環境有何要求,是否需要配置特定的環境,這將影響到操作系統、存儲模式的選擇。
2、網站的訪問量:網站的日均訪問人數和平均同時在線人數有多少,這將影響到CPU、內存、帶寬等選擇。
3、網站的數據大小:網站目前的數據有多大,未來是否會快速增加,這將影響到硬盤的選擇。
4、網站的目標用戶:網站是面向全國用戶還是本地用戶,這將影響到機房線路的選擇。
在確定網站情況之后可以結合云主機的各項配置參數進行估算選擇:
云主機參數配置
1.CPU:CPU代表主機的運算能力,如果網站流量較大,動態頁面比較多,建議選擇2核以上CPU。
2.內存:內存也是決定網站打開速度的重要因素,內存越大,可用緩存越大,打開速度也就越快,windows操作系統不支持選擇512MB內存。
3.硬盤:硬盤的大小要根據網站的大小來決定,在選擇時應該考慮到剩余空間。另外硬盤的I/O讀取速度直接決定文件讀取的快慢,新麥互聯云主機硬盤的讀取速度比其他網站快很多,一般情況下都夠用。
4.帶寬:云主機沒有流量限制,所以主要考慮帶寬。帶寬是一個網站打開速度的直接體現,帶寬越大,訪問的時候,打開速度就越快。訪問人數較多的網站,建議選擇大的帶寬。
5.操作系統:操作系統的選擇和個人的熟悉情況和網站具體情況有關,對哪種操作系統比較了解就選擇哪種操作系統,另外windows系統對asp程序支持較好,不過占用內存較多,而Linux系統對php程序支持較好,更省內存,并且有的程序可能只支持某個操作系統。
6.機房線路:線路選擇合適的機房。
7.存儲模式:分布式存儲數據保留四份,而SSD固態硬盤適合對I/O讀取速度有更高要求的用戶。
如果還是不能確定選擇何種配置,可以先購買一個標準配置運行一段時間進行觀察,如果發現配置不夠可以隨時升級
php 高并發解決思路解決方案,如何應對網站大流量高并發情況。本文為大家總結了常用的處理方式,但不是細節,后續一系列細節教程給出。希望大家喜歡。
一 高并發的概念
在互聯網時代,并發,高并發通常是指并發訪問。也就是在某個時間點,有多少個訪問同時到來。
二 高并發架構相關概念
1、QPS (每秒查詢率) : 每秒鐘請求或者查詢的數量,在互聯網領域,指每秒響應請求數(指 HTTP 請求)
2、PV(Page View):綜合瀏覽量,即頁面瀏覽量或者點擊量,一個訪客在 24 小時內訪問的頁面數量
--注:同一個人瀏覽你的網站的同一頁面,只記做一次 pv
3、吞吐量(fetches/sec) :單位時間內處理的請求數量 (通常由 QPS 和并發數決定)
4、響應時間:從請求發出到收到響應花費的時間
5、獨立訪客(UV):一定時間范圍內,相同訪客多次訪問網站,只計算為 1 個獨立訪客
6、帶寬:計算帶寬需關注兩個指標,峰值流量和頁面的平均大小
7、日網站帶寬: PV/統計時間(換算到秒) * 平均頁面大小(kb)* 8
三 需要注意點:
1、QPS 不等于并發連接數(QPS 是每秒 HTTP 請求數量,并發連接數是系統同時處理的請求數量)
2、峰值每秒請求數(QPS)= (總 PV 數*80%)/ (六小時秒數*20%)【代表 80%的訪問量都集中在 20%的時間內】
3、壓力測試: 測試能承受的最大并發數 以及測試最大承受的 QPS 值
4、常用的性能測試工具【ab,wrk,httpload,Web Bench,Siege,Apache JMeter】
四 優化
1、當 QPS 小于 50 時
優化方案:為一般小型網站,不用考慮優化
2、當 QPS 達到 100 時,遇到數據查詢瓶頸
優化方案: 數據庫緩存層,數據庫的負載均衡
3、當 QPS 達到 800 時, 遇到帶寬瓶頸
優化方案:CDN 加速,負載均衡
4、當 QPS 達到 1000 時
優化方案: 做 html 靜態緩存
5、當 QPS 達到 2000 時
優化方案: 做業務分離,分布式存儲
五、高并發解決方案案例:
1、流量優化
防盜鏈處理(去除惡意請求)
2、前端優化
(1) 減少 HTTP 請求[將 css,js 等合并]
(2) 添加異步請求(先不將所有數據都展示給用戶,用戶觸發某個事件,才會異步請求數據)
(3) 啟用瀏覽器緩存和文件壓縮
(4) CDN 加速
(5) 建立獨立的圖片服務器(減少 I/O)
3、服務端優化
(1) 頁面靜態化
(2) 并發處理
(3) 隊列處理
4、數據庫優化
(1) 數據庫緩存
(2) 分庫分表,分區
(3) 讀寫分離
(4) 負載均衡
5、web 服務器優化
(1) nginx 反向代理實現負載均衡
(2) lvs 實現負載均衡
本文題目:php分布式數據存儲,php分布式架構
分享地址:http://vcdvsql.cn/article8/hshgop.html
成都網站建設公司_創新互聯,為您提供移動網站建設、軟件開發、營銷型網站建設、標簽優化、網站內鏈、動態網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯