咱們的項目若是跑在一臺機器上,若是這臺機器出現故障的話,或者用戶請求量比較高,一臺機器支撐不住的話。咱們的網站可能就訪問不了。那怎麼解決呢?就須要使用多臺機器,部署同樣的程序,讓幾個機器同時的運行咱們的網站。那怎麼怎麼分發請求的咱們的全部機器上。因此負載均衡的概念就出現了。php
負載均衡是指基於反向代理能將如今全部的請求根據指定的策略算法,分發到不一樣的服務器上。經常使用實現負載均衡的能夠用nginx,lvs。可是如今也有個問題,若是負載均衡服務器出現問題了怎麼辦?全部冗餘的概念就出現了。mysql
冗餘其實就是兩個或者多臺服務器 一個主服務器,一個從服務器。 假設一個主服務器的負載均衡服務器出現了問題,從服務器可以替代主服務器來繼續負載均衡。實現的方式就是使用keepalive來搶佔虛擬主機。nginx
分佈式其實就是將一個大項目的拆分出來,單獨運行。laravel
舉個上面的例子。假設咱們的訪問量特別大。咱們就能夠作成分佈式,跟cdn同樣的機制。在北京,杭州,深圳三個地方都搭建一個如出一轍的集羣。離北京近的用戶就訪問北京的集羣,離深圳近的就訪問深圳這邊的集羣。這樣就將咱們網戰給拆分3個區域了,各自獨立。git
再舉個例子好比咱們redis分佈式。redis分佈式是將redis中的數據分佈到不一樣的服務器上面,每臺服務器存儲不一樣的內容,而mysql集羣是每臺服務器都放着同樣的數據。這也就理解了分佈式和集羣的概念。web
mysql master服務器會把sql操做日誌寫入到bin.log 日誌裏 slave服務器會去讀master的bin.log 日誌,而後執行sql語句。redis
主從有如下幾個問題。算法
1.master服務器能寫又能讀,slave卻只能寫。sql
slave讀取的數據尚未寫入,這樣該怎麼解決呢?shell
如何解決數據不一致
在config/database.php
mysql配置塊中將sticky設置爲true
sticky 是一個 可選值,它可用於當即讀取在當前請求週期內已寫入數據庫的記錄。若 sticky 選項被啓用,而且當前請求週期內執行過 「寫」 操做,那麼任何 「讀」 操做都將使用 「寫」 鏈接。這樣可確保同一個請求週期內寫入的數據能夠被當即讀取到,從而避免主從延遲致使數據不一致的問題。不過是否啓用它,取決於應用程序的需求。
同步代碼到多臺服務器
Laravel爲咱們提供了擴展包laravel/envoy,它爲定義遠程服務器的平常任務,提供了一套簡潔、輕量的語法。Blade 風格語法便可實現部署任務的配置、Artisan 命令的執行等。
composer global require laravel/envoy
Envoy 任務都應在項目根目錄下的 Envoy.blade.php 中定義。寫入一下內容
@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) @task('deploy', ['on' => ['web-1', 'web-2']]) cd site git pull origin {{ $branch }} composer update php artisan migrate @endtask
以上代碼意思就是在命令行envoy run deploy時候,咱們會ssh到會web-1,web-2 執行
cd site git pull origin {{ $branch }} php artisan migrate
也能夠本身手寫一個Linux cron來實現代碼同步
不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們 ,須要請戳這裏