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

Pengantar Penerapan MySQL Menggunakan Peran yang Mungkin

Dimungkinkan untuk mengotomatisasi dan menyederhanakan operasi yang berulang, rumit, dan membosankan. Ini adalah mesin otomatisasi TI yang mengotomatiskan penyediaan cloud, manajemen konfigurasi, penerapan aplikasi, orkestrasi intra-layanan, dan banyak kebutuhan TI lainnya. Tidak memerlukan agen, hanya menggunakan SSH untuk mendorong perubahan dari satu sumber ke beberapa sumber daya jarak jauh tanpa konfigurasi infrastruktur keamanan khusus tambahan dan menggunakan format bahasa sederhana (YAML) untuk menjelaskan tugas otomatisasi.

Menginstal server MySQL mandiri adalah tugas sederhana yang mudah, tetapi ini dapat menjadi masalah jika Anda memiliki beberapa server database, versi, platform, dan lingkungan yang harus didukung. Oleh karena itu, memiliki alat manajemen konfigurasi adalah cara untuk meningkatkan efisiensi, menghilangkan pengulangan, dan mengurangi kesalahan manusia.

Dalam posting blog ini, kami akan memandu Anda melalui dasar-dasar otomatisasi Ansible untuk MySQL, serta manajemen konfigurasi dengan contoh dan penjelasan. Kita akan mulai dengan penerapan MySQL mandiri yang sederhana, seperti yang diilustrasikan dalam diagram tingkat tinggi berikut:

Menginstal Kemungkinan

Untuk panduan ini, kita harus memiliki setidaknya dua host - Satu host untuk Ansible (Anda dapat menggunakan workstation alih-alih server) dan host lainnya adalah host target yang ingin kami gunakan server MySQL.

Untuk menginstal Ansible di CentOS 7, cukup jalankan perintah berikut:

(ansible-host)$ yum install -y epel-release

(ansible-host)$ yum install -y ansible

Untuk distribusi OS lainnya, lihat panduan penginstalan yang memungkinkan.

Menyiapkan SSH Tanpa Kata Sandi

Menggunakan kata sandi selama SSH didukung, tetapi kunci SSH tanpa kata sandi dengan ssh-agent adalah salah satu cara terbaik untuk menggunakan Ansible. Langkah awal adalah mengonfigurasi SSH tanpa kata sandi karena Ansible akan melakukan penerapan hanya oleh saluran ini. Pertama, buat kunci SSH pada host Ansible:

(ansible-host)$ whoami

root

(ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa

Anda harus mendapatkan setidaknya file berikut yang dihasilkan:

(ansible-host)$ ls -al ~/.ssh/

-rw-------. 1 root root 1679 Jan 14 03:40 id_rsa

-rw-r--r--. 1 root root  392 Jan 14 03:40 id_rsa.pub

Untuk mengizinkan SSH tanpa kata sandi, kita perlu menyalin kunci publik SSH (id_rsa.pub) ke host jarak jauh yang ingin kita akses. Kita dapat menggunakan alat yang disebut ssh-copy-id untuk melakukan tugas ini untuk kita. Namun, Anda harus mengetahui kata sandi pengguna dari host target dan otentikasi kata sandi diperbolehkan pada host target:

(ansible-host)$ whoami

root

(ansible-host)$ ssh-copy-id [email protected]

Perintah di atas akan meminta kata sandi root 192.168.0.221, cukup masukkan kata sandi dan kunci SSH untuk pengguna Ansible host saat ini akan disalin ke host target, 192.168.0.221 ke ~/.ssh/authorized_keys, artinya kami mengotorisasi kunci tertentu untuk mengakses server ini dari jarak jauh. Untuk mengujinya, Anda harus dapat menjalankan perintah jarak jauh berikut tanpa kata sandi dari Ansible host:

(ansible-host)$ ssh [email protected] "hostname -I"

192.168.0.221

Jika Anda tidak diizinkan menggunakan pengguna root untuk SSH (misalnya, "PermitRootLogin no" dalam konfigurasi SSH), Anda dapat menggunakan pengguna sudo. Dalam contoh berikut, kami menyiapkan SSH tanpa kata sandi untuk pengguna sudo yang disebut "gelandangan":

(ansible-host)$ whoami

vagrant

(ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa

(ansible-host)$ ls -al ~/.ssh/

-rw-------. 1 vagrant vagrant 1679 Jan 14 03:45 id_rsa

-rw-r--r--. 1 vagrant vagrant  392 Jan 14 03:45 id_rsa.pub

(ansible-host)$ ssh-copy-id [email protected]

Jika server target tidak mengizinkan otentikasi kata sandi melalui SSH, cukup salin konten kunci publik SSH di ~/.ssh/id_rsa.pub secara manual ke ~/.ssh/authorized_keys host target mengajukan. Misalnya, pada host Ansible, ambil konten kunci publik:

(ansible-host)$ cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]

Hubungkan ke host target dan tempel kunci publik host Ansible ke ~/.ssh/authorized_keys:

(target-host)$ whoami

root

(target-host)$ vi ~/.ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]

