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