E ese le manaia pe a oʻo mai mea laiti uma e manaʻomia: o se peni lelei ma se api, penitala faʻamaʻai, se isumu lelei, nai uaea faaopoopo, ma isi. O nei mea e le faʻaalia e le tosina atu i ai, ae faʻaopoopoina le mafanafana i le olaga. O le tala lava e tasi o loʻo i ai i telefoni feaveaʻi ma komepiuta: mo faʻamalama umi, mo le faʻaititia o le tele o se ata, mo le faʻatusatusaina o tupe a le tagata lava ia, lomifefiloi, faaliliu, tagata liliu, ma isi. E iai sau tasi? VPS - lea e taugofie, i taimi uma e maua ai le tele o mea aoga? Leai, e le o le tasi o loʻo ia te oe i lau kamupani, ae o lau lava, "taga" tasi. Na matou manatu e aunoa ma se VPS laʻititi i le 2019 sa faʻanoanoa, e pei lava o le leai o se vaipuna masani i se lauga. Aisea e faanoanoa ai? O le taumafanafana. O a mai le taumafanafana? Tau mafanafana mo se tagata tomai faapitoa IT: nofo i le fale, galue i au galuega e sili ona e fiafia i ai e aunoa ma se faanoanoa. I se tulaga lautele, sa matou mafaufau ma faia.
Ua taunu'u mai faiga faa-Komunisi, uo.
E faapena o ia - matou VPS mo le tolusefulu
Ua matou faitau i le tele o tala mai tagata tauva ma tagata faʻaoga na tusia 3-4 tausaga talu ai pe aisea e le manaʻomia ai se VPS taugofie. Ia, e saʻo, o le VPS "mo se pene" o se maketi mama ma e le mafai ona ofoina atu avanoa faigaluega masani. Ae o taimi ua suia, o le tau o punaoa faʻapitoa ua faʻaitiitia ma maualalo, ma mo 30 rubles i le masina ua matou sauni e ofoina atu lenei mea:
Galue: Intel Xeon 2 GHz (1 autu)
Linux system (Debian, Ubuntu, CentOS e filifili mai)
1 tuatusi IPv4 tuuto
10 GB o faʻamaumauga faʻamaumauga i luga o taʻavale SSD-vasega televave
RAM: 512 MB
Ta'i lua pili
feoaiga e le gata
O le tau e fa'atatau i fa'agata fa'atekinisi fa'aopoopo, fa'amatalaga i luga itulau la matou ofo manaia - VPS mo 30 rubles.
O ai e talafeagai mo lenei server virtual? Ioe i le toetoe lava o tagata uma: amata, fiafia, atinaʻe poto masani, faʻafiafia DIY ma e oʻo lava i nisi kamupani.
O le a le mea e fetaui mo lenei VPS?
Matou te manatu o le a maua e le au faitau a Habr a latou lava auala e faʻaaoga ai lenei faʻatulagaga, ae na matou filifili e aoina a matou lava filifiliga o manatu - faʻapefea pe a manaʻomia e se tasi, ae le iloa e alii?
Tuu lau 'upega tafaʻilagi faigofie, faila, toe amata i le code, ma isi. Ioe, o lau lava 'upega tafaʻilagi faʻatulagaina e faia ai se lagona lelei i le tagata faigaluega. Tuu i luga o lau VPS ma ia nafa ma le saogalemu ma le mautu o le saite oe lava, ae le o le aufaigaluega a le au talimalo masani.
Fa'aoga VPS mo fa'amoemoega fa'aa'oa'oga: fa'afeiloa'i lau poloketi, su'esu'e foliga o le 'au'aunaga ma le 'au'aunaga fa'agaioiga, fa'ata'ita'i ma DNS, tinker ma se tama'i nofoaga fa'aaoaoga.
Mo telefoni. O nisi taimi o se tagata fai pisinisi, freelancer poʻo se kamupani laʻititi e manaʻomia tele le IP telefoni, ma o le au faʻatautaia o lenei telefoni e matuaʻi matapeʻapeʻa. E faigofie: matou te ave la matou 'auʻaunaga, faʻatau se numera mai se IP telefoni feaveaʻi, faʻatutu se virtual PBX ma fatuina numera i totonu (pe a manaʻomia). E tele naua tupe teu.
Fa'aoga le 'au'aunaga e su'e ai au talosaga.
Fa'aoga le 'au'aunaga mo fa'ata'ita'iga DIY, e aofia ai le fa'atonutonuina ma le aoina mai o fa'amaumauga mai masini atamai fale.
O se auala e le masani ai e faʻaaogaina o le tuʻuina lea o se fesoasoani fefaʻatauaʻiga fefaʻatauaʻiga, se robot fefaʻatauaʻiga, i luga o le server. O le a nafa atoatoa oe mo le mautu ma le saogalemu o le 'au'aunaga, o lona uiga o le ae mauaina se meafaigaluega fa'atonutonu mo fefa'ataua'iga i maketi fa'atau. Ia, pe a iai se tasi e fiafia pe fuafua :)
O loʻo i ai talosaga mo ia VPS i totonu o le kamupani. I le faaopoopo atu i le auaunaga telefoni ua uma ona taʻua, e mafai ona e faʻatinoina le tele o mea manaia. Faataitaiga:
Tu'u ni fa'amaumauga laiti ma fa'amatalaga e mafai ona maua e tagata faigaluega femalagaa'i i se mamao, mo se fa'ata'ita'iga, fa'aaoga ftp. O lenei mea o le a faʻatagaina oe e faʻafesoʻotaʻi vave auʻiliʻiliga fou, faʻafouina fetuutuunaiga mo tagata faʻatau, faʻaaliga, ma isi.
Tuuina atu avanoa le tumau i tagata faʻaoga poʻo tagata faʻatau e faʻaalia polokalame poʻo ala faʻasalalau.
VPS su'ega su'ega mo 30 rubles - faia mo oe
30 rubles e matua itiiti lava e te le manaʻo e ave se kata e totogi ma suʻe. O nisi taimi matou te paie foi, ae o le taimi lenei na matou faia mea uma mo oe. Aʻo leʻi tuʻuina atu 'auʻaunaga i le taua, na matou faia se suʻega e siaki uma faʻamatalaga ma faʻaalia mea e mafai e 'auʻaunaga i lenei tau. Ina ia sili atu le manaia, matou te faʻaopopoina le ogaoga ma siaki pe faʻafefea ona amio lenei faʻatulagaga pe a sili atu le mamafa ma le uta nai lo tau matou te setiina.
O le tagata talimalo sa i lalo o le uta o le tele o masini masini na faia galuega eseese i luga o le processor ma faʻaaogaina ma le faʻaaogaina le subsystem disk. O le fa'amoemoe o le fa'ata'ita'iina lea o le tu'uga maualuga ma se uta fa'atusa pe sili atu nai lo le taua.
I le faaopoopo atu i le avega faifaipea, na matou faʻapipiʻiina masini masini 3 na aoina mai metotia faʻapipiʻi e faʻaaoga ai le sysbench, o le averesi o iʻuga o loʻo tuʻuina atu i lalo, ma 50 masini masini na fatuina ai se uta faaopoopo. O masini faʻataʻitaʻi suʻega uma sa i ai le faʻatulagaga tutusa (1 core, RAM 512 GB, SSD 10 GB), o le ata masani debian 9.6 na filifilia e avea ma faiga faʻaoga, lea e ofoina atu i tagata faʻaoga ile RUVDS.
O le uta na faʻataʻitaʻiina i le natura ma le tele e faʻatusatusa i le taua:
O nisi masini komepiuta na faʻalauiloaina ma maualalo le uta
O nisi masini na faʻatautaia se faʻataʻitaʻiga faʻataʻitaʻiga o le uta i luga o le gaosiga (faʻaaogaina le aoga meafaigatā)
I le vaega o totoe o masini komepiuta, matou te faʻatautaia se tusitusiga e faʻaaoga ai le dd e kopi ai faʻamaumauga mai faʻamaumauga na saunia muamua i le tisiki ma se tapulaa seti e faʻaaoga ai le pv (faʻataʻitaʻiga e mafai ona vaʻaia. iinei и iinei).
E le gata i lea, e pei ona e manatua, e tolu a matou masini na aoina mai fua faʻatatau.
I luga o masini taʻitasi, o se tusitusiga na faʻatinoina faʻataʻamilomilo uma i le 15 minute, lea e faʻataʻitaʻiina ai faʻataʻitaʻiga masani sysbench mo le gaosiga, manatua ma le tisiki.
Fa'amatalaga sysbench.sh
#!/bin/bash
date +"%Y-%m-%d %H:%M:%S" >> /root/sysbench/results.txt
sysbench --test=cpu run >> /root/sysbench/results.txt
sysbench --test=memory run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=seqwr run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=seqrd run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=rndrw run >> /root/sysbench/results.txt
O taunuʻuga o loʻo tuʻuina atu mo le faʻaogaina i le sysbench format, ae o le averesi o tau mo le taimi atoa o suʻega na ave mai masini uma, o le taunuuga e mafai ona vaʻaia iinei:
Sysbanch-avg.txtsysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Doing CPU performance benchmark
Threads started!
Done.
Maximum prime number checked in CPU test: 10000
Test execution summary:
total time: 19.2244s
total number of events: 10000
total time taken by event execution: 19.2104
per-request statistics:
min: 1.43ms
avg: 1.92ms
max: 47.00ms
approx. 95 percentile: 3.02ms
Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 19.2104/0.00
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Doing memory operations speed test
Memory block size: 1K
Test execution summary:
total time: 320.9155s
total number of events: 104857600
total time taken by event execution: 244.8399
per-request statistics:
min: 0.00ms
avg: 0.00ms
max: 139.41ms
approx. 95 percentile: 0.00ms
Threads fairness:
events (avg/stddev): 104857600.0000/0.00
execution time (avg/stddev): 244.8399/0.00
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing sequential write (creation) test
Threads started!
Done.
Operations performed: 0 Read, 131072 Write, 128 Other = 131200 Total
Read 0b Written 2Gb Total transferred 2Gb (320.1Mb/sec)
20251.32 Requests/sec executed
Test execution summary:
total time: 6.9972s
total number of events: 131072
total time taken by event execution: 5.2246
per-request statistics:
min: 0.01ms
avg: 0.04ms
max: 96.76ms
approx. 95 percentile: 0.03ms
Threads fairness:
events (avg/stddev): 131072.0000/0.00
execution time (avg/stddev): 5.2246/0.00
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing sequential read test
Threads started!
Done.
Operations performed: 131072 Read, 0 Write, 0 Other = 131072 Total
Read 2Gb Written 0b Total transferred 2Gb (91.32Mb/sec)
5844.8 Requests/sec executed
Test execution summary:
total time: 23.1054s
total number of events: 131072
total time taken by event execution: 22.9933
per-request statistics:
min: 0.00ms
avg: 0.18ms
max: 295.75ms
approx. 95 percentile: 0.77ms
Threads fairness:
events (avg/stddev): 131072.0000/0.00
execution time (avg/stddev): 22.9933/0.00
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Number of random requests for random IO: 10000
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Threads started!
Done.
Operations performed: 6000 Read, 4000 Write, 12800 Other = 22800 Total
Read 93.75Mb Written 62.5Mb Total transferred 156.25Mb (1341.5Kb/sec)
85.61 Requests/sec executed
Test execution summary:
total time: 152.9786s
total number of events: 10000
total time taken by event execution: 14.1879
per-request statistics:
min: 0.01ms
avg: 1.41ms
max: 210.22ms
approx. 95 percentile: 4.95ms
Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 14.1879/0.00
O faʻaiʻuga e faʻaalia, ae e le tatau lava ona avea o QoS.
O lo'o fa'atulagaina le fa'amaumauga e pei ona fa'ailoa mai iinei:
mysql -t < employees.sql
mysql -t < test_employees_sha.sql
Fa'avae su'ega la'ititi:
laulau
RowsCount
Tele fa'amaumauga (MB)
Fa'asinomaga tele (KB)
matagaluega
9
0.02
16.00
dept_emp
331143
11.52
5648.00
dept_manager
24
0.02
16.00
tagata faigaluega
299379
14.52
0.00
totogi
2838426
95.63
0.00
suafa
442783
19.56
0.00
O se su'ega muamua o lo'o tusia i luga o le tulivae i le Python e fa'atino ai gaioiga:
getState: toe faafoi le tulaga
getEmployee: toe fa'afo'i tagata faigaluega (+totogi, +suafa) mai le fa'amaumauga
patchEmployee: suia fanua faigaluega
insertSalary: fa'aofi se totogi
Punavai o auaunaga (dbtest.py)
#!/usr/bin/python
import mysql.connector as mariadb
from flask import Flask, json, request, abort
from mysql.connector.constants import ClientFlag
app = Flask(__name__)
def getFields(cursor):
results = {}
column = 0
for d in cursor.description:
results[d[0]] = column
column = column + 1
return results
PAGE_SIZE = 30
@app.route("/")
def main():
return "Hello!"
@app.route("/employees/<page>", methods=['GET'])
def getEmployees(page):
offset = (int(page) - 1) * PAGE_SIZE
connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees')
cursor = connection.cursor()
cursor.execute("SELECT * FROM employees LIMIT {} OFFSET {}".format(PAGE_SIZE, offset))
return {'employees': [i[0] for i in cursor.fetchall()]}
@app.route("/employee/<id>", methods=['GET'])
def getEmployee(id):
id = int(id)
connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees')
cursor = connection.cursor()
cursor.execute("SELECT * FROM employees WHERE emp_no = {}".format(id))
fields = getFields(cursor)
employee = {}
found = False
for row in cursor.fetchall():
found = True
employee = {
"birth_date": row[fields["birth_date"]],
"first_name": row[fields["first_name"]],
"last_name": row[fields["last_name"]],
"gender": row[fields["gender"]],
"hire_date": row[fields["hire_date"]]
}
if not found:
abort(404)
cursor.execute("SELECT * FROM salaries WHERE emp_no = {}".format(id))
fields = getFields(cursor)
salaries = []
for row in cursor.fetchall():
salary = {
"salary": row[fields["salary"]],
"from_date": row[fields["from_date"]],
"to_date": row[fields["to_date"]]
}
salaries.append(salary)
employee["salaries"] = salaries
cursor.execute("SELECT * FROM titles WHERE emp_no = {}".format(id))
fields = getFields(cursor)
titles = []
for row in cursor.fetchall():
title = {
"title": row[fields["title"]],
"from_date": row[fields["from_date"]],
"to_date": row[fields["to_date"]]
}
titles.append(title)
employee["titles"] = titles
return json.dumps({
"status": "success",
"employee": employee
})
def isFieldValid(t, v):
if t == "employee":
return v in ["birdth_date", "first_name", "last_name", "hire_date"]
else:
return false
@app.route("/employee/<id>", methods=['PATCH'])
def setEmployee(id):
id = int(id)
content = request.json
print(content)
setList = ""
data = []
for k, v in content.iteritems():
if not isFieldValid("employee", k):
continue
if setList != "":
setList = setList + ", "
setList = setList + k + "=%s"
data.append(v)
data.append(id)
print(setList)
print(data)
connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees', client_flags=[ClientFlag.FOUND_ROWS])
cursor = connection.cursor()
cursor.execute("UPDATE employees SET {} WHERE emp_no = %s".format(setList), data)
connection.commit()
if cursor.rowcount < 1:
abort(404)
return json.dumps({
"status": "success"
})
@app.route("/salary", methods=['PUT'])
def putSalary():
content = request.json
print(content)
connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees', client_flags=[ClientFlag.FOUND_ROWS])
cursor = connection.cursor()
data = [content["emp_no"], content["salary"], content["from_date"], content["to_date"]]
cursor.execute("INSERT INTO salaries (emp_no, salary, from_date, to_date) VALUES (%s, %s, %s, %s)", data)
connection.commit()
return json.dumps({
"status": "success"
})
@app.route("/state", methods=['GET'])
def getState():
return json.dumps({
"status": "success",
"state": "working"
})
if __name__ == '__main__':
app.run(host='0.0.0.0',port='5002')
Faʻamolemole faʻamolemole! I lalo ole tulaga e le tatau ona avea lenei auaunaga o se faʻataʻitaʻiga poʻo se taʻiala!
E faia su'ega e fa'aaoga ai le JMeter tuai. O se faasologa o suʻega e umi mai le 15 minute i le 2 itula na faʻalauiloaina, e aunoa ma se faʻalavelave, o le pasene o talosaga e fesuisuiaʻi, ma o le gaosiga e ese mai le 300 i le 600 talosaga i le minute. Numera o filo mai le 50 i le 500.
Ona o le mea moni o le database e laʻititi tele, o le poloaiga:
mysql -e "SHOW ENGINE INNODB STATUS"
E fa'aalia ai:
Buffer pool hit rate 923 / 1000, young-making rate 29 / 1000 not 32 / 1000
O lo'o i lalo le averesi taimi tali mo talosaga:
pepa
lautele
Median
90%Laina
95%Laina
99%Laina
min
Max
maua Tagata faigaluega
37.64
12.57
62.28
128.5
497.57
5
4151.78
getState
17
7.57
30.14
58.71
193
3
2814.71
patch Tagata faigaluega
161.42
83.29
308
492.57
1845.14
5
6639.4
tuuTotogi
167.21
86.93
315.34
501.07
1927.12
7
6722.44
Atonu e faigata ia te oe ona faʻamasinoina mai nei faʻamatalaga faʻapitoa pe faʻafefea ona fetaui lenei VPS mo au galuega faʻapitoa ma, i se tulaga lautele, o auala o loʻo lisiina e faʻatapulaʻa i na mataupu e tatau ona matou taulimaina i se tasi ituaiga poʻo le isi manino e le atoatoa. Matou te valaʻauina oe e tusi au lava faʻaiuga ma faʻataʻitaʻi le server mo 30 rubles i au talosaga moni ma galuega ma fautua atu au filifiliga mo lenei faʻatulagaga i faʻamatalaga.