Sekarang Anda dapat mencoba menjalankan perintah jarak jauh dari Ansible host untuk memverifikasi dan Anda tidak akan dimintai sandi apa pun. Pada titik ini, SSH tanpa kata sandi kami telah dikonfigurasi.

Menentukan Host Target

Selanjutnya kita perlu menentukan host target, host yang ingin kita kelola menggunakan Ansible. Berdasarkan arsitektur kami, kami hanya akan menggunakan satu server MySQL yaitu 192.168.0.221. Tambahkan baris berikut ke /etc/ansible/hosts:

[db-mysql]

192.168.0.221

Di atas berarti kita mendefinisikan grup yang disebut "db-mysql", yang akan menjadi pengidentifikasi saat kita merujuk ke host target di Playbook Ansible. Kami juga dapat mencantumkan semua alamat IP atau nama host dari host target di bawah grup ini. Pada titik ini, kami hanya memiliki satu server MySQL untuk digunakan, jadi hanya ada satu entri yang ada. Anda juga dapat menentukan aturan pencocokan apa pun untuk mencocokkan host di bawah satu grup, misalnya:

[db-mysql]

192.168.0.[221:223]

Definisi di atas berarti kita memiliki 3 host di bawah grup ini dengan alamat IP berikut:

  • 192.168.0.221
  • 192.168.0.222
  • 192.168.0.223

Ada banyak cara dan aturan untuk mencocokkan dan mengelompokkan host target seperti yang ditunjukkan dalam panduan inventaris yang memungkinkan.

Memilih Peran yang Mungkin

Untuk memberi tahu Ansible apa yang akan di-deploy, kita perlu mendefinisikan langkah-langkah penerapan dalam file berformat YML yang disebut playbook. Seperti yang mungkin Anda ketahui, menginstal server MySQL lengkap memerlukan beberapa langkah untuk memenuhi semua dependensi MySQL, konfigurasi pasca-instalasi, pembuatan skema dan pengguna, dan sebagainya. Ansible telah menyediakan sejumlah modul MySQL yang dapat membantu kami, tetapi kami masih harus menulis pedoman untuk langkah-langkah penerapan.

Untuk menyederhanakan langkah penerapan, kita dapat menggunakan peran Ansible yang ada. Peran yang memungkinkan adalah komponen independen yang memungkinkan penggunaan kembali langkah-langkah konfigurasi umum. Peran Ansible harus digunakan dalam buku pedoman. Ada sejumlah peran MySQL Ansible yang tersedia di Ansible Galaxy, repositori untuk peran Ansible yang tersedia untuk langsung dimasukkan ke dalam buku pedoman Anda.

Jika Anda mencari "mysql", Anda akan mendapatkan banyak peran Ansible untuk MySQL:

Kami akan menggunakan yang paling populer bernama "mysql" oleh geerlingguy. Anda dapat memilih untuk menggunakan peran lain tetapi sebagian besar yang paling banyak diunduh cenderung untuk tujuan umum yang biasanya berfungsi dengan baik dalam banyak kasus.

Pada host Ansible, jalankan perintah berikut untuk mengunduh peran Ansible:

(ansible-host)$ ansible-galaxy install geerlingguy.mysql

Peran akan diunduh ke ~/.ansible/roles/geerlingguy.mysql/ dari pengguna saat ini.

Menulis Playbook yang Mungkin

Dengan melihat peran Readme of the Ansible, kita bisa mengikuti contoh playbook yang sedang disediakan. Pertama, buat file playbook bernama deploy-mysql.yml dan tambahkan baris berikut:

(ansible-host)$ vim ~/deploy-mysql.yml

- hosts: db-mysql

  become: yes

  vars_files:

    - vars/main.yml

  roles:

    - { role: geerlingguy.mysql }

Pada baris di atas, kita mendefinisikan host target yang merupakan semua host di bawah entri db-mysql di /etc/ansible/hosts. Baris berikutnya (menjadi) memberi tahu Ansible untuk mengeksekusi buku pedoman sebagai pengguna root, yang diperlukan untuk peran tersebut (dinyatakan di sana dalam file Readme). Selanjutnya, kita tentukan lokasi file variabel (var_files) yang terletak di vars/main.yml, relatif terhadap jalur playbook.

Mari kita buat direktori dan file variabel dan tentukan baris berikut:

(ansible-host)$ mkdir vars

(ansible-host)$ vim vars/main.yml

mysql_root_password: "theR00tP455w0rd"

Untuk informasi lebih lanjut, lihat bagian Variabel Peran di file Readme peran ini.

Mulai Penerapan

Sekarang kita siap untuk memulai penerapan MySQL. Gunakan perintah ansible-playbook untuk menjalankan definisi playbook kami:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Anda akan melihat banyak baris muncul di output. Fokus pada baris terakhir yang merangkum penerapan:

PLAY RECAP ***************************************************************************************************************************************

192.168.0.221              : ok=36 changed=8 unreachable=0    failed=0 skipped=16 rescued=0 ignored=0

Jika semuanya berubah menjadi hijau dan OK, Anda dapat memverifikasi pada host database bahwa server MySQL kami sudah diinstal dan dijalankan:

(mysql-host)$ rpm -qa | grep -i maria

mariadb-server-5.5.64-1.el7.x86_64

mariadb-libs-5.5.64-1.el7.x86_64

mariadb-5.5.64-1.el7.x86_64



(mysql-host)$ mysqladmin -uroot -p ping

Enter password:

mysqld is alive

Seperti yang Anda lihat di atas, untuk CentOS 7, instalasi MySQL default adalah MariaDB 5.5 sebagai bagian dari repositori paket standar. Pada titik ini, penerapan kami dianggap selesai, namun, kami ingin menyesuaikan lebih lanjut penerapan kami seperti yang ditunjukkan di bagian berikutnya.

Menyesuaikan Penerapan

Definisi paling sederhana dalam buku pedoman memberi kita instalasi yang sangat mendasar dan menggunakan semua opsi konfigurasi default. Kami selanjutnya dapat menyesuaikan instalasi MySQL dengan memperluas/memodifikasi/menambahkan buku pedoman untuk melakukan hal berikut:

  • modifikasi opsi konfigurasi MySQL
  • tambahkan pengguna basis data
  • tambahkan skema database
  • mengonfigurasi hak pengguna
  • mengonfigurasi replikasi MySQL
  • instal MySQL dari vendor lain
  • mengimpor file konfigurasi MySQL khusus

Menginstal MySQL dari repositori Oracle

Secara default, peran akan menginstal paket MySQL default yang disertakan dengan distribusi OS. Adapun CentOS 7, Anda akan menginstal MariaDB 5.5 secara default. Misalkan kita ingin menginstal MySQL dari vendor lain, kita dapat memperluas playbook dengan pre_tasks, tugas yang dijalankan Ansible sebelum menjalankan tugas apa pun yang disebutkan dalam file .yml, seperti yang ditunjukkan pada contoh berikut:

(ansible-host)$ vim deploy-mysql.yml

- hosts: db-mysql

  become: yes

  vars_files:

    - vars/main.yml

  roles:

    - { role: geerlingguy.mysql }

  pre_tasks:

    - name: Install the MySQL repo.

      yum:

        name: http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

        state: present

      when: ansible_os_family == "RedHat"

    - name: Override variables for MySQL (RedHat).

      set_fact:

        mysql_daemon: mysqld

        mysql_packages: ['mysql-server']

        mysql_log_error: /var/lib/mysql/error.log

        mysql_syslog_tag: mysqld

        mysql_pid_file: /var/run/mysqld/mysqld.pid

        mysql_socket: /var/lib/mysql/mysql.sock

      when: ansible_os_family == "RedHat"

