+ All Categories
Home > Technology > Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Date post: 17-Feb-2017
Category:
Upload: fwdays
View: 290 times
Download: 5 times
Share this document with a friend
94
PHP at Scale: Knowing enough to be dangerous! Oleksii Petrov Skelia Ukraine / ETWater
Transcript
Page 1: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

PHP at Scale:Knowing enough to be dangerous!

Oleksii PetrovSkelia Ukraine / ETWater

Page 2: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Who am ISystem ArchitectTeam LeadPHP Developer

Find me on@alexhelkar

alexhelkar

https://github.com/alexhelkar

Page 3: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

What does it mean"to scale"?

Page 4: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Does it mean?

Page 5: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Or does it mean?

Page 6: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Often it means

Page 7: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

"To scale"Improve system metrics

without changing thesystem*

* (dramaticaly)

Page 8: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Scale roadmap is predefinedby your stack and software architecture

Page 9: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Let's go!

Page 10: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

PerformanceStory

Page 11: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

PHP 7 factsisset 1.55 times faster than array_key_existsis_file 26 times faster than file_existssingle quotes slower that double quotesinstanceof faster is_aetc.

Code performance?

Page 12: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Blackfire.io & Symfony Blog

Current results:Total request time: 18.4 msfile_exists called: 7 timesExec. time for file_exists: 460 µs Expected results:Exec/ time: ~17.6 µsTotal request time: ~18.3996 ms

Page 13: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

PHP lang performance

...овно?

OR

...амно?

Page 14: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Why a system isslow?

Page 15: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Because ofDatabase!

Page 16: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Scaling strategiesCachingQueueingReads/Writes SplitingSharding

Page 17: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Caching

Page 18: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Typical Request Flow

Page 19: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

DB Cache

Page 20: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Application Cache

Page 21: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Web Cache

Page 22: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Cache: Rule of thumb

IF Application is SLOWEnable Caching

IF Application has GLITCHESDisable Caching

Page 23: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Queueing

Page 24: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Queue as The Equalizer

Page 25: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Queue as The Equalizer

Page 26: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Problems?

Delays

Page 27: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Queue as Load Balancer

Page 28: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Problems?

Unboundedbuffers!

Page 29: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Read/Write Splitting

Page 30: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Master-Slave replicationasync/semi-sync

Writes

Reads Reads

Page 31: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Problems?

Replication lag

Page 32: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Galera Replicationaka sync replication

Page 33: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Problems?

WritesPerformance

Page 34: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

What is IoT?

Page 35: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

IoT is like

Page 36: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

CanvasREST APIWeather DataAvg. Request Size 325b

Page 37: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Data Sample{ "deviceId": 231, "lat":"45.22838254", "lng":"-114.23725403", "timestamp":1459509524, "temperature":2.99, "precipProbability":0.386, "humidity":0.055, "pressure":1035.617}

Page 38: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Load GeneratorYandex Tank

Page 39: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

TasksCreate platform setupGather performance metricsCalculate budgets

Page 40: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Plan 1: 86k req/day (1 rps)

Page 41: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Plan 2: 8.64M req/day (100 rps)

Page 42: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Setup: 20$

Page 43: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Response Time

Page 44: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Limitation

Page 45: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Same Setup: 200rps

Page 46: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Why 3 databaseservers?

Page 47: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Probability?

Head: 50% | Tails: 50%

Page 48: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Probability of 2 consecutive Heads?

25%

Page 49: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Probability of 3 consecutive Heads?

12.5% 0.5^3

Page 50: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Servers reliability

1 Server 99%

10 Servers 90.4%

100 Servers 36.6%

Page 51: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Distributed System

High Availability

Any

should consider

Page 52: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Plan 4: 43.2M req/day (500rps)

Page 53: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Setup Variant 1: 380$

Page 54: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Quantiles

Page 55: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Setup Variant 2: 150$

Page 56: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Quantiles

Page 57: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Mircoservices230 Reasons to choose

380$ - 150$ = 230$

Page 58: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Plan 5: 84.6M req/day (1k rps)

Page 59: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Plan 5: 84.6M req/day (1k rps)

Page 60: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Plan 6: 432M req/day (5k rps)

Page 61: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Started to thinkabout bulk inserts?

Page 62: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Plan 7: 1.26B req/day (15k rps)

Page 63: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Quantiles

Page 64: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

TCP/IP

Page 65: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

TCP Flow

Page 66: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Packets Rate

Page 67: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Packets Rate

1 Request

15k Requests

~10 Packets

~15k Packets

Page 68: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Load Balancer Trick

Page 69: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Load Balancer Trick

Page 70: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Load Balancer Trick

Page 71: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Load Balancer Trick

Page 72: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Why?

Page 73: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Load Balancer Trick

75k pack.

75k pack.

LB Recieved: 150k packets

Page 74: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Plan 7: 50000 req/sec

Page 75: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

CommodityHardware

Page 76: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Commodity Hardware

$5 Server 1 CPU

20 CPU $100 Server

$640 Server

Page 77: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

c4.8xlarge: $1222.750/monthly

Page 78: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

DNS Load Distribution

Page 79: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

DNS Load Distribution

Page 80: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

DNS Cache

Page 81: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Rule of Thumb: Add LB

Page 82: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

What if?

Page 83: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Floating IP

Page 84: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Sharding?Last Resort

Page 85: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Mysql: Manual Sharding

Page 86: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Mysql: Fabric (pre-alpha)<?php

$mysqli = new mysqli("myapp", "user", "password", "database");

mysqlnd_ms_fabric_select_shard($mysqli, "test.fabrictest", 10);$mysqli->query("INSERT INTO fabrictest(id) VALUES (10)");

mysqlnd_ms_fabric_select_shard($mysqli, "test.fabrictest", 10);$mysqli->query("SELECT id FROM test WHERE id = 10");

http://php.net/manual/ru/mysqlnd-ms.quickstart.mysql_fabric.php

Page 87: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

MariaDB: Spider

Page 88: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Mysql Cluster (NDB)

Page 89: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

MongoDB Sharding

Page 90: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Apache Cassandra

Page 91: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

RabbitMQHits 1 Million Messages Per

Second. 32 machines

https://blog.pivotal.io/pivotal/products/rabbitmq-hits-one-million-messages-per-

second-on-google-compute-engine

Page 92: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Apache Kafka2 Million Writes Per Second

3 machines

https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-

second-three-cheap-machines

Page 93: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Instead SummaryScalability as afterwords doesn't workDatabase is not a queueDatabase is not a lock systemRedis is not a queueLoad balancers as a mustLinear disk writes winsPerfomance in PHP is done by everything except PHPBeing distributed is freaking hard

Page 94: Алексей Петров "PHP at Scale: Knowing enough to be dangerous!"

Questions?

Find me on@alexhelkar

alexhelkar

https://github.com/alexhelkar


Recommended