Brain + VPS airson 30 rubles =?

Tha e cho snog nuair a tha na rudan beaga riatanach uile ri làimh: peann math agus leabhar notaichean, peansail biorach, luchag comhfhurtail, sreang no dhà a bharrachd, msaa. Chan eil na rudan neo-shoilleir seo a 'tarraing aire, ach a' cur ri comhfhurtachd beatha. Tha an aon sgeulachd ann le diofar thagraidhean gluasadach is deasg: airson seallaidhean-sgrìn fada, airson meud dealbh a lughdachadh, airson ionmhas pearsanta obrachadh a-mach, faclairean, eadar-theangairean, luchd-tionndaidh, msaa. A bheil fear agad? VPS - a tha saor, an-còmhnaidh aig làimh agus a bheir mòran bhuannachdan? Chan e, chan e am fear a th’ agad nad chompanaidh, ach am fear agad fhèin, “pòcaid”. Bha sinn den bheachd gun robh e brònach às aonais VPS beag ann an 2019, dìreach mar às aonais peann fuarain àbhaisteach aig òraid. Carson a bhith brònach? 'S e samhradh a th' ann. Ciamar a tha an samhradh? Samhradh airson eòlaiche IT: suidhe aig an taigh, ag obair air na pròiseactan as fheàrr leat gun aithreachas sam bith. San fharsaingeachd, smaoinich sinn agus rinn sinn e.

Brain + VPS airson 30 rubles =?
Tha co-mhaoineas air ruighinn, a chompanaich.

Tha e mar sin - an VPS againn airson trithead

Tha sinn air tòrr artaigilean a leughadh bho cho-fharpaisich agus luchd-cleachdaidh a sgrìobh 3-4 bliadhna air ais mu carson nach eil feum air VPS saor. Uill, tha sin ceart, an uairsin bha VPS “airson sgillinn” na fhìor mhargaidheachd agus cha b ’urrainn dha cothroman obrach àbhaisteach a thabhann. Ach tha amannan ag atharrachadh, tha cosgais ghoireasan brìgheil a ’fàs nas ìsle agus nas ìsle, agus airson 30 rubles gach mìos tha sinn deiseil airson seo a thabhann:

  • Pròiseasar: Intel Xeon 2 GHz (1 cridhe)
  • Siostam Linux (Debian, Ubuntu, CentOS airson taghadh)
  • 1 seòladh IPv4 sònraichte
  • 10 GB de stòradh dàta air draibhearan SSD clas iomairt luath
  • RAM: 512 MB
  • Bilean gach diog
  • Trafaig gun chrìoch

Tha an taraif fo ùmhlachd cuingealachaidhean teicnigeach a bharrachd, mion-fhiosrachadh air duilleag an tairgse fionnar againn - VPS airson 30 rubles. 

Cò dha a tha an frithealaiche brìgheil seo freagarrach? Tha, cha mhòr a h-uile duine: luchd-tòiseachaidh, luchd-dealasach, luchd-leasachaidh eòlach, luchd-leantainn DIY agus eadhon cuid de chompanaidhean.

Cò dha a tha an VPS seo freagarrach?

Tha sinn den bheachd gum faigh luchd-leughaidh Habr gu cinnteach an dòigh aca fhèin air an rèiteachadh seo a chleachdadh, ach chuir sinn romhainn an taghadh bheachdan againn fhèin a chruinneachadh - dè ma tha feum aig cuideigin air, ach nach eil fios aig na fir?

  • Cuir do làrach-lìn sìmplidh, pasgan, ath-thòiseachadh le còd, msaa. Gu dearbh, tha an làrach-lìn dealbhaichte agad fhèin a’ toirt deagh bheachd air an fhastaiche. Cuir e air an VPS agad agus bi cunntachail airson tèarainteachd agus seasmhachd na làraich thu fhèin, agus chan ann le luchd-obrach solaraichean aoigheachd cunbhalach.
  • Cleachd VPS airson adhbharan foghlaim: thoir aoigheachd don phròiseact agad, dèan sgrùdadh air feartan an t-siostaim obrachaidh frithealaiche is frithealaiche, feuch DNS, tinker le làrach foghlaim beag.
  • Airson fòn. Aig amannan feumaidh neach-tionnsgain fa-leth, neach-obrach neo-cheangailte no companaidh glè bheag fònadh IP gu cruaidh, agus tha luchd-obrachaidh an fhòn seo gu math sanntach. Tha e sìmplidh: bidh sinn a’ gabhail ar frithealaiche, a’ ceannach àireamh bho ghnìomhaiche fòn IP, a’ stèidheachadh PBX brìgheil agus a’ cruthachadh àireamhan a-staigh (ma tha sin riatanach). Tha na sàbhalaidhean uamhasach.
  • Cleachd am frithealaiche gus na h-aplacaidean agad a dhearbhadh.
  • Cleachd am frithealaiche airson deuchainnean DIY, a’ toirt a-steach smachd agus cruinneachadh dàta bho luchd-mothachaidh siostam dachaigh smart.
  • Is e dòigh neo-àbhaisteach air a chleachdadh a bhith a’ cur neach-cuideachaidh malairt iomlaid, inneal-fuadain malairt, air an fhrithealaiche. Bidh làn dhleastanas ort airson seasmhachd agus tèarainteachd an fhrithealaiche, a tha a’ ciallachadh gum faigh thu ionnstramaid fo smachd airson malairt air na margaidhean stoc. Uill, air eagal 's gu bheil ùidh aig duine sam bith no a' planadh :)

