MinIO স্থাপনা সব আকার এবং আকারে আসে। আমরা Linux- এর যেকোনো সংস্করণে বেয়ার মেটাল ইনস্টলেশন সমর্থন করি, Kubernetes- এর যেকোনো সংস্করণে (Red Hat OpenShift সহ) কন্টেইনারাইজড ইনস্টলেশন সমর্থন করি এবং যেখানে আপনি একটি ছোট লাইটওয়েট একক বাইনারি স্থাপন করতে পারেন সেখানে ইনস্টল করি। কিন্তু নমনীয়তার সাথে অনিবার্যতা আসে যে প্রান্তের ক্ষেত্রে সমস্যাগুলি ডিবাগ করার প্রয়োজন হবে।
এই ব্লগ পোস্টে, আমরা আপনাকে দেখাব কিভাবে Kubernetes-এ চলমান একটি MinIO ইনস্টল ডিবাগ করতে হয় এবং বেয়ার মেটাল ইন্সটলেশন করার সময় আপনার সম্মুখীন হতে পারে এমন কিছু সাধারণ সমস্যা এবং কীভাবে সেগুলি সংশোধন করা যায়।
কুবারনেটস ক্লাস্টারের ভিতরে চলমান MinIO API অ্যাক্সেস করার কয়েকটি উপায় রয়েছে। আমরা kubectl port-forwarding
ব্যবহার করতে পারি বা এপিআই অ্যাক্সেস করতে সক্ষম হতে NodePort
এ একটি Service
শোনার সেট আপ করতে পারি। এই উভয় পদ্ধতিই নেটওয়ার্কের বাইরে থেকে পরিষেবাটি অ্যাক্সেস করার একটি উপায় অফার করে, তবে তারা একটি প্রধান ক্ষতির সাথে আসে: আপনি কেবলমাত্র সেই পরিষেবাটি অ্যাক্সেস করতে পারেন যা উপলব্ধ পোর্টে নোডপোর্ট বা পোর্ট ফরওয়ার্ডিং উল্লেখ করে (অ্যাপ্লিকেশনের জন্য সাধারণ কনফিগারেশন নয় ) উদাহরণস্বরূপ, আপনাকে MinIO API অ্যাক্সেস করতে হবে, সাধারণত 9000
পোর্টে পাওয়া যায়, একটি এলোমেলোভাবে নির্ধারিত 3xxxx
পোর্টের মাধ্যমে।
যদি আমি আপনাকে বলি যে একটি ভাল উপায় আছে - এবং এটি উপন্যাস নয়? অ্যাপ্লিকেশনগুলি ডিবাগ করার সময় আপনি নেটিভ রান-টাইম পরিবেশে সম্পূর্ণ অ্যাক্সেস পেতে চান যাতে আপনি ক্লাস্টারটির সমস্যা সমাধান এবং ডিবাগ করতে বিভিন্ন সরঞ্জাম ব্যবহার করতে পারেন। এটি করার একটি উপায় হল একটি "ব্যস্তবক্স" শৈলী পড চালু করা এবং অ্যাপ্লিকেশনটি ডিবাগ করার জন্য প্রয়োজনীয় সমস্ত প্রয়োজনীয় সরঞ্জাম ইনস্টল করা।
প্রথমে আপনার MinIO ইনস্টলের মতো একই নামস্থানে একটি Pod
চালু করুন। এটি করার জন্য নিম্নলিখিত yaml দিয়ে debugger-pod.yaml
নামে একটি yaml ফাইল তৈরি করুন।
apiVersion: v1 kind: Pod metadata: name: mc labels: app: mc spec: containers: - image: minio/mc:latest command: - "sleep" - "604800" imagePullPolicy: IfNotPresent name: mc restartPolicy: Always
উপরের পড কনফিগারেশনটি MinIO mc
ইউটিলিটির জন্য ইমেজ টানছে। নিশ্চিত করার জন্য যে পডটি কেবল চালু হবে না এবং তারপরে প্রস্থান করবে, আমরা একটি sleep
কমান্ড যুক্ত করেছি।
yaml সংরক্ষিত হয়ে গেলে Kubernetes নামস্থান যেখানে MinIO ক্লাস্টার চলছে সেখানে কনফিগারেশন প্রয়োগ করুন
kubectl apply -f debugger-pod.yaml
একবার পড আপ এবং চলমান শেল মাধ্যমে এটি অ্যাক্সেস
$ kubectl exec -i -t -n default mc -c mc -- sh -c "(bash || ash || sh)" [root@mc /]#
তারপর mc
দিয়ে আপনি MinIO ক্লাস্টার অ্যাক্সেস করতে পারেন
[root@mc /]# mc alias set myminio --insecure Added `myminio` successfully.
এখন যেহেতু আমাদের একটি ডিবাগার পড আপ এবং চলমান আছে, আপনি একই নেটওয়ার্কের মধ্যে সরাসরি ক্লাস্টারে কাজ করতে পারেন। উদাহরণস্বরূপ, যদি কোনও সাইট অফলাইনে যাওয়ার কারণে বা হার্ডওয়্যার ব্যর্থতার কারণে প্রতিলিপিটি ভেঙে যায়, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে প্রতিলিপি করার জন্য যেকোন মুলতুবি বস্তুগুলিকে পুনরায় সিঙ্ক করতে পারেন
[root@mc /]# mc admin replicate resync start minio1 minio2 [root@mc /]# mc admin replicate resync status minio1 minio2 ✔ ✔ ✔ ResyncID: 2248d1d1-633f-4d61-b938-d8ea0b9b2d31 Status: Completed Objects: 2225 Versions: 2225 FailedObjects: 0 Throughput: 5.3 MiB/s IOPs: 124.23 objs/s Transferred: 94 MiB Elapsed: 17.909833202s CurrObjName: testbucket/web-app/tsconfig.json
আপনি ডিবাগার পড চালানোর আরেকটি কারণ হল যদি আপনার পডে কিছু ফাইল সিস্টেম অনুমতি বা অবৈধ গ্রুপ কনফিগারেশন থাকে, আপনি ডিবাগার পড ব্যবহার করে সেগুলি আপডেট করতে পারেন
[root@mc /]# chgrp -R 1000780050 .minio.sys/
উপরের ডিবাগিং পদ্ধতিটি বেয়ার মেটাল পরিবেশেও ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ আপনি mc
ইনস্টল সহ একটি ব্যস্তবক্স বা বেসশন নোড চালু করতে পারেন এবং উপরের মতো একই নির্দেশাবলী অনুসরণ করতে পারেন।
বেয়ার মেটাল লিনাক্স ইনস্টল সবচেয়ে সহজবোধ্য। আসলে MinIO ইন্সটল করতে এবং SystemD এর সাথে চলমান হতে কয়েকটি কমান্ড লাগে। বিস্তারিত জানার জন্য, দেখুন
একটি মহান সময়ের মধ্যে একবার, বেয়ার মেটাল ইনস্টল গুলিয়ে যায়। এখানে কিছু (অত-সাধারণ নয়) ত্রুটি রয়েছে যেগুলি সম্পর্কে আমাদের জিজ্ঞাসা করা হয়েছে৷
সবচেয়ে সাধারণ সমস্যাগুলির মধ্যে একটি হল MinIO বাইনারি এবং কনফিগারেশন ফাইলের ফাইলের অনুমতি। যদি এটি ঘটে, আপনি যখন SystemD ব্যবহার করে MinIO শুরু করেন তখন আপনি দেখতে পাবেন
Assertion failed for MinIO.
এবং এখানে সম্পূর্ণ স্ট্যাক ট্রেস আছে
# systemctl status minio.service ● minio.service - MinIO Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: enabled) Active: inactive (dead) Assert: start assertion failed at Tue 2023-12-26 18:21:38 PST; 8s ago AssertFileIsExecutable=/usr/local/bin/minio was not met Docs: https://docs.min.io Dec 26 18:13:37 minio1 systemd[1]: minio.service: Starting requested but asserts failed. Dec 26 18:17:50 minio1 systemd[1]: Assertion failed for MinIO. Dec 26 18:21:38 minio1 systemd[1]: minio.service: Starting requested but asserts failed. Dec 26 18:21:38 minio1 systemd[1]: Assertion failed for MinIO.
এটি বিভিন্ন কারণে হতে পারে, আসুন তালিকাটি নিচে যান এবং তাদের প্রতিটির জন্য পরীক্ষা করুন।
MinIO বাইনারি : বাইনারি, এই উদাহরণে /usr/local/bin/minio
এ অবস্থিত যথাক্রমে ব্যবহারকারী এবং গোষ্ঠীর জন্য root:root
অনুমতি থাকা প্রয়োজন।
# ll /usr/local/bin/minio total 93804 -rwxr-xr-x 1 root root 96018432 Nov 15 16:35 minio*
MinIO পরিষেবা ব্যবহারকারী এবং গোষ্ঠী : MinIO পরিষেবাটিকে নিরাপত্তার উদ্দেশ্যে একটি অনন্য লিনাক্স ব্যবহারকারী এবং গোষ্ঠীর অধীনে চলতে হবে, root
ব্যবহারকারী হিসাবে কখনই চালানো হবে না। ডিফল্টরূপে আমরা ব্যবহারকারী এবং গ্রুপ নামের জন্য minio-user
ব্যবহার করি। SystemD পরিষেবা কনফিগার ফাইলে আপনাকে এরকম কিছু দেখতে হবে
User=minio-user Group=minio-user
MinIO ডেটা Dir : যে ডিরেক্টরিতে MinIO ডেটা সংরক্ষণ করা হবে সেটির মালিকানা minio-user:minio-user
বা যে ব্যবহারকারীর উপরে আপনি MinIO পরিষেবা চালানোর সিদ্ধান্ত নেন তার মালিকানাধীন হতে হবে।
# ls -l /mnt total 4 drwxrwxr-x 2 minio-user minio-user 4096 Dec 27 09:58 data
SystemD এবং MinIO কনফিগারেশন : উভয় কনফিগার ফাইলেরই অনুমতি থাকা উচিত root:root
ব্যবহারকারী এবং গ্রুপের জন্য
# ls -l /etc/default/minio -rw-r--r-- 1 root root 1330 Dec 27 09:52 /etc/default/minio # ls -l /etc/systemd/system/minio.service -rw-r--r-- 1 root root 941 Dec 26 17:13 /etc/systemd/system/minio.service
রুট হিসাবে চালান : সম্পূর্ণ ইনস্টল প্রক্রিয়াটি root
হিসাবে চালানো উচিত। আপনার ব্যবহারকারীর অনুমতি থাকলে আপনি sudo
ও চেষ্টা করতে পারেন তবে সুপারিশটি হল রুট হিসাবে চালানোর কারণ ইনস্টলের জন্য ফাইলগুলিকে এমন এক গুচ্ছ জায়গায় রাখতে হবে যেখানে শুধুমাত্র root
ব্যবহারকারী অ্যাক্সেস করতে পারে। আপনার ব্যাশ প্রম্পটে একটি #
থাকা উচিত এবং $
এর মতো নয়
#
বনাম $
যদি উপরের কোনটিই কাজ না করে, তাহলে সবচেয়ে ভালো পদ্ধতি হল অ্যাপ, ডিরেক্টরি এবং কনফিগারেশন মুছে ফেলা এবং রুট ব্যবহারকারী হিসেবে একটি নতুন ইনস্টল শুরু করা।
মুছে ফেলা ফাইলগুলির সাথে সম্পর্কিত আরেকটি সাধারণ সমস্যা যা এখনও প্রক্রিয়াটিকে ধরে রাখে, যা পোর্ট দ্বন্দ্ব সৃষ্টি করে। এমনকি যখন একটি পরিষেবা চলছে না, আপনি বিদ্যমান পোর্টে একটি নতুন পরিষেবা শুরু করতে অক্ষম হতে পারেন বা যে পরিষেবাটি চলছে সেটি খারাপ আচরণ করবে (যেমন আপনাকে লগইন করার অনুমতি না দেওয়া)৷
# lsof -n | grep (deleted) COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME nginx 13423 root 5u REG 253,3 42949672960 17 (deleted) minio 13423 minio 6u REG 253,3 0 18 (deleted) minio 13423 minio 7u REG 253,3 0 19 (deleted)
আপনি একটি MinIO ইনস্টলে নীচের মতো ত্রুটিগুলি দেখতে পারেন৷
net::ERR_FAILED
উপরের স্ক্রিনশটটি একটি অভ্যন্তরীণ সার্ভার ত্রুটি এবং একটি অননুমোদিত ত্রুটি দেখায়৷ পৃষ্ঠের দিকে তাকানোর সময় এটি অস্পষ্ট দেখায় যে এই ত্রুটিটি কী কারণে হয়েছে, আমরা একটু লিনাক্স জ্ঞানের সাথে ডিবাগ করতে পারি যা এটির কারণ হতে পারে, আসুন একটু জেনে নেওয়া যাক।
এই সমস্যাটি ডিবাগ করার বিভিন্ন উপায় রয়েছে, প্রথমে একাধিক MinIO প্রক্রিয়া একই নোডে চলছে কিনা তা পরীক্ষা করে দেখুন
# ps aux | grep -i minio minio-u+ 5048 0.3 1.7 1594008 144384 ? Ssl 11:03 0:01 /usr/local/bin/minio server --console-address :9001 /mnt/data/disk1/minio minio-u+ 9276 0.3 1.7 1594208 144301 ? Ssl 11:25 0:01 /usr/local/bin/minio server --console-address :9001 /mnt/data/disk1/minio
আমরা উপরে দেখতে পাচ্ছি যে 2টি MinIO প্রক্রিয়া চলছে। পুরানো বা দীর্ঘতম চলমান প্রক্রিয়াটিকে হত্যা করে শুরু করুন, এই ক্ষেত্রে এটি প্রক্রিয়া আইডি 5048
বলে মনে হয়।
kill -9 5048
কখনও কখনও প্রক্রিয়াটি মেরে ফেলার পরেও পরিষেবাটি এখনও শুরু নাও হতে পারে বা এখনও বন্ধ হয়ে যেতে পারে কারণ এটি একটি প্রসেস নম্বর সংরক্ষিত করেছে কিন্তু যেতে দেয়নি৷ এটি এমন ফাইলগুলির কারণে হতে পারে যেগুলি মুছে ফেলা হয়েছে কিন্তু এখনও অপারেটিং সিস্টেম দ্বারা ট্র্যাক করা হচ্ছে৷ আপনি LSOF এর মাধ্যমে মুছে ফেলা ফাইলগুলি খুঁজে পেতে পারেন
lsof -n | grep '(deleted)'
শেষ কিন্তু অন্তত নয়, যদি কোনো মুছে ফেলা ফাইল অবশিষ্ট না থাকে বা হ্যাং প্রসেস থাকে এবং সবকিছু যদি একেবারে পরিষ্কার দেখায়, শেষ অবলম্বন হল দ্রুত নোডটি পুনরায় চালু করা। এটি একটি নো-ননসেন্স পদ্ধতি যা কোনো মুলতুবি থাকা ফাইল এবং প্রক্রিয়াগুলিকে বন্ধ করে দেয় এবং সাফ করে যাতে আপনি একটি নতুন ইনস্টল শুরু করেন।
যদিও বিরল, ইনস্টলেশন এজ কেস সবসময়ই থাকবে। MinIO গ্রাহকরা জানেন যে তাদের উদ্বিগ্ন হওয়ার কিছু নেই কারণ তারা আমাদের প্রকৌশলীদের দ্রুত মেসেজ করতে পারে - যারা কোড লিখেছেন -
সমস্যা সমাধান এবং ডিবাগিং সম্পর্কে আপনার যদি কোনো প্রশ্ন থাকে