1.實現(xiàn)一個多并發(fā)的網站任務,開始做的時候并不知道實際的并發(fā)量會有多少,經過討論決定使用如下的流程方式
2.解釋一下,收到客戶端發(fā)過來的請求后,通過負載均衡分配到空閑的web服務器進行請求處理,請求期間的操作都是使用redis作為數(shù)據讀取和存儲(不要用數(shù)據庫,要不然會出現(xiàn)MySQL連接數(shù)過大,服務器卡死的情況),然后購票成功后再寫入數(shù)據庫中。下面分布解說
3.首先需要用到負載均衡,不要以為很麻煩,現(xiàn)在很方便,阿里云就提供相應的服務,直接購買就好,然后將服務器綁定到負載均衡實例中,域名指向負載均衡實例就好,可以寫兩個靜態(tài)頁面分別放到web服務器1和web服務器2中,不停刷新看看是否是請求到不同的服務器了。
4.負載均衡可以跑通知之后將自己的代碼傳到兩臺服務器中,然后測試能否跑起來。
5.在測試過程中發(fā)現(xiàn)用戶登錄有問題,因為是購票系統(tǒng),所以肯定存在用戶模塊,這里用戶登錄使用session存儲的,所以搭建負載均衡還牽扯到一個session共享的問題。不過用到的是laravel框架,框架里面的session默認是使用文件存儲方式,支持redis存儲,而我們兩臺web服務器連接的是同一個redis服務器,所以將存儲方式換成redis存儲后就解決了問題。其他不支持的框架也可以使用memcache,數(shù)據庫等解決,方法很多,可以單獨看看這方面的解決方法。
6.代碼傳到服務器也能跑通之后,就需要進行壓力測試了。
7.使用的服務器配置是2臺2核8G內存5M寬帶的web服務器,一臺4核16的數(shù)據庫redis服務器。
8.并發(fā)測試工具阿里云也有,買了一個便開始測試,但實際測試過程中發(fā)現(xiàn)與理想的差距甚大,4百并發(fā)便已經有不少失敗請求。
9.優(yōu)化吧,首先修改了一下nginx和php-fpm之間的通信方式,把原來TCP修改成了UNIX Domain Socket.相比之下減少了很多tcp/ip層,物理層,路由層之間的連接,再跑一邊,效果好了一點點。
10.然后發(fā)現(xiàn)再跑壓測的時候,活躍進程數(shù)很低,發(fā)現(xiàn)PHP里面的配置max_children本來就很小,然后按照網上說的計算方式,把值調整到了400,接著監(jiān)聽,發(fā)現(xiàn)是好很多,但是活躍進程一直到60~80就上不去了,而查看cup,負載等都已經到100%,原來cpu忙不過來了。。。
11.升級cpu,到8核,內存升級到16G,然后max_children調整到了800,哇哦,質的飛躍,還是硬件給力,并發(fā)一兩千還是支持的住的。
12.想要支持的并發(fā)跟多的話,可以通過增加web服務器來分擔負載,程序優(yōu)化優(yōu)化,服務器方面的優(yōu)化還有待提升,后面慢慢研究吧。