負載均衡作為一個處理高並發,大流量的訪問的業務場景,已經幾乎是常識性的知識了。
而本文的意義在於需求:由於大流量請求,導致服務無法正常響應,在不增加購買機器成本的場景下,如何提高服務器的業務處理能力?提示為:某個服務訪問頻率比其他服務的訪問頻率要高很多,服務是用JAVA語言編寫的。
一般情況下,我們有兩種可供選擇的負載均衡方式,一是買別人的服務,別人給你提供好,你只需界面上操作下就行了;二是自己搭建負載均衡服務。當然了,這個層面的分類是會被噴的。咱們說點先靠譜的。
負載均衡分為軟件負載均衡和硬件負載均衡; 百度百科解釋如下: 軟件負載均衡解決方案是指在一台或多台服務器相應的操作系統上安裝一個或多個附加軟件來實現負載均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的優點是基於特定環境,配置簡單,使用靈活,成本低廉,可以滿足一般的負載均衡需求。 硬件負載均衡解決方案是直接在服務器和外部網絡間安裝負載均衡設備,這種設備通常稱之為負載均衡器,由於專門的設備完成專門的任務,獨立於操作系統,整體性能得到大量提高,加上多樣化的負載均衡策略,智能化的流量管理,可達到最佳的負載均衡需求。
說得再多,其實也就是用后面許多機器支撐起前端的大流量請求。也就是說,在這種場景下,只要你足夠有錢,哪怕你一台機器只能處理1、2個並發,那么你通過購買足夠多的機器,也是可以應對大流量問題的。
回到本文的出發點,怎樣在不增加后端機器的情況下,提高業務處理能力呢?兩個解決方向:
1. 某個服務訪問量遠高於其他服務,那么,我就讓這個高訪問的服務能夠訪問到比普通服務更多的機器,這樣就可以分配更多資源給該服務了。
2. 利用多核CPU,讓每台機器能夠提供N個服務出來,這樣就變相增加了機器的數量,也不至於購買新機器。
3. 組合1&2,更好提供服務。
要想讓某服務能夠擁有更多的服務器資源,這就涉及到了負載均衡的權重問題和路由問題了。如下為Nginx的配置示例:
server { listen 8080; server_name admin.123.com; location /func1 { proxy_pass http://k1; proxy_set_header Host $host; #域名轉發 proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #IP轉發 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; proxy_read_timeout 600; proxy_send_timeout 600; } location /func2 { proxy_pass http://k2; proxy_set_header Host $host; #域名轉發 proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #IP轉發 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; proxy_read_timeout 600; proxy_send_timeout 600; } } #nginx 負載均衡配置權重,解決訪問概率問題,fun1配置3台機器,fun2配置1台機器 upstream k1{ server 10.136.82.92:8080 weight=2; server 10.136.82.93:8080 weight=2; server 10.136.82.94:8080 weight=2; } upstream k2{ server 10.136.82.93:8080 weight=2; }
OK,分配概率問題處理了,咱們來看看怎樣在一台機器上提供出更多的服務出來。
就如本文標題據說,多核CPU,是目前的服務器絕對配置,目前可以說單核的機器已經找不到了吧。那么,怎樣利用這個資源呢? Java其實是可以自動利用多核資源的,那就是通過多線程去處理業務,這時代碼運行就會被隨機分配到其他核心處理器去處理了。但是對於不利用多線程編程的情況,多核的資源可能就被浪費了。 那么,怎樣直接利用多核資源呢? 當然就是在每個核心上面啟動一個新服務咯。
在每個核心上啟動一個服務如Tomcat,方式有多種,如:
1. 復制項目到代碼,更改端口,如server -> server1 -> server2,直接指定核心啟動
taskset -c 1 ./tomcat7 start #直接指定核心啟動,當然了,這樣是無法利用到多核的 taskset -pc 2 20033 #為進程單獨指定核心運行,如為8081->1,8082->3 ...
2. 使用docker容器,在一台機器上創建N個docker容器,然后將war/jar的項目代碼安裝其中,然后向外部暴露一個商品映射到docker內部的8080端口即可。
docker run -it -d -p 40090:8080 con_server1 /bin/bash # 創建一個容器,端口映射 docker start con_server1 # 啟動容器 docker exec -it con_server1 # 進入容器1
運行好多個實例后,再通過負載均衡分配權重即可。
至此,多核利用完畢。針對實際應用中,可能不會這么麻煩的去操作,但是也算是一種思路吧,還有就是硬件負載均衡的配置應該會更簡單些吧,畢竟是花了錢的。如下是A10負載均衡器的介紹圖,就當是位符吧。
目前很多實際問題,都不能只從代碼層面去考慮了,但是我們能做的,還是把代碼寫好一點,然后去了解下服務器的大環境。
這樣吹牛會不會好點,哈哈哈。。。