در بخش قبلی مراحل ساخت کلاستر به صورت کامل توضیح داده شد. در این بخش قصد داریم تا بر روی کلاستر ایجاد شده یک دیتابیس mysql پیاده سازی کنیم. مهمترین نکته در راه اندازی هر دیتابیسی حفظ دیتای ذخیره شده در دیتابیس است. در صورتی که سرویس ما روی چندین نود قابل پیاده سازی باشد، با هر بار پیاده سازی دیتابیس در یک نود متفاوت اجرا میشود، که این مساله باعث از دست رفتن دیتا میشود.
برای حل این مساله باید محیط ذخیره دیتای دیتابیس یک جای ثابت و مشخص باشد. یک راه، پیاده سازی دیتابیس در یک نود ثابت و مشخص است. برای این کار میتوان با استفاده از قابلیت affinity در کوبرنتیز دیتابیس را همیشه در یک نود مشخص اجرا کرد تا دیتای دیتابیس از بین نرود.
راه حل دیگر استفاده از یک فضای ذخیره سازی مجزا است. در این روش یک ماشین مجزا برای ذخیره سازی طراحی میشود و تمام داده ها در آن ذخیره میشود. از مزایای دیگر استفاده از سرویس NFS برای ذخیره سازی داده این است که داده ها مستقل از نرم افزارها هستند و برای بکاپ گیری، تنها بکاپ گیری از ماشین ذخیره سازی کافی است و نیازی به بکاپ گیری از سایر نودهای پیاده سازی نیست.
در پست قبلی نحوه راه اندازی این ماشین توضیح داده شد. در این پست قصد دارم تا نحوه استفاده از این فضا در پیاده سازی دیتابیس mysql را آموزش بدهم.
برای این کار یک فایل کانفیگ mysql.yaml به صورت زیر ایجاد کنید.
apiVersion: v1
kind: ConfigMap
metadata:
name: db-env
data:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: mydatabase
MYSQL_USER: db_user
MYSQL_PASSWORD: db_password
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-deployment
spec:
serviceName: mysql
replicas: 1
selector:
matchLabels:
component: mysql
template:
metadata:
labels:
component: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
name: exposed-port
envFrom:
- configMapRef:
name: db-env
livenessProbe:
exec:
command:
- sh
- -c
- "mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}"
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
nfs:
path: /data/nfs1/mysql-data
server: 192.168.68.157
---
apiVersion: v1
kind: Service
metadata:
name: mysql-cluster
spec:
type: ClusterIP
selector:
component: mysql
ports:
- port: 3306
targetPort: exposed-port
توضیح مختصری در خصوص کانفیگ بالا داده خواهد شد.
در بخش اول ابتدا متغیرهای محیطی mysql شامل پسورد دیتابیس، نام دیتابیس و غیره تنظیم شده است. در بخش بعدی تنظیمات مربوط به پیاده سازی mysql ایجاد شده است. در اینجا کانفیگ ایجاد شده در بخش اول توسط کانفیگ envFrom فراخوانی شده است. بخش اصلی مورد نظر ما بخش volumes و volumeMounts است. همانطور که مشاهده میکنید در بخش volumes، نوع volume از نوع nfs تعریف شده است. برای این نوع والیوم باید آدرس سرور مشخص شود. همانطور که در آموزش بخش 2 توضیح داده شد، آی پی ماشین ذخیره سازی 192.168.68.157 است، و محل ذیره سازی داده data/nfs1/ است. در بخش آخر هم کانفیگ دسترسی به دیتابیس پیاده سازی شده است.
حال با دستور زیر سرویس مورد نظر را اجرا کنید.
kubectl apply -f mysql.yaml
همانطور که مشاهده میکنید با استفاده از یک سرویس Network File Storage میتوان بدون دغدغه از محل ذخیره سازی داده ها سرویس مورد نظر خود را راه اندازی کنید بدون اینکه دیتای شما از دست برود.