Tha tagraidhean ann airson an leithid de VPS anns an raon chorporra. A bharrachd air an t-seirbheis fòn a chaidh ainmeachadh roimhe, faodaidh tu grunn rudan inntinneach a chuir an gnìomh. Mar eisimpleir:

  • Cuir stòran-dàta beaga agus fiosrachadh a bhios ruigsinneach do luchd-obrach siubhail air astar, mar eisimpleir, a’ cleachdadh ftp. Leigidh seo leat mion-sgrùdaidhean ùra a iomlaid gu sgiobalta, rèiteachaidhean ùraichte airson luchd-reic, taisbeanaidhean, msaa.
  • Thoir cothrom sealach do luchd-cleachdaidh no teachdaichean gus bathar-bog no meadhanan a thaisbeanadh.

Dràibhear deuchainn VPS airson 30 rubles - air a dhèanamh dhutsa

Tha 30 rubles cho beag is nach eil thu eadhon airson cairt a thoirt a-mach airson pàigheadh ​​​​agus deuchainn. Tha sinn uaireannan cho leisg cuideachd, ach an turas seo rinn sinn a h-uile càil dhut. Mus do chuir sinn na frithealaichean air bhog gu cath, rinn sinn deuchainn gus sgrùdadh a dhèanamh air a h-uile mion-fhiosrachadh agus sealltainn dè as urrainn dha na frithealaichean aig a’ phrìs seo. Gus a dhèanamh nas inntinniche, chuir sinn fìor mhòr ris agus rinn sinn sgrùdadh air mar a bhiodh an rèiteachadh seo gad ghiùlan fhèin nam biodh an dùmhlachd agus an luchd nas àirde na na luachan a shuidhich sinn. 

Bha an aoigh fo luchd grunn innealan brìgheil a rinn diofar ghnìomhan air a ’phròiseasar agus a’ cleachdadh fo-shiostam diosc gu gnìomhach. Is e an t-amas a bhith a 'samhlachadh dùmhlachd àrd de shuidheachadh agus luchd a tha coltach ri no nas motha na fear sabaid.

A bharrachd air an luchd cunbhalach, chuir sinn a-steach 3 innealan brìgheil a chruinnich metrics synthetigeach a’ cleachdadh sysbench, agus chaidh na toraidhean cuibheasach dhiubh a thoirt seachad gu h-ìosal, agus 50 inneal brìgheil a chruthaich luchd a bharrachd. Bha an aon rèiteachadh aig a h-uile inneal brìgheil deuchainn (1 core, RAM 512 GB, SSD 10 GB), chaidh an ìomhaigh àbhaisteach debian 9.6 a thaghadh mar an siostam obrachaidh, a tha air a thabhann do luchd-cleachdaidh air RUVDS.

Chaidh an luchd a shamhlachadh ann an nàdar agus meud an coimeas ri sabaid:

  • Chaidh cuid de dh’ innealan brìgheil a chuir air bhog le luchd ìosal
  • Bha cuid de dh’ innealan a’ ruith sgriobt deuchainn a’ dèanamh atharrais air an luchd air a’ phròiseasar (a’ cleachdadh a’ ghoireas cuideim)
  • Air a’ phàirt a bha air fhàgail de na h-innealan mas-fhìor, ruith sinn sgriobt a chleachd dd airson dàta a chopaigeadh bho dhàta a chaidh ullachadh ro-làimh gu diosc le seata crìche a’ cleachdadh pv (chìthear eisimpleirean an seo и an seo).

