LVM Caching mit SSDs einrichten

Aus Thomas-Krenn-Wiki
Wechseln zu: Navigation, Suche

Dieser Wikiartikel zeigt, wie Sie mittels LVM Cache HDDs, durch Verwendung von SSDs als Caching Devices, beschleunigen können. LVM Cache stellt ein Frontend für den dm-cache Kernel Treiber dar, um eine bequeme Administration zu ermöglichen.

LVM Cache Grundlagen

Im nachfolgenden Abschnitt werden kompakt die LVM Cache Grundlagen erläutert, welche Caching Strategien und Komponenten es gibt. Detailliertere Informationen zu LVM finden Sie im Wikartikel LVM Grundlagen.

Caching Strategien

LVM Cache unterstützt zwei unterschiedliche Cache Strategien, writethrough und writeback. Der Wikiartikel zur alternativen SSD Caching Methode Flashcache geht auf die unterschiedlichen Methoden noch detaillierter ein.

Writethrough

Dieser Modus ist standardmäßig konfiguriert, es handelt sich hierbei um einen reinen Lesecache, er stellt sicher dass alle Daten immer auf beiden Devices geschrieben sind, also auf dem CachePoolLV und auch auf dem OriginLV. Falls bei diesem Modus ein Device des Cache Pools ausfällt, resultiert kein Datenverlust.

Writeback

Dieser Modus verzögert als Schreib- und Lesecache das Zurückschreiben der Daten vom Cache Pool zum OriginLV. Writeback erhöht die Performance, aber der Ausfall eines Caching Devices kann durch das verzögerte Schreiben auf die HDD zu einem Datenverlust führen. Deshalb sollte ein Writeback Cache, wie in der folgenden Beispielkonfiguration, immer als RAID 1 ausgeführt werden. Der writeback Modus kann bei der Anlage des Cache Pools durch folgenden Parameter gesetzt werden:
--cachemode writeback

Nomenklatur

Die folgenden Begriffe werden im Zusammenhang mit LVM Cache verwendet:[1]

Kurzbezeichnung Komponente Beschreibung Liegt auf Beispiel
OriginLV Origin logical volume Großes, langsames Logical Volume Festplatte lv_data1 (ursprünglich)

lv_data1_corig (verstecktes Volume nach Cache Aktivierung)

CacheDataLV Cache data logical volume Kleines, schnelles Logical Volume für Cache Pool Daten SSD lv_data1_cache
CacheMetaLV Cache metadata logical volume Noch Kleineres, schnelles Logical Volume für Cache Pool Meta SSD lv_data1_cache_meta
CachePoolLV Cache pool logical volume CacheDataLV + CacheMetaLV SSD lv_data1_cache
CacheLV Cache logical volume OriginLV + CachePoolLV Festplatte(n) + SSD(s) lv_data1

Einschränkungen

Ein LVM Cache für das Root Filesystem kann zu Problemen beim Bootvorgang führen, initrd fehlen laut eines Bugreports zumindest in Ubuntu einige Funktionen um das gecachte LV beim Systemstart aktivieren zu können.[2]

Problemlösung

Im weiteren Verlauf dieses Threads wird eine Problemlösung dazu angeboten. Es müssen nachfolgende Module hinzugefügt werden.

sudo echo "dm_cache" >> /etc/initramfs-tools/modules
sudo echo "dm_cache_mq" >> /etc/initramfs-tools/modules
sudo echo "dm_persistent_data" >> /etc/initramfs-tools/modules
sudo echo "dm_bufio" >> /etc/initramfs-tools/modules

Vorbereitungen

Der LVM Cache in diesem Beispiel setzt auf CentOS 7 als Betriebssystem auf. Die nachfolgenden Konfigurationsschritte können auch für andere Linux-basierte Distributionen adaptiert werden.

Betriebssystem Installation

Als Betriebssystem kommt CentOS 7.2 zum Einsatz (CentOS-7-x86_64-Minimal-1511.iso). Nach der Installation des Betriebssystems werden die nachfolgenden Komponenten mit yum installiert:

  • yum install lvm2 hdparm smartmontools
    

SSD und HDD Caches konfigurieren

Nach der Installation des Betriebssystems und der erforderlichen Softwarekomponenten kann der LVM Cache angelegt werden. Der folgende Abschnitt zeigt, wie Sie die Konfiguration im Detail vornehmen.

Hinweis: Deaktivieren Sie vorab die integrierten Caches der Festplatten:

Deaktivieren der Caches

Mittels hdparm werden die Caches der SSDs und HDDs verwaltet. Die Caches der SSDs bleiben aktiviert und die Caches der Festplatten werden deaktviert (Parameter -W wird auf 0 gesetzt).

  • SSD Caches der SSDs bleiben aktiv:
hdparm -W1 /dev/sda
hdparm -W1 /dev/sdb
  • HDD Caches der Festplatten werden deaktiviert:
hdparm -W0 /dev/sdc
hdparm -W0 /dev/sdd

Persistentes Setzen der Parameter

Führen Sie nun einen Reboot durch und überprüfen Sie, ob die Einstellungen permanent erhalten bleiben. In unserem Beispiel bleiben die Einstellungen noch nicht permanent erhalten, hier kann ein init-Skript Abhilfe verschaffen. Ein beispielhaftes Service-Skript finden Sie auf dem Git-Repo von Jason Lewis, man kann dies als Ausgangspunkt verwenden um ein hdparm-Initskript zu erstellen.[3]

Die Cache Einstellungen sollten wie im Folgenden abgebildet, gesetzt sein:

  • SSD Cache Einstellungen
[root@centos7 ~]# hdparm -W /dev/sda
/dev/sda:
 write-caching =  1 (on)
[root@centos7 ~]# hdparm -W /dev/sdb
/dev/sdb:
 write-caching =  1 (on)
  • HDD Cache Einstellungen
[root@centos7 ~]# hdparm -W /dev/sdc
/dev/sdc:
 write-caching =  0 (off)
[root@centos7 ~]# hdparm -W /dev/sdd
/dev/sdd:
 write-caching =  0 (off)

Software RAIDs erstellen

Für unser Beispiel werden nun mit MDADM zwei auf Linux Software RAID basierende RAID 1 Sets erstellt. Ein LVM Cache kann auch auf einzelnen Festplatten, bzw SSDs, aufgebaut werden. Aus Gründen der Datensicherheit ist jedoch eine RAID-Konfiguration zu empfehlen. Des weiteren könnte man statt eines Linux Software RAIDs auch ein LVM RAID einsetzen.[4]

  • RAID 1 für den SSD Cache mit der Bezeichnung raid-cache:
mdadm --create raid-cache --level=1 --raid-devices=2 /dev/sda3 /dev/sdb3
mdadm --detail --scan /dev/md/raid-cache >> /etc/mdadm.conf
  • RAID 1 für die HDDs mit der Bezeichnung raid-data:
mdadm --create raid-data --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
mdadm --detail --scan /dev/md/raid-data >> /etc/mdadm.conf

LVM Cache einrichten

Nach den vorbereitenden Aufgaben wird im nachfolgenden Abschnitt der LVM Cache konfiguriert. Zuerst werden die Physical Devices und eine Volume Group erstellt. Anschließend werden drei Logical Volumes konfiguriert und zum Abschluss der Cache Pool aktiviert.

Physical devices und Volume Group erstellen

Mit pvcreate werden die Physical Volumes raid-data und raid-cache erstellt. Anschließend wird darauf mit vgcreate eine Volume Group mit der Bezeichnung vg1 konfiguriert.

Physical Volumes erstellen

Im ersten Schritt werden die Physical Volumes raid-data und raid-cache erstellt.

pvcreate /dev/md/raid-data
pvcreate /dev/md/raid-cache

Volume Group erstellen

Erstellen Sie nun eine Volume Group vg1, die über die beiden LVM Physical Volumes raid-data und raid-cache gestülpt wird. Es ist ein wichtiger Hinweis hier anzuführen, dass die beiden Logical Volumes immer in einer gemeinsamen Volume Group liegen müssen.

  • vgcreate vg1 /dev/md/raid-data /dev/md/raid-cache
    

Falls bereits eine Volume Group auf der (den) zu cachende(n) Festplatte(n) konfiguriert ist, kann durch vgextend, die SSD hinzugefügt werden.

Logical Volumes erstellen

Nun werden die drei erforderlichen Logical Volumes erstellt, in diesem Beispiel ist das Logical Volume auf den HDDs 4 GB groß und der SSD-Cache bemisst 2 GB. Das Logical Volume mit den Metadaten sollte ein Tausendstel der Datenkomponente betragen und mindestens 8 MB groß sein, in dieser Beispielkonfiguration werden 12 MB für die Metadaten reserviert.

OriginLV

