ஐந்து ஆண்டுகளுக்கு முன்பு நான் டரான்டூலில் வேலை செய்ய முயற்சித்தேன், ஆனால் அது எனக்கு வேலை செய்யவில்லை. ஆனால் சமீபத்தில் நான் ஒரு வெபினாரை நடத்தினேன், அங்கு நான் ஹடூப் பற்றி பேசினேன், MapReduce எவ்வாறு செயல்படுகிறது என்பது பற்றி. அங்கு என்னிடம் ஒரு கேள்வி கேட்கப்பட்டது - "இந்த பணிக்கு ஏன் டரான்டூலைப் பயன்படுத்தக்கூடாது?".
ஆர்வத்திற்காக, நான் அதற்குத் திரும்பவும், சமீபத்திய பதிப்பைச் சோதிக்கவும் முடிவு செய்தேன் - இந்த நேரத்தில் நான் திட்டத்தை மிகவும் விரும்பினேன். இப்போது நான் டரான்டூலில் ஒரு எளிய பயன்பாட்டை எவ்வாறு எழுதுவது என்பதைக் காண்பிப்பேன், அதை ஏற்றி செயல்திறனைச் சரிபார்க்கவும், எல்லாம் எவ்வளவு எளிதானது மற்றும் குளிர்ச்சியானது என்பதை நீங்கள் காண்பீர்கள்.
டரான்டூல் என்றால் என்ன
டரான்டூல் தன்னை அதிவேக தரவுத்தளமாக நிலைநிறுத்துகிறது. நீங்கள் விரும்பும் எந்த தரவையும் அதில் வைக்கலாம். கூடுதலாக, அவற்றை நகலெடுக்கவும், ஷார்ட் - அதாவது, பல சேவையகங்களில் ஒரு பெரிய அளவிலான தரவைப் பிரித்து, அவற்றிலிருந்து முடிவுகளை ஒருங்கிணைக்கவும் - தவறுகளை பொறுத்துக்கொள்ளும் மாஸ்டர்-மாஸ்டர் இணைப்புகளை உருவாக்கவும்.
இரண்டாவதாக, இது ஒரு பயன்பாட்டு சேவையகம். உங்கள் பயன்பாடுகளை அதில் எழுதலாம், தரவுகளுடன் வேலை செய்யலாம், எடுத்துக்காட்டாக, சில விதிகளின்படி பின்னணியில் பழைய உள்ளீடுகளை நீக்கலாம். நீங்கள் நேரடியாக டரான்டுலாவில் ஒரு Http சேவையகத்தை எழுதலாம், அது தரவுகளுடன் வேலை செய்யும்: அவற்றின் எண்ணைக் கொடுங்கள், அங்கு புதிய தரவை எழுதுங்கள் மற்றும் அனைத்தையும் முதன்மையாகக் குறைக்கவும்.
தோழர்களே ஒரு 300-வரி செய்தி வரிசையை எவ்வாறு உருவாக்கினார்கள் என்பது பற்றிய ஒரு கட்டுரையைப் படித்தேன், அது கண்ணீர் மற்றும் துடிக்கிறது - அவர்கள் குறைந்தபட்ச செயல்திறன் வினாடிக்கு 20 செய்திகளைக் கொண்டுள்ளனர். இங்கே நீங்கள் உண்மையிலேயே திரும்பி மிகப் பெரிய பயன்பாட்டை எழுதலாம், மேலும் இவை PostgreS இல் உள்ளதைப் போல சேமிக்கப்படாது.
தோராயமாக அத்தகைய சேவையகம், எளிமையானது மட்டுமே, இந்த கட்டுரையில் விவரிக்க முயற்சிப்பேன்.
நிறுவல்
சோதனைக்காக, நான் மூன்று நிலையான மெய்நிகர் இயந்திரங்களைத் தொடங்கினேன் - 20 ஜிகாபைட் ஹார்ட் டிரைவ், உபுண்டு 18.04. 2 மெய்நிகர் CPU மற்றும் 4 ஜிகாபைட் நினைவகம்.
நாங்கள் டரான்டூலை நிறுவுகிறோம் - ஒரு பாஷ் ஸ்கிரிப்டை இயக்கவும் அல்லது ஒரு களஞ்சியத்தைச் சேர்த்து, டரான்டூலை நிறுவவும். ஸ்கிரிப்டிற்கான இணைப்பு - (சுருள் -எல்
tarantoolctl டரான்டுலா நிகழ்வுகளை நிர்வகிப்பதற்கான முக்கிய கட்டளை.
/etc/tarantool - இங்கே முழு கட்டமைப்பு உள்ளது.
var/log/tarantool - இங்கே பதிவுகள் உள்ளன.
var/lib/tarantool - இங்கே தரவு உள்ளது, பின்னர் அவை நிகழ்வுகளாக பிரிக்கப்படுகின்றன.
நிகழ்வு-கிடைக்கக்கூடிய மற்றும் நிகழ்வு-செயல்படுத்தும் கோப்புறைகள் உள்ளன - அதில் தொடங்கப்படுவதைக் கொண்டுள்ளது - லுவா குறியீட்டைக் கொண்ட நிகழ்வு உள்ளமைவு கோப்பு, இது எந்த போர்ட்களில் கேட்கிறது, அதற்கு என்ன நினைவகம் உள்ளது, வினைல் என்ஜின் அமைப்புகள், தொடக்கத்தில் செயல்படும் குறியீடு ஆகியவற்றை விவரிக்கிறது சேவையகங்கள், பகிர்தல், வரிசைகள், காலாவதியான தரவை நீக்குதல் மற்றும் பல.
நிகழ்வுகள் PostgreS இல் உள்ளதைப் போல வேலை செய்கின்றன. எடுத்துக்காட்டாக, வெவ்வேறு போர்ட்களில் தொங்கும் தரவுத்தளத்தின் பல நகல்களை இயக்க வேண்டும். ஒரு சேவையகத்தில் பல தரவுத்தள நிகழ்வுகள் தொடங்கப்படுகின்றன, அவை வெவ்வேறு துறைமுகங்களில் தொங்குகின்றன. அவை முற்றிலும் மாறுபட்ட அமைப்புகளைக் கொண்டிருக்கலாம் - ஒரு நிகழ்வு ஒரு தர்க்கத்தை செயல்படுத்துகிறது, இரண்டாவது - மற்றொன்று.
நிகழ்வு மேலாண்மை
எங்களிடம் tarantoolctl கட்டளை உள்ளது, இது டரான்டுலா நிகழ்வுகளை நிர்வகிக்க அனுமதிக்கிறது. எடுத்துக்காட்டாக, tarantoolctl சரிபார்ப்பு எடுத்துக்காட்டு, உள்ளமைவு கோப்பைச் சரிபார்த்து, தொடரியல் பிழைகள் இல்லை என்றால் கோப்பு சரி என்று கூறும்.
நிகழ்வின் நிலையை நீங்கள் பார்க்கலாம் - tarantoolctl நிலை உதாரணம். அதே வழியில், நீங்கள் தொடங்க, நிறுத்த, மறுதொடக்கம் செய்யலாம்.
ஒரு நிகழ்வு இயங்கியவுடன், அதை இணைக்க இரண்டு வழிகள் உள்ளன.
1. நிர்வாக பணியகம்
இயல்பாக, டரான்டூல் ஒரு சாக்கெட்டைத் திறந்து, டரான்டுலாவைக் கட்டுப்படுத்த எளிய ASCII உரையை அனுப்புகிறது. கன்சோலுக்கான இணைப்பு எப்போதும் நிர்வாகி பயனரின் கீழ் நிகழ்கிறது, அங்கீகாரம் இல்லை, எனவே டரான்டுலாவை வெளியே கட்டுப்படுத்த கன்சோல் போர்ட்டை நீங்கள் எடுக்க வேண்டியதில்லை.
இந்த வழியில் இணைக்க, நீங்கள் Tarantoolctl என்டர் இன்ஸ்டன்ஸ் பெயரை உள்ளிட வேண்டும். கட்டளை கன்சோலைத் தொடங்கி நிர்வாகி பயனராக இணைக்கும். கன்சோல் போர்ட்டை ஒருபோதும் வெளியில் காட்ட வேண்டாம் - அதை ஒரு யூனிட் சாக்கெட்டாக விடுவது நல்லது. பின்னர் சாக்கெட்டிற்கான எழுத்து அணுகல் உள்ளவர்கள் மட்டுமே டரான்டுலாவுடன் இணைக்க முடியும்.
நிர்வாக விஷயங்களுக்கு இந்த முறை தேவை. தரவுகளுடன் பணிபுரிய, இரண்டாவது முறையைப் பயன்படுத்தவும் - பைனரி நெறிமுறை.
2. ஒரு குறிப்பிட்ட போர்ட்டுடன் இணைக்க பைனரி நெறிமுறையைப் பயன்படுத்துதல்
உள்ளமைவில் கேட்கும் கட்டளை உள்ளது, இது வெளிப்புற தகவல்தொடர்புகளுக்கான துறைமுகத்தைத் திறக்கிறது. இந்த போர்ட் பைனரி நெறிமுறையுடன் பயன்படுத்தப்படுகிறது மற்றும் அங்கீகரிப்பு அங்கு செயல்படுத்தப்படுகிறது.
இந்த இணைப்பிற்கு, tarantoolctl இணைப்பு போர்ட் எண் பயன்படுத்தப்படுகிறது. இதைப் பயன்படுத்தி, நீங்கள் தொலை சேவையகங்களுடன் இணைக்கலாம், அங்கீகாரத்தைப் பயன்படுத்தலாம் மற்றும் பல்வேறு அணுகல் உரிமைகளை வழங்கலாம்.
தரவு பதிவு மற்றும் பெட்டி தொகுதி
டரான்டூல் ஒரு தரவுத்தளம் மற்றும் பயன்பாட்டு சேவையகமாக இருப்பதால், இது பல்வேறு தொகுதிகளைக் கொண்டுள்ளது. பாக்ஸ் தொகுதியில் நாங்கள் ஆர்வமாக உள்ளோம் - இது தரவுகளுடன் வேலை செய்கிறது. நீங்கள் ஒரு பெட்டியில் எதையாவது எழுதும்போது, டேரான்டூல் தரவை வட்டில் எழுதுகிறது, நினைவகத்தில் சேமிக்கிறது அல்லது வேறு ஏதாவது செய்கிறது.
சாதனை
எடுத்துக்காட்டாக, நாம் பெட்டி தொகுதிக்குள் சென்று box.once செயல்பாட்டை அழைக்கிறோம். சர்வர் துவக்கப்படும் போது, எங்கள் குறியீட்டை இயக்குவதற்கு Tarantool கட்டாயப்படுத்தும். எங்கள் தரவு சேமிக்கப்படும் இடத்தை நாங்கள் உருவாக்குகிறோம்.
local function bootstrap()
local space = box.schema.create_space('example')
space:create_index('primary')
box.schema.user.grant('guest', 'read,write,execute', 'universe')
-- Keep things safe by default
-- box.schema.user.create('example', { password = 'secret' })
-- box.schema.user.grant('example', 'replication')
-- box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
end
அதன் பிறகு, நாங்கள் ஒரு முதன்மை குறியீட்டை உருவாக்குகிறோம் - முதன்மையானது - இதன் மூலம் நாம் தரவைத் தேடலாம். முன்னிருப்பாக, அளவுருக்கள் எதுவும் குறிப்பிடப்படவில்லை எனில், ப்ரைமர் குறியீட்டிற்கான ஒவ்வொரு உள்ளீட்டிலும் முதல் புலம் பயன்படுத்தப்படும்.
பின்னர் விருந்தினர் பயனருக்கு மானியம் வழங்குகிறோம், அதன் கீழ் பைனரி நெறிமுறை மூலம் இணைக்கிறோம். முழு நிகழ்விலும் படிக்க, எழுத மற்றும் செயல்படுத்த அனுமதிக்கிறோம்.
வழக்கமான தரவுத்தளங்களுடன் ஒப்பிடுகையில், இங்கே எல்லாம் மிகவும் எளிமையானது. எங்களிடம் இடம் உள்ளது - எங்கள் தரவு வெறுமனே சேமிக்கப்படும் ஒரு பகுதி. ஒவ்வொரு நுழைவும் ஒரு டூப்பிள் என்று அழைக்கப்படுகிறது. இது ஒரு மெசேஜ் பேக்கில் தொகுக்கப்பட்டுள்ளது. இது மிகவும் அருமையான வடிவம் - இது பைனரி மற்றும் குறைந்த இடத்தை எடுக்கும் - 18 பைட்டுகள் மற்றும் 27.
அவருடன் பணிபுரிவது மிகவும் வசதியானது. கிட்டத்தட்ட ஒவ்வொரு வரியிலும், ஒவ்வொரு தரவு உள்ளீட்டிலும் முற்றிலும் வேறுபட்ட நெடுவரிசைகள் இருக்கலாம்.
Box.space கட்டளையைப் பயன்படுத்தி எல்லா இடங்களையும் பார்க்கலாம். ஒரு குறிப்பிட்ட நிகழ்வைத் தேர்ந்தெடுக்க, box.space உதாரணத்தை எழுதி, அதில் முழுத் தகவலைப் பெறுவோம்.
டரான்டூலில் இரண்டு வகையான என்ஜின்கள் உள்ளன: நினைவகம் மற்றும் வினைல். நினைவகம் அனைத்து தரவையும் நினைவகத்தில் சேமிக்கிறது. எனவே, எல்லாம் எளிமையாகவும் விரைவாகவும் வேலை செய்கிறது. தரவு வட்டில் டம்ப் செய்யப்படுகிறது, மேலும் எழுதுவதற்கு முன் பதிவு செய்யும் பொறிமுறையும் உள்ளது, எனவே சர்வர் செயலிழந்தால் எதையும் இழக்க மாட்டோம்.
வினைல் வட்டில் தரவை மிகவும் பழக்கமான வடிவத்தில் சேமிக்கிறது - அதாவது, எங்களிடம் உள்ள நினைவகத்தை விட அதிகமான தரவை நீங்கள் சேமிக்க முடியும், மேலும் டரான்டுலா அதை வட்டில் இருந்து படிக்கும்.
இப்போது நாம் நினைவகத்தைப் பயன்படுத்துவோம்.
unix/:/var/run/tarantool/example.control> box.space.example
---
- engine: memtx
before_replace: 'function: 0x41eb02c8'
on_replace: 'function: 0x41eb0568'
ck_constraint: []
field_count: 0
temporary: false
index:
0: &0
unique: true
parts:
- type: unsigned
is_nullable: false
fieldno: 1
id: 0
space_id: 512
type: TREE
name: primary
primary: *0
is_local: false
enabled: true
name: example
id: 512
...
unix/:/var/run/tarantool/example.control>
அட்டவணை:
எந்தவொரு இடத்திற்கும் முதன்மைக் குறியீடு உருவாக்கப்பட வேண்டும், ஏனெனில் அது இல்லாமல் எதுவும் இயங்காது. எந்த தரவுத்தளத்திலும், நாங்கள் முதல் புலத்தை உருவாக்குகிறோம் - பதிவு ஐடி.
பாகங்கள்:
இங்குதான் எங்கள் குறியீட்டில் என்ன இருக்கிறது என்பதைக் குறிப்பிடுகிறோம். இது ஒரு பகுதியைக் கொண்டுள்ளது - நாம் பயன்படுத்தும் முதல் புலம், கையொப்பமிடாதது - நேர்மறை முழு எண். ஆவணத்தில் இருந்து எனக்கு நினைவிருக்கும் வரையில், அதிகபட்சமாக 18 குவிண்டில்லியன் இருக்க முடியும். ரெண்டு நிறைய.
நாம் செருக கட்டளையைப் பயன்படுத்தி தரவைச் செருகலாம்.
unix/:/var/run/tarantool/example.control> box.space.example:insert{1, 'test1', 'test2'}
---
- [1, 'test1', 'test2']
...
unix/:/var/run/tarantool/example.control> box.space.example:insert{2, 'test2', 'test3', 'test4'}
---
- [2, 'test2', 'test3', 'test4']
...
unix/:/var/run/tarantool/example.control> box.space.example:insert{3, 'test3'}
---
- [3, 'test3']
...
unix/:/var/run/tarantool/example.control> box.space.example:insert{4, 'test4'}
---
- [4, 'test4']
...
unix/:/var/run/tarantool/example.control>
முதல் புலம் முதன்மை விசையாகப் பயன்படுத்தப்படுகிறது, எனவே அது தனிப்பட்டதாக இருக்க வேண்டும். நெடுவரிசைகளின் எண்ணிக்கையால் நாங்கள் வரையறுக்கப்படவில்லை, எனவே நாம் விரும்பும் அளவுக்கு தரவைச் செருகலாம். நான் மேலே விவரித்த MessagePack வடிவத்தில் அவை குறிப்பிடப்பட்டுள்ளன.
தரவு வெளியீடு
பின்னர் தேர்ந்த கட்டளையுடன் தரவைக் காட்டலாம்.
Box.example.select விசையுடன் {1} விரும்பிய உள்ளீட்டைக் காண்பிக்கும். சாவியைத் தவிர்த்தால், நம்மிடம் உள்ள அனைத்து பதிவுகளையும் பார்க்கலாம். அவை அனைத்தும் நெடுவரிசைகளின் எண்ணிக்கையில் வேறுபட்டவை, ஆனால் இங்கே, கொள்கையளவில், நெடுவரிசைகளின் கருத்து இல்லை - புல எண்கள் உள்ளன.
நீங்கள் விரும்பும் அளவுக்கு முற்றிலும் தரவு இருக்கலாம். உதாரணமாக, நாம் அவற்றை இரண்டாவது புலத்தில் தேட வேண்டும். இதைச் செய்ய, நாங்கள் ஒரு புதிய இரண்டாம் நிலை குறியீட்டை உருவாக்குகிறோம்.
box.space.example:create_index( ‘secondary’, { type = ‘TREE’, unique = false, parts = {{field = 2, type =’string’} }})
Create_index கட்டளையைப் பயன்படுத்துகிறோம்.
அதை இரண்டாம் நிலை என்கிறோம்.
அதன் பிறகு, நீங்கள் அளவுருக்களைக் குறிப்பிட வேண்டும். குறியீட்டு வகை TREE ஆகும். இது தனிப்பட்டதாக இல்லாமல் இருக்கலாம், எனவே நாம் Unique = false என உள்ளிடுகிறோம்.
அதன் பிறகு, எங்கள் குறியீட்டில் என்ன பகுதிகள் உள்ளன என்பதைக் குறிப்பிடுகிறோம். புலம் என்பது நாம் குறியீட்டை இணைக்கும் புலத்தின் எண்ணிக்கை மற்றும் சரம் வகையைக் குறிப்பிடுகிறது. அதனால் அது உருவாக்கப்பட்டது.
unix/:/var/run/tarantool/example.control> box.space.example:create_index('secondary', { type = 'TREE', unique = false, parts = {{field = 2, type = 'string'}}})
---
- unique: false
parts:
- type: string
is_nullable: false
fieldno: 2
id: 1
space_id: 512
type: TREE
name: secondary
...
unix/:/var/run/tarantool/example.control>
இப்போது நாம் இதை இப்படி அழைக்கலாம்:
unix/:/var/run/tarantool/example.control> box.space.example.index.secondary:select('test1')
---
- - [1, 'test1', 'test2']
...
பாதுகாப்பு
நிகழ்வை மறுதொடக்கம் செய்து மீண்டும் டேட்டாவை அழைக்க முயற்சித்தால், அவை இல்லை - எல்லாம் காலியாக இருப்பதைக் காண்போம். Tarantool சோதனைச் சாவடிகளை உருவாக்கி, தரவை வட்டில் சேமிப்பதால் இது நிகழ்கிறது, ஆனால் அடுத்த சேமிப்பிற்கு முன் வேலை செய்வதை நிறுத்தினால், எல்லா செயல்பாடுகளையும் இழப்போம் - ஏனென்றால் கடைசி சோதனைச் சாவடியிலிருந்து நாம் மீண்டு வருவோம், எடுத்துக்காட்டாக, இரண்டு மணி நேரத்திற்கு முன்பு.
ஒவ்வொரு வினாடியையும் சேமிப்பது வேலை செய்யாது - ஏனென்றால் தொடர்ந்து 20 ஜிபியை வட்டில் வைப்பது ஒரு யோசனை.
இதற்காக, எழுதுவதற்கு முன் பதிவு என்ற கருத்து கண்டுபிடிக்கப்பட்டு செயல்படுத்தப்பட்டது. அதன் உதவியுடன், தரவுகளின் ஒவ்வொரு மாற்றத்திற்கும், ஒரு சிறிய எழுதும் பதிவு கோப்பில் ஒரு பதிவு உருவாக்கப்படுகிறது.
சோதனைச் சாவடி வரை உள்ள ஒவ்வொரு நுழைவும் அவற்றில் சேமிக்கப்படும். இந்த கோப்புகளுக்கு, நாங்கள் அளவை அமைக்கிறோம் - எடுத்துக்காட்டாக, 64 எம்பி. அது நிரம்பியதும், பதிவு இரண்டாவது கோப்பிற்குச் செல்லத் தொடங்குகிறது. மறுதொடக்கத்திற்குப் பிறகு, டரான்டூல் கடைசி சோதனைச் சாவடியிலிருந்து மீண்டு, பின்னர் அது நிறுத்தப்படும் வரை அனைத்துப் பரிவர்த்தனைகளையும் சுருட்டுகிறது.
அத்தகைய பதிவைச் செய்ய, box.cfg அமைப்புகளில் (example.lua கோப்பில்) ஒரு விருப்பத்தை நீங்கள் குறிப்பிட வேண்டும்:
wal_mode = “write”;
தரவு பயன்பாடு
நாங்கள் இப்போது எழுதியதைக் கொண்டு, டேரான்டுலாவைப் பயன்படுத்தி தரவைச் சேமிக்க முடியும், மேலும் அது தரவுத்தளமாக மிக வேகமாகச் செயல்படும். இப்போது கேக் மீது செர்ரி - அதை நீங்கள் என்ன செய்ய முடியும்.
ஒரு விண்ணப்பத்தை எழுதுதல்
உதாரணமாக, டரான்டுலாவிற்கு அத்தகைய விண்ணப்பத்தை எழுதுவோம்
ஸ்பாய்லரின் கீழ் உள்ள பயன்பாட்டைப் பார்க்கவும்
box.cfg {
listen = '0.0.0.0:3301';
io_collect_interval = nil;
readahead = 16320;
memtx_memory = 128 * 1024 * 1024; -- 128Mb
memtx_min_tuple_size = 16;
memtx_max_tuple_size = 128 * 1024 * 1024; -- 128Mb
vinyl_memory = 128 * 1024 * 1024; -- 128Mb
vinyl_cache = 128 * 1024 * 1024; -- 128Mb
vinyl_max_tuple_size = 128 * 1024 * 1024; -- 128Mb
vinyl_write_threads = 2;
wal_mode = "write";
wal_max_size = 256 * 1024 * 1024;
checkpoint_interval = 60 * 60; -- one hour
checkpoint_count = 6;
force_recovery = true;
log_level = 5;
log_nonblock = false;
too_long_threshold = 0.5;
read_only = false
}
local function bootstrap()
local space = box.schema.create_space('example')
space:create_index('primary')
box.schema.user.create('example', { password = 'secret' })
box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
box.schema.user.create('repl', { password = 'replication' })
box.schema.user.grant('repl', 'replication')
end
-- for first run create a space and add set up grants
box.once('replica', bootstrap)
-- enabling console access
console = require('console')
console.listen('127.0.0.1:3302')
-- http config
local charset = {} do -- [0-9a-zA-Z]
for c = 48, 57 do table.insert(charset, string.char(c)) end
for c = 65, 90 do table.insert(charset, string.char(c)) end
for c = 97, 122 do table.insert(charset, string.char(c)) end
end
local function randomString(length)
if not length or length <= 0 then return '' end
math.randomseed(os.clock()^5)
return randomString(length - 1) .. charset[math.random(1, #charset)]
end
local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')
local httpd = http_server.new('0.0.0.0', 8080, {
log_requests = true,
log_errors = true
})
local router = http_router.new()
local function get_count()
local cnt = box.space.example:len()
return cnt
end
router:route({method = 'GET', path = '/count'}, function()
return {status = 200, body = json.encode({count = get_count()})}
end)
router:route({method = 'GET', path = '/token'}, function()
local token = randomString(32)
local last = box.space.example:len()
box.space.example:insert{ last + 1, token }
return {status = 200, body = json.encode({token = token})}
end)
prometheus = require('prometheus')
fiber = require('fiber')
tokens_count = prometheus.gauge("tarantool_tokens_count",
"API Tokens Count")
function monitor_tokens_count()
while true do
tokens_count:set(get_count())
fiber.sleep(5)
end
end
fiber.create(monitor_tokens_count)
router:route( { method = 'GET', path = '/metrics' }, prometheus.collect_http)
httpd:set_router(router)
httpd:start()
சின்னங்களை வரையறுக்கும் சில அட்டவணையை லுவாவில் அறிவிக்கிறோம். சீரற்ற சரத்தை உருவாக்க இந்த அட்டவணை தேவை.
local charset = {} do -- [0-9a-zA-Z]
for c = 48, 57 do table.insert(charset, string.char(c)) end
for c = 65, 90 do table.insert(charset, string.char(c)) end
for c = 97, 122 do table.insert(charset, string.char(c)) end
end
அதன் பிறகு, நாம் ஒரு செயல்பாட்டை அறிவிக்கிறோம் - randomString மற்றும் நீள மதிப்பை அடைப்புக்குறிக்குள் கொடுக்கிறோம்.
local function randomString(length)
if not length or length <= 0 then return '' end
math.randomseed(os.clock()^5)
return randomString(length - 1) .. charset[math.random(1, #charset)]
end
பின்னர் http ரூட்டர் மற்றும் http சேவையகத்தை எங்கள் டரான்டுலா சேவையகமான JSON உடன் இணைக்கிறோம், அதை நாங்கள் கிளையண்டிற்கு வழங்குவோம்.
local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')
அதன் பிறகு, அனைத்து http சேவையக இடைமுகங்களிலும் போர்ட் 8080 இல் தொடங்குகிறோம், இது அனைத்து கோரிக்கைகளையும் பிழைகளையும் பதிவு செய்யும்.
local httpd = http_server.new('0.0.0.0', 8080, {
log_requests = true,
log_errors = true
})
அடுத்து, போர்ட் 8080 / எண்ணிக்கையில் GET முறையுடன் கோரிக்கை வந்தால், ஒரு வரியிலிருந்து செயல்பாட்டை அழைக்கிறோம் என்று ஒரு வழியை அறிவிக்கிறோம். இது ஒரு நிலையை வழங்குகிறது - 200, 404, 403 அல்லது நாம் குறிப்பிடுவது.
router:route({method = 'GET', path = '/count'}, function()
return {status = 200, body = json.encode({count = get_count()})}
end)
உடலில், நாங்கள் json.encode ஐத் தருகிறோம், அதில் எண்ணிக்கை மற்றும் பெறுமதியைக் குறிப்பிடுகிறோம், இது எங்கள் தரவுத்தளத்தில் உள்ள பதிவுகளின் எண்ணிக்கையைக் காட்டுகிறது.
இரண்டாவது முறை
router:route({method = 'GET', path = '/token'}, function()
local token = randomString(32)
local last = box.space.example:len()
box.space.example:insert{ last + 1, token }
return {status = 200, body = json.encode({token = token})}
end)
வரிசையில் எங்கே திசைவி:பாதை({முறை = 'GET', பாதை = '/டோக்கன்'}, செயல்பாடு() நாங்கள் செயல்பாட்டை அழைக்கிறோம் மற்றும் ஒரு டோக்கனை உருவாக்குகிறோம்.
வரி உள்ளூர் டோக்கன் = randomString(32) 32 எழுத்துகள் கொண்ட சீரற்ற சரம்.
கோட்டில் உள்ளூர் கடைசி = box.space.example:len() கடைசி உறுப்பை வெளியே இழுக்கிறோம்.
மற்றும் வரிசையில் box.space.example:Insert{ last + 1, token } நாங்கள் எங்கள் தரவுத்தளத்தில் தரவை எழுதுகிறோம், அதாவது, ஐடியை 1 ஆல் அதிகரிக்கிறோம். இது போன்ற ஒரு விகாரமான வழியில் மட்டும் செய்ய முடியாது. டரான்டுலா இந்த வழக்குக்கான தொடர்களைக் கொண்டுள்ளது.
டோக்கனை அங்கே எழுதுகிறோம்.
இவ்வாறு, ஒரு கோப்பில் ஒரு விண்ணப்பத்தை எழுதினோம். நீங்கள் இப்போதே தரவை அணுகலாம், மேலும் பெட்டி தொகுதி உங்களுக்காக அனைத்து அழுக்கு வேலைகளையும் செய்யும்.
இது http கேட்கிறது மற்றும் தரவுகளுடன் வேலை செய்கிறது, எல்லாம் ஒரே நிகழ்வில் உள்ளது - பயன்பாடு மற்றும் தரவு இரண்டும். எனவே, எல்லாம் மிக விரைவாக நடக்கும்.
இயக்க, நாங்கள் http தொகுதியை நிறுவுகிறோம்:
நாங்கள் அதை எப்படி செய்கிறோம், ஸ்பாய்லரின் கீழ் பார்க்கவும்
root@test2:/# tarantoolctl rocks install http
Installing http://rocks.tarantool.org/http-scm-1.src.rock
Missing dependencies for http scm-1:
checks >= 3.0.1 (not installed)
http scm-1 depends on checks >= 3.0.1 (not installed)
Installing http://rocks.tarantool.org/checks-3.0.1-1.rockspec
Cloning into 'checks'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 28 (delta 1), reused 16 (delta 1), pack-reused 0
Receiving objects: 100% (28/28), 12.69 KiB | 12.69 MiB/s, done.
Resolving deltas: 100% (1/1), done.
Note: checking out '580388773ef11085015b5a06fe52d61acf16b201'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
No existing manifest. Attempting to rebuild...
checks 3.0.1-1 is now installed in /.rocks (license: BSD)
-- The C compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Found TARANTOOL: /usr/include (found version "2.4.2-80-g18f2bc82d")
-- Tarantool LUADIR is /.rocks/share/tarantool/rocks/http/scm-1/lua
-- Tarantool LIBDIR is /.rocks/share/tarantool/rocks/http/scm-1/lib
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:
version
-- Build files have been written to: /tmp/luarocks_http-scm-1-V4P9SM/http/build.luarocks
Scanning dependencies of target httpd
[ 50%] Building C object http/CMakeFiles/httpd.dir/lib.c.o
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:32:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c: In function ‘tpl_term’:
/usr/include/tarantool/lauxlib.h:144:15: warning: this statement may fall through [-Wimplicit-fallthrough=]
(*(B)->p++ = (char)(c)))
~~~~~~~~~~~^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:62:7: note: in expansion of macro ‘luaL_addchar’
luaL_addchar(b, '\');
^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:63:6: note: here
default:
^~~~~~~
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:39:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h: In function ‘tpe_parse’:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:147:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
type = TPE_TEXT;
~~~~~^~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:149:3: note: here
case TPE_LINECODE:
^~~~
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:40:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h: In function ‘httpfast_parse’:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:372:22: warning: this statement may fall through [-Wimplicit-fallthrough=]
code = 0;
~~~~~^~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:374:13: note: here
case status:
^~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:393:23: warning: this statement may fall through [-Wimplicit-fallthrough=]
state = message;
~~~~~~^~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:395:13: note: here
case message:
^~~~
[100%] Linking C shared library lib.so
[100%] Built target httpd
[100%] Built target httpd
Install the project...
-- Install configuration: "Debug"
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/VERSION.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lib/http/lib.so
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/tsgi_adapter.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/nginx_server/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/fs.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/matching.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/middleware.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/request.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/response.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/tsgi.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/utils.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/mime_types.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/codes.lua
http scm-1 is now installed in /.rocks (license: BSD)
root@test2:/#
ரன் செய்ய எங்களுக்கு ப்ரோமிதியஸும் தேவை:
root@test2:/# tarantoolctl rocks install prometheus
Installing http://rocks.tarantool.org/prometheus-scm-1.rockspec
Cloning into 'prometheus'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 19 (delta 2), reused 5 (delta 0), pack-reused 0
Receiving objects: 100% (19/19), 10.73 KiB | 10.73 MiB/s, done.
Resolving deltas: 100% (2/2), done.
prometheus scm-1 is now installed in /.rocks (license: BSD)
root@test2:/#
நாங்கள் தொடங்குகிறோம் மற்றும் தொகுதிகளை அணுகலாம்
root@test2:/# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Content-length: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive
{"token":"e2tPq9l5Z3QZrewRf6uuoJUl3lJgSLOI"}
root@test2:/# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Content-length: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive
{"token":"fR5aCA84gj9eZI3gJcV0LEDl9XZAG2Iu"}
root@test2:/# curl -D - -s http://127.0.0.1:8080/count
HTTP/1.1 200 Ok
Content-length: 11
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive
{"count":2}root@test2:/#
/எண்ணிக்கை நமக்கு நிலையை 200 தருகிறது.
/டோக்கன் ஒரு டோக்கனை வெளியிடுகிறது மற்றும் இந்த டோக்கனை தரவுத்தளத்தில் எழுதுகிறது.
சோதனை வேகம்
50 வினவல்களுக்கு ஒரு அளவுகோலை இயக்குவோம். போட்டி கோரிக்கைகள் 000 ஆக இருக்கும்.
root@test2:/# ab -c 500 -n 50000 http://127.0.0.1:8080/token
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests
Server Software: Tarantool
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /token
Document Length: 44 bytes
Concurrency Level: 500
Time taken for tests: 14.578 seconds
Complete requests: 50000
Failed requests: 0
Total transferred: 7950000 bytes
HTML transferred: 2200000 bytes
Requests per second: 3429.87 [#/sec] (mean)
Time per request: 145.778 [ms] (mean)
Time per request: 0.292 [ms] (mean, across all concurrent requests)
Transfer rate: 532.57 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 10 103.2 0 3048
Processing: 12 69 685.1 15 13538
Waiting: 12 69 685.1 15 13538
Total: 12 78 768.2 15 14573
Percentage of the requests served within a certain time (ms)
50% 15
66% 15
75% 16
80% 16
90% 16
95% 16
98% 21
99% 42
100% 14573 (longest request)
root@test2:/#
டோக்கன்கள் வழங்கப்படுகின்றன. நாங்கள் தொடர்ந்து தரவுகளை பதிவு செய்கிறோம். 99% கோரிக்கைகள் 42 மில்லி விநாடிகளில் முடிக்கப்பட்டன. அதன்படி, ஒரு சிறிய கணினியில் வினாடிக்கு சுமார் 3500 கோரிக்கைகள் உள்ளன, அங்கு 2 கோர்கள் மற்றும் 4 ஜிகாபைட் நினைவகம் உள்ளது.
நீங்கள் சில 50000 டோக்கனைத் தேர்ந்தெடுத்து அதன் மதிப்பைப் பார்க்கலாம்.
நீங்கள் http மட்டுமின்றி, உங்கள் தரவை செயலாக்கும் பின்னணி செயல்பாடுகளை இயக்கவும். கூடுதலாக, பல்வேறு தூண்டுதல்கள் உள்ளன. எடுத்துக்காட்டாக, நீங்கள் புதுப்பிப்புகளில் செயல்பாடுகளை அழைக்கலாம், ஏதாவது சரிபார்க்கலாம் - முரண்பாடுகளை சரிசெய்யலாம்.
நீங்கள் நேரடியாக தரவுத்தள சேவையகத்தில் ஸ்கிரிப்ட் பயன்பாடுகளை எழுதலாம், மேலும் எதையும் வரையறுக்காமல், எந்த தொகுதிகளையும் இணைக்கலாம் மற்றும் எந்த தர்க்கத்தையும் செயல்படுத்தலாம்.
பயன்பாட்டு சேவையகம் வெளிப்புற சேவையகங்களை அணுகலாம், தரவை சேகரித்து அதன் தரவுத்தளத்தில் சேர்க்கலாம். இந்த தரவுத்தளத்தில் உள்ள தரவு பிற பயன்பாடுகளால் பயன்படுத்தப்படும்.
இது டரான்டுலாவால் செய்யப்படும், மேலும் ஒரு தனி விண்ணப்பத்தை எழுத வேண்டிய அவசியமில்லை.
முடிவில்
இது ஒரு பெரிய வேலையின் முதல் பகுதி. இரண்டாவது மிக விரைவில் Mail.ru குழு வலைப்பதிவில் வெளியிடப்படும், மேலும் இந்த கட்டுரையில் அதற்கான இணைப்பை கண்டிப்பாக சேர்ப்போம்.
நாங்கள் ஆன்லைனில் இந்த விஷயங்களை உருவாக்கும் நிகழ்வுகளில் கலந்துகொள்ளவும், உண்மையான நேரத்தில் கேள்விகளைக் கேட்கவும் நீங்கள் ஆர்வமாக இருந்தால், இணைக்கவும்
நீங்கள் மேகக்கணிக்கு செல்ல வேண்டும் அல்லது உங்கள் உள்கட்டமைப்பு பற்றி கேள்விகள் இருந்தால்,
PS எங்களிடம் மாதத்திற்கு 2 இலவச தணிக்கைகள் உள்ளன, ஒருவேளை உங்கள் திட்டம் அவற்றில் ஒன்றாக இருக்கலாம்.
ஆதாரம்: www.habr.com