Cuideachd, mar a chuimhnicheas tu, bha trì innealan againn a chruinnich metrics synthetigeach.

Air gach inneal, chaidh sgriobt a chuir gu bàs gach 15 mionaid, a bhios a’ ruith deuchainnean sysbench àbhaisteach airson pròiseasar, cuimhne agus diosc.

Sgriobt 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

Tha na toraidhean air an taisbeanadh airson goireasachd ann an cruth sysbench, ach chaidh na luachan cuibheasach airson na h-ùine deuchainn gu lèir a thoirt bho gach inneal, chithear an toradh an seo:

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

Tha na toraidhean taisbeanach, ach cha bu chòir an gabhail mar QoS fhathast. 

Innealan a chruthaicheas luchdan a bharrachd

Bog:

  • ullamh-Get ùrachadh
  • apt-get upgrade
  • na stàlaich python-pip
  • pip stàlaich mysql-connector-python-rf

MariaDB air a chuir a-steach, Mar a nì thu an seo:

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

Chaidh bunait deuchainn a ghabhail bho seo:

Tha an stòr-dàta air a chleachdadh mar a chaidh a shònrachadh an seo:

mysql -t < employees.sql
mysql -t < test_employees_sha.sql

Bunait deuchainn beag:

Clàr 

Cunnt sreathan 

Meud an dàta (MB)

Meud clàr-amais (KB)

roinnean 

9

0.02

16.00

roinn_emp 

331143 

11.52

5648.00

dept_manaidsear 

24 

0.02

16.00

luchd-obrach 

299379 

14.52

0.00

tuarastalan 

2838426 

95.63

0.00 

tiotalan 

442783 

19.56

0.00

Tha seirbheis deuchainn prìomhadail air a sgrìobhadh air a’ ghlùin ann am Python; bidh e a’ coileanadh ceithir obrachaidhean:

  1. getState: a 'tilleadh an inbhe
  2. getEmployee: a’ tilleadh luchd-obrach (+ tuarastalan, + tiotalan) bhon stòr-dàta
  3. patchEmployee: atharraich raointean luchd-obrach
  4. cuir a-steach Tuarastal: inserts a salary

Stòr seirbheis (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')

Thoir aire! Cha bu chòir an t-seirbheis seo a ghabhail mar eisimpleir no stiùireadh ann an suidheachadh sam bith!

Bithear a’ dèanamh deuchainnean a’ cleachdadh seann JMeter math. Chaidh sreath de dheuchainnean a mhair bho 15 mionaidean gu 2 uair a chuir air bhog, gun bhriseadh sam bith, bha an àireamh sa cheud de dh’iarrtasan ag atharrachadh, agus bha an gluasad eadar-dhealaichte bho 300 gu 600 iarrtas gach mionaid. An àireamh de snàithleanan bho 50 gu 500.

Leis gu bheil an stòr-dàta glè bheag, tha an àithne:

mysql -e "SHOW ENGINE INNODB STATUS"

A’ sealltainn gu bheil:

Buffer pool hit rate 923 / 1000, young-making rate 29 / 1000 not 32 / 1000

Gu h-ìosal tha na h-amannan freagairt cuibheasach airson iarrtasan:

label

cuibheasach

Meadhanach

90% loidhne

95% loidhne

99% loidhne

Am Faoilteach uairean

Max

faigh Neach-obrach

37.64

12.57

62.28

128.5

497.57

5

4151.78

faighStàit

17

7.57

30.14

58.71

193

3

2814.71

neach-obrach

161.42

83.29

308

492.57

1845.14

5

6639.4

cuir Tuarastal

167.21

86.93

315.34

501.07

1927.12

7

6722.44

Is dòcha gum bi e duilich dhut breithneachadh bho na toraidhean synthetigeach sin dè cho freagarrach ‘s a tha an VPS seo airson na gnìomhan sònraichte agad agus, san fharsaingeachd, tha na dòighean clàraichte cuingealaichte ris na cùisean sin ris an robh againn ri dèiligeadh ann an aon chruth no ann an dòigh eile. gu soilleir chan eil e iomlan. Tha sinn a’ toirt cuireadh dhut na co-dhùnaidhean agad fhèin a tharraing agus deuchainn a dhèanamh air an fhrithealaiche airson 30 rubles air na fìor thagraidhean agus gnìomhan agad agus na roghainnean agad airson an rèiteachadh seo a mholadh anns na beachdan.

Source: www.habr.com

Cuir beachd ann