قم بتثبيت RockMongo على CentOS 7
RockMongo هي أداة إدارة MongoDB على الويب تشبه أداة إدارة MySQL: phpMyAdmin. سيغطي هذا البرنامج التعليمي عملية التثبيت
منذ تأسيسها في عام 2009 ، كان MongoDB يقود صناعة NoSQL. أحد المفاهيم الأساسية لـ MongoDB هو مجموعة النسخ المتماثلة ، لذا قبل العمل معها ، لنقم أولاً بمراجعة المفهوم.
أبسط نموذج للاتصال المستخدم في نسخ قواعد البيانات هو هندسة Master-Slave. كما يوحي اسمه أن هذا النموذج له دوران ينتشران في سيد فريد والعديد من العبيد ، فإن دور السيد هو معالجة عمليات القراءة والكتابة التي يقوم بها العملاء ويتم التعامل مع العبيد على أنها نسخة طبق الأصل من السيد.
أهم ميزة لهذا النموذج هي أن أداء المعلم لا يتأثر بعمليات النسخ الاحتياطي ، تتم عمليات النسخ الاحتياطي بطريقة غير متزامنة ويمكن أن يصبح هذا مشكلة خطيرة عندما تفشل العقدة الرئيسية. تتم قراءة العقد التابعة فقط ويجب ترقيتها يدويًا إلى العقدة الرئيسية ، لذلك في هذا الوقت هناك احتمال لفقدان البيانات.
أحد الخيارات لحل مشكلة الإتاحة هو أن يكون لديك أكثر من عنصر رئيسي في الهندسة المعمارية ، ولكن هذا يمكن أن يؤدي إلى مشكلة أخرى في اتساق البيانات بين تلك الحالات والتعقيد الإضافي للتكوين.
الآن بالنظر إلى السياق ، يمكننا تقديم تقنية مجموعة النسخ المتماثلة لـ MongoDB. Replica Set هو اسم بنية Master-Slave التي تحتوي على تجاوز تلقائي للفشل ، لذلك في اللحظة التي primary
تفشل فيها عقدة رئيسية (والتي تسمى الآن ) في العمل بشكل صحيح ، election
سيتم تشغيل عقدة رئيسية وسيتم انتخاب عقدة أساسية جديدة من العبيد المتبقين ( يشار إليها الآن باسم secondaries
).
العقدة الأساسية هي الوحيدة التي تقوم بعمليات الكتابة ، بشكل افتراضي تتم معالجة عمليات القراءة من قبل الأساسي أيضًا ولكن يمكن تغيير هذا السلوك لاحقًا.
يتم تسجيل العمليات في oplog
(سجل العمليات) ، ثم تقوم العقد الثانوية بتحديث محتواها بشكل غير متزامن بناءً على محتوىoplog
ملحوظة: oplog
هي مجموعة مغطاة ، وهذا يعني أن المجموعة لها حد ، local.oplog.rs
ويمكنك التحقق من محتوى هذه المجموعة داخل غلاف مونغو في أي عضو مجموعة.
إلى جانب كونها الأشخاص الذين يقومون بعمل نسخة احتياطية مناسبة لقاعدة البيانات ، فإن العقدة الثانوية لها هذه الأدوار:
بفضل هذه الخصائص يمكن أن يكون لدينا أنواع مختلفة من العقد الثانوية:
primary
ولا يمكن أن تؤدي إلى انتخابات ، ومع ذلك يمكنها التصويت في الانتخابات ، ولديها نسخة طبق الأصل كاملة ويمكنها قبول عمليات القراءة. يمكن أن تكون مفيدة في نشر مراكز البيانات المتعددة.Priority 0
أعضاء ، لكن علاوة على ذلك لا يمكنهم معالجة عمليات القراءة. قد يصوتون إذا لزم الأمر. المهام المفضلة لهؤلاء الأعضاء هي إعداد التقارير والنسخ الاحتياطية.priority 0
عقدة ، ويوصى بأن يكون hidden
عضوًا أيضًا.قبل نشر البنية التحتية ، من المهم تصميمها ، وهناك نقاط يجب مراعاتها في هذا التصميم.
ضع في اعتبارك أن الحد الأدنى لعدد العناصر لإنشاء مجموعة نسخ متماثلة هو 3. يمكنك مزج الأنواع الثلاثة من العقد بحد أدنى واحد أساسي وعقدة ثانوية واحدة.
في هذا الدليل سننشر 3 أعضاء ، واحد أساسي وثانوي ثانوي قياسي.
ملاحظة: من المستحسن أن يكون الحد الأقصى لعدد الأعضاء المصوتين 7 مع مزيج من الحكام والأعضاء الثانويين.
الاسم هو للإشارة فقط ولكنك تستخدمه في تكوين المجموعة. ضع في اعتبارك أنه يمكن أن يكون لديك أكثر من نسخة متماثلة واحدة في بيئة الإنتاج الخاصة بك ، لذلك لا تهمل اسم مجموعتك.
يشجع هذا البرنامج التعليمي المستخدم على تحديد اسم المجموعة.
يقترح هذا البرنامج التعليمي أن يتم نشره في نفس مركز البيانات حتى تتمكن من تجنب مشاكل الاتصال.
ملاحظة: في حالة النشر في مراكز بيانات مختلفة ، يوصى بتغليف عقدك بشبكة VPN
إطلاق 3 عقد من Ubuntu 16.04 x64 ؛ في نفس المنطقة من بوابة العملاء الخاصة بك ، إذا أمكن. لا تنس تسميتها وفقًا لنوع المشروع الذي تتعامل معه وتأكد من أن يكون لديك نفس حجم الخادم في جميع هذه العقد.
بعد نشر العقد الثلاث ، سيتعين عليك التأكد من أن كل عقدة يمكنها التحدث مع الباقي. تحتاج إلى ssh إلى عقدتين والوصول إلى الآخرين باستخدام ping -c 4 EXAMPLE_IP
. التغيير EXAMPLE_IP
إلى عناوين IP الفعلية للعقد الخاصة بك.
هنا يمكنك رؤية مثال للتواصل الناجح بين عقدتين.
root@foo_node:~# ping -c 4 EXAMPLE_IP
PING EXAMPLE_IP (EXAMPLE_IP) 56(84) bytes of data.
64 bytes from EXAMPLE_IP: icmp_seq=1 ttl=59 time=0.594 ms
64 bytes from EXAMPLE_IP: icmp_seq=2 ttl=59 time=0.640 ms
64 bytes from EXAMPLE_IP: icmp_seq=3 ttl=59 time=0.477 ms
64 bytes from EXAMPLE_IP: icmp_seq=4 ttl=59 time=0.551 ms
--- EXAMPLE_IP ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3021ms
rtt min/avg/max/mdev = 0.477/0.565/0.640/0.064 ms
بشكل عام ، يمكنك استخدام حزمة MongoDB من Ubuntu ، ولكن من الأفضل استخدام الريبو الرسمي للمجتمع لأنه دائمًا ما يكون محدثًا. يحتوي هذا الريبو على هذه الحزم:
mongod
الخفي (العملية الأساسية التي تعالج طلبات البيانات).mongos
الخفي (خدمة التوجيه لعمليات النشر المشتركة).mongo shell
واجهة JavaScript.تابع تثبيت الحزم.
قم باستيراد المفتاح العام لنظام إدارة الحزم.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
قم بإنشاء ملف القائمة لـ MongoDB '/etc/apt/sources.list.d/mongodb-org-3.4.list'.
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
تحديث قاعدة بيانات الحزمة.
sudo apt-get update
تثبيت metapackage MongoDB.
sudo apt-get install -y mongodb-org
ابدأ خدمة MongoDB.
sudo service mongod start
يمكنك الآن فتح mongo shell
أي جلسة باش. للقيام بذلك ، يجب عليك استخدام mongo
الأمر. سيتم استقبالك بشيء مشابه لهذا.
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
*Some extra logs are cut by the way*
>
لا تنس إغلاق الخدمة sudo service mongod stop
، لأننا سنبدأ لاحقًا mongod
ببعض المعلمات. كرر هذه العملية في جميع العقد 3 من المجموعة.
استخدام ملف مفتاح يفرض مفهومين في إدارة مجموعة النسخ المتماثلة. الأول هو Internal Authentication
. افتراضيًا ، يمكنك بدء mongo shell
جلسة بدون استخدام مستخدم وستكون لهذه الجلسة التحكم الكامل في قاعدة البيانات ، ولكن عند استخدام ملف مفتاح للمصادقة ، mongo shell
تصل جلسة العمل الخاصة بك إلى حالة تسمى localhost exception
. تسمح لك هذه الحالة فقط بإنشاء المستخدم المسؤول ومجموعة النسخ المتماثلة. المفهوم الثاني هو Role-Based Access Control
، أو بعبارة أخرى إذن. يتم فرض هذا للتحكم في المستويات الإدارية لمجموعة النسخ المتماثلة.
ملف المفتاح هو كلمة المرور التي سيتم استخدامها في المجموعة ، يجب أن تكون كلمة المرور هذه هي نفسها في جميع أعضاء المجموعة. لزيادة الأمان ، من المهم استخدام مفتاح عشوائي مع الأداة التي تختارها.
يجب أن يتراوح طول المحتوى بين 6 و 1064 حرفًا. كما يجب عليك تعيين read only
إذن لملف المفتاح.
chmod 400 PATH_OF_YOUR_KEYFILE
الآن قم بنسخ ملف المفتاح الخاص بك إلى كل عضو في المجموعة ، يرجى استخدام مجلد ثابت للرجوع إليه في المستقبل ، ولا تقم بتخزينه في وسيط قابل للإزالة.
استخدم أيضًا مجلدًا للملف الذي mongod
يمكنه الوصول إليه.
في هذه الخطوة ، نحتاج إلى البدء mongod daemon
في كل عضو في المجموعة . هناك طريقتان لبدء mongod
العملية: استخدام ملف التكوين أو استخدام سطر الأوامر. كلتا الطريقتين سهلة للغاية ، ولكن فقط من أجل البساطة ، يستخدم هذا البرنامج التعليمي إصدار سطر الأوامر.
استخدم الاسم الذي اخترته سابقًا في هذا الأمر.
mongod --keyFile PATH_OF_YOUR_KEYFILE --replSet "YOUR_SET_NAME"
افتراضيًا mongod
لا يعمل كبرنامج خفي. ستحتاج إلى استخدام --fork
المعلمة أو استخدامها upstart
لتشغيلها بالكامل كحفل. في هذا البرنامج التعليمي ، لا نشجع على تشغيل البرنامج mongod
الخفي حتى تتمكن من رؤية السجلات إلى جهازك الطرفي مباشرة.
ملاحظة: اكتب بعناية اسم مجموعة النسخ المتماثلة لأنه بمجرد إنشائها لا يمكنك تغييرها.
ملاحظة: إذا قمت بتشغيل mongod
كعملية غير خفية ، فسيتعين عليك فتح اتصال ssh آخر لمواصلة العمل.
يجب عليك استخدام mongo
الأمر لفتح mongo shell
. يمكن القيام بذلك في أي عضو في المجموعة.
في هذه اللحظة نحن في حالة تسمى localhost exception
. عند استخدام ملف مفتاح لإعداد mongod
العملية ، فأنت ملزم بإنشاء مسؤول قاعدة بيانات قبل أن تتمكن من تطبيق عمليات القراءة والكتابة ، ولكننا سننتقل إلى ذلك لاحقًا.
هذا جزء دقيق ، نحن نستخدم الأمر rs.initiate()
داخل mongo shell
من الخطوة 4. قبل استخدام هذا الأمر دعنا نراجعه.
rs.initiate(
{
_id : <replicaSetName>,
members: [
{ _id : 0, host : "example1.net:27017" },
{ _id : 1, host : "example2.net:27017" },
{ _id : 2, host : "example3.net:27017" }
]
}
)
_id
الحقل الأول عبارة عن سلسلة ويجب أن يتطابق مع ذلك --replSet
الذي تم تمريره قبل إلى mongod
. أيضاً ، host
يجب أن تكون كل قيمة لـ إما ip أو اسم المجال لكل عضو في مجموعة النسخ المتماثلة. لا تنس إلحاق المنفذ الذي يستخدمه مثيل mongo في كل عضو.
حان الوقت الآن لتنفيذ الأمر مع بياناتك ، سيؤدي ذلك إلى تشغيل election
، ثم يتم انتخاب الأساسي تلقائيًا.
هنا يجب أن تلاحظ أن مؤشر shell الخاص بك قد تغير إلى YOUR_SET_NAME:PRIMARY>
أو YOUR_SET_NAME:SECONDARY
. هذا يعني أن إنشاء مجموعة كانت ناجحة.
لمواصلة العمل تحتاج إلى العثور على primary
، إذا لم يكن لديك بالطبع. استخدم rs.status()
الأمر لإظهار معلومات مجموعة النسخ المتماثلة وحدد موقع primary
. كنت تبحث عن العقار "stateStr" : "PRIMARY"
.
بعد تحديد موقع primary
، أدخل mongo shell
الأمر التالي وقم بتشغيله باستخدام بياناتك.
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "YOUR_USER",
pwd: "YOU_PASSWORD",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
في admin = db.getSiblingDB("admin")
جزء يتيح لنا كتابة إلى admin
من قاعدة بيانات مختلفة. يؤدي هذا إلى إنشاء اسم مستعار يسمى admin
، حتى نتمكن من تنفيذ الأوامر باستخدامه بدلاً من ذلك.
إذا كانت العملية ناجحة ، فستتلقى إشعارًا بإضافة المستخدم.
Successfully added user: {
"user" : "YOUR_USER",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
في هذه المرحلة ، لدينا فقط مشرف لجميع الخوادم ، ولكن وجود مجموعة متماثلة يجبرنا على أن يكون لدينا مستخدم له clusterAdmin
الدور. سننشئ مستخدمًا آخر له هذا الدور فقط لفصل الاهتمامات.
لقد وصلنا إلى حد الـ localhost exception
، ولهذا السبب علينا تغيير المصادقة إلى المستخدم الذي تم إنشاؤه خطوة واحدة من قبل.
يمكنك تغيير المستخدمين داخل mongo shell
بما يلي.
db.getSiblingDB("admin").auth("YOUR_ADMIN", "YOUR_PASSWORD" )
إذا لم تكن قد اتصلت بالفعل mongo shell
باستخدام هذا الأمر بدلاً من ذلك.
mongo -u "YOUR_ADMIN" -p "YOUR_PASSWORD" --authenticationDatabase "admin"
سيتم إعلامك بتغيير المستخدم ، ويمكنك الانتقال إلى الخطوة التالية.
و clusterAdmin
دور يعطي عنصر تحكم المستخدم الكاملة للمجموعة النسخة المتماثلة. يعد إنشاءه سهلاً مثل إنشاء مستخدم المشرف.
db.getSiblingDB("admin").createUser(
{
"user" : "YOUR_USER",
"pwd" : "YOUR_PASSWORD",
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)
لاحظ أن هذه المرة يتم تغيير الدور إلىclusterAdmin
.
في هذه اللحظة لدينا 2 مستخدمين إداريين: أحدهما لديه السيطرة الكاملة على الخادم والآخر لديه حق الوصول إلى المهام الإدارية على مستوى مجموعة النسخ المتماثلة. ومع ذلك ، فنحن نفتقر إلى مستخدم لديه حق الوصول إلى "استخدام" قاعدة بيانات ، لذلك سننشئ هذا المستخدم الآن.
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "YOUR_USER",
pwd: "YOUR_PASSWORD",
roles: [ { role: "userAdminAnyDatabase", db: "cars" } ]
}
)
لاحظ هذه المرة أننا نقوم بتغيير db
الجزء ، حيث نضع قاعدة البيانات في متناول المستخدم ، وفي هذه الحالة نستخدم قاعدة بيانات مسماة cars
.
لم يتم إنشاء قاعدة البيانات حتى الآن. للقيام بذلك ، سيكون عليك كتابة بعض الأوامر لإنشائها ضمنيًا. قم بالتبديل إلى cars
قاعدة البيانات.
use cars
سوف تحصل على الإعلام: switched to db cars
.
لم يتم إنشاء قاعدة البيانات حتى الآن ، للقيام بذلك تحتاج إلى كتابة شيء لها. نحن نستخدم المثال التالي.
db.models.insert({ make: "Dodge", model: "Viper", year: 2010 })
هذه المرة سيتم إعلامك بـ WriteResult({ "nInserted" : 1 })
.
إذا كنت تريد ، يمكنك استرداد جميع الكائنات في قاعدة البيانات ، باستخدام find()
الطريقة:
db.models.find()
{ "_id" : ObjectId("59acd8b55334882863541ff4"), "make" : "Dodge", "model" : "Viper", "year" : 2010 }
لاحظ أن ذلك _id
سيكون مختلفًا في الإخراج الخاص بك ، ولكن يجب أن تكون البيانات الأخرى هي نفسها. مع إعطاء الوقت الكافي ، سيتم نسخ هذه البيانات للأعضاء الآخرين.
قد يكون إنشاء مجموعة نسخ متماثلة أمرًا صعبًا في البداية نظرًا لوجود الكثير من المعلومات لفهمها ، ولكن بمجرد أن تحصل على الفكرة وراءها ، يمكنك نشرها بسرعة ، لذلك لا تستسلم إذا لم تتمكن من فهمها في المرة الأولى. ضع في اعتبارك أن مجموعة النسخ المتماثلة مهمة في إدارة MongoDB لأنها تفتح إمكانية إضافة ميزات متقدمة مثل موازنة التحميل.
RockMongo هي أداة إدارة MongoDB على الويب تشبه أداة إدارة MySQL: phpMyAdmin. سيغطي هذا البرنامج التعليمي عملية التثبيت
MongoDB غير آمن افتراضيًا. إذا كنت تقوم بتثبيت MongoDB وتشغيله بدون تكوينه للمصادقة ، فستواجه وقتًا سيئًا
في هذا المقال ، يوضح لك Ill كيفية تثبيت MariaDB على OpenBSD 6 وتكوينه بحيث يمكن الوصول إليه من خلال خادم ويب مختلط (Apache أو Nginx). أنت أيضا
استخدام نظام مختلف؟ مقدمة ArangoDB هي قاعدة بيانات NoSQL مفتوحة المصدر مع نموذج بيانات مرن للمستندات والرسوم البيانية والقيم الأساسية. أنه
MySQL هو البرنامج الأكثر شعبية في العالم المستخدم لقواعد البيانات. من المهم جدًا التأكد من وجود نسخ احتياطية من قاعدة بياناتك. تسمح هذه الممارسة
المتطلبات الأساسية خادم Vultr يعمل حتى تاريخ Arch Linux (راجع هذه المقالة). الوصول إلى Sudo: الأوامر المطلوبة ليتم تشغيلها كجذر مسبوقة بـ # ، وواحد
استخدام نظام مختلف؟ مقدمة ArangoDB هي قاعدة بيانات NoSQL مفتوحة المصدر مع نموذج بيانات مرن للمستندات والرسوم البيانية والقيم الأساسية. أنه
المتطلبات الأساسية خادم Vultr يعمل حتى تاريخ Arch Linux (راجع هذه المقالة) وصول Sudo: الأوامر المطلوبة ليتم تشغيلها كجذر مسبوقة بـ # ، وواحد
MongoDB هي قاعدة بيانات NoSQL سريعة وقوية. ومع ذلك ، يتم تحديث مستودعات دبيان ببطء وغالبًا ما تحتوي على إصدارات قديمة جدًا من الحزم. هذا توتوريا
مقدمة InfluxDB هي قاعدة بيانات تستند إلى سلسلة زمنية مكتوبة في Go. يحتوي InfluxDB على العديد من الاستخدامات العملية ، أحدها هو تخزين بيانات المراقبة على الخوادم. أنا
استخدام نظام مختلف؟ Apache Cassandra هو نظام إدارة قاعدة بيانات NoSQL مجاني ومفتوح المصدر تم تصميمه لتوفير قابلية التوسع ، hig
إن OrientDB عبارة عن مصدر مفتوح متعدد النماذج من الجيل التالي NoSQL DBMS. مع دعم نماذج البيانات المتعددة ، يمكن أن يوفر OrientDB المزيد من الوظائف والمرونة في
phpRedisAdmin هو تطبيق ويب يدير قواعد بيانات Redis مع واجهة مستخدم رسومية بديهية. سيشرح هذا البرنامج التعليمي كيفية التثبيت
Redis هو حل تخزين بيانات ذي قيمة رئيسية ، وغالبًا ما يشار إليه بقاعدة بيانات NoSQL. يمكن أن يحقق سرعات قراءة / كتابة عالية جدًا لأنه عبارة عن وحدة ذاكرة داخل الذاكرة
النسخ الاحتياطي هو جزء مهم من التعامل مع قواعد البيانات. بغض النظر عما إذا كنت تدير موقعًا للشركات ، أو تستضيف WordPress فقط ، فمن المهم الاحتفاظ بنسخة احتياطية
Laravel GitScrum ، أو GitScrum هي أداة إنتاجية مفتوحة المصدر مصممة لمساعدة فرق التطوير على تطبيق منهجية سكروم بطريقة مماثلة
استخدام نظام مختلف؟ Apache Cassandra هو نظام إدارة قاعدة بيانات NoSQL مجاني ومفتوح المصدر تم تصميمه لتوفير قابلية التوسع ، hig
المتطلبات الأساسية خادم Vultr يعمل حتى تاريخ Arch Linux (راجع هذه المقالة.) الوصول إلى Sudo. الأوامر المطلوبة للتشغيل كجذر مسبوقة بـ # ، وواحدة
Redis هو مخزن بنية بيانات. إنه شائع في مواقع WordPress لأنه يوفر تعزيزات كبيرة في الأداء بسبب منهجه الأمثل في التخزين المؤقت.
نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول
يعرف الكثير منكم أن Switch سيصدر في مارس 2017 وميزاته الجديدة. بالنسبة لأولئك الذين لا يعرفون ، قمنا بإعداد قائمة بالميزات التي تجعل "التبديل" "أداة لا غنى عنها".
هل تنتظر عمالقة التكنولوجيا للوفاء بوعودهم؟ تحقق من ما تبقى دون تسليم.
اقرأ المدونة لمعرفة الطبقات المختلفة في بنية البيانات الضخمة ووظائفها بأبسط طريقة.
اقرأ هذا لمعرفة مدى انتشار الذكاء الاصطناعي بين الشركات الصغيرة وكيف أنه يزيد من احتمالات نموها ومنح منافسيها القدرة على التفوق.
لقد أصبح حل CAPTCHA صعبًا جدًا على المستخدمين في السنوات القليلة الماضية. هل ستكون قادرة على أن تظل فعالة في اكتشاف البريد العشوائي والروبوتات في المستقبل القريب؟
مع تطور العلم بمعدل سريع ، واستلام الكثير من جهودنا ، تزداد أيضًا مخاطر تعريض أنفسنا إلى تفرد غير قابل للتفسير. اقرأ ، ماذا يمكن أن يعني التفرد بالنسبة لنا.
ما هو التطبيب عن بعد والرعاية الصحية عن بعد وأثره على الأجيال القادمة؟ هل هو مكان جيد أم لا في حالة الوباء؟ اقرأ المدونة لتجد طريقة عرض!
ربما سمعت أن المتسللين يكسبون الكثير من المال ، لكن هل تساءلت يومًا كيف يجنون هذا النوع من المال؟ دعنا نناقش.
أصدرت Apple مؤخرًا macOS Catalina 10.15.4 تحديثًا تكميليًا لإصلاح المشكلات ولكن يبدو أن التحديث يتسبب في المزيد من المشكلات التي تؤدي إلى إنشاء أجهزة macOS. قراءة هذه المادة لمعرفة المزيد