Fai'ai + VPS mo 30 rubles =?

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.

Fai'ai + VPS mo 30 rubles =?
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

Memory transfer size: 102400M

Memory operations type: write
Memory scope type: global
Threads started!
Done.

Operations performed: 104857600 (328001.79 ops/sec)

102400.00 MB transferred (320.32 MB/sec)

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. 

Masini e fa'atupu ai uta fa'aopoopo

vaivai:

  • lata Mauaina-talafeagai
  • talafeagai-maua faʻaleleia
  • talafeagai-maua le pipi-pip
  • pip faʻapipiʻi mysql-connector-python-rf

Faʻapipiʻi MariaDB, Faʻafefea iinei:

apt-get install libmariadbclient-dev
mysql -e "INSTALL PLUGIN blackhole SONAME 'ha_blackhole.so';" -- нужно для test_employees_sha

Su'e fa'avae su'e mai iinei:

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:

  1. getState: toe faafoi le tulaga
  2. getEmployee: toe fa'afo'i tagata faigaluega (+totogi, +suafa) mai le fa'amaumauga
  3. patchEmployee: suia fanua faigaluega
  4. 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.

puna: www.habr.com

Faaopoopo i ai se faamatalaga