lvcreate -L 4G -n lv_data1 vg1 /dev/md/raid-data

CacheDataLV

lvcreate -L 2G -n lv_data1_cache vg1 /dev/md/raid-cache

CacheMetadataLV

lvcreate -L 12M -n lv_data1_cache_meta vg1 /dev/md/raid-cache


Konvertierung in einen Cache Pool

Für einen LVM Cache sind nun noch zwei Konfigurationsschritte erforderlich. Dies erfolgt mit dem Tool lvconvert und es werden damit ein CachePoolLV und abschließend ein CacheLV erstellt.

CachePoolLV erstellen

Die beiden vorab angelegten Logical Volumes CacheDataLV und CacheMetadataLV werden nun zu einem CachePoolLV verbunden.

# lvconvert --type cache-pool --cachemode writethrough --poolmetadata vg1/lv_data1_cache_meta vg1/lv_data1_cache
  WARNING: Converting logical volume vg1/lv_data1_cache and vg1/lv_data1_cache_meta to pool's data and metadata volumes.
  THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Do you really want to convert vg1/lv_data1_cache and vg1/lv_data1_cache_meta? [y/n]: y
  Converted vg1/lv_data1_cache to cache pool.

CacheLV erstellen

Nun wird das CachePoolLV und das OriginLV zum CacheLV final verknüpft. Der LVM Cache ist nun vollständig konfiguriert und kann eingesetzt werden.

# lvconvert --type cache --cachepool vg1/lv_data1_cache vg1/lv_data1
  Logical volume vg1/lv_data1 is now cached.

Ausgabe von lvs

In einer detaillierten Ausgabe des Befehls lvs sehen sie die Struktur des neu erstellten LVM Caches.

# lvs -a -o +devices
  LV                     VG   Attr       LSize  Pool             Origin           Data%  Meta%  Move Log Cpy%Sync Convert Devices                
  lv_data1               vg1  Cwi-a-C---  4.00g [lv_data1_cache] [lv_data1_corig] 0.00   2.31            100.00           lv_data1_corig(0)      
  [lv_data1_cache]       vg1  Cwi---C---  2.00g                                   0.00   2.31            100.00           lv_data1_cache_cdata(0)
  [lv_data1_cache_cdata] vg1  Cwi-ao----  2.00g                                                                           /dev/md125(0)          
  [lv_data1_cache_cmeta] vg1  ewi-ao---- 12.00m                                                                           /dev/md125(512)        
  [lv_data1_corig]       vg1  owi-aoC---  4.00g                                                                           /dev/md124(0)          
  [lvol0_pmspare]        vg1  ewi------- 12.00m                                                                           /dev/md124(1024)

Testen des Caches

Sie können den LVM Cache mittlels dmsetup status testen, zum Beispiel wird hier die Trefferrate oder die Anzahl der Blöcke im Cache angezeigt. Der Wikiartikel zu Dm-cache liefert ebenso ausführliche Erklärungen zu den Terminalausgaben von dmsetup status.

dmsetup status des erstellten Caches

# dmsetup status /dev/mapper/vg1-lv_data1
0 8388608 cache 8 106/3072 128 32086/32768 1096 123 32387 317 0 0 0 1 writethrough 2 migration_threshold 2048 smq 0 rw -

Einzelnachweise

  1. Manpage zu lvmcache (man7.org)
  2. Unable to mount lvmcache root device at boot time (bugs.launchpad.net)
  3. sample-service-script/service.sh (github.com)
  4. RAIDing with LVM vs MDRAID - pros and cons? (http://unix.stackexchange.com)

Weitere Informationen


Foto Werner Fischer.jpg

Autor: Werner Fischer

Werner Fischer, tätig im Bereich Communications / Knowledge Transfer bei Thomas-Krenn, hat sein Studium zu Computer- und Mediensicherheit an der FH Hagenberg abgeschlossen. Er ist regelmäßig Autor in Fachzeitschriften und Speaker bei Konferenzen wie LinuxCon, OSDC, OSMC, LinuxTag u.v.m. Seine Freizeit gestaltet er sehr abwechslungsreich. In einem Moment absolviert er seinen Abschluss im Klavierspielen, im anderen läuft er beim Linzmarathon in der Staffel mit oder interessiert sich für OpenStreetMap.


Das könnte Sie auch interessieren

Adaptec maxCache konfigurieren
Adaptec maxCache SSD Cache
CacheCade Pro 2.0 Laufwerk mit StorCLI erstellen