Heim >Schlagzeilen >Ausführliche Diskussion von Lösungen und Lösungen für den Zugriff mit „hoher Parallelität und großem Datenverkehr'.
Wie kann das Problem hoher Parallelität und großem Datenverkehr gelöst werden? Der folgende Artikel wird Ihnen die Ideen und Lösungen für Web mit hoher Parallelität und großem Datenverkehr vorstellen. Ich hoffe, er wird Ihnen hilfreich sein!
Empfohlene Videokurse: „ Daten-Parallelitätslösung auf Zehn-Millionen-Ebene (Theorie + Praxis) “
Teilen Sie einige Interviewfragen mit hoher Parallelität: 15 PHP-Interviewfragen zu hoher Parallelität (Zusammenfassung)
QPS: Die Anzahl der Anfragen oder Abfragen pro Sekunde. Im Internetbereich bezieht es sich auf die Anzahl der entsprechenden Anfragen pro Sekunde (http-Anfragen).
Spitzen-QPS pro Sekunde: (80 % der gesamten PVs)/(20 % der Sekunden in 6 Stunden), 80 % der Besuche konzentrieren sich auf 20 % der Zeit
Anzahl gleichzeitiger Verbindungen: verarbeitet von das System gleichzeitig Anzahl der Anfragen
Durchsatz: Die Anzahl der pro Zeiteinheit verarbeiteten Anfragen (normalerweise bestimmt durch QPS und Parallelität).
Reaktionszeit: Die Zeit, die von der Anfrage bis zur Antwort vergeht. Beispielsweise dauert es 100 ms, bis das System eine HTTP-Anfrage verarbeitet. Diese 100 ms sind die Antwortzeit des Systems.
PV: Seitenaufrufe sind Seitenaufrufe und Klicks, die Anzahl der Seiten, die ein Besucher innerhalb von 24 Stunden besucht.
UV: Eindeutiger Besucher (UniQue Visitor), d. h. derselbe Besucher besucht die Website mehrmals innerhalb eines bestimmten Zeitraums und wird nur als 1 eindeutiger Besucher gezählt.
Bandbreite: Die Berechnung der Bandbreitengröße konzentriert sich auf zwei Indikatoren: Spitzenverkehr und durchschnittliche Seitengröße.
Tägliche Website-Bandbreite = PV/statistische Zeit (umgerechnet in Sekunden an einem Tag) * durchschnittliche Seitengröße (Einheit KB) * 8.
Stresstest: Die maximale Parallelität, die der Test aushalten kann, die maximale QPS, die der Test aushalten kann. Es ist zu beachten, dass die gleichzeitige Testmaschine von der getesteten Maschine getrennt sein muss. Führen Sie keine gleichzeitigen Tests auf Online-Servern durch . Beobachten Sie die Maschine, auf der sich der AB-Test befindet, und die CPU, der Speicher, das Netzwerk usw. der Front-End-Maschine der getesteten Maschine haben 75 % des maximalen Grenzwerts nicht überschritten.
Parallelität
Antwortgeschwindigkeit
Fehlertoleranz
Häufig verwendete Leistungstest-Tools: ab, wrk, http_load, Web Bench, Siege, Apache JMeter.
Reduzieren Sie HTTP-Anfragen: Bildzusammenführung, JS-Zusammenführung, CSS-Zusammenführung und Komprimierung. Obwohl die Datei möglicherweise größer ist, werden die Anforderungen reduziert
Hinzufügen asynchrone Anfragen: Daten über die eigentliche Ajax-Aufrufschnittstelle abrufen
Durchsuchen starten Server-Caching und Dateikomprimierung (das Nginx-Komprimierungsmodul kann ebenfalls aktiviert werden)
CDN-Beschleunigung: Lösen Sie das Problem unzureichender Bandbreite und speichern Sie Daten im CDN Knoten, beim Zugriff den nächstgelegenen Knoten auswählen, Bandbreite reduzieren und den Zugriff beschleunigen
Einrichten eines unabhängigen Bildservers: Bilder sind sehr io-freundlich. Sie können den Bildserver vollständig vom Webserver trennen Erstellen Sie einen separaten Bildserver. Die Konfiguration, die nicht zum Computertyp gehört, kann auch entsprechend angepasst werden. Serverseitige Optimierung: statisches HTML der Seite. Reduzierung des Lastdrucks des Servers, Durchdringung der Seitenstatik, Statik hat eine effektive Zeit Datenbank-Cache: Memcache, Redis-Cache
MySQL-Indexoptimierung, MySQL-Subdatenbank und -Tabelle, MySQL-Partitionsbetrieb, MySQL-Master-Slave-Replikation Lese-/Schreibtrennung, MySQL-Lastausgleich, MySQL-Master-Slave-Hot-Standby
Webserver-Optimierung:
Lastausgleich: Sie können den Reverse-Proxy von Ningx verwenden, um den Lastausgleich zu verwenden, Sie können die Netzwerkverteilung verwenden. Die vierte Ebene von LVS in der Schicht implementiert den Lastausgleich
Vierter Lastausgleich: Der sogenannte vierschichtige Lastausgleich basiert auf IP+Port-Lastausgleich
Siebenschichtiger Lastausgleich: Der sogenannte siebenschichtige Lastausgleich Layer-Lastausgleich ist ein Lastausgleich basierend auf (URL-)Informationen -Layer-Lastausgleich. Es verfügt über leistungsstarke Funktionen, einen stabilen Betrieb und eine einfache und flexible Konfiguration. Das Hochladen von Back-End-Servern kann im asynchronen Modus erfolgen Gewichte zuweisen, und die Zuweisungsmethode ist flexibel.
Nginx-Lastausgleichsstrategie
faire Strategie (Erweiterung)
Universeller Hash (Erweiterung)
Konsistenter Hash (Erweiterung)
1. IP-Hash-Strategie
Eine weitere in Nginx integrierte Lastausgleichsstrategie Prozess ist Dem Polling sehr ähnlich, außer dass der Algorithmus und die spezifischen Strategien einige Änderungen aufweisen. Der IP-Hash-Algorithmus ist ein getarnter Polling-Algorithmus Wenn die Maschine auf einen niedrigeren Wert als andere Maschinen fällt, wird die Anforderung an die nächste Maschine mit hoher Gewichtung weitergeleitet. Wenn alle Back-End-Maschinen ausgefallen sind, setzt Nginx die Flags aller Maschinen sofort auf den ursprünglichen Zustand zurück, um zu verhindern, dass sie alle verursachen Maschinen müssen sich in einem Timeout-Zustand befinden
3. Faire Strategie
Beurteilen Sie die Auslastungssituation anhand der Antwortzeit des Back-End-Servers und wählen Sie die Maschine mit der geringsten Auslastung zum Auslagern aus.
Universeller Hash, konsistent Konsistent Hashing-Strategie, allgemeines Hashing ist relativ einfach, Sie können in Nginx integrierte Variablen als Schlüssel für das Hashing verwenden, konsistentes Hashing verwendet einen integrierten konsistenten Hashing-Ring und unterstützt Memcache
Vierschichtige Lastausgleichsimplementierung
durch Nachrichten Die Zieladresse und der Port in , zusammen mit der vom Lastausgleichsgerät festgelegten Serverauswahlmethode, bestimmen den endgültig ausgewählten internen Server lvs-bezogene Begriffe:
DS: Director-Server-Zielserver, d
RS: Echter Server, echter Server, also Back-End-Servercdn Accelerate
Was ist CDN?
Knoten: Er kann als Spiegel des realen Servers verstanden werden.Das CDN-System kann die Anfrage des Benutzers in Echtzeit an den Dienstknoten weiterleiten, der dem Benutzer am nächsten liegt, basierend auf umfassenden Informationen wie Netzwerkverkehr, Verbindungen zu jedem Knoten, Lastbedingungen, Entfernung zum Benutzer und Antwortzeit. Was sind die Vorteile von CDN?
3. Remote-Zugriffsbenutzer wählen auf der Grundlage der DNS-Lastausgleichstechnologie automatisch einen Remote-Spiegel-Cache-Server aus und lesen Daten aus dem Cache Wenn Remote-Benutzer auf den Server zugreifen, reduzieren Sie die Bandbreite des Remote-Zugriffs, teilen Sie den Netzwerkverkehr, reduzieren Sie die Auslastung des Website-Webservers und andere Funktionen.
Wie implementiert man CDN?
BAT und andere CDN-DiensteVerwenden Sie den 4-Schichten-Lastausgleich von LVS.
Sie können Nginx, Lack, Squid und Apache TrafficServer für den 7-Schichten-Lastausgleich und Cache verwenden. Verwenden Sie Squid als Reverse-Proxy oder Nginx als Reverse-ProxyIst Unabhängigkeit notwendig?
1. Teilen Sie die E/A-Last des Webservers, trennen Sie den ressourcenintensiven Bilddienst und verbessern Sie die Leistung und Stabilität des Servers
2 Bilddienste einrichten Gezielte Caching-Lösung, Bandbreitenkosten reduzieren und Zugriffsgeschwindigkeit verbessern
Warum einen unabhängigen Domainnamen verwenden?
Grund: Die Anzahl der gleichzeitigen Browserverbindungen unter demselben Domainnamen ist begrenzt, da die meisten Web-Caches nur Anfragen ohne Cookies zwischenspeichern, was dazu führt, dass keine Bildanfrage möglich ist Hit the Cache
Ist es ein Problem nach der Unabhängigkeit?
So laden Sie Bilder hoch und synchronisieren sie.
NPS-Freigabemethode. Verwenden Sie die FTP-Synchronisierung und warum statisch sein , statische Implementierung. Was ist ein Prozess? Wird vom System für die Ressourcenzuweisung und -planung verwendet. Die Grundeinheit ist die Grundlage der Betriebssystemstruktur.
Bereit: Wenn ein Prozess alle Ressourcen außer dem Prozessor erhalten hat und ausgeführt werden kann, sobald er den Prozessor erhält, befindet er sich in einem Bereitschaftszustand. Der Bereitschaftszustand kann nach mehreren Prioritäten in die Warteschlange gestellt werden. Wenn ein Prozess beispielsweise aufgrund des Ablaufs der Zeitscheibe in den Bereitschaftszustand wechselt, wird er in eine Warteschlange mit niedriger Priorität gestellt. Wenn ein Prozess aufgrund des Abschlusses einer E/A-Operation in den Bereitschaftszustand übergeht, wird er in eine Warteschlange mit hoher Priorität.
Was ist ein Thread?
Ein Thread kann einen anderen Thread erstellen und abbrechen, und mehrere Threads im selben Prozess können gleichzeitig ausgeführt werden.
Ein Thread ist ein einzelner sequenzieller Kontrollfluss in einem Programm. Eine relativ unabhängige und planbare Ausführungseinheit innerhalb eines Prozesses. Sie ist die Grundeinheit für die unabhängige Planung und Zuweisung von CPUs. Sie bezieht sich auf die Planungseinheit eines laufenden Programms.Was ist eine Coroutine? Eine Coroutine ist ein leichter Thread im Benutzermodus, und die Planung der Coroutine wird vollständig vom Benutzer gesteuert. Coroutinen haben ihren eigenen Registerkontext und Stapel. Wenn der Koordinationsplan wechselt, werden der Registerkontext und der Stapel an anderen Orten gespeichert. Beim Zurückschalten werden der zuvor gespeicherte Registerkontext und der Stapel wiederhergestellt. Der direkte Betrieb des Stapels verursacht im Grunde keinen Overhead durch Kernelwechsel, und auf globale Variablen kann zugegriffen werden Sperren, sodass der Kontextwechsel sehr schnell erfolgt. Was ist der Unterschied zwischen Thread und Prozess? 1. Ein Thread ist eine Ausführungseinheit innerhalb eines Prozesses. Sie teilen sich den Adressraum des Prozesses und der Prozess verfügt über einen eigenen unabhängigen Adressraum.
2. Prozess ist die Einheit der Ressourcenzuteilung und des Eigentums. Threads im selben Prozess teilen sich die Ressourcen des Prozesses.
3. Thread ist die Grundeinheit der Prozessorplanung, aber Prozess ist nicht
4 Beide können gleichzeitig ausgeführt werden
5 Jeder unabhängige Thread hat einen Einstiegspunkt für die Programmausführung und wird sequentiell ausgeführt Der Ausgang der Sequenz und des Programms, aber der Thread kann nicht unabhängig ausgeführt werden und muss von der Anwendung abhängen, und die Anwendung bietet eine Steuerung für die Ausführung mehrerer Threads.
Was ist der Unterschied zwischen Threads und Coroutinen?
1 Ein Thread kann mehrere Coroutinen haben, und ein Prozess kann auch mehrere Coroutinen allein haben
2. Threads und Prozesse sind alle synchrone Mechanismen, während Coroutinen asynchron sind
3 Die Assoziation kann den Status des letzten Aufrufs beibehalten. Jedes Mal, wenn der Prozess erneut eintritt, entspricht dies dem Eintritt in den Status des letzten Aufrufs.
Wenn zwei oder mehr Prozesse gleichzeitig im selben Computersystem ausgeführt werden dürfen, bedeutet dies, dass ein weiterer Prozess geöffnet und eine weitere Ressource zugewiesen wird und die Kommunikation zwischen Prozessen unbequem ist Was ist Multithreading?
Threads unterteilen einen Prozess in viele Slices, wobei jeder Slice ein unabhängiger Prozess sein kann. Der Unterschied zu Multiprozessen besteht darin, dass nur die Ressourcen eines Prozesses verwendet werden und Threads kommunizieren können Unter mehreren Konzepten liegt der Unterschied zwischen?
Single-Prozess-Single-Thread: eine Person isst an einem Tisch
Synchronisiertes Blockierungsmodell
Multiprozess: Die frühesten serverseitigen Programme lösten das Problem der gleichzeitigen E/A durch Multiprozess und Multithread. Eine Anfrage erstellt einen Prozess und dann das Kind Der Prozess tritt ein Die Schleife interagiert synchron mit der Clientverbindung und sendet und empfängt Verarbeitungsdaten. Schritte
Erstellen Sie einen Socket
Nachdem der Sub-Thread/Thread erfolgreich erstellt wurde, tritt er in die while-Schleife ein, blockiert den Recv-Aufruf und wartet darauf, dass der Client Daten an den Server sendet
Wenn die Clientverbindung geschlossen wird, wird der untergeordnete Prozess/Thread beendet und alle Ressourcen zerstört. Der Hauptprozess/Thread recycelt diesen untergeordneten Prozess/Thread.
Dieses Modell hängt stark von der Anzahl der Prozesse ab, um Parallelitätsprobleme zu lösen.
Das Starten einer großen Anzahl von Prozessen führt zu einem zusätzlichen Prozessplanungsverbrauch.
Asynchrones, nicht blockierendes Modell Das Programm verwendet das klassische Reactor-Modell, was bedeutet, dass es sich nicht um das Senden und Empfangen von Daten handelt. Sie können nur Ereignisänderungen eines Socket-Handles überwachen.
Reaktormodell:- add:添加一个socket到reactor
- set:修改socket对应的事件,如可读可写
- del:从reactor中移除
- callback:事件发生后回掉指定的函数
nginx: Multithread-Reaktorswoole: Multithread-Reaktor + Multiprozess-Worker
1.php-Erweiterung , parallel, Hochleistungsnetzwerk Die in reiner C-Sprache geschriebene Kommunikations-Engine bietet einen asynchronen Multithread-Server in PHP-Sprache, asynchronen TCP/UDP-Netzwerk-Client, asynchrones MySQL, asynchrones Redis, Datenbankverbindungspool, AsyncTask, Nachrichtenwarteschlange, Millisekunden-Timer, Asynchrones Lesen und Schreiben von Dateien, asynchrone DNS-Abfrage.
Wenn auf das Inventarsystem nicht zugegriffen werden kann, schlägt die Bestellreduzierung fehl, was zu einem Bestellfehler führt.
Das Bestellsystem ist vom Inventarsystem entkoppelt.
Referenzwarteschlange. Nachdem der Benutzer eine Bestellung aufgegeben hat Bestellung, das Bestellsystem ist abgeschlossen. Persistenzverarbeitung, Schreiben der Nachricht in die Nachrichtenwarteschlange und Rückgabe des Bestellerfolgs des Benutzers Basierend auf den Bestellinformationen Nachrichtenwarteschlange zuerst. Wenn die Länge der Nachrichtenwarteschlange den Maximalwert überschreitet, wird direkt ein Fehler gemeldet oder der Benutzer wird aufgefordert, das Anforderungsvolumen zu kontrollieren und hohen Datenverkehr zu verringern
7.日志处理 应用场景:解决大量日志的传输 日志采集程序将程序写入消息队列,然后通过日志处理程序的订阅消费日志。
8.消息通讯 聊天室
9.常见消息队列产品 kafka,ActiveMQ,ZeroMQ,RabbitMQ,Redis等 php的异步 消息队列
10.接口的并发请求 curl_multi_init
1.什么是数据库缓存
mysql等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对mysql产生的增删,改,查的操作造成巨大的I/O开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念应运而生。
极大的解决数据库服务器的压力
提高应用数据的响应速度
常见的缓存形式:内存缓存和文件缓存
2.为什么要使用数据库缓存
缓存数据是为了让客户端很少甚至不访问数据库服务器进行数据的查询,高并发下,能最大程序地降低对数据库服务器的访问压力。
用户请求-》数据查询-》连接数据库服务器并查询数据-》将数据缓存起来(html,内存,json,序列化数据)-》显示给客户端
缓存方式的选择
缓存场景的选择
缓存数据的实时性
缓存数据的稳定性
3.使用mysql查询缓存
启用mysql查询缓存
极大的降低cpu使用率
query_cache_type查询缓存类型,有0,1,2三个取值。0则不适用查询缓存。1表示始终使用查询缓存,2表示按需使用查询缓存。
query_cahce_type=1 select SQL_NO_CACHE * from my_table where condition; query_cache_type=2 select SQL_CACHE * from my_table where condition; query_cache_size
默认情况下query_cache_size为0,表示为查询缓存预留的内存为0,则无法使用查询缓存 SET GLOBAL query_cache_size = 134217728; 查询缓存可以看作是SQL文本和查询结果的映射 第二次查询的SQL和第一次查询的SQL完全相同,则会使用缓 SHOW STATUS LIKE ‘Qcache_hits’查看命中次数 表的结构和数据发生改变时,查询缓存中的数据不再有效
情理缓存:
FLUSH QUERY CACHE;//清理查询缓存内存碎片
RESET QUERY CACHE;//从查询缓存中移出所有查询
FLUSH TABLES;//关闭所有打开的表,同时该操作将会清空查询缓存中的内容
4.使用Memcache缓存
对于大型站点,如果没有中间缓存层,当流量打入数据库层时,即便有之前的几层为我们挡住一部分流量,但是在大并发的情况下,还是会有大量请求涌入数据库层,这样对于数据库服务器的压力冲击很大,响应速度也会下降,因此添加中间缓存层很有必要。
memcache是一套分布式的高速缓存系统,由liveJournal的BrandFitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。 memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像,视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存,然后从内存中读取,从而大大提高读取速度。
工作流程:先检查客户端的请求数据是否在memcache中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcache中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中。
通用缓存机制:用查询的方法名+参数作为查询时的key,value对中的key值
5.使用Redis缓存
与memcache的区别:
性能相差不大
redis在2.0版本后增加了自己的VM特性,突破物理内存的限制,memcache可以修改最大可用内存,采用LRU算法
redis依赖客户端来实现分布式读写
memcache本身没有数据冗余机制
redis支持(快照,aof)依赖快照进行持久化aof增强了可靠性的同时,对性能有所影响
redis用户数据量较小的高性能操作和运算上
memcache用于在动态系统中减少数据库负载,提升性能;适合做缓存提高性能。
可用于存储其他数据:session,session_set_save_handler
Optimierung des Datentabellen-Datentyps: int, smallint., bigint, enum, IP-Speicher verwendet IP2long-Konvertierung und -Speicherung vom Typ int
Je mehr Indizes, desto besser , Erstellen Sie den entsprechenden Index für das entsprechende Feld
Befolgen Sie das Präfixprinzip des Index
wie das Abfrage-%-Problem
Optimierung des vollständigen Tabellenscans
oder bedingte Indexverwendung
Zeichen Das Problem des String-Typ-Index-Fehlers
Optimieren Sie den Datenzugriff beim Abfragen von Daten, verwenden Sie Limits, versuchen Sie, * nicht zu verwenden, machen Sie komplexe Abfragen einfach, teilen Sie Abfragen auf, zerlegen Sie verwandte Abfragen*
Optimieren Sie bestimmte Arten von Abfrageanweisungen, count() optimieren, verwandte Abfrageanweisungen optimieren, Unterabfragen optimieren, Group by und Unique optimieren, Limit und Union optimieren
Optimierung der Speicher-Engine: Versuchen Sie, innodb zu verwenden
Optimierung der Datenbanktabellenstruktur: Partition Betrieb (für Benutzer transparent) Partition, Unterdatenbank und Untertabelle (horizontale Aufteilung, vertikale Aufteilung als Sekundärtabelle)
Optimierung der Datenbankserverarchitektur: Master-Slave-Replikation, Lese-/Schreibtrennung, Dual-Master-Hot-Standby , Lastausgleich (LVs, um einen Lastausgleich zu erreichen, die MyCat-Datenbank-Middleware implementiert den Lastausgleich)