Jalankan buku pedoman:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Di atas akan menginstal MySQL dari repositori Oracle sebagai gantinya. Versi default yang akan Anda dapatkan adalah MySQL 5.6. Menjalankan pedoman di atas pada host target yang sudah menjalankan versi lama MySQL/MariaDB kemungkinan akan gagal karena ketidakcocokan.

Membuat Database dan Pengguna MySQL

Di dalam vars/main.yml, kita dapat mendefinisikan database MySQL dan pengguna yang ingin kita konfigurasikan di server MySQL kita dengan menggunakan modul mysql_database dan mysql_users, tepat setelah definisi sebelumnya tentang mysql_root_password:

(ansible-host)$ vim vars/main.yml

mysql_root_password: "theR00tP455w0rd"

mysql_databases:

  - name: myshop

    encoding: latin1

    collation: latin1_general_ci

  - name: sysbench

    encoding: latin1

    collation: latin1_general_ci

mysql_users:

  - name: myshop_user

    host: "%"

    password: mySh0pPassw0rd

    priv: "myshop.*:ALL"

  - name: sysbench_user

    host: "192.168.0.%"

    password: sysBenchPassw0rd

    priv: "sysbench.*:ALL"

Definisi tersebut menginstruksikan Ansible untuk membuat dua database, "myshop" dan "sysbench", mengikuti pengguna MySQL masing-masing dengan hak istimewa yang tepat, host dan sandi yang diizinkan.

Jalankan ulang buku pedoman untuk menerapkan perubahan ke server MySQL kami:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Kali ini, Ansible akan mengambil semua perubahan yang kami buat di vars/main.yml untuk diterapkan ke server MySQL kami. Kami dapat memverifikasi di server MySQL dengan perintah berikut:

(mysql-host)$ mysql -uroot -p -e 'SHOW DATABASES'

Enter password:

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

| Database           |

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

| information_schema |

| myshop             |

| mysql              |

| performance_schema |

| sysbench           |

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

(mysql-host)$ mysql -uroot -p -e 'SHOW GRANTS FOR [email protected]"192.168.0.%"'

Enter password:

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

| Grants for [email protected]%                                                                                   |

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

| GRANT USAGE ON *.* TO 'sysbench_user'@'192.168.0.%' IDENTIFIED BY PASSWORD '*4AC2E8AD02562E8FAAF5A958DC2AEA4C47451B5C' |

| GRANT ALL PRIVILEGES ON `sysbench`.* TO 'sysbench_user'@'192.168.0.%'                                                  |

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

Mengaktifkan Log Kueri Lambat

Peran ini mendukung pengaktifan log kueri lambat MySQL, kita dapat menentukan lokasi file log serta waktu kueri lambat. Tambahkan variabel yang diperlukan di dalam file vars/main.yml:

mysql_root_password: "theR00tP455w0rd"

mysql_databases:

  - name: example_db

    encoding: latin1

    collation: latin1_general_ci

  - name: sysbench

    encoding: latin1

    collation: latin1_general_ci

mysql_users:

  - name: example_user

    host: "%"

    password: similarly-secure-password

    priv: "example_db.*:ALL"

  - name: sysbench_user

    host: "192.168.0.%"

    password: sysBenchPassw0rd

    priv: "sysbench.*:ALL"

mysql_slow_query_log_enabled: true

mysql_slow_query_log_file: 'slow_query.log'

mysql_slow_query_time: '5.000000'

Jalankan kembali buku pedoman untuk menerapkan perubahan:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Playbook akan membuat perubahan yang diperlukan pada opsi terkait permintaan lambat MySQL dan memulai ulang server MySQL secara otomatis untuk memuat konfigurasi baru. Kami kemudian dapat memverifikasi apakah opsi konfigurasi baru dimuat dengan benar di server MySQL:

(mysql-host)$ mysql -uroot -p -e 'SELECT @@slow_query_log, @@slow_query_log_file, @@long_query_time'

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

| @@slow_query_log | @@slow_query_log_file | @@long_query_time |

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

|                1 | slow_query.log        | 5.000000 |

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

Termasuk File Konfigurasi MySQL Kustom

Variabel peran yang memungkinkan dan variabel MySQL adalah dua hal yang berbeda. Penulis peran ini telah membuat sejumlah variabel terkait MySQL yang dapat direpresentasikan dengan variabel peran Ansible. Diambil dari file Readme, berikut beberapa diantaranya:

mysql_port: "3306"

mysql_bind_address: '0.0.0.0'

mysql_datadir: /var/lib/mysql

mysql_socket: *default value depends on OS*

mysql_pid_file: *default value depends on OS*

mysql_log_file_group: mysql *adm on Debian*

mysql_log: ""

mysql_log_error: *default value depends on OS*

mysql_syslog_tag: *default value depends on OS*

Jika konfigurasi yang dihasilkan tidak memenuhi persyaratan MySQL kami, kami dapat menyertakan file konfigurasi MySQL khusus ke dalam penerapan dengan menggunakan variabel mysql_config_include_files. Ia menerima larik nilai yang dipisahkan oleh koma, dengan "src" sebagai awalan untuk jalur sebenarnya di Ansible host.

Pertama-tama, kita harus menyiapkan file konfigurasi khusus pada host Ansible. Buat direktori dan file konfigurasi MySQL sederhana:

(ansible-host)$ mkdir /root/custom-config/

(ansible-host)$ vim /root/custom-config/my-severalnines.cnf

[mysqld]

max_connections=250

log_bin=binlog

expire_logs_days=7

Misalnya kita memiliki file konfigurasi lain khusus untuk konfigurasi mysqldump:

(ansible-host)$ vim /root/custom-config/mysqldump.cnf

[mysqldump]

max_allowed_packet=128M

Untuk mengimpor file konfigurasi ini ke dalam penerapan kami, tentukan dalam array mysql_config_include_files di file vars/main.yml:

mysql_root_password: "theR00tP455w0rd"

mysql_databases:

  - name: example_db

    encoding: latin1

    collation: latin1_general_ci

  - name: sysbench

    encoding: latin1

    collation: latin1_general_ci

mysql_users:

  - name: example_user

    host: "%"

    password: similarly-secure-password

    priv: "example_db.*:ALL"

  - name: sysbench_user

    host: "192.168.0.%"

    password: sysBenchPassw0rd

    priv: "sysbench.*:ALL"

mysql_slow_query_log_enabled: true

mysql_slow_query_log_file: slow_query.log

mysql_slow_query_time: 5

mysql_config_include_files: [

  src: '/root/custom-config/my-severalnines.cnf',

  src: '/root/custom-config/mysqldump.cnf'

]

Perhatikan bahwa /root/custom-config/mysqld-severalnines.cnf dan /root/custom-config/mysqldump.cnf ada di dalam Ansible host.

Jalankan kembali buku pedoman:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Playbook akan mengimpor file konfigurasi tersebut dan memasukkannya ke dalam direktori include (tergantung pada OS) yaitu /etc/my.cnf.d/ untuk CentOS 7. Playbook akan memulai ulang secara otomatis Server MySQL untuk memuat opsi konfigurasi baru. Kami kemudian dapat memverifikasi apakah opsi konfigurasi baru dimuat dengan benar:

(mysql-host)$ mysql -uroot -p -e 'select @@max_connections'

250

(mysql-host)$ mysqldump --help | grep ^max-allowed-packet

max-allowed-packet                134217728

Kesimpulan

Ansible dapat digunakan untuk mengotomatisasi penyebaran basis data dan manajemen konfigurasi dengan sedikit pengetahuan tentang skrip. Sementara itu, ClusterControl menggunakan pendekatan SSH tanpa kata sandi yang serupa untuk menerapkan, memantau, mengelola, dan menskalakan klaster database Anda dari A hingga Z, dengan antarmuka pengguna dan tidak memerlukan keahlian tambahan untuk mencapai hasil yang sama.


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

  2. ClusterControl - Manajemen Cadangan Tingkat Lanjut - mariabackup Bagian II

  3. Bagaimana RTRIM() Bekerja di MariaDB

  4. MariaDB CHARACTER_LENGTH() Dijelaskan

  5. 7 Cara Mengembalikan Baris Duplikat yang memiliki Kunci Utama di MariaDB