Menemukan penyimpanan yang optimal adalah proses yang agak rumit, semuanya memiliki pro dan kontra. Tentu saja, pemimpin dalam kategori ini adalah CEPH, tetapi ini adalah sistem yang agak rumit, meskipun dengan fungsionalitas yang sangat kaya. Bagi kami, sistem seperti itu berlebihan, mengingat kami membutuhkan penyimpanan sederhana yang direplikasi dalam mode master-master untuk beberapa terabyte. Setelah mempelajari banyak bahan, diputuskan untuk menguji produk paling modis di pasar untuk rangkaian yang kami minati. Karena kenyataan bahwa tidak ada solusi siap dari rencana seperti itu ditemukan, saya ingin berbagi praktik terbaik saya tentang topik ini dan menggambarkan masalah yang kami temui dalam proses penyebaran.Tujuan
Apa yang kami harapkan dari repositori baru:- Kemampuan untuk bekerja dengan sejumlah genap untuk replikasi.
- Instalasi mudah, pengaturan, dukungan
- Sistem harus dewasa, teruji waktu, dan pengguna
- Kemampuan untuk memperluas ruang penyimpanan tanpa downtime
- Penyimpanan harus kompatibel dengan Kubernetes
- Seharusnya ada failover otomatis ketika salah satu node crash
Pada poin terakhir kita punya banyak pertanyaan.Penyebaran
Untuk penyebaran, dua mesin virtual diciptakan pada CentOs 8. Masing-masing terhubung melalui disk tambahan dengan penyimpanan.Persiapan awal
Untuk GlusterFS, Anda perlu mengalokasikan disk terpisah dengan XFS sehingga tidak mempengaruhi sistem dengan cara apa pun.Pilih partisi:$ fdisk /dev/sdb
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-16777215, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-16777215, default 16777215):
Created a new partition 1 of type βLinuxβ and of size 8 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table. Syncing disks.
Format dalam XFS dan mount:$ mkfs.xfs /dev/sdb1
$ mkdir /gluster
$ mount /dev/sdb1 /gluster
Dan to top it off, letakkan entri di / etc / fstab untuk secara otomatis me-mount direktori saat startup sistem:/dev/sdb1 /gluster xfs defaults 0 0
Instalasi
Mengenai instalasi, banyak artikel telah ditulis, dalam hubungan ini kita tidak akan masuk jauh ke dalam proses, kita hanya akan mempertimbangkan apa yang perlu diperhatikan.Di kedua node, instal dan jalankan glusterfs versi terbaru:$ wget -P /etc/yum.repos.d https://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-rhel8.repo
$ yum -y install yum-utils
$ yum-config-manager --enable PowerTools
$ yum install -y glusterfs-server
$ systemctl start glusterd
Selanjutnya, Anda perlu memberi tahu glaster di mana simpul tetangganya berada. Ini dilakukan hanya dengan satu simpul. Poin penting: jika Anda memiliki jaringan domain, maka Anda harus menentukan nama server dengan domain, jika tidak di masa depan Anda harus mengulang semuanya.$ gluster peer probe gluster-02.example.com
Jika berhasil, maka kami memeriksa koneksi dengan perintah dari kedua server:$ gluster peer status
Number of Peers: 1
Hostname: gluster-02.example.com
Uuid: a6de3b23-ee31-4394-8bff-0bd97bd54f46
State: Peer in Cluster (Connected)
Other names:
10.10.6.72
Sekarang Anda dapat membuat Volume di mana kami akan menulis.gluster volume create main replica 2 gluster-01.example.com:/gluster/main gluster-02.example.com:/gluster/main force
Dimana:- volume nama utama
- replika - tipe Volume (lebih jelasnya dapat ditemukan di dokumentasi resmi )
- 2 - jumlah replika
Jalankan Volume dan periksa kinerjanya:gluster volume start main
gluster volume status main
Untuk Volume yang direplikasi, Anda disarankan untuk mengatur parameter berikut:$ gluster volume set main network.ping-timeout 5
$ gluster volume set main cluster.quorum-type fixed
$ gluster volume set main cluster.quorum-count 1
$ gluster volume set main performance.quick-read on
Dengan langkah-langkah sederhana ini, kami telah membangun cluster GlusterFS. Masih terhubung ke sana dan periksa kinerjanya. Ubuntu diinstal pada mesin klien, untuk pemasangan Anda perlu menginstal klien:$ add-apt-repository ppa:gluster/glusterfs-7
$ apt install glusterfs-client
$ mkdir /gluster
$ mount.glusterfs gluster-01.example.com:/main /gluster
Gluster, ketika terhubung ke salah satu node, memberikan alamat semua node dan secara otomatis terhubung ke semua node. Jika klien telah terhubung, kegagalan salah satu node tidak akan menyebabkan berhenti. Tetapi jika node pertama tidak tersedia, itu tidak akan mungkin untuk terhubung jika terjadi sesi istirahat. Untuk melakukan ini, saat pemasangan, Anda dapat melewati parameter backupvolfile yang menunjukkan simpul kedua.mount.glusterfs gluster-01.example.com:/main /gluster -o backupvolfile-server=gluster-02.example.com
Poin penting: gluster menyinkronkan file antar node hanya jika perubahannya melalui volume yang dipasang. Jika Anda membuat perubahan langsung pada node, file akan tidak sinkron.Terhubung ke Kubernetes
Pada tahap ini, pertanyaan dimulai: "Bagaimana menghubungkannya?". Dan ada beberapa opsi. Pertimbangkan mereka.Heketi
Yang paling populer dan direkomendasikan adalah menggunakan layanan eksternal: heketi. heketi adalah lapisan antara kubernetes dan gluster, yang memungkinkan Anda untuk mengelola dan bekerja dengan penyimpanan melalui http. Tapi heketi akan menjadi titik kegagalan itu, karena layanan tidak berkerumun. Contoh kedua dari layanan ini tidak akan dapat bekerja secara mandiri, karena setiap perubahan disimpan dalam database lokal. Menjalankan layanan ini di kubernetes juga tidak cocok, karena ia membutuhkan disk statis tempat database-nya akan disimpan. Dalam hal ini, opsi ini ternyata paling tidak pantas.Titik akhir di Kubernetes
Jika Anda memiliki Kubernet pada sistem dengan manajer paket, maka ini adalah pilihan yang sangat nyaman. Intinya adalah bahwa untuk semua server GlusteFS di Kubernetes, Endpoint umum dibuat. Suatu layanan digantung pada Titik Akhir ini dan kami akan sudah terpasang pada layanan ini. Agar opsi ini berfungsi, perlu menginstal glusterfs-client pada setiap simpul Kubernetes dan memastikan bahwa ia dapat dipasang. Di Kubernetes, gunakan konfigurasi berikut:apiVersion: v1
kind: Endpoints
metadata:
name: glusterfs-cluster
subsets:
- addresses:
- ip: 10.10.6.71
ports:
- port: 1
- addresses:
- ip: 10.10.6.72
ports:
- port: 1
---
apiVersion: v1
kind: Service
metadata:
name: glusterfs-cluster
spec:
ports:
- port: 1
Sekarang kita dapat membuat penyebaran uji sederhana dan memeriksa cara kerja pemasangan. Di bawah ini adalah contoh penyebaran tes sederhana:apiVersion: apps/v1
kind: Deployment
metadata:
name: gluster-test
spec:
replicas: 1
selector:
matchLabels:
app: gluster-test
template:
metadata:
labels:
app: gluster-test
spec:
volumes:
- name: gluster
glusterfs:
endpoints: glusterfs-cluster
path: main
containers:
- name: gluster-test
image: nginx
volumeMounts:
- name: gluster
mountPath: /gluster
Opsi ini tidak cocok untuk kami, karena kami memiliki container-linux di semua node Kubernetes. Pengelola paket tidak ada di sana, jadi itu tidak mungkin untuk menginstal gluster-client untuk pemasangan. Dalam hal ini, opsi ketiga ditemukan, yang diputuskan untuk digunakan.GlusterFS + NFS + terus disimpan
Sampai baru-baru ini, GlusterFS menawarkan server NFS sendiri, tetapi sekarang layanan eksternal nfs-ganesha digunakan untuk NFS. Cukup banyak yang telah ditulis tentang ini, sehubungan dengan ini kita akan mencari cara untuk mengkonfigurasinya.Repositori harus didaftarkan secara manual. Untuk melakukan ini, dalam file /etc/yum.repos.d/nfs-ganesha.repo kita tambahkan:[nfs-ganesha]
name=nfs-ganesha
baseurl=https://download.nfs-ganesha.org/2.8/2.8.0/RHEL/el-8/$basearch/
enabled=1
gpgcheck=1
[nfs-ganesha-noarch]
name=nfs-ganesha-noarch
baseurl=https://download.nfs-ganesha.org/2.8/2.8.0/RHEL/el-8/noarch/
enabled=1
gpgcheck=1
Dan instal:yum -y install nfs-ganesha-gluster --nogpgcheck
Setelah instalasi, kami melakukan konfigurasi dasar pada file /etc/ganesha/ganesha.conf.# create new
NFS_CORE_PARAM {
# possible to mount with NFSv3 to NFSv4 Pseudo path
mount_path_pseudo = true;
# NFS protocol
Protocols = 3,4;
}
EXPORT_DEFAULTS {
# default access mode
Access_Type = RW;
}
EXPORT {
# uniq ID
Export_Id = 101;
# mount path of Gluster Volume
Path = "/gluster/main";
FSAL {
# any name
name = GLUSTER;
# hostname or IP address of this Node
hostname="gluster-01.example.com";
# Gluster volume name
volume="main";
}
# config for root Squash
Squash="No_root_squash";
# NFSv4 Pseudo path
Pseudo="/main";
# allowed security options
SecType = "sys";
}
LOG {
# default log level
Default_Log_Level = WARN;
}
Kita perlu memulai layanan, mengaktifkan nfs untuk volume kita dan memeriksa apakah sudah dinyalakan.$ systemctl start nfs-ganesha
$ systemctl enable nfs-ganesha
$ gluster volume set main nfs.disable off
$ gluster volume status main
Akibatnya, statusnya harus menunjukkan bahwa server nfs telah mulai untuk volume kami. Anda perlu melakukan mount dan periksa.mkdir /gluster-nfs
mount.nfs gluster-01.example.com:/main /gluster-nfs
Tetapi opsi ini tidak toleran terhadap kesalahan, jadi Anda perlu membuat alamat VIP yang akan melakukan perjalanan antara dua node kami dan membantu mengalihkan lalu lintas jika salah satu dari node tersebut jatuh.Menginstal keepalived di CentOs dilakukan segera melalui manajer paket.$ yum install -y keepalived
Kami mengkonfigurasi layanan di file /etc/keepalived/keepalived.conf:global_defs {
notification_email {
admin@example.com
}
notification_email_from alarm@example.com
smtp_server mail.example.com
smtp_connect_timeout 30
vrrp_garp_interval 10
vrrp_garp_master_refresh 30
}
#C , . , VIP .
vrrp_script chk_gluster {
script "pgrep glusterd"
interval 2
}
vrrp_instance gluster {
interface ens192
state MASTER # BACKUP
priority 200 # , 100
virtual_router_id 1
virtual_ipaddress {
10.10.6.70/24
}
unicast_peer {
10.10.6.72 #
}
track_script {
chk_gluster
}
}
Sekarang kita dapat memulai layanan dan memeriksa apakah VIP pada node muncul:$ systemctl start keepalived
$ systemctl enable keepalived
$ ip addr
1: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:97:55:eb brd ff:ff:ff:ff:ff:ff
inet 10.10.6.72/24 brd 10.10.6.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 10.10.6.70/24 scope global secondary ens192
valid_lft forever preferred_lft forever
Jika semuanya bekerja untuk kami, maka tetap menambahkan PersistentVolume ke Kubernetes dan membuat layanan pengujian untuk memverifikasi operasi.---
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 10.10.6.70
path: /main
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gluster-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
volumeName: "gluster-nfs"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: gluster-test
labels:
app: gluster-test
spec:
replicas: 1
selector:
matchLabels:
app: gluster-test
template:
metadata:
labels:
app: gluster-test
spec:
volumes:
- name: gluster
persistentVolumeClaim:
claimName: gluster-nfs
containers:
- name: gluster-test
image: nginx
volumeMounts:
- name: gluster
mountPath: /gluster
Dengan konfigurasi ini, jika terjadi penurunan simpul utama, ia akan diam selama sekitar satu menit sampai mount jatuh dalam batas waktu dan beralih. Sederhana selama satu menit untuk penyimpanan ini, katakanlah ini bukan situasi biasa dan kita jarang akan bertemu dengannya, tetapi dalam kasus ini sistem akan secara otomatis beralih dan terus bekerja, dan kita akan dapat menyelesaikan masalah dan melakukan pemulihan tanpa khawatir tentang yang sederhana.Ringkasan
Pada artikel ini, kami memeriksa 3 opsi yang memungkinkan untuk menghubungkan GlusterFS ke Kubernetes, dalam versi kami dimungkinkan untuk menambahkan revisioner ke Kubernetes, tetapi kami belum membutuhkannya. Masih menambahkan hasil tes kinerja antara NFS dan Gluster pada node yang sama.File di 1Mb:sync; dd if=/dev/zero of=tempfile bs=1M count=1024; sync
Gluster: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.63496 s, 407 MB/s
NFS: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.4527 s, 197 MB/s
File di 1Kb:sync; dd if=/dev/zero of=tempfile bs=1K count=1048576; sync
Gluster: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 70.0508 s, 15.3 MB/s
NFS: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.95208 s, 154 MB/s
NFS bekerja sama untuk ukuran file apa pun, perbedaan kecepatan tidak terlalu terlihat, tidak seperti GlusterFS, yang sangat terdegradasi dengan file kecil. Tetapi pada saat yang sama, dengan ukuran file besar, NFS menunjukkan kinerja 2-3 kali lebih rendah dari Gluster.