Odoo (पहले OpenERP के नाम से जाना जाता था) ओपन-सोर्स बिजनेस ऐप का एक सूट है। यह दो संस्करणों में आता है - समुदाय और उद्यम। इस प्लेटफ़ॉर्म के भीतर एकीकृत कुछ सबसे लोकप्रिय ऐप (और मुफ़्त!) हैं, चर्चा, सीआरएम, इन्वेंटरी, वेबसाइट, कर्मचारी, अवकाश, भर्ती, व्यय, लेखा, चालान, बिक्री का स्थान और बहुत कुछ।
इस ब्लॉग पोस्ट में, हम देखेंगे कि उच्च उपलब्धता और मापनीयता प्राप्त करने के लिए ओडू को कैसे क्लस्टर किया जाए। यह पोस्ट ड्रूपल, वर्डप्रेस, मैगेंटो को स्केल करने पर हमारे पिछले पोस्ट के समान है। इस्तेमाल किए गए सॉफ्टवेयर्स ओडू 12, हैप्रोक्सी 1.8.8, Keepalived 1.3.9, PostgreSQL 11 और OCFS2 (ओरेकल क्लस्टर फाइल सिस्टम) हैं।
हमारे सेटअप में 6 सर्वर हैं:
- lb1 (HAProxy) + रख-रखाव + ClusterControl - 192.168.55.101
- lb2 (HAProxy) + रख-रखाव + साझा भंडारण - 192.168.55.102
- odoo1 - 192.168.55.111
- odoo2 - 192.168.55.112
- postgresql1 (मास्टर) - 192.168.55.121
- postgresql2 (दास) - 192.168.55.122
सभी नोड उबंटू 18.04.2 एलटीएस (बायोनिक) पर चल रहे हैं। हम PostgreSQL, Keepalived और HAProxy को तैनात और प्रबंधित करने के लिए ClusterControl का उपयोग करेंगे क्योंकि यह हमें काम का एक गुच्छा बचाएगा। ClusterControl LB1 पर HAProxy के साथ सह-स्थित होगा, जबकि हम साझा स्टोरेज प्रदाता के रूप में उपयोग करने के लिए lb2 में एक अतिरिक्त डिस्क जोड़ेंगे। इस डिस्क को एक साझा निर्देशिका के रूप में OCFS2 नामक क्लस्टर फ़ाइल सिस्टम का उपयोग करके माउंट किया जाएगा। एक आभासी आईपी पता, 192.168.55.100 हमारी डेटाबेस सेवा के लिए एकल समापन बिंदु के रूप में कार्य करता है।
निम्नलिखित आरेख हमारे संपूर्ण सिस्टम आर्किटेक्चर को दर्शाता है:
सभी नोड्स पर /etc/hosts की सामग्री निम्नलिखित है:
192.168.55.101 lb1.local lb1 cc.local cc
192.168.55.102 lb2.local lb2 storage.local storage
192.168.55.111 odoo1.local odoo1
192.168.55.112 odoo2.local odoo2
192.168.55.121 postgresql1.local postgresql1
192.168.55.122 postgresql2.local postgresql2
PostgreSQL स्ट्रीमिंग प्रतिकृति परिनियोजित करना
हम lb1:
. पर ClusterControl स्थापित करके शुरुआत करेंगे$ wget severalnines.com/downloads/cmon/install-cc
$ chmod 755 ./install-cc
$ sudo ./install-cc
स्थापना विज़ार्ड का पालन करें, प्रक्रिया के दौरान आपको कुछ प्रश्नों के उत्तर देने होंगे।
ClusterControl नोड (lb1) से पासवर्ड रहित SSH को उन सभी नोड्स में सेटअप करें जिन्हें ClusterControl द्वारा प्रबंधित किया जाएगा, जो कि lb1 (स्वयं), lb2, postresql1 और postgresql2 है। लेकिन पहले, एक SSH कुंजी जनरेट करें:
$ whoami
ubuntu
$ ssh-keygen -t rsa # press Enter on all prompts
फिर ssh-copy-id टूल का उपयोग करके सभी लक्ष्य नोड्स की कुंजी को कॉपी करें:
$ whoami
ubuntu
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]
http://192.168.55.101/clustercontrol . पर ClusterControl UI खोलें और पासवर्ड के साथ एक सुपर एडमिन यूजर बनाएं। आपको ClusterControl UI डैशबोर्ड पर रीडायरेक्ट कर दिया जाएगा। फिर, शीर्ष मेनू में "तैनाती" बटन पर क्लिक करके एक नया PostgreSQL क्लस्टर तैनात करें। आपको निम्नलिखित परिनियोजन संवाद के साथ प्रस्तुत किया जाएगा:
अगले डायलॉग में हमने जो टाइप किया है, वह यहां दिया गया है, "डिफाइन पोस्टग्रेएसक्यूएल सर्वर्स":
- सर्वर पोर्ट:5432
- उपयोगकर्ता:पोस्टग्रेज
- पासवर्ड:s3cr3t
- संस्करण:11
- दातादिर:<खाली छोड़ दें>
- भंडार:विक्रेता भंडार का उपयोग करें
"डिफाइन टोपोलॉजी" सेक्शन पर, पोस्टग्रेस्क्ल1 और पोस्टग्रेस्क्ल2 के आईपी एड्रेस को तदनुसार निर्दिष्ट करें:
अंतिम खंड "परिनियोजन सारांश" के तहत आपके पास तुल्यकालिक प्रतिकृति को सक्षम करने का विकल्प है। चूंकि हम केवल फेलओवर उद्देश्यों के लिए दास का उपयोग करेंगे (गुलाम किसी भी रीड ऑपरेशंस की सेवा नहीं करेगा), हम डिफ़ॉल्ट मान को वैसे ही छोड़ देते हैं। फिर, डेटाबेस क्लस्टर परिनियोजन प्रारंभ करने के लिए "तैनाती" दबाएँ। आप गतिविधि> नौकरियां> क्लस्टर बनाएं को देखकर परिनियोजन प्रगति की निगरानी कर सकते हैं :
इस बीच, कुछ कॉफी लें और क्लस्टर परिनियोजन 10 ~ 15 मिनट के भीतर पूरा हो जाना चाहिए।
PostgreSQL सर्वर के लिए लोड बैलेंसर्स और वर्चुअल आईपी तैनात करना
इस बिंदु पर, हमारे पास पहले से ही एक मास्टर-स्लेव सेटअप में दो-नोड PostgreSQL प्रतिकृति क्लस्टर चल रहा है:
अगला कदम हमारे डेटाबेस के लिए लोड बैलेंसर टियर को तैनात करना है, जो हमें इसे वर्चुअल आईपी एड्रेस से जोड़ने और एप्लिकेशन के लिए सिंगल एंडपॉइंट प्रदान करने की अनुमति देता है। हम नीचे के रूप में HAProxy परिनियोजन विकल्पों को कॉन्फ़िगर करेंगे:
एप्लिकेशन मूल रूप से रीड-राइट विभाजन का समर्थन नहीं करता है इसलिए हम उच्च उपलब्धता प्राप्त करने के लिए सक्रिय-निष्क्रिय विधि का उपयोग करेंगे। सबसे अच्छा लोड संतुलन एल्गोरिथ्म "स्रोत" नीति है, क्योंकि हम एक समय में केवल एक PostgreSQL नोड का उपयोग कर रहे हैं।
दूसरे लोड बैलेंसर, lb2 के लिए भी यही चरण दोहराएं। इसके बजाय "सर्वर पता" को 192.168.55.102 में बदलें। यदि आप Nodes पृष्ठ के अंतर्गत जाते हैं, तो परिनियोजन पूर्ण होने के बाद यह कैसा दिखता है:
पहले श्रोता पर लाल रेखा अपेक्षित है जहाँ HAProxy दिखाता है कि postgresql2 (192.168.55.122) डाउन है क्योंकि स्वास्थ्य जांच स्क्रिप्ट नोड ऊपर है लेकिन मास्टर नहीं है। ब्लू लाइन (haproxy_5434_ro) के साथ दूसरा श्रोता दिखाता है कि नोड यूपी है लेकिन "बैकअप" स्थिति में है। इस श्रोता को अनदेखा किया जा सकता है, हालांकि एप्लिकेशन पढ़ने-लिखने के विभाजन का समर्थन नहीं करता है।
इसके बाद, हम इन लोड बैलेंसरों के शीर्ष पर Keepalived इंस्टेंसेस को एक वर्चुअल IP पते के साथ जोड़ने के लिए तैनात करते हैं। प्रबंधित करें -> बैलेंसर लोड करें -> Keepalived -> Keepalived तैनात करें . पर जाएं और पहले और दूसरे HAProxy उदाहरणों को निर्दिष्ट करें, फिर सुनने के लिए वर्चुअल IP पता और नेटवर्क इंटरफ़ेस:
परिनियोजन प्रारंभ करने के लिए "रख-रखाव तैनात करें" पर क्लिक करें। PostgreSQL कनेक्शन सेवा अब किसी भी डेटाबेस नोड के लिए संतुलित लोड है और 192.168.55.100 पोर्ट 5433 के माध्यम से सुलभ है।
iSCSI को कॉन्फ़िगर करना
स्टोरेज सर्वर (LB2) को iSCSI के माध्यम से एक डिस्क को निर्यात करने की आवश्यकता है ताकि इसे Odoo एप्लिकेशन सर्वर (odoo1 और odoo2) दोनों पर माउंट किया जा सके। iSCSI मूल रूप से आपके कर्नेल को बताता है कि आपके पास एक SCSI डिस्क है, और यह उस एक्सेस को IP पर स्थानांतरित करता है। "सर्वर" को "लक्ष्य" कहा जाता है और "क्लाइंट" जो उस आईएससीएसआई डिवाइस का उपयोग करता है वह "आरंभकर्ता" है।
सबसे पहले, lb2 में iSCSI लक्ष्य स्थापित करें:
$ sudo apt install -y tgt
बूट पर tgt सक्षम करें:
$ systemctl enable tgt
फ़ाइल सिस्टम क्लस्टरिंग के लिए एक अलग डिस्क रखना पसंद किया जाता है। इस प्रकार, हम एप्लिकेशन सर्वर (odoo1 और odoo2) के बीच साझा करने के लिए lb2 (/dev/sdb) में माउंट की गई एक अन्य डिस्क का उपयोग करने जा रहे हैं। सबसे पहले, tgtadm टूल का उपयोग करके एक iSCSI लक्ष्य बनाएं:
$ sudo tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2019-02.lb2:odcfs2
फिर, ब्लॉक डिवाइस /dev/sdb को लॉजिकल यूनिट नंबर (LUN) 1 को टारगेट आईडी 1 के साथ असाइन करें:
$ sudo tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sdb
फिर, उसी नेटवर्क पर आरंभकर्ता नोड्स को इस लक्ष्य तक पहुंचने की अनुमति दें:
$ sudo tgtadm --lld iscsi --op bind --mode target --tid 1 --initiator-address 192.168.55.0/24
iSCSI कॉन्फ़िगरेशन लाइनों को डंप करने के लिए tgt-admin टूल का उपयोग करें और इसे कॉन्फ़िगरेशन फ़ाइल के रूप में सहेजें ताकि इसे पुनरारंभ करने के लिए लगातार बना रहे:
$ sudo tgt-admin --dump > /etc/tgt/conf.d/shareddisk.conf
अंत में, iSCSI लक्ष्य सेवा पुनः प्रारंभ करें:
$ sudo systemctl restart tgt
** odoo1 और odoo2 पर निम्न चरणों का पालन किया जाना चाहिए।
संबंधित मेजबानों पर iSCSI आरंभकर्ता स्थापित करें:
$ sudo apt-get install -y open-iscsi
iSCSI आरंभकर्ता को स्वचालित रूप से प्रारंभ करने के लिए सेट करें:
$ sudo systemctl enable open-iscsi
iSCSI लक्ष्य खोजें जिन्हें हमने पहले सेट किया है:
$ sudo iscsiadm -m discovery -t sendtargets -p lb2
192.168.55.102:3260,1 iqn.2019-02.lb2:odcfs2
यदि आप ऊपर के समान परिणाम देखते हैं, तो इसका मतलब है कि हम देख सकते हैं और iSCSI लक्ष्य से जुड़ने में सक्षम हैं। lb2 पर iSCSI लक्ष्य से जुड़ने के लिए निम्न कमांड का उपयोग करें:
$ sudo iscsiadm -m node --targetname iqn.2019-02.lb2:odcfs2 -p lb2 -l
Logging in to [iface: default, target: iqn.2019-02.lb2:odcfs2, portal: 192.168.55.102,3260] (multiple)
Login to [iface: default, target: iqn.2019-02.lb2:odcfs2, portal: 192.168.55.102,3260] successful.
सुनिश्चित करें कि आप /dev निर्देशिका के अंतर्गत सूचीबद्ध नई हार्ड डिस्क (/dev/sdb) देख सकते हैं:
$ sudo ls -1 /dev/sd*
/dev/sda
/dev/sda1
/dev/sda2
/dev/sda3
/dev/sdb
हमारी साझा डिस्क अब दोनों एप्लिकेशन सर्वर (odoo1 और odoo2) पर आरोहित है।
Odoo के लिए OCFS2 को कॉन्फ़िगर करना
** निम्नलिखित चरणों को odoo1 पर निष्पादित किया जाना चाहिए जब तक कि अन्यथा निर्दिष्ट न हो।
OCFS2 फाइल सिस्टम को एक से अधिक स्थानों पर माउंट करने की अनुमति देता है। odoo1 और odoo2 दोनों सर्वरों पर OCFS2 टूल इंस्टॉल करें:
$ sudo apt install -y ocfs2-tools
हार्ड डिस्क ड्राइव /dev/sdb के लिए डिस्क विभाजन तालिका बनाएं:
$ sudo cfdisk /dev/sdb
cfdisk विज़ार्ड में निम्नलिखित अनुक्रमों का उपयोग करके एक विभाजन बनाएँ:नया> प्राथमिक> आकार स्वीकार करें> लिखें> हाँ> छोड़ें ।
/dev/sdb1 पर एक OCFS2 फ़ाइल सिस्टम बनाएँ:
$ sudo mkfs.ocfs2 -b 4K -C 128K -L "Odoo_Cluster" /dev/sdb1
mkfs.ocfs2 1.8.5
Cluster stack: classic o2cb
Label: Odoo_Cluster
Features: sparse extended-slotmap backup-super unwritten inline-data strict-journal-super xattr indexed-dirs refcount discontig-bg append-dio
Block size: 4096 (12 bits)
Cluster size: 131072 (17 bits)
Volume size: 21473656832 (163831 clusters) (5242592 blocks)
Cluster groups: 6 (tail covers 2551 clusters, rest cover 32256 clusters)
Extent allocator size: 4194304 (1 groups)
Journal size: 134217728
Node slots: 8
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 3 block(s)
Formatting Journals: done
Growing extent allocator: done
Formatting slot map: done
Formatting quota files: done
Writing lost+found: done
mkfs.ocfs2 successful
/etc/ocfs2/cluster.conf पर क्लस्टर कॉन्फ़िगरेशन फ़ाइल बनाएं और नोड और क्लस्टर निर्देशों को नीचे परिभाषित करें:
# /etc/ocfs2/cluster.conf
cluster:
node_count = 2
name = ocfs2
node:
ip_port = 7777
ip_address = 192.168.55.111
number = 1
name = odoo1
cluster = ocfs2
node:
ip_port = 7777
ip_address = 192.168.55.112
number = 2
name = odoo2
cluster = ocfs2
ध्यान दें कि नोड या क्लस्टर क्लॉज के तहत विशेषताएँ एक टैब के बाद होनी चाहिए।
** निम्न चरणों को odoo1 और odoo2 पर निष्पादित किया जाना चाहिए जब तक कि अन्यथा निर्दिष्ट न हो।
odoo2 पर वही कॉन्फ़िगरेशन फ़ाइल (/etc/ocfs2/cluster.conf) बनाएं। यह फ़ाइल क्लस्टर के सभी नोड्स में समान होनी चाहिए, और इस फ़ाइल में किए गए परिवर्तनों को क्लस्टर के अन्य नोड्स में प्रचारित किया जाना चाहिए।
हमारे द्वारा /etc/ocfs2/cluster.conf में किए गए परिवर्तनों को लागू करने के लिए o2cb सेवा को पुनरारंभ करें:
$ sudo systemctl restart o2cb
/var/lib/odoo के अंतर्गत Odoo फाइल डायरेक्टरी बनाएं:
$ sudo mkdir -p /var/lib/odoo
/dev/sdb1 डिवाइस के लिए ब्लॉक आईडी प्राप्त करें। यदि आप iSCSI डिवाइस का उपयोग करते हैं तो fstab में UUID की अनुशंसा की जाती है:
$ sudo blkid /dev/sdb1 | awk {'print $3'}
UUID="93a2b6c4-d800-4532-9a9b-2d2f2f1a726b"
निम्न पंक्ति को /etc/fstab में जोड़ते समय UUID मान का उपयोग करें:
UUID=93a2b6c4-d800-4532-9a9b-2d2f2f1a726b /var/lib/odoo ocfs2 defaults,_netdev 0 0
ocfs2 क्लस्टर पंजीकृत करें और फ़ाइल सिस्टम को fstab से माउंट करें:
$ sudo o2cb register-cluster ocfs2
$ sudo mount -a
इसके साथ सत्यापित करें:
$ mount | grep odoo
/dev/sdb1 on /var/lib/odoo type ocfs2 (rw,relatime,_netdev,heartbeat=local,nointr,data=ordered,errors=remount-ro,atime_quantum=60,coherency=full,user_xattr,acl,_netdev)
यदि आप उपरोक्त लाइन को सभी एप्लिकेशन सर्वर पर देख सकते हैं, तो हम ओडू को स्थापित करने के लिए अच्छे हैं।
Odoo 12 को इंस्टाल करना और कॉन्फ़िगर करना
** निम्न चरणों को odoo1 और odoo2 पर निष्पादित किया जाना चाहिए जब तक कि अन्यथा निर्दिष्ट न हो।
पैकेज रिपॉजिटरी के माध्यम से Odoo 12 स्थापित करें:
$ wget -O - https://nightly.odoo.com/odoo.key | sudo apt-key add -
$ echo "deb http://nightly.odoo.com/12.0/nightly/deb/ ./" | sudo tee -a /etc/apt/sources.list.d/odoo.list
$ sudo apt update && sudo apt install odoo
डिफ़ॉल्ट रूप से, उपरोक्त आदेश स्वचालित रूप से उसी होस्ट पर PostgreSQL सर्वर स्थापित करेगा जो Odoo निर्भरता के हिस्से के रूप में है। हम शायद इसे रोकना चाहते हैं क्योंकि हम वैसे भी स्थानीय सर्वर का उपयोग नहीं करने जा रहे हैं:
$ sudo systemctl stop postgresql
$ sudo systemctl disable postgresql
Postgresql1 पर, "odoo" नामक एक डेटाबेस उपयोगकर्ता बनाएँ:
$ sudo -i
$ su - postgres
$ createuser --createrole --createdb --pwprompt odoo
प्रॉम्प्ट में पासवर्ड निर्दिष्ट करें। फिर postgresql1 और postgresql2 दोनों पर, एप्लिकेशन और लोड बैलेंसर नोड्स को कनेक्ट करने की अनुमति देने के लिए pg_hba.conf के अंदर निम्न पंक्ति जोड़ें। जैसा कि हमारे मामले में है, यह /etc/postgresql/11/main/pg_hba.conf:
पर स्थित है।host all all 192.168.55.0/24 md5
फिर परिवर्तनों को लोड करने के लिए PostgreSQL सर्वर को पुनः लोड करें:
$ su - postgres
$ /usr/lib/postgresql/11/bin/pg_ctl reload -D /var/lib/postgresql/11/main/
Odoo कॉन्फ़िगरेशन फ़ाइल को /etc/odoo/odoo.conf पर संपादित करें और उसके अनुसार admin_passwd, db_host और db_password पैरामीटर कॉन्फ़िगर करें:
[options]
; This is the password that allows database operations:
admin_passwd = admins3cr3t
db_host = 192.168.55.100
db_port = 5433
db_user = odoo
db_password = odoopassword
;addons_path = /usr/lib/python3/dist-packages/odoo/addons
नए परिवर्तनों को लोड करने के लिए दोनों सर्वरों पर Odoo को पुनरारंभ करें:
$ sudo systemctl restart odoo
वेब ब्राउज़र के माध्यम से किसी एक एप्लिकेशन सर्वर पर ओडू खोलें। इस उदाहरण में, हम odoo1 से जुड़े हैं, इस प्रकार URL http://192.168.55.111:8069/ है। और आपको निम्न प्रारंभिक पृष्ठ देखना चाहिए:
Odoo कॉन्फ़िगरेशन फ़ाइल में परिभाषित admin_passwd मान के समान "मास्टर पासवर्ड" निर्दिष्ट करें। फिर इस प्लेटफॉर्म का उपयोग करने वाली नई कंपनी के लिए सभी आवश्यक जानकारी भरें।
एक बार हो जाने के बाद, आरंभीकरण समाप्त होने तक एक क्षण प्रतीक्षा करें। आपको Odoo व्यवस्थापन डैशबोर्ड पर पुनः निर्देशित किया जाएगा:
इस बिंदु पर, Odoo इंस्टॉलेशन पूरा हो गया है और आप इस कंपनी के लिए व्यावसायिक ऐप्स को कॉन्फ़िगर करना शुरू कर सकते हैं। इस एप्लिकेशन सर्वर द्वारा किए गए सभी फ़ाइल परिवर्तन "/var/lib/odoo/.local" पर स्थित क्लस्टर फ़ाइल सिस्टम के अंदर संग्रहीत किए जाएंगे (जो कि किसी अन्य एप्लिकेशन सर्वर, odoo2 पर भी माउंट किया गया है), जबकि डेटाबेस में परिवर्तन हो रहे होंगे। PostgreSQL मास्टर नोड पर।
दो अलग-अलग होस्ट पर चलने के बावजूद, ध्यान दें कि इस लेखन में ओडू एप्लिकेशन स्वयं लोड-संतुलित नहीं है। आप डेटाबेस सेवा की तरह ही बेहतर उपलब्धता प्राप्त करने के लिए डेटाबेस क्लस्टर के लिए तैनात HAProxy इंस्टेंस का उपयोग कर सकते हैं। साथ ही, दोनों एप्लिकेशन सर्वरों द्वारा उपयोग किया जाने वाला साझा डिस्क फ़ाइल सिस्टम (OCFS2) अभी भी एकल-बिंदु विफलता के संपर्क में है, क्योंकि वे सभी lb2 पर एक ही iSCSI डिवाइस का उपयोग कर रहे हैं (कल्पना करें कि lb2 अप्राप्य है)।
डेटाबेस फ़ेलओवर ऑपरेशन
आप सोच रहे होंगे कि अगर PostgreSQL मास्टर डाउन हो जाए तो क्या होगा। यदि ऐसा होता है, तो ClusterControl स्वचालित रूप से चल रहे दास को मास्टर बनने के लिए बढ़ावा देगा, जैसा कि नीचे स्क्रीनशॉट में दिखाया गया है:
एंड-यूज़र से कुछ भी करने की आवश्यकता नहीं है क्योंकि फ़ेलओवर स्वचालित रूप से (30-सेकंड की छूट अवधि के बाद) किया जाता है। फ़ेलओवर पूर्ण होने के बाद, नई टोपोलॉजी को ClusterControl द्वारा इस प्रकार रिपोर्ट किया जाएगा:
यदि पुराना मास्टर वापस आता है, तो PostgreSQL सेवा स्वचालित रूप से बंद हो जाएगी और उपयोगकर्ता को जो अगला काम करना है, वह है नोड क्रियाएँ> प्रतिकृति स्लेव का पुनर्निर्माण करें :
सिंकिंग ऑपरेशन पूरा होने के बाद पुराना मास्टर नए मास्टर का गुलाम बन जाएगा:
ClusterControl निश्चित रूप से अपनी स्वचालित पुनर्प्राप्ति सुविधा के साथ डेटाबेस उपलब्धता में सुधार करता है और खराब डेटाबेस नोड को फिर से सिंक करना केवल दो क्लिक दूर है। एक भयावह विफलता घटना के बाद यह कितना आसान है?
अभी लोगों के लिए बस इतना ही। हैप्पी क्लस्टरिंग!