Yana da kyau sosai lokacin da duk ƙananan abubuwan da ake buƙata suna kusa: alkalami mai kyau da faifan rubutu, fensir mai kaifi, linzamin kwamfuta mai dadi, wasu ƙarin wayoyi, da sauransu. Wadannan abubuwan da ba a san su ba ba sa jawo hankali, amma suna kara jin dadi ga rayuwa. Haka labarin yake tare da aikace-aikacen wayar hannu da tebur daban-daban: don dogon hotuna, don rage girman hoto, don ƙididdige kuɗaɗen sirri, ƙamus, masu fassara, masu canzawa, da sauransu. Kuna da daya? VPS - wanda ba shi da tsada, koyaushe yana hannun kuma yana kawo fa'idodi da yawa? A'a, ba wanda kuke da shi a cikin kamfanin ku ba, amma naku, "aljihu" ɗaya. Mun yi tunanin cewa ba tare da ƙaramin VPS ba a cikin 2019 abin baƙin ciki ne ko ta yaya, kamar ba tare da alkalami na marmaro na yau da kullun ba a lacca. Me yasa za ku yi baƙin ciki? Lokacin bazara ne. Yaya lokacin rani? Lokacin bazara don ƙwararren IT: zaune a gida, yin aiki akan ayyukan da kuka fi so ba tare da wani nadama ba. Gabaɗaya, mun yi tunani kuma mun aikata shi.
Kwaminisanci ya iso 'yan'uwa.
Ya kasance kamar haka - VPS ɗinmu na talatin
Mun karanta labarai da yawa daga masu fafatawa da masu amfani waɗanda suka rubuta shekaru 3-4 da suka gabata game da dalilin da yasa ba a buƙatar VPS mara tsada. To, haka ne, to, VPS "na dinari" ya kasance tallace-tallace mai tsabta kuma ba zai iya ba da damar aiki na yau da kullum ba. Amma lokuta suna canzawa, farashin albarkatun kayan aiki yana zama ƙasa da ƙasa, kuma don 30 rubles a wata muna shirye don bayar da wannan:
Mai sarrafawa: Intel Xeon 2 GHz (1 core)
Tsarin Linux (Debian, Ubuntu, CentOS don zaɓar daga)
1 adireshin IPv4 na musamman
10 GB na ajiyar bayanai akan faifan SSD-aji mai sauri na kasuwanci
RAM: 512 MB
Biyan kuɗi na biyu
Unlimited zirga-zirga
Farashin kuɗin fito yana ƙarƙashin ƙarin hani na fasaha, cikakkun bayanai akan page tayin mu mai kyau - VPS don 30 rubles.
Wanene wannan rumbun sabar da ta dace da ita? Ee ga kusan kowa da kowa: masu farawa, masu goyon baya, ƙwararrun masu haɓakawa, masu sha'awar DIY har ma da wasu kamfanoni.
Menene wannan VPS ya dace da shi?
Muna tsammanin cewa masu karatun Habr tabbas za su sami nasu hanyar yin amfani da wannan tsari, amma mun yanke shawarar tattara namu zaɓi na ra'ayoyin - menene idan wani yana buƙata, amma mazan ba su sani ba?
Sanya gidan yanar gizon ku mai sauƙi, fayil ɗin fayil, ci gaba tare da lamba, da sauransu. Tabbas, gidan yanar gizon ku da aka tsara yana da tasiri mai kyau akan mai aiki. Sanya shi akan VPS ɗin ku kuma ku kasance masu alhakin tsaro da kwanciyar hankali na rukunin yanar gizon da kanku, kuma ba ta hanyar ma'aikatan masu ba da sabis na yau da kullun ba.
Yi amfani da VPS don dalilai na ilimi: karbi bakuncin aikinku, nazarin fasalulluka na uwar garken da tsarin aiki na uwar garken, gwaji tare da DNS, tinker tare da ƙaramin rukunin ilimi.
Don wayar tarho. Wani lokaci mutum dan kasuwa, mai zaman kansa ko kuma karamin kamfani yana matukar bukatar wayar IP, kuma masu gudanar da wannan wayar suna da kwadayin gaske. Abu ne mai sauƙi: muna ɗaukar sabar mu, siyan lamba daga afaretan wayar IP, saita PBX mai kama da ƙirƙira lambobi na ciki (idan ya cancanta). Adadin yana da yawa.
Yi amfani da uwar garken don gwada aikace-aikacenku.
Yi amfani da sabar don gwaje-gwajen DIY, gami da sarrafawa da tattara bayanai daga firikwensin tsarin gida mai kaifin baki.
Wata sabuwar hanyar amfani da ita ita ce sanya mataimakiyar ciniki ta musanya, mutum-mutumin ciniki, akan sabar. Za ku kasance da cikakken alhakin kwanciyar hankali da tsaro na uwar garken, wanda ke nufin za ku karbi kayan aiki mai sarrafawa don ciniki a kan kasuwannin hannun jari. To, idan wani yana da sha'awa ko shirin :)
Akwai aikace-aikace don irin wannan VPS a cikin tsarin kamfani. Baya ga sabis ɗin tarho da aka ambata, zaku iya aiwatar da abubuwa masu ban sha'awa da yawa. Misali:
Sanya ƙananan bayanan bayanai da bayanan da za su sami dama ga ma'aikatan tafiya a nesa, misali, ta amfani da ftp. Wannan zai ba ku damar musanya sabbin ƙididdiga cikin sauri, sabunta saitunan masu siyarwa, gabatarwa, da sauransu.
Ba da damar ɗan lokaci ga masu amfani ko abokan ciniki don nuna software ko kafofin watsa labarai.
Gwajin gwajin VPS na 30 rubles - an yi muku
30 rubles kaɗan ne wanda ba kwa son ɗaukar katin don biya da gwadawa. Mu wani lokacin ma kasalaci ne, amma wannan lokacin mun yi muku komai. Kafin ƙaddamar da sabobin cikin yaƙi, mun gudanar da gwaji don bincika duk cikakkun bayanai kuma mu nuna abin da sabobin ke iya a wannan jadawalin kuɗin fito. Don yin shi mafi ban sha'awa, mun ƙara matsananci kuma mun duba yadda wannan tsarin zai kasance idan yawa da kaya sun wuce ƙimar da muka saita.
Mai watsa shiri yana ƙarƙashin nauyin injuna masu kama-da-wane da yawa waɗanda suka yi ayyuka daban-daban akan na'urar kuma suna amfani da tsarin faifai. Manufar ita ce a kwaikwayi babban adadin jeri da kaya mai kama da ko mafi girma fiye da na fama.
Bugu da ƙari, nauyin kullun, mun shigar da na'urori masu mahimmanci guda 3 waɗanda suka tattara ma'auni na synthetic ta amfani da sysbench, matsakaicin sakamakon da aka ba da shi a ƙasa, da kuma na'urori 50 masu mahimmanci waɗanda suka haifar da ƙarin kaya. Duk injunan gwaji suna da tsari iri ɗaya (1 core, RAM 512 GB, SSD 10 GB), an zaɓi madaidaicin hoton debian 9.6 azaman tsarin aiki, wanda aka ba wa masu amfani akan RUVDS.
An kwaikwayi nauyin a cikin yanayi da girma mai kama da yaƙi:
An ƙaddamar da wasu injunan kama-da-wane da ƙananan kaya
Wasu injina sun gudanar da rubutun gwajin da ke kwaikwaya lodi akan na'ura mai sarrafawa (ta amfani da mai amfani danniya)
A kan sauran na'urori masu kama-da-wane, mun gudanar da rubutun da ke amfani da dd don kwafin bayanai daga bayanan da aka riga aka shirya zuwa faifai tare da iyakataccen saiti ta amfani da pv (misalan za a iya gani). a nan и a nan).
Har ila yau, kamar yadda kuka tuna, muna da inji guda uku waɗanda suka tattara ma'auni na roba.
A kan kowace na'ura, an aiwatar da rubutun a cyclyly kowane minti 15, wanda ke gudanar da daidaitattun gwaje-gwajen sysbench don processor, ƙwaƙwalwar ajiya da faifai.
Rubutun 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
Ana gabatar da sakamakon don dacewa a cikin tsarin sysbench, amma matsakaicin ƙimar duk lokacin gwaji an ɗauke shi daga duk injina, ana iya ganin sakamakon anan:
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
Sakamakon yana nuni ne, amma har yanzu bai kamata a ɗauke shi azaman QoS ba.
Ana tura bayanan bayanai kamar yadda aka ƙayyade a nan:
mysql -t < employees.sql
mysql -t < test_employees_sha.sql
Ƙananan ginin gwaji:
Table
Lissafin Lissafi
Girman bayanai (MB)
Girman Fihirisa (KB)
sassan
9
0.02
16.00
dept_emp
331143
11.52
5648.00
dept_manager
24
0.02
16.00
ma'aikata
299379
14.52
0.00
albashi
2838426
95.63
0.00
sunayen sarauta
442783
19.56
0.00
An rubuta sabis ɗin gwaji na farko akan gwiwa a Python; yana yin ayyuka huɗu:
getState: yana dawo da matsayi
getEmployee: mayar da ma'aikata (+ albashi, + lakabi) daga ma'ajin bayanai
ma'aikaci: canza filayen ma'aikata
saka Salary: saka albashi
Tushen sabis (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')
Tsanaki Babu wani yanayi da ya kamata a ɗauki wannan sabis ɗin a matsayin misali ko jagora!
Ana yin gwaje-gwaje ta amfani da tsohuwar JMeter mai kyau. An ƙaddamar da jerin gwaje-gwajen da za a yi daga mintuna 15 zuwa sa'o'i 2, ba tare da katsewa ba, adadin buƙatun ya bambanta, kuma abin da ake samarwa ya bambanta daga buƙatun 300 zuwa 600 a cikin minti ɗaya. Yawan zaren daga 50 zuwa 500.
Saboda gaskiyar cewa ma'ajin bayanan yana da kankanta, umarni:
mysql -e "SHOW ENGINE INNODB STATUS"
Ya nuna cewa:
Buffer pool hit rate 923 / 1000, young-making rate 29 / 1000 not 32 / 1000
A ƙasa akwai matsakaicin lokacin amsa buƙatun:
Lakabin
Talakawan
Median
Layi 90%.
Layi 95%.
Layi 99%.
min
Max
samun Ma'aikaci
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
ma'aikacin faci
161.42
83.29
308
492.57
1845.14
5
6639.4
sa Albashi
167.21
86.93
315.34
501.07
1927.12
7
6722.44
Yana iya zama da wahala a gare ku ku yanke hukunci daga waɗannan sakamakon haɗin gwiwa yadda ya dace da wannan VPS don takamaiman ayyukanku kuma, gabaɗaya, hanyoyin da aka lissafa suna iyakance ga waɗannan lamuran waɗanda dole ne mu magance su a cikin nau'i ɗaya ko wata. Don haka jerinmu shine. a fili ba gamawa ba. Muna gayyatar ku don zana ra'ayoyin ku kuma gwada sabar don 30 rubles akan ainihin aikace-aikacenku da ayyukanku kuma ku ba da shawarar zaɓuɓɓukanku don wannan saitin a cikin sharhi.