MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Menyebarkan Nextcloud yang Sangat Tersedia dengan MySQL Galera Cluster dan GlusterFS

Nextcloud adalah aplikasi sinkronisasi dan berbagi file sumber terbuka yang menawarkan penyimpanan file cloud gratis, aman, dan mudah diakses, serta sejumlah alat yang memperluas rangkaian fiturnya. Ini sangat mirip dengan Dropbox, iCloud, dan Google Drive yang populer, tetapi tidak seperti Dropbox, Nextcloud tidak menawarkan hosting penyimpanan file di luar lokasi.

Dalam posting blog ini, kita akan menerapkan pengaturan yang tersedia tinggi untuk infrastruktur "Dropbox" pribadi kami menggunakan Nextcloud, GlusterFS, Percona XtraDB Cluster (MySQL Galera Cluster), ProxySQL dengan ClusterControl sebagai alat otomatisasi untuk mengelola dan memantau database dan tingkat penyeimbang beban.

Catatan:Anda juga dapat menggunakan MariaDB Cluster, yang menggunakan library replikasi dasar yang sama seperti di Percona XtraDB Cluster. Dari perspektif penyeimbang beban, ProxySQL berperilaku serupa dengan MaxScale dalam hal ia dapat memahami lalu lintas SQL dan memiliki kontrol mendetail tentang bagaimana lalu lintas dirutekan.

Arsitektur Basis Data untuk Nexcloud

Dalam posting blog ini, kami menggunakan total 6 node.

  • 2 x server proxy 
  • 3 x database + server aplikasi
  • 1 x server pengontrol (ClusterControl)

Diagram berikut mengilustrasikan pengaturan akhir kami:

Untuk Percona XtraDB Cluster, minimal 3 node diperlukan untuk solid replikasi multi-master. Aplikasi Nextcloud ditempatkan bersama di dalam server database, sehingga GlusterFS juga harus dikonfigurasi pada host tersebut.

Tingkat penyeimbang beban terdiri dari 2 node untuk tujuan redundansi. Kami akan menggunakan ClusterControl untuk menyebarkan tingkat database dan tingkat penyeimbang beban. Semua server berjalan di CentOS 7 dengan definisi /etc/hosts berikut di setiap node:

192.168.0.21 nextcloud1 db1

192.168.0.22 nextcloud2 db2

192.168.0.23 nextcloud3 db3

192.168.0.10 vip db

192.168.0.11 proxy1 lb1 proxysql1

192.168.0.12 proxy2 lb2 proxysql2

Perhatikan bahwa GlusterFS dan MySQL adalah proses yang sangat intensif. Jika Anda mengikuti penyiapan ini (GlusterFS dan MySQL berada di satu server), pastikan Anda memiliki spesifikasi perangkat keras yang layak untuk server tersebut.

Penerapan Database Nextcloud

Kami akan mulai dengan penerapan basis data untuk Percona XtraDB Cluster tiga simpul kami menggunakan ClusterControl. Instal ClusterControl dan kemudian atur SSH tanpa kata sandi ke semua node yang akan dikelola oleh ClusterControl (3 PXC + 2 proxy). Pada simpul ClusterControl, lakukan:

$ whoami

root

$ ssh-copy-id 192.168.0.11

$ ssh-copy-id 192.168.0.12

$ ssh-copy-id 192.168.0.21

$ ssh-copy-id 192.168.0.22

$ ssh-copy-id 192.168.0.23

**Masukkan kata sandi root untuk masing-masing host saat diminta.

Buka browser web dan buka https://{ClusterControl-IP-address}/clustercontrol dan buat pengguna super. Lalu pergi ke Deploy -> MySQL Galera. Ikuti wizard penerapan yang sesuai. Pada tahap kedua 'Define MySQL Servers', pilih Percona XtraDB 5.7 dan tentukan alamat IP untuk setiap node database. Pastikan Anda mendapatkan centang hijau setelah memasukkan detail node database, seperti yang ditunjukkan di bawah ini:

Klik "Terapkan" untuk memulai penerapan. Cluster database akan siap dalam 15~20 menit. Anda dapat mengikuti kemajuan penerapan di Aktivitas -> Pekerjaan -> Buat Cluster -> Detail Pekerjaan Lengkap. Cluster akan dicantumkan di bawah dasbor Database Cluster setelah diterapkan.

Sekarang kita dapat melanjutkan ke penerapan penyeimbang beban basis data.

Deployment Load Balancer Database Nextcloud

Nextcloud direkomendasikan untuk dijalankan pada pengaturan penulis tunggal, di mana penulisan akan diproses oleh satu master pada satu waktu, dan pembacaan dapat didistribusikan ke node lain. Kita dapat menggunakan ProxySQL 2.0 untuk mencapai konfigurasi ini karena dapat merutekan kueri tulis ke satu master.

Untuk menerapkan ProxySQL, klik Tindakan Cluster> Tambahkan Penyeimbang Beban> ProxySQL> Sebarkan ProxySQL. Masukkan informasi yang diperlukan seperti yang disorot oleh panah merah:

Isi semua detail yang diperlukan seperti yang disorot oleh panah di atas. Alamat server adalah server lb1, 192.168.0.11. Lebih jauh ke bawah, kami menentukan admin ProxySQL dan memantau kata sandi pengguna. Kemudian sertakan semua server MySQL ke dalam set penyeimbangan beban dan kemudian pilih "Tidak" di bagian Transaksi Implisit. Klik "Deploy ProxySQL" untuk memulai penerapan.

Ulangi langkah yang sama seperti di atas untuk penyeimbang beban sekunder, lb2 (tetapi ubah "Alamat Server" ke alamat IP lb2). Jika tidak, kita tidak akan memiliki redundansi di lapisan ini.

Node ProxySQL kami sekarang diinstal dan dikonfigurasi dengan dua grup host untuk Galera Cluster. Satu untuk grup master tunggal (hostgroup 10), di mana semua koneksi akan diteruskan ke satu node Galera (ini berguna untuk mencegah kebuntuan multi-master) dan grup multi-master (grup host 20) untuk semua beban kerja read-only yang akan diseimbangkan ke semua server MySQL backend.

Selanjutnya, kita perlu menerapkan alamat IP virtual untuk menyediakan titik akhir tunggal untuk node ProxySQL kita sehingga aplikasi Anda tidak perlu mendefinisikan dua host ProxySQL yang berbeda. Ini juga akan memberikan kemampuan failover otomatis karena alamat IP virtual akan diambil alih oleh node ProxySQL cadangan jika terjadi kesalahan pada node ProxySQL utama.

Pergi ke ClusterControl -> Manage -> Load Balancers -> Keepalive -> Deploy Keepalive. Pilih "ProxySQL" sebagai jenis penyeimbang beban dan pilih dua server ProxySQL yang berbeda dari dropdown. Kemudian tentukan alamat IP virtual serta antarmuka jaringan yang akan didengarkannya, seperti yang ditunjukkan pada contoh berikut:

Setelah penerapan selesai, Anda akan melihat detail berikut di bilah ringkasan cluster:

Terakhir, buat database baru untuk aplikasi kita dengan masuk ke ClusterControl -> Manage -> Schemas and Users -> Create Database dan tentukan "nextcloud". ClusterControl akan membuat database ini di setiap node Galera. Tingkat penyeimbang beban kami sekarang telah selesai.

Penerapan GlusterFS untuk Nextcloud

Langkah-langkah berikut harus dilakukan pada nextcloud1, nextcloud2, nextcloud3 kecuali ditentukan lain.

Langkah Pertama

Disarankan untuk memisahkan ini untuk penyimpanan GlusterFS, jadi kami akan menambahkan disk tambahan di bawah /dev/sdb dan membuat partisi baru:

$ fdisk /dev/sdb

Ikuti wizard pembuatan partisi fdisk dengan menekan tombol berikut:

n > p > Enter > Enter > Enter > w

Langkah Kedua

Verifikasi apakah /dev/sdb1 telah dibuat:

$ fdisk -l /dev/sdb1

Disk /dev/sdb1: 8588 MB, 8588886016 bytes, 16775168 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Langkah Ketiga

Format partisi dengan XFS:

$ mkfs.xfs /dev/sdb1

Langkah Empat

Pasang partisi sebagai /storage/brick:

$ mkdir /glusterfs

$ mount /dev/sdb1 /glusterfs

Verifikasi bahwa semua node memiliki tata letak berikut:

$ lsblk

NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sda      8:0 0 40G  0 disk

└─sda1   8:1 0 40G  0 part /

sdb      8:16 0   8G 0 disk

└─sdb1   8:17 0   8G 0 part /glusterfs

Langkah Kelima

Buat subdirektori bernama brick di bawah /glusterfs:

$ mkdir /glusterfs/brick

Langkah Enam

Untuk redundansi aplikasi, kita dapat menggunakan GlusterFS untuk replikasi file antar host. Pertama, instal repositori GlusterFS untuk CentOS:

$ yum install centos-release-gluster -y

$ yum install epel-release -y

Langkah Tujuh

Instal server GlusterFS

$ yum install glusterfs-server -y

Langkah Delapan

Aktifkan dan mulai daemon gluster:

$ systemctl enable glusterd

$ systemctl start glusterd

Langkah Sembilan

Di nextcloud1, periksa node lain:

(nextcloud1)$ gluster peer probe 192.168.0.22

(nextcloud1)$ gluster peer probe 192.168.0.23

Anda dapat memverifikasi status rekan dengan perintah berikut:

(nextcloud1)$ gluster peer status

Number of Peers: 2



Hostname: 192.168.0.22

Uuid: f9d2928a-6b64-455a-9e0e-654a1ebbc320

State: Peer in Cluster (Connected)



Hostname: 192.168.0.23

Uuid: 100b7778-459d-4c48-9ea8-bb8fe33d9493

State: Peer in Cluster (Connected)

Langkah Sepuluh

Di nextcloud1, buat volume yang direplikasi pada node yang diperiksa:

(nextcloud1)$ gluster volume create rep-volume replica 3 192.168.0.21:/glusterfs/brick 192.168.0.22:/glusterfs/brick 192.168.0.23:/glusterfs/brick

volume create: rep-volume: success: please start the volume to access data

Langkah Sebelas

Mulai volume yang direplikasi di nextcloud1:

(nextcloud1)$ gluster volume start rep-volume

volume start: rep-volume: success

Pastikan volume dan proses yang direplikasi sudah online:

$ gluster volume status

Status of volume: rep-volume

Gluster process                             TCP Port RDMA Port Online Pid

------------------------------------------------------------------------------

Brick 192.168.0.21:/glusterfs/brick         49152 0 Y 32570

Brick 192.168.0.22:/glusterfs/brick         49152 0 Y 27175

Brick 192.168.0.23:/glusterfs/brick         49152 0 Y 25799

Self-heal Daemon on localhost               N/A N/A Y 32591

Self-heal Daemon on 192.168.0.22            N/A N/A Y 27196

Self-heal Daemon on 192.168.0.23            N/A N/A Y 25820



Task Status of Volume rep-volume

------------------------------------------------------------------------------

There are no active volume tasks

Langkah Dua Belas

Pasang volume yang direplikasi di /var/www/html. Buat direktori:

$ mkdir -p /var/www/html

Langkah Tiga Belas

13) Tambahkan baris berikut ke /etc/fstab untuk mengizinkan pemasangan otomatis:

/dev/sdb1 /glusterfs xfs defaults,defaults 0 0

localhost:/rep-volume /var/www/html   glusterfs defaults,_netdev 0 0

Langkah Empat Belas

Pasang GlusterFS ke /var/www/html:

$ mount -a

Dan verifikasi dengan:

$ mount | grep gluster

/dev/sdb1 on /glusterfs type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

localhost:/rep-volume on /var/www/html type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)

Volume yang direplikasi sekarang siap dan dipasang di setiap node. Sekarang kita dapat melanjutkan untuk men-deploy aplikasi.

Penerapan Aplikasi Nextcloud

Langkah-langkah berikut harus dilakukan pada nextcloud1, nextcloud2 dan nextcloud3 kecuali ditentukan lain.

Nextcloud membutuhkan PHP 7.2 dan yang lebih baru dan untuk distribusi CentOS, kami harus mengaktifkan sejumlah repositori seperti EPEL dan Remi untuk menyederhanakan proses instalasi.

Langkah Pertama

Jika SELinux diaktifkan, nonaktifkan terlebih dahulu:

$ setenforce 0

$ sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

Anda juga dapat menjalankan Nextcloud dengan SELinux diaktifkan dengan mengikuti panduan ini.

Langkah Kedua

Instal persyaratan Nextcloud dan aktifkan repositori Remi untuk PHP 7.2:

$ yum install -y epel-release yum-utils unzip curl wget bash-completion policycoreutils-python mlocate bzip2

$ yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm

$ yum-config-manager --enable remi-php72

Langkah Ketiga

Instal dependensi Nextcloud, sebagian besar paket terkait Apache dan PHP 7.2:

$ yum install -y httpd php72-php php72-php-gd php72-php-intl php72-php-mbstring php72-php-mysqlnd php72-php-opcache php72-php-pecl-redis php72-php-pecl-apcu php72-php-pecl-imagick php72-php-xml php72-php-pecl-zip

Langkah Empat

Aktifkan Apache dan jalankan:

$ systemctl enable httpd.service

$ systemctl start httpd.service

Langkah Kelima

Buat tautan simbolis untuk PHP untuk menggunakan biner PHP 7.2:

$ ln -sf /bin/php72 /bin/php

Langkah Enam

Di nextcloud1, unduh Server Nextcloud dari sini dan ekstrak:

$ wget https://download.nextcloud.com/server/releases/nextcloud-17.0.0.zip

$ unzip nextcloud*

Langkah Tujuh

Di nextcloud1, salin direktori ke /var/www/html dan tetapkan kepemilikan yang benar:

$ cp -Rf nextcloud /var/www/html

$ chown -Rf apache:apache /var/www/html

**Perhatikan proses penyalinan ke /var/www/html akan memakan waktu karena replikasi volume GlusterFS.

Langkah Delapan

Sebelum melanjutkan untuk membuka wizard penginstalan, kita harus menonaktifkan variabel pxc_strict_mode selain "ENFORCING" (nilai default). Hal ini disebabkan oleh fakta bahwa impor database Nextcloud akan memiliki sejumlah tabel tanpa kunci utama yang ditentukan yang tidak direkomendasikan untuk dijalankan di Galera Cluster. Ini dijelaskan lebih lanjut di bawah bagian Penyetelan lebih jauh.

Untuk mengubah konfigurasi dengan ClusterControl, cukup buka Manage -> Configurations -> Change/Set Parameters:

Pilih semua instance database dari daftar, dan masukkan:

  • Grup:MYSQLD
  • Parameter:pxc_strict_mode
  • Nilai Baru:PERMISSIVE

ClusterControl akan melakukan perubahan yang diperlukan pada setiap node database secara otomatis. Jika nilainya dapat diubah selama runtime, itu akan segera berlaku. ClusterControl juga mengonfigurasi nilai di dalam file konfigurasi MySQL untuk persistensi. Anda akan melihat hasil berikut:

Langkah Sembilan

Sekarang kita siap untuk mengkonfigurasi instalasi Nextcloud kita. Buka browser dan pergi ke server HTTP nextcloud1 di http://192.168.0.21/nextcloud/ dan Anda akan disajikan dengan wizard konfigurasi berikut:

Konfigurasikan bagian "Penyimpanan &basis data" dengan nilai berikut:

  • Folder data:/var/www/html/nextcloud/data
  • Konfigurasi database:MySQL/MariaDB
  • Nama pengguna:nextcloud
  • Password:(password untuk pengguna nextcloud)
  • Basis data:nextcloud
  • Host:192.168.0.10:6603 (Alamat IP virtual dengan port ProxySQL)

Klik "Finish Setup" untuk memulai proses konfigurasi. Tunggu hingga selesai dan Anda akan diarahkan ke dasbor Nextcloud untuk pengguna "admin". Instalasi sekarang selesai. Bagian selanjutnya memberikan beberapa tip penyetelan untuk berjalan secara efisien dengan Galera Cluster.

Penyetelan Database Nextcloud

Kunci Utama

Memiliki kunci utama di setiap tabel sangat penting untuk replikasi kumpulan tulis Galera Cluster. Untuk tabel yang relatif besar tanpa kunci utama, transaksi pembaruan atau penghapusan yang besar akan sepenuhnya memblokir cluster Anda untuk waktu yang sangat lama. Untuk menghindari keanehan dan kasus tepi, cukup pastikan bahwa semua tabel menggunakan mesin penyimpanan InnoDB dengan kunci utama eksplisit (kunci unik tidak dihitung).

Instalasi default Nextcloud akan membuat sekumpulan tabel di bawah database yang ditentukan dan beberapa di antaranya tidak mematuhi aturan ini. Untuk memeriksa apakah tabel kompatibel dengan Galera, kita dapat menjalankan pernyataan berikut:

mysql> SELECT DISTINCT CONCAT(t.table_schema,'.',t.table_name) as tbl, t.engine, IF(ISNULL(c.constraint_name),'NOPK','') AS nopk, IF(s.index_type = 'FULLTEXT','FULLTEXT','') as ftidx, IF(s.index_type = 'SPATIAL','SPATIAL','') as gisidx FROM information_schema.tables AS t LEFT JOIN information_schema.key_column_usage AS c ON (t.table_schema = c.constraint_schema AND t.table_name = c.table_name AND c.constraint_name = 'PRIMARY') LEFT JOIN information_schema.statistics AS s ON (t.table_schema = s.table_schema AND t.table_name = s.table_name AND s.index_type IN ('FULLTEXT','SPATIAL'))   WHERE t.table_schema NOT IN ('information_schema','performance_schema','mysql') AND t.table_type = 'BASE TABLE' AND (t.engine <> 'InnoDB' OR c.constraint_name IS NULL OR s.index_type IN ('FULLTEXT','SPATIAL')) ORDER BY t.table_schema,t.table_name;

+---------------------------------------+--------+------+-------+--------+

| tbl                                   | engine | nopk | ftidx | gisidx |

+---------------------------------------+--------+------+-------+--------+

| nextcloud.oc_collres_accesscache      | InnoDB | NOPK | | |

| nextcloud.oc_collres_resources        | InnoDB | NOPK | | |

| nextcloud.oc_comments_read_markers    | InnoDB | NOPK | | |

| nextcloud.oc_federated_reshares       | InnoDB | NOPK | | |

| nextcloud.oc_filecache_extended       | InnoDB | NOPK | | |

| nextcloud.oc_notifications_pushtokens | InnoDB | NOPK |       | |

| nextcloud.oc_systemtag_object_mapping | InnoDB | NOPK |       | |

+---------------------------------------+--------+------+-------+--------+

Output di atas menunjukkan ada 7 tabel yang tidak memiliki primary key yang ditentukan. Untuk memperbaiki hal di atas, cukup tambahkan kunci utama dengan kolom kenaikan otomatis. Jalankan perintah berikut di salah satu server database, misalnya nexcloud1:

(nextcloud1)$ mysql -uroot -p

mysql> ALTER TABLE nextcloud.oc_collres_accesscache ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_collres_resources ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_comments_read_markers ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_federated_reshares ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_filecache_extended ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_notifications_pushtokens ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_systemtag_object_mapping ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

Setelah modifikasi di atas diterapkan, kita dapat mengkonfigurasi ulang pxc_strict_mode ke nilai yang disarankan, "ENFORCING". Ulangi langkah #8 di bawah bagian "Penempatan Aplikasi" dengan nilai yang sesuai.

BACA-COMMITTED Tingkat Isolasi

Tingkat isolasi transaksi yang disarankan seperti yang disarankan oleh Nextcloud adalah menggunakan READ-COMMITTED, sedangkan Galera Cluster default ke tingkat isolasi REPEATABLE-READ yang lebih ketat. Menggunakan READ-COMMITTED dapat menghindari kehilangan data dalam skenario beban tinggi (misalnya dengan menggunakan klien sinkronisasi dengan banyak klien/pengguna dan banyak operasi paralel).

Untuk mengubah tingkat transaksi, buka ClusterControl -> Manage -> Configurations -> Change/Set Parameter dan tentukan yang berikut:

Klik "Lanjutkan" dan ClusterControl akan segera menerapkan perubahan konfigurasi. Tidak diperlukan restart basis data.

Multi-Instance Nextcloud

Karena kami melakukan instalasi di nextcloud1 saat mengakses URL, alamat IP ini secara otomatis ditambahkan ke variabel 'trusted_domains' di dalam Nextcloud. Saat Anda mencoba mengakses server lain, misalnya server sekunder, http://192.168.0.22/nextcloud, Anda akan melihat kesalahan bahwa ini adalah host yang tidak diotorisasi dan harus ditambahkan ke variabel domain_terpercaya.

Oleh karena itu, tambahkan semua alamat IP host di bawah array "trusted_domain" di dalam /var/www/html/nextcloud/config/config.php, seperti contoh di bawah ini:

  'trusted_domains' =>

  array (

    0 => '192.168.0.21',

    1 => '192.168.0.22',

    2 => '192.168.0.23'

  ),

Konfigurasi di atas memungkinkan pengguna untuk mengakses ketiga server aplikasi melalui URL berikut:

  • http://192.168.0.21/nextcloud (nextcloud1)
  • http://192.168.0.22/nextcloud (nextcloud2)
  • http://192.168.0.23/nextcloud (nextcloud3)

Catatan:Anda dapat menambahkan tingkat penyeimbang beban di atas tiga instans Nextcloud ini untuk mencapai ketersediaan tinggi untuk tingkat aplikasi dengan menggunakan proxy terbalik HTTP yang tersedia di pasar seperti HAProxy atau nginx. Itu di luar cakupan entri blog ini.

Menggunakan Redis untuk Mengunci File

Mekanisme Penguncian File Transaksional Nextcloud mengunci file untuk menghindari kerusakan file selama operasi normal. Direkomendasikan untuk menginstal Redis untuk menangani penguncian file transaksional (ini diaktifkan secara default) yang akan membongkar cluster database dari menangani pekerjaan berat ini.

Untuk menginstal Redis, cukup:

$ yum install -y redis

$ systemctl enable redis.service

$ systemctl start redis.service

Tambahkan baris berikut di dalam /var/www/html/nextcloud/config/config.php:

  'filelocking.enabled' => true,

  'memcache.locking' => '\OC\Memcache\Redis',

  'redis' => array(

     'host' => '192.168.0.21',

     'port' => 6379,

     'timeout' => 0.0,

   ),

Untuk detail selengkapnya, lihat dokumentasi ini, Penguncian File Transaksional.

Kesimpulan

Nextcloud dapat dikonfigurasi untuk menjadi layanan hosting file yang skalabel dan tersedia untuk memenuhi permintaan berbagi file pribadi Anda. Di blog ini, kami menunjukkan bagaimana Anda dapat membawa redundansi di Nextcloud, sistem file, dan lapisan basis data.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana TIME() Bekerja di MariaDB

  2. Bagaimana UPPER() Bekerja di MariaDB

  3. Cara Mencadangkan Basis Data MariaDB Moodle Anda

  4. Cara Menginstal MariaDB 10 di RHEL 8

  5. Cara Menjalankan Aplikasi PHP 5 dengan MySQL 8.0 di CentOS 7