مرحبا بالجميع!
بمجرد ظهور مهمة في الوظيفة - يبدو أن هناك مجموعة InnoDB اختبار تم تكوينها على العديد من الأجهزة الافتراضية مع السنتوس 7.5 ، تحتاج إلى دراستها وإضافة بضع عقد أخرى. يمكنك كسر والسخرية كما تشاء. يبدو مغريا.
قبل ذلك ، لم يكن لدي أي خبرة مع هذه المجموعة ، ولكن Google للمساعدة.
مع بعض الاستثناءات ، كانت جميع الروابط الموجودة فيه وفي Yandex إما على dev.mysql.com ، أو على هذا
المقال على Habr . يبدو أنه تم تكوين مجموعة من عقدتين عليه.
حسنًا ، لقد قرأت المقالة ، لقد فوجئت إلى حد ما بتعقيد إضافة العقد ونقص العديد من التفاصيل ، لكن حسنًا. مع خطيئة ، أضفت في نصف عقدة جديدة (بعض الأوامر لم تكن مفيدة ، وبعضها بشكل عام كسر كل شيء) ، وبعد ذلك بدأت في تجربة إعادة تشغيل العقد ، وما إلى ذلك.
بعد عدة مناهج ووفيات لا حصر لها من الخلايا العصبية ، لم تستطع الكتلة الوقوف. لم ترغب إحدى العقدة في إضافتها تحت أي ظرف ، وأغلقت الأخرى عند محاولة الوصول إلى قاعدة البيانات ، وتظاهر الثالث أن كل شيء كان في محله. كان علي أن أطلق النار وأبدأ من الصفر.
عند إنشاء مجموعة جديدة ، لسوء الحظ ، نشأت الكثير من المشاكل والتناقضات. ربما كانت النقطة في إصدارات البرامج ، حاولت mysql 5.7. ربما في التوزيع. ونتيجة لذلك ، توقفت عن محاولات طائشة للقيام بكل شيء على قطعة ورق وبدأت في إعدادها عن طريق الكتابة. وجوجل.
اجتمعت أمسيات وليالي ممتعة والكتلة بل ورفضت الانهيار.
في الوقت نفسه ، كانت طريقة إنشائها مختلفة بشكل كبير عن المحاولات السابقة وأردت مشاركتها ، لأن على الإنترنت ، لم أجد تعليمات أخرى ذات صلة ومفصلة ومفهومة لإعداد مجموعة inDoDB.
لذا ، لدينا ثلاثة أجهزة افتراضية متطابقة مع تعطيل Centos 7.5 الحد الأدنى 1804 و selinux وجدار الحماية المعطلان:
1.1.1.1
1.1.1.2
1.1.1.3
للعمل ، استخدمت mysql 5.7 ، لذلك نستخدمها. لنبدأ بـ 1.1.1.1:
1. تثبيت مستودع الخلية:
rpm -i https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
قم بإيقاف تشغيل المستودع لـ 8 ، وقم بتشغيله لـ 5.7 وتحقق - إذا كان كل شيء على ما يرام ، فقم بتثبيت mysql:
yum install yum-utils yum-config-manager --disable mysql80-community yum-config-manager --enable mysql57-community yum repolist yum install mysql-community-server mysql-shell
2. نأتي /etc/my.cnf إلى هذا النموذج:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid bind-address=0.0.0.0 port=3301 # Replication part server_id=1 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW plugin-load = group_replication.so # Group replication part transaction_write_set_extraction=XXHASH64 loose-group_replication_start_on_boot = OFF loose-group_replication_local_address = 1.1.1.1:33011 loose-group_replication_bootstrap_group = OFF report_port = 3301 report_host = 1.1.1.1
3301 هنا هو المنفذ الذي ستستمع إليه الخلية ، و 33011 هو المنفذ الذي تتواصل فيه العقد مع بعضها البعض.
3. إطلاق الخلية وأداء التكوين الأولي:
systemctl start mysqld grep 'password' /var/log/mysqld.log mysql_secure_installation
4. حسنًا ، أنشئ مجموعة ، بالإضافة إلى مستخدم منفصل لإدارتها. إذا كنت تعرف مسبقًا عناوين IP للعقد ، فيمكنك إدراجها على الفور في قائمة IPWhitelist. سوف نتظاهر بأننا لا نعرف حتى الآن عن 1.1.1.2. و 1.1.1.3:
mysqlsh > \c 127.0.0.1:3301 > dba.configureLocalInstance("127.0.0.1:3301", {mycnfPath: "/etc/my.cnf", clusterAdmin: "cladmin", clusterAdminPassword: "SomePassword!123"}) > \c cladmin@1.1.1.1:3301 > dba.checkInstanceConfiguration() > cl=dba.createCluster('TestCluster', {ipWhitelist: '1.1.1.1'}) > dba.configureLocalInstance() > cl.status()
انتهى! يجب أن يقوم cl.status بإخراج شيء مثل هذا:
{ "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "1.1.1.1:3301", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures.", "topology": { "1.1.1.1:3301": { "address": "1.1.1.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://cladmin@1.1.1.1:3301" }
عند تغيير الكتلة ، سيكون من الضروري تنفيذ الأمر dba.configureLocalInstance () محليًا على جميع العقد لحفظ التغييرات:
WARNING: On instance '1.1.1.1:3301' membership change cannot be persisted since MySQL version 5.7.23 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the <Dba>.configureLocalInstance command locally to persist the changes.
لأن سنقوم بإضافة عقدتين أخريين ، نحن لا نغلق الاتصال بالخادم 1.1.1.1 ، سيكون مفيدًا لنا.
الآن دعنا نحاول إضافة العقدة 1.1.1.2 إلى الكتلة. للقيام بذلك ، نقوم بتنفيذ جميع الأوامر نفسها عليه حتى 3 خطوات شاملة ، ولا ننسى تغيير server_id و loose-group_replication_local_address و report_host.
4. نقوم بتنفيذ 1.1.1.2:
mysql -p > set GLOBAL group_replication_allow_local_disjoint_gtids_join=ON;
حاولت تعيين هذا المتغير من خلال mysqlsh ، بالتبديل إلى وضع SQL ، ولكن الإجراءات هناك لم تؤثر عليه في الخلية. التالي:
mysqlsh > \c 127.0.0.1:3301 > dba.configureLocalInstance("127.0.0.1:3301", {mycnfPath: "/etc/my.cnf", clusterAdmin: "cladmin", clusterAdminPassword: "SomePassword!123"}) > \c cladmin@1.1.1.2:3301 > dba.checkInstanceConfiguration()
5. العودة إلى العقدة الأولى 1.1.1.1. إذا أغلقت الاتصال ، فيمكنك الاتصال بسرعة بالكتلة مثل هذا:
mysqlsh --uri cladmin@1.1.1.1:3301 --cluster > \sql > STOP GROUP_REPLICATION; > SET GLOBAL group_replication_ip_whitelist="1.1.1.1,1.1.1.2"; > START GROUP_REPLICATION; > \js > cluster.addInstance('cladmin@1.1.1.2:3301', {ipWhitelist: '1.1.1.1,1.1.1.2'}) > cluster.status()
لسبب ما ، عند إضافة عقدة بدون خيار ipWhitelist ، لا يتم إرسالها تلقائيًا ، لذلك نحددها يدويًا.
إذا تم تكوين القائمة البيضاء الخاصة بك في البداية لجميع العقد أو الشبكة الفرعية ، فيمكن تخطي الأوامر في وضع SQL.
لا تنس تنفيذ dba.configureLocalInstance () على جميع العقد لحفظ التكوين.
تحولت مجموعة العقدتين:
{ "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "1.1.1.1:3301", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures.", "topology": { "1.1.1.1:3301": { "address": "1.1.1.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "1.1.1.2:3301": { "address": "1.1.1.2:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://cladmin@1.1.1.1:3301" }
حسنًا ، هناك مجموعة من عقدتين ، ولكن في وضع "الكتلة لا تتسامح مع أي إخفاقات"
أضف ثالثًا ، الخوارزمية هي نفسها تمامًا مثل إضافة واحدة أخرى.
إذا كنت بحاجة إلى تغيير القائمة البيضاء مرة أخرى ، فأنت بحاجة إلى تنفيذ الأوامر على العقدة r / w ، لأن على عقد r / o لا يبدو أنها تؤدي إلى أي شيء. في هذه الحالة ، ستسقط عُقد r / o وسيتعين إعادة توصيلها ، والإبلاغ في الوقت نفسه عن قائمة بيضاء جديدة.
في حالتنا:
> cluster.rejoinInstance('cladmin@1.1.1.2:3301', {ipWhitelist: '1.1.1.1,1.1.1.2,1.1.1.3'})
حسنًا ، مرة أخرى ، لا تنس تنفيذ dba.configureLocalInstance () على جميع العقد لحفظ التكوين.
تبدو مجموعة من ثلاث عقد كما يلي:
{ "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "1.1.1.1:3301", "ssl": "REQUIRED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "1.1.1.1:3301": { "address": "1.1.1.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "1.1.1.2:3301": { "address": "1.1.1.2:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "1.1.1.3:3301": { "address": "1.1.1.3:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://cladmin@1.1.1.1:3301" }
إذا انهارت الكتلة إلى حالة عقدة واحدة ، فستحتاج إلى البدء بالمعلمة loose-group_replication_bootstrap_group = ON في /etc/my.cnf
بعد البدء ، ستحتاج إلى إيقاف تشغيل المعلمة مرة أخرى ، وإلا سيتم فصل هذه العقدة دائمًا عن الكتلة والحفاظ على الخاصة بها.
يتم وصف تثبيت mysql-router بشكل جيد
هنا ، لذلك لا أرى أي معنى في التكرار.
هذا كل شيء ، هذا كل شيء ، آمل أن يجد شخص ما تجربتي مفيدة.
شكرا لكم على اهتمامكم.