Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erreicht man einen Lastausgleich in PHP? Beispiel für einen PHP-Lastausgleich (Code)

Wie erreicht man einen Lastausgleich in PHP? Beispiel für einen PHP-Lastausgleich (Code)

不言
不言Original
2018-07-25 15:56:1713489Durchsuche

Es gibt viele Möglichkeiten, den Lastausgleich in PHP zu implementieren. Lassen Sie uns hier ohne weiteres einen Blick auf die Implementierung des PHP-Lastausgleichs werfen.

1. PHP-Datei

Die erste Frage ist: Wenn Sie eine große Anzahl kleiner Server haben, wie laden Sie Ihre PHP-Datei auf alle hoch? sie Auf dem Server? Als Referenz stehen Ihnen die folgenden Methoden zur Verfügung:

1. Laden Sie alle Dateien einzeln auf jeden Server hoch. Stellen Sie sich vor, Sie haben 20 Server, dann wird der Upload-Prozess sehr lang sein Es kann leicht zu Fehlern kommen, und es ist sehr wahrscheinlich, dass bei der Aktualisierung unterschiedliche Dateiversionen auf verschiedenen Servern vorhanden sind.
2. Verwenden Sie „rsync“ (oder eine ähnliche Software), um Dateien in einem lokalen Verzeichnis und mehreren Remote-Host-Verzeichnissen zu synchronisieren.
3. Verwenden Sie Versionskontrollsoftware (z. B. Subversion). Dadurch kann ich meinen Code sehr gut pflegen, und wenn ich meine Anwendung veröffentliche, kann ich den Befehl svnupdate auf jedem Server ausführen, um ihn zu synchronisieren. Dieser Ansatz erleichtert auch den Serverwechsel auf eine frühere Version des Codes.
4. Verwenden Sie einen Dateiserver (Sie finden, dass NFS dafür sehr gut geeignet ist). Wenn Ihr Dateiserver ausfällt, sind dies natürlich viele wird nicht verfügbar sein. Zu diesem Zeitpunkt müssen Sie mehr Geld für die Wiederherstellung ausgeben.

Welche Methode Sie wählen, hängt von Ihren Bedürfnissen und Ihren Fähigkeiten ab. Wenn Sie ein Versionskontrollsystem verwenden, möchten Sie möglicherweise eine Möglichkeit planen, den Code auf allen Servern zu aktualisieren, indem Sie gleichzeitig einen Aktualisierungsbefehl ausführen. Wenn Sie jedoch einen Dateiserver verwenden, müssen Sie einen Mechanismus zur Wiederherstellung nach Fehlern implementieren, um Anforderungsfehler zu verhindern, falls der Server ausfällt.

2. Datei-Upload

Wenn nur ein Server vorhanden ist, ist das Hochladen von Dateien kein Problem. Aber wie sollen die hochgeladenen Dateien gespeichert werden, wenn wir mehrere Server haben? Das Problem beim Hochladen von Dateien ähnelt der serverübergreifenden PHP-Dateispeicherung. Hier sind mehrere mögliche Lösungen:
1. Speichern Sie die Datei in der Datenbank.

Die meisten Daten ermöglichen das Speichern von Binärdaten. Wenn Sie einen Dateidownload anfordern, gibt access data die Binärdaten sowie den entsprechenden Dateinamen und -typ an den Benutzer aus. Bevor Sie diese Lösung verwenden, sollten Sie überlegen, wie die Datenbank Ihre Dateien speichert. Das Problem bei diesem Ansatz besteht darin, dass die Dateien nicht mehr verfügbar sind, wenn der Datenbankserver ausfällt.

2. Speichern Sie hochgeladene Dateien auf einem Dateiserver

Wie in der vorherigen Einführung müssen Sie einen Dateiserver installieren, der von allen Webservern gemeinsam genutzt wird, und alle hochgeladenen Dateien hier hochladen Webserver können es nach dem Hochladen verwenden. Wenn der Dateiserver jedoch ausfällt, kann es zu Unterbrechungen beim Herunterladen der Bilddateien kommen.

3. Entwerfen Sie Ihren eigenen Upload-Mechanismus, um Dateien auf jeden Server zu übertragen.

Diese Methode weist nicht die Nachteile einer einzelnen Dateiserver- oder Datenbanklösung auf, erhöht jedoch die Komplexität Ihres Codes . Was sollten Sie beispielsweise tun, wenn der Server während des Hochladens auf mehrere Server ausfällt?

Eine Datenbank zum Speichern hochgeladener Dateien zu verwenden und gleichzeitig einen Datei-Caching-Mechanismus zu entwerfen, ist eine gute Lösung. Wenn der Server eine Datei-Download-Anfrage erhält, prüft er zunächst, ob die Datei im Cache-System vorhanden ist. Wenn sie gefunden wird, lädt er sie aus der Datenbank herunter und speichert sie im Dateisystem.

3. Sitzungen

Wenn Sie mit der PHP-Sitzungsverarbeitung vertraut sind, wissen Sie wahrscheinlich, dass es sich standardmäßig um eine Sitzung handelt Daten in temporären Dateien auf dem Server. Darüber hinaus befindet sich diese Datei nur auf dem Server, auf dem Sie sie angefordert haben. Nachfolgende Anforderungen können jedoch von einem anderen Server verarbeitet werden, wodurch eine neue Sitzung auf dem anderen Server generiert wird. Dies führt dazu, dass Sitzungen häufig nicht erkannt werden, z. B. dass angemeldete Benutzer immer wieder aufgefordert werden, sich erneut anzumelden.

Meine empfohlene Lösung besteht darin, entweder den in PHP integrierten Sitzungsverarbeitungsmechanismus wiederherzustellen, um Sitzungsdaten in der Datenbank zu speichern, oder einen eigenen Mechanismus zu implementieren, um sicherzustellen, dass die Anfrage eines Benutzers an denselben Server gesendet wird.

4. Konfiguration

Obwohl dieses Thema nicht besonders mit PHP zu tun hat, halte ich es dennoch für notwendig, es zu erwähnen. Beim Betrieb geclusterter Server ist es sinnvoll, die Konfigurationsdateien zwischen den Servern auf irgendeine Weise synchron zu halten. Wenn die Konfigurationsdateien inkonsistent sind, kann dies zu einem sehr seltsamen, zeitweise auftretenden Verhalten führen, das schwierig zu beheben sein kann.

Ich empfehle, sie einzeln mithilfe eines Versionskontrollsystems zu verwalten. Auf diese Weise können Sie verschiedene PHP-Konfigurationsdateien für verschiedene Projektinstallationen speichern und außerdem alle Serverkonfigurationsdateien synchron halten.

5. Protokollierung

Wie Konfigurationsprobleme hängt auch die Protokollierung nicht nur mit PHP zusammen. Dennoch ist es sehr wichtig, dass Ihr Server fehlerfrei läuft. Wie würden Sie ohne ein ordnungsgemäßes Protokollierungssystem feststellen, ob Ihr PHP-Code anfängt, Fehler zu generieren (Sie schalten die display_errors-Einstellung immer aus, wenn das System offiziell läuft, nicht wahr?)

Es gibt mehrere Möglichkeiten kann die Protokollierung implementieren:

1. Protokolle auf jedem Server aufzeichnen. Dies ist der einfachste Weg. Jede Maschine zeichnet nur eine Datei auf. Der Vorteil besteht darin, dass es einfach ist und möglicherweise nur sehr wenig Konfiguration erfordert. Mit zunehmender Serveranzahl wird die Überwachung der Protokolldateien auf jedem Server jedoch sehr schwierig.
2. Auf einer Freigabe protokollieren Bei dieser Methode verfügt jeder Server weiterhin über die Protokolldateien, diese werden jedoch über den Freigabemechanismus auf einem zentralen Dateiserver gespeichert, was die Überwachung der Protokolle erleichtert. Das Problem bei dieser Lösung besteht darin, dass bei Nichtverfügbarkeit des Dateiservers ein einfaches Protokollschreibproblem schließlich zum Absturz der gesamten Anwendung führt.
3. Protokolle auf einem Protokollierungsserver aufzeichnen Sie können eine Protokollierungssoftware wie Syslog verwenden, um alle Protokolle auf einen zentralen Server zu schreiben. Obwohl diese Methode mehr Konfiguration erfordert, bietet sie auch die robusteste Lösung.

PHP-Lastausgleichsinstanz

Wenn Sie den Lastausgleich verwenden möchten, können Sie den Konfigurations-HTTP-Knoten wie folgt ändern:

#设定http服务器,利用它的反向代理功能提供负载均衡支持
            http {
            #设定mime类型,类型由mime.type文件定义
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
            #设定日志格式
            access_log    /var/log/nginx/access.log;
#省略上文有的一些配置节点
#。。。。。。。。。。
#设定负载均衡的服务器列表
            upstream mysvr {
            #weigth参数表示权值,权值越高被分配到的几率越大
            server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口
            server 192.168.8.2x:80  weight=1;
            server 192.168.8.3x:80  weight=6;
            }
upstream mysvr2 {
            #weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.8.x:80  weight=1;
            server 192.168.8.x:80  weight=6;
            }
#第一个虚拟服务器
            server {
            #侦听192.168.8.x的80端口
            listen       80;
            server_name  192.168.8.x;
#对aspx后缀的进行负载均衡请求
            location ~ .*\.aspx$ {
root   /root;      #定义服务器的默认网站根目录位置
            index index.php index.html index.htm;   #定义首页索引文件的名称
proxy_pass  http://mysvr ;#请求转向mysvr 定义的服务器列表
#以下是一些反向代理的配置可删除.
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 10m;    #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;  #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90;  #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;        #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;         #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;             #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
}

Verwandte Empfehlung:

Detaillierte Erläuterung des Sitzungsfreigabefalls unter PHP-Lastausgleich (mit Code)

Das obige ist der detaillierte Inhalt vonWie erreicht man einen Lastausgleich in PHP? Beispiel für einen PHP-Lastausgleich (Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn