Настройка структуры хранилища VMM
- 11/07/2017
- Время чтения: 12 мин
- Соавторы
System Center Virtual Machine Manager (VMM) можно использовать для управления физической и виртуализированной инфраструктурой.
You can use System Center – Virtual Machine Manager (VMM) to manage your physical and virtualized infrastructure. В область управления VMM можно включить управление хранилищами, которые назначаются виртуальным узлам и кластерам, а также виртуальным машинам.
As part of that management VMM can manage storage that you assign to virtual hosts and clusters, and VMs.
- Локальные и удаленные: VMM поддерживает как локальные, так и удаленные хранилища.Local and remote: VMM recognizes both local and remote storage. Локальным называется хранилище, размещенное на сервере VMM или непосредственно подключенное к нему; как правило, диск на сервере, который подключен к встроенному массиву RAID или SAS JBOD.Local is storage located on the VMM server or directly attached to it, commonly a disk drive on the server that's connected with inbuilt RAID or SAS JBOD connectivity. Очевидно, что такой тип выделенного хранилища узла не является общим и не обеспечивает отказоустойчивость и высокий уровень доступности.Obviously this type of dedicated host storage isn't shared, and doesn't provide resilience or high availability.
- Блочные и файловые: VMM может управлять блочными устройствами хранения и файловыми хранилищами.Block and file-based: VMM can manage block storage devices and file-based storage.
Блочное хранилищеBlock storage
ПодключениеConnection | VMM поддерживает управление блочными устройствами хранения данных, подключающимися по протоколам Fibre Channel, Serial Attached SCSI (SAS) или iSCSI (Internet SCSI).VMM can manage block storage devices that connect using Fibre Channel, Serial Attached SCSI (SAS), or iSCSI (Internet SCSI).VMM поддерживает обнаружение массивов iSCSI со статическими, динамическими и ручными целями и управление ими.VMM can discover and manage iSCSI arrays with static, dynamic, or manual targets.Сервер цели iSCSI (Майкрософт) можно использовать в качестве устройства хранения, установив его поставщик.You can use a Microsoft iSCSI target server as a storage device by installing its provider. |
ПротоколыProtocols | VMM поддерживает запоминающие устройства, использующие протоколы SMI-S и SMP.VMM provides support for storage devices that use the SMI-S and and SMP protocols.VMM использует API управления хранилищами Windows (SMAPI) для управления блочными устройствами хранения, совместимыми со спецификациями SMI-S или SMP.VMM uses Window Storage Management API (SMAPI) to manage block-based storage devices compliant with SMI-S or SMP specifications.VMM совместно использует SMAPI и SMP для управления непосредственно подключенным хранилищем и внешними массивами хранения данных.VMM combines SMAPI and SMP to manage directly attached storage and external storage arrays.VMM совместно использует SMAPI и службу управления хранением данных (которая функционирует как клиент SMI-S) для управления устройствами хранения SMI-S.VMM combines SMAPI and the Storage Management service (which functions as an SMI-S client) to manage SMI-S storage devices.Изготовители запоминающих устройств по стандарту SMI-S создают для своих устройств поставщики SMI-S.Vendors of storage devices with the SMI-S standard create SMI-S provides for their devices. |
Узлы виртуализацииVirtualization hosts | Хранилище, настроенное в VMM, может использоваться только для узлов и кластеров Hyper-V.Storage configured in VMM can only be used for Hyper-V hosts and clusters. |
Поддерживаемые массивы хранения данныхSupported storage arrays | В VMM 2016 поддерживаются определенные массивы хранения данных.Specific storage arrays are supported in VMM 2016. Можно использовать другие массивы, но нет никакой гарантии, что вы сможете управлять всеми задачами хранения в VMM.You can use other arrays, but there's no guarantee that you'll be able to manage all storage tasks in VMM. Корпорация Майкрософт рекомендует связаться с поставщиком СХД, чтобы определить, поддерживается ли эта система VMM.We recommend that you chat to your storage provider to determine VMM support. |
Виртуальный адаптер Fibre ChannelVirtual fibre channel | Если вы хотите использовать виртуальный адаптер Fibre Channel для предоставления виртуальным машинам прямого доступа к хранилищу Fibre Channel, вы можете управлять этим хранилищем с помощью VMM в следующих конфигурациях.If you want to use virtual fibre channel to give VMs direct access to fibre channel storage, you can manage this storage with VMM in these configurations.Один массив хранения данных, подключенный к одной структуре (состоящей из одного или нескольких коммутаторов), подключенной к одной виртуальной сети хранения данных.Single storage array connected to a single fabric (comprised of single or multiple switches) connected to a single vSAN.Один массив хранения данных, подключенный к нескольким структурам (состоящим из одного или нескольких коммутаторов), подключенных к одной виртуальной сети хранения данных.Single storage array connected to multiple fabrics (comprised of single or multiple switches per fabric) connected to a single vSAN.Несколько массивов хранения данных, подключенных к одной структуре (состоящей из одного или нескольких коммутаторов), подключенной к одной виртуальной сети хранения данных.Multiple storage arrays connected to a single fabric (comprised of single or multiple switches) connected to a single vSAN.Несколько массивов хранения данных, подключенных к нескольким структурам (состоящим из одного или нескольких коммутаторов), подключенных к нескольким виртуальным сетям хранения данных.Multiple storage arrays connected to multiple fabrics (comprised of single or multiple switches per fabric) connected to multiple vSANs. Такая конфигурация обеспечивает дублирование путей к массивам хранения.This configuration provides dual-redundant paths to storage arrays.Виртуальные сети хранения данных могут включать адаптеры шины только из одной структуры.A vSAN can only include HBAs from a single fabric. |
Настройка блочного хранилищаSet up block storage
Общая процедура настройки блочного хранилища в структуре VMM выглядит следующим образом.The general process for setting up block-based storage in the VMM fabric is as follows:
Источник: https://docs.microsoft.com/ru-ru/system-center/vmm/manage-storage?view=sc-vmm-1807
Установка и настройка Citrix XenServer Часть 4
Дата: 27.05.2015 Автор Admin
В данной статье мы рассмотрим автозапуск виртуальных машин и создание локальных хранилищ.
Добавим новый хост Xen — xen3.
Настроим автоматический запуск виртуальных машин на хосте xen3.
Открываем консоль сервера, и определяем UUID пула xen3 следующей командой:
В данном случае UUID равен — 22a1a096-b11c-eeda-194d-58aa6168e6dd
Теперь включаем функцию автостарта на уровне пула xen.
xe pool-param-set uuid=22a1a096-b11c-eeda-194d-58aa6168e6dd other-config:auto_poweron=true |
Теперь включим автозапуск на уровне виртуальных машин.
Получаем список vm командой:
Далее берем параметр UUID необходимой VM и включаем автозапуск:
xe vm-param-set uuid=9663daca-6e73-fee7-5571-ba582cf637ca other-config:auto_poweron=true |
Теперь перезагрузим хост xen. После загрузки гипервизора виртуальная машина будет запущена.
Перейдем к настройке локальных хранилищ.
Если по каким-то причинам вы не можете использовать общие хранилища, вы можете создать SR из локальных дисков.
Далее мы создадим:
Локальное хранилище ISO файлов
Локальное хранилище LVM
Локальное хранилище EXT
Выключим хост и добавим 3 диска.
Я добавлю 1 диск на 100 гб для ISO хранилища, 1 диск на 200 гб для LVM SR и 1 диск на 300 гб для EXT SR.
Начнем с настройки локального хранилища iso файлов.
Открываем консоль сервера xen3 через xencenter.
Посмотрим диски в системе командой:
Вывод будет примерно таким:
В данном случае мне нужен диск /dev/sdb , т.к. его размер 100 гб и на нем мы планировали сделать iso хранилище.
Создадим таблицу разделов на данном диске.
Теперь если набрать fdisk -l , вы увидите следующую картину:
Теперь создадим на диске файловую систему.
Создадим папку куда будет подключаться данный диск:
Добавим в файл /etc/fstab точку монтирования для нового диска:
echo “/dev/sdb1 /mnt/isosr ext3 defaults 1 1” >> /etc/fstab |
Подключаем диск:
После перезагрузки диск не нужно подключать снова. Он будет подключаться автоматически.
Создадим новое ISO хранилище:
xe sr-create name-label=ISO type=iso device-config:location=/mnt/isosr device-config:legacy_mode=true content-type=iso |
Как видите у нас появилось новое хранилище для ISO образов.
Перейдем к созданию хранилищ виртуальных машин.
Создадим LVM хранилище на диске /dev/sdd , размер которого 200гб.
xe sr-create host-uuid=uuid content-type=user type=lvm device-config:device=/dev/sdd shared=false name-label=”VM Storage 1″ |
В данной команде вместо uuid вводится значение uuid хоста, для удобства при вводе команды удалите uuid, чтобы получилось host-uuid= и нажмите Tab, консоль сама подставит значение uuid вашего хоста.
Теперь у нас появилось LVM хранилище для виртуальных машин.
Создадим EXT хранилище, на оставшемся диске /dev/sdc на 300 гб.
xe sr-create host-uuid=uuid content-type=user type=ext device-config:device=/dev/sdc shared=false name-label=”VM Storage 2″ |
Отличие EXT хранилища в том, что виртуальные машины на нем хранятся в виде файлов, например как на NFS.
EXT хранилище создано!
Готово, теперь у нашего хоста есть одно локальное хранилище ISO дисков, и два хранилища для виртуальных машин.
Но настоятельно рекомендую использовать общие хранилища, т.к. это наиболее надежный способ.
Удачной установки! =)
Источник: http://ittraveler.org/ustanovka-i-nastrojka-citrix-xenserver-chast-4/
Xenserver detach and re-attach a local storage repository separate disk
Googling I found that would be useful to add instructions on how to detach and re-attach a local storage ( separate disk ) to XenServer. It is necessary to use command line interface (CLI).
We can see Storage Repository using xe sr-list:
# xe sr-list uuid ( RO) : 37239476-c08f-ad02-c776-77830c73d6c6 name-label ( RW): Local storage name-description ( RW): host ( RO): xs-602 type ( RO): lvm content-type ( RO): user uuid ( RO) : 38faf3c9-f7ab-a8b6-4fb9-80a4745c2b05 name-label ( RW): sr xenserver 5 name-description ( RW): host ( RO): xs-602 type ( RO): lvm content-type ( RO): user uuid ( RO) : c425f5fb-1e60-685c-0a1c-6cc11a0087b7 name-label ( RW): DVD drives name-description ( RW): Physical DVD drives host ( RO): xs-602 type ( RO): udev content-type ( RO): iso … …
Add a Local Storage Repository ( SR )
To add a Local Storage Repository check the SR available in the host using pv display. We can see the default XenServer Local SR and if there are others disks attached others SR. Disks maybe temporary attached and with full XenServer installation,too.
# pvdisplay — Physical volume — PV Name /dev/sda3 VG Name VG_XenStorage-37239476-c08f-ad02-c776-77830c73d6c6 PV Size 290.09 GB / not usable 7.81 MB Allocatable yes PE Size (KByte) 4096 Total PE 74260 Free PE 17919 Allocated PE 56341 PV UUID fOijAs-Dyb0-IUvH-5UzC-ivnj-Jx4u-c51TzT — Physical volume — PV Name /dev/sdb3 VG Name VG_XenStorage-4f9d6505-0f10-5e08-9629-4a4813ec57a7 PV Size 1.81 TB / not usable 8.06 MB Allocatable yes PE Size (KByte) 4096 Total PE 474881 Free PE 414464 Allocated PE 60417 PV UUID JI2nT4-Aaj3-XIns-jpPy-YSJ6-isSV-9wkTsm
We can see two LVM volumes. The first, in sda disk, is the main XenServer local SR, the second is 1.8 TB LVM volume in sdb disk. To attach SR is necessary :
- recognize the Storage Repository in XenServer
- create the SR physical block device (PBD)
- then plug the PBD to XenServer
Let the Storage Repository recognizable using xe sr-introduce
[root@xs61 ~]# xe sr-introduce uuid=4f9d6505-0f10-5e08-9629-4a4813ec57a7 type=lvm name-label=”sr-l-T18″ content-type=user 4f9d6505-0f10-5e08-9629-4a4813ec57a7
Now we can see SR in XenCenter and it will be marked as Detached.
We have to create the PBD ( physical block device) using xe pdb-create command. To use the command, you need the host uuid and device name of the partition.
xe host-list uuid ( RO) : 6acdd0f6-cad4-4d46-b852-16c645e6c8b5 name-label ( RW): xs-602 name-description ( RW): Default install of XenServer
To know the /dev/sdb3 devicename we can use ls -l /dev/disk/by-id
[root@xs61 ~]# ls -l /dev/disk/by-id total 0 lrwxrwxrwx 1 root root 9 Jan 13 13:57 scsi-SATA_WDC_WD20EARX-00_WD-WCAZAJ973153 -> ../../sdb lrwxrwxrwx 1 root root 10 Jan 13 13:57 scsi-SATA_WDC_WD20EARX-00_WD-WCAZAJ973153-part1 -> ../../sdb1 lrwxrwxrwx 1 root root 10 Jan 13 13:57 scsi-SATA_WDC_WD20EARX-00_WD-WCAZAJ973153-part2 -> ../../sdb2 lrwxrwxrwx 1 root root 10 Jan 13 13:57 scsi-SATA_WDC_WD20EARX-00_WD-WCAZAJ973153-part3 -> ../../sdb3 lrwxrwxrwx 1 root root 10 Jan 13 13:57 scsi-SATA_WDC_WD20EARX-00_WD-WCAZAJ973153-part4 -> ../../sdb4 lrwxrwxrwx 1 root root 9 Jan 13 13:57 scsi-SATA_WDC_WD3201ABYS-_WD-WCARW3003070 -> ../../sda lrwxrwxrwx 1 root root 10 Jan 13 13:57 scsi-SATA_WDC_WD3201ABYS-_WD-WCARW3003070-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 Jan 13 13:57 scsi-SATA_WDC_WD3201ABYS-_WD-WCARW3003070-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 Jan 13 13:57 scsi-SATA_WDC_WD3201ABYS-_WD-WCARW3003070-part3 -> ../../sda3 lrwxrwxrwx 1 root root 9 Jan 13 13:57 usb-Generic_USB_CF_Reader_058F312D81B -> ../../sdd lrwxrwxrwx 1 root root 9 Jan 13 13:57 usb-Generic_USB_MS_Reader_058F312D81B -> ../../sdf …
The PBD is created using xe pbd-create
# xe pbd-create host-uuid=6acdd0f6-cad4-4d46-b852-16c645e6c8b5 sr-uuid=4f9d6505-0f10-5e08-9629-4a4813ec57a7 device-config:device=/dev/disk/by-id/scsi-SATA_WDC_WD20EARX-00_WD-WCAZAJ973153-part3 7c37bb56-ee51-19b1-3df0-a5a4df9b385a
Then we can connect with xe pbd-plug
# xe pbd-plug uuid=7c37bb56-ee51-19b1-3df0-a5a4df9b385a
Remove a Storage Repository
To remove the Storage Repository added SR-uuid= 4f9d6505-0f10-5e08-9629-4a4813ec57a7 we have to reverse the actions previosuly made.
- unplung the Storage Repository PBD ( physical block device ) using pbd-unplug
- then remove SR with sr-forget
We can list PBD using xe pbd-list
[root@localhost ~]# xe pbd-list uuid ( RO) : 2513bd51-bce5-18a5-040f-64ccf6822aec host-uuid ( RO): 6acdd0f6-cad4-4d46-b852-16c645e6c8b5 sr-uuid ( RO): 66c01d4b-911d-8cfd-d5a0-d78a5ad2f732 device-config (MRO): location: /dev/xapi/block currently-attached ( RO): true uuid ( RO) : 8bb8f425-59ff-e8b2-edf2-627708adcfb2 host-uuid ( RO): 6acdd0f6-cad4-4d46-b852-16c645e6c8b5 sr-uuid ( RO): c425f5fb-1e60-685c-0a1c-6cc11a0087b7 device-config (MRO): location: /dev/xapi/cd currently-attached ( RO): true uuid ( RO) : 7c37bb56-ee51-19b1-3df0-a5a4df9b385a host-uuid ( RO): 6acdd0f6-cad4-4d46-b852-16c645e6c8b5 sr-uuid ( RO): 4f9d6505-0f10-5e08-9629-4a4813ec57a7 device-config (MRO): device: /dev/disk/by-id/scsi-SATA_WDC_WD20EARX-00_WD-WCAZAJ973153-part3 currently-attached ( RO): true uuid ( RO) : 52449e07-4f89-bc68-1a8e-3887b74cb875 host-uuid ( RO): 6acdd0f6-cad4-4d46-b852-16c645e6c8b5 sr-uuid ( RO): 37239476-c08f-ad02-c776-77830c73d6c6 device-config (MRO): device: /dev/disk/by-id/scsi-SATA_WDC_WD3201ABYS-_WD-WCARW3003070-part3 currently-attached ( RO): true … ..
Unplug PBD with
xe pbd-unplug uuid=7c37bb56-ee51-19b1-3df0-a5a4df9b385a
Remove Storage Repository using
xe sr-forget uuid=4f9d6505-0f10-5e08-9629-4a4813ec57a7
Create a new Storage Repository
To create a new Storage Repository when you add a new disk you have to use the command xe sr-create. The command in question is an extremely dangerous command because it deletes the data on the partition or disk ( So beware).
The command syntax is:
xe sr-create name-label= physical-size= type= content-type= device-config:= [host-uuid=] [shared=]
To check the disks accessible from XenServer use fdisk -l
[root@localhost ~]# fdisk -l Disk /dev/sda: 320.0 GB, 320072933376 bytes … boot drive … Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes …
To get the UUID of the host refer to xe host-list
[root@localhost ~]# xe host-list
Источник: https://mauriziosiagri.wordpress.com/2012/12/30/xenserver-detach-and-re-attach-a-local-storage-repository-separate-disk/
Ручное управление хранилищами XenServer 6.5
google translate français italiano español 中国 한국의 Azərbaycan Deutsch Polskie 日本人 O'zbekiston Қазақстан ____________________________________________________________________ Здравствуйте. Опять решил поделится своими наработками с теми к первый раз сталкивается с гипервизором XenServer 6.
5 Сдесь просто приведу список команд и пояснения. ——————————————————————– Плановое обсуживание дисков XenServer 6.
5
Открыть Xencentr – выбрать хост – перейти вкладка “Storage” – выбрать диск – нажать “Reclaim freed space” (оно же обслуживание SSD не чаще 1 раз в неделю)
——————————————————————– Узнаем серийный номер дискаsmartctl -a /dev/sda
——————————————————————– Добавить диск в XenServer 6.5 если он не определяется как HBA: 1. Выключить машину “реальную”, вставить исправный диск, включить “реальную” машину, подключится к консоли хоста через SSH(или XenCentr). 2. Увидеть свежий дискfdisk -l
должно появится что-то типа /dev/sda с размером или /dev/sdc это зависит от порта куда воткнули провод на материнке может произвольно менятся после перезагрузки и добавления других дисков. 3. Создать LVMpvcreate /dev/sdc -ff
y
если вылазит ошибка Command not permitted while global/metadata_read_only is set то
pvcreate /dev/sdc -ff –config global{metadata_read_only=0}4. Узнать UUID хоста
xe host-list
5. Узнать UUID диска
ll /dev/disk/by-id
6. Создать локальное хранилище из диска
xe sr-create content-type=user device-config:device=/dev/disk/by-id/ host-uuid= name-label=”Local Storage 2” shared=false type=lvm
примерно так должно выглядеть:
xe sr-create content-type=user device-config:device=/dev/disk/by-id/scsi-SATA_WDC_WD10EZEX-00_WD-WMC1S0569793 host-uuid =c13e0443-f07a-4f99-b0b5-46258bd5c774 name-label=”Local Storage 1″ shared=false type=lvm 7. Готово. Если вы хорошо разбираетесь в структуре дисков и вам не составит труда найти или переназначить буквы дисков или разделов то можете использовать вот такую команду:xe sr-create content-type=user device-config:device=/dev/sdi name-label=”Local Storage 2″ shared=false type=lvm
——————————————————————– Дополнительные команды (СПРАВКА) ——————————————————————– Узнаем UUID хранилища Xen (SR)xe sr-list
…
uuid ( RO) : 1ceae0eb-eb9f-88a8-cad1-0ff5d3a14d40 name-label ( RW): Hardware HBA SATA 2TB name-description ( RW): Hardware HBA SR [ATA – X3E1P8EPT] host ( RO): xen1.domainzentyal.ru type ( RO): lvmohba content-type ( RO): … Узнаю UUID устройства
xe pbd-list sr-uuid=1ceae0eb-eb9f-88a8-cad1-0ff5d3a14d40
…
uuid ( RO) : 4621ed93-ea2b-b553-15d1-9ffe15f60668 host-uuid ( RO): 51b11626-0b8b-4fb5-b77e-5c830218a831 sr-uuid ( RO): 8a800336-6593-5ccc-b39b-e523d3eb0eb1 device-config (MRO): device: /dev/md1
currently-attached ( RO): true
…
Отключаю устройство “/dev/md1”
xe pbd-unplug uuid=4621ed93-ea2b-b553-15d1-9ffe15f60668
——————————————————————–
Забываю хранилище “Hardware HBA SATA 2TB”
xe sr-forget uuid=1ceae0eb-eb9f-88a8-cad1-0ff5d3a14d40 Размонтирую массивumount /dev/md1
Останавливаю массив
mdadm -S /dev/md1
Затираю суперблоки
mdadm –zero-superblock /dev/sde1
Убираю всё лишнее из файла конфигурацииnano /etc/mdadm.conf
Посмотреть состояние массива:cat /proc/mdstat
mdadm –detail –scan –verbose
mdadm –query /dev/md1
Посмотреть детально какое устройство зеркало, какого виртуального диска. Для raid 10 идут парами (0,1)зеркало,(2,3)зеркало,(4,5)зеркало …
mdadm –detail /dev/md0
Добавить hotspare дискmdadm -a /dev/md1 /dev/sdс1
Убрать из массива дискmdadm -r /dev/md1 /dev/sdс1
Создать раздел с помощью fdisk или gdisk если GPTfdisk /dev/sde
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (29180-121601, default 29180): Using default value 29180
Last cylinder or +size or +sizeM or +sizeK (29180-121601, default 121601): +240000M Command (m for help): w
Поменять флаг (тип) файловой системы
fdisk /dev/sde
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): L
Hex code (type L to list codes): fd
Command (m for help): w
Создать файловую систему на первом разделеmkfs.ext3 /dev/sde1
Просмотреть разделы LVM в XenServer 6.5xe sr-list type=lvm
———————————– Удалить “Local Storage” в XenServer за 3 команды: Т.З. Допустим вам понадобилось удалить диски из ксена, и вы можете видеть их название например “Local Storage 400gb” Первое отмонтируем:xe pbd-unplug uuid=$(xe pbd-list params=uuid –minimal sr-uuid=$(xe sr-list params=uuid –minimal name-label=”Local Storage 400gb”))Второе уничтожим:
xe pbd-destroy uuid=$(xe pbd-list params=uuid –minimal sr-uuid=$(xe sr-list params=uuid –minimal name-label=”Local Storage 400gb”))Третье забудем о нём:
xe sr-forget uuid=$(xe sr-list params=uuid –minimal name-label=”Local Storage 400gb”)Хочу обратить внимание на то что пробелы строчные и ЗАГЛАВНЫЕ буквы учитываются иначе вы получите ошибку о том что такое устройство не найдено!!! ———————————–
Источник: https://zametki-for-it.blogspot.com/p/blog-page_12.html
Удаление локального хранилища (local storage) в XenServer 6.5
Понадобилось мне как-то раз пересоздать raid на сервере с гипервизором Xenserver 6.5. Для этого нужно было отключить и удалить все локальные хранилища, пересоздать рейд и подключить заново новые storages. Задача простая, но как это часто бывает с XenServer, выполнить ее из панели управления нельзя, нужно лезть в консоль и выполнять кучу громоздких команд.
Приступаем к работе. Освобождаем хранилища, которые будем удалять. Для этого надо остановить и куда-нибудь перенести все виртуальные машины с них, иначе ничего не выйдет. Когда очистите сторейджи, можно приступать к работе.
Первым делом надо выяснить UUID отключаемых хранилищ:
# xe sr-list
uuid ( RO) : 4489372b-0fd2-7af6-1093-629b572502fd name-label ( RW): RAID1-01 name-description ( RW): host ( RO): xen02 type ( RO): lvm content-type ( RO): user
uuid ( RO) : dda2990b-70eb-17e5-5021-826f36b000db<\p>name-label ( RW): RAID1-02 name-description ( RW): host ( RO): xen02 type ( RO): lvm
content-type ( RO): user
У вас вывод будет скорее всего длиннее, там будут подключенные iso репозитории, двд дисковод и прочее. Я все это вырезал, оставил только 2 local storage, которые буду удалять: RAID1-01 и RAID1-02. Записываем куда-нибудь их uuidы.
Дальше нам нужно получить уиды от Physical Block Device (PBD). Выполняем команды для каждого storage:
# xe pbd-list sr-uuid=4489372b-0fd2-7af6-1093-629b572502fd
uuid ( RO) : 7b4d9a8d-e5d6-2610-7a29-836839ba77c3 host-uuid ( RO): c1413f35-0611-44cb-84cc-6808dd8fad42 sr-uuid ( RO): 4489372b-0fd2-7af6-1093-629b572502fd device-config (MRO): device: /dev/md10 currently-attached ( RO): true # xe pbd-list sr-uuid=dda2990b-70eb-17e5-5021-826f36b000db
uuid ( RO) : 6b814cb2-8bd3-217f-d10f-3e91630a007a<\p>host-uuid ( RO): c1413f35-0611-44cb-84cc-6808dd8fad42 sr-uuid ( RO): dda2990b-70eb-17e5-5021-826f36b000db device-config (MRO): device: /dev/md11
currently-attached ( RO): true
Сохраняем полученные uuid от pbd. Отключаем их с помощью команд:
# xe pbd-unplug uuid=7b4d9a8d-e5d6-2610-7a29-836839ba77c3
# xe pbd-unplug uuid=6b814cb2-8bd3-217f-d10f-3e91630a007a
В этом режиме хранилища будут существовать в отключенном виде. Их еще можно будет подключить обратно. Если они вам точно больше не нужны, то удаляем их:
# xe pbd-destroy uuid=7b4d9a8d-e5d6-2610-7a29-836839ba77c3
# xe pbd-destroy uuid=6b814cb2-8bd3-217f-d10f-3e91630a007a
Поле удаления они все равно продолжают висеть в XenCenter, хотя сделать с ними уже ничего нельзя. Чтобы они полностью исчезли, забываем их:
# xe sr-forget uuid=4489372b-0fd2-7af6-1093-629b572502fd
# xe sr-forget uuid=dda2990b-70eb-17e5-5021-826f36b000db
Все, теперь их нет в системе. Можно разбирать mdadm массив и собирать с новыми параметрами. Потом стандартным образом подключать новые local storage к xenserver.
XenServer в плане управления не очень удобная система. В бесплатной версии практически все действия по управлению, кроме создания виртуальных машин, требуют каких-то действий в консоли. Но с другой стороны, мы имеем в основе практически стандартный линукс.
Если у вас есть опыт работы с ним, то вы сможете оценить удобства, которые из этого вытекают. К примеру, вы без проблем можете разместить гипервизор на программный рейд mdadm. В случае бюджетного железа это очень существенный плюс.
Сервер реально получает отказоустойчивость, я много раз проверял подобные конфигурации.
Вы легко можете подключить UPS APC к серверу и управлять им с помощью apcupsd. Это очень удобно. В бесплатных версиях vmware или hyper-v вам будет значительно сложнее реализовать подобный функционал.
А в случае с рейдом просто нет шансов установить гипервизор на рейд, если его не поддерживает железо. Постараюсь в будущем поподробнее описать работу с xenserver.
У нас он почему-то не очень популярен, хотя среди бесплатных гипервизоров для малого и среднего бизнеса он может быть весьма полезен.
Источник: http://problem-info.ru/udalenie-lokal-nogo-hranilischa-local-storage-v-xenserver-6-5.html
Хранение данных в локальном хранилище localStorage
От автора: приветствую вас, друзья. В предыдущей статье мы с вами познакомились с плагином jQuery Cookie, который предоставляет простой интерфейс для работы с куками и, соответственно, позволяет хранить данные в куках. В этой статье мы узнаем еще об одном способе хранения данных, речь идет о локальном хранилище localStorage.
Итак, объект localStorage является глобальным объектом, в котором нам доступно целых 5 Мб места, т.е. записать туда мы можем очень-очень много разных данных. При этом эти данные будут храниться сколь угодно долго. Это очень удобно.
Для работы с объектом нам предлагается некоторый набор методов:
setItem() — запись в хранилище;
getItem() — получение данных их localStorage;
Современные тенденции и подходы в веб-разработке
Узнайте алгоритм быстрого профессионального роста с нуля в сайтостроении
Узнать подробнее
removeItem() — удаление конкретных данных;
clear() — очистка хранилища полностью.
Работа с представленными методами очень похожа на работу с куками в предыдущей статье. Давайте попробуем что-то записать в хранилище.
localStorage.setItem('name', 'Andrey'); |
Теперь посмотрим в консоли на содержимое хранилища:
Как видим, в хранилище записалась переменная (ключ, свойство) name с нужным значением. Без проблем можем записать еще что-то:
localStorage.setItem('name', 'Andrey');localStorage.setItem('name2', 'John'); |
Теперь мы записали в объект localStorage уже пару свойств. Давайте распечатаем сам объект и убедимся, что свойства там есть:
console.log(localStorage); |
Современные тенденции и подходы в веб-разработке
Узнайте алгоритм быстрого профессионального роста с нуля в сайтостроении
Узнать подробнее
Получить данные из хранилища можно несколькими способами. Во-первых, для получения данных можно использовать метод getItem(), передавая в качестве параметра нужный ключ.
console.log( localStorage.getItem('name') ); |
Также можем использовать синтаксис работы с массивами, обращаясь вот так:
console.log( localStorage['name'] ); |
Ну и можем обратиться к свойству объекта следующим образом:
console.log( localStorage.name ); |
Все три строки кода выведут одно и то же значение.
Как видим, ничего сложного в сохранении данных нет. Если какие-либо данные нам не нужны, мы можем удалить их по ключу, обратившись к методу removeItem().
localStorage.removeItem('name'); |
Если же нам нужно полностью очистить хранилище, тогда на помощь приходит метод clear:
После этой команды хранилище станет абсолютно пустым, как в начале работы:
На этом мы завершим данную статью. Исходники к статье вы можете скачать по ссылке. Больше о JavaScript и jQuery вы можете узнать из наших уроков или курса. Удачи!
Современные тенденции и подходы в веб-разработке
Узнайте алгоритм быстрого профессионального роста с нуля в сайтостроении
Узнать подробнее
Источник: https://webformyself.com/xranenie-dannyx-v-lokalnom-xranilishhe-localstorage/
Изменение размеров shared storage в Citrix Xen “на лету”
Пришло время апргейда железа. И оказалось, что гипервизор VMware 3.5 не работает с новыми боксами (мы взяли ProLiant BL465c G7, а с ними работает только VMware4). Фришная лицензия от VMware vSphere 4 тоже не подошла – там держатся только 2 физических CPU максимум по 6 core и не более 4х виртуальных CPU.
И серьезно стал вопрос о выборе нового гипервизора. Реально имеем две альтернативы – Xen (Citrix и XCP) и RHEV (KVM). Свое мнение про них и сравнительный анализ я напишу позже, когда все эксперименты закончатся и будет сделан выбор. Пока в данной статье я опишу “кусочек” экспериментов.
Мне понадобилось изменить размер shared SAN partition на Citrix Xen 5.6 FP1 – на раздел не помещаются снапшоты, а без снапшотов нормально бекап не провести – нужно останавливать виртуалку, что неприемлемо.
Разумеется, изменение размера нужно делать “на лету”.
Забегая немного вперед, отмечу, что мне удалось сделать это, даже не останавливая виртуалку, запущенную на этом томе!. Честно говоря, дисковой активности в виртуалке не было, т.е. эксперимент не совсем “чистый”. И Citrix честно предупреждают, что рекомендуют все-таки виртуалку останавливать “во избежании”.
Полагаю, что все-таки можно производить ресайз раздела и без остановки, если активность диска низкая. Как-нибудь при возможности попробую провести эксперимент.
Но вернемся к задаче. Итак, формулировка: Есть shared storage, расположенный на SAN. К стораджу, разумеется, подключаемся двумя адаптерами и multipath включен (мы же все-таки enterprise 😉 ). Имеем два XenServer'а в пуле. На разделе расположена виртуальная машина (запущенная).
Задача – увеличить размер раздела без перезагрузки Xen-серверов (и желательно без остановки виртуалки). 100% рабочего алгоритма, как обычно, в инете я не нашел. Пришлось компилить из разных источников 🙂 Последовательность действий:
- логинимся на один из Xen-серверов.
- смотрим статус multipath:# mpathutil status3600508b40010525700011000228f0000 dm-1 HP,HSV210[sizе=17G ][features=1 queue_if_no_path][hwhandler=0 ][rw ]\_ round-robin 0 [prio=200][enabled] \_ 2:0:6:1 sdm 8:192 [active][ready] \_ 2:0:4:1 sdi 8:128 [active][ready] \_ 1:0:6:1 sde 8:64 [active][ready] \_ 1:0:4:1 sda 8:0 [active][ready]\_ round-robin 0 [prio=40][enabled] \_ 2:0:7:1 sdo 8:224 [active][ready] \_ 2:0:5:1 sdk 8:160 [active][ready] \_ 1:0:7:1 sdg 8:96 [active][ready]\_ 1:0:5:1 sdc 8:32 [active][ready]Вместо mpathutil status можно воспользоваться командой multipath -l – это одно и то же.Нас интересует две вещи: WWID тома и имена scsi устройств, через которых работает dev-mapper
- смотрим uuid тома, который нам нужно ресайзить. Вообще-то можно обойтись и без него, зная только WWID – задача заключается в идентификации тома в LVM (чуть дальше), но может не сработать при отсуствии multipath (не проверял, негде :)):# xe sr-list name-label=STORAGEuuid ( RO) : 62cf6e68-40ff-bd54-4089-5c8e3a55162a name-label ( RW): STORAGE name-description ( RW): Hardware HBA SR [HP – /dev/sde [sdg] [sda] [sdc] [sdm] [sdo] [sdi] [sdk]] host ( RO): type ( RO): lvmohbacontent-type ( RO):
- смотрим состояние тома в lvm:# pvs | grep 62cf6e68-40ff-bd54-4089-5c8e3a55162a/dev/mapper/3600508b40010525700011000228f0000 VG_XenStorage-62cf6e68-40ff-bd54-4089-5c8e3a55162a lvm2 a- 16.99G 0.94GТут мы видим, что устройство размером в 17 гиг, свободно почти гиг
- пора ресайзить раздел со стороны SAN. Делаем это через интерфейс управления стораджем, увеличивая, например, до 30Gb
- возвращаемся в консоль XenServer. Даем команду FC адаптерам пересканировать сторадж. У меня Emulex, поэтому я приведу команды для него. Для других адаптеров команда рескана может отличаться!# echo “- – -” > /sys/class/scsi_host/host0/rescan# echo “- – -” > /sys/class/scsi_host/host1/rescanКак легко заметить, команды ничем не отличается от рескана для RHEL. Не удивительно – Citrix Xen базируется именно на RHEL 🙂
- теперь нужно пересканировать каждое из scsi устройств (дисков), через которые работает dev-mapper. Фокус с удалением дисков (как я использовал ранее при рескане) нас не устраивает – том не должен потеряться, у нас же там живая виртуалка продолжает работать! Делаем это командами:# echo 1 > /sys/block/sda/device/rescan# echo 1 > /sys/block/sde/device/rescan# echo 1 > /sys/block/sdi/device/rescan# echo 1 > /sys/block/sdm/device/rescan# echo 1 > /sys/block/sdo/device/rescan# echo 1 > /sys/block/sdk/device/rescan# echo 1 > /sys/block/sdg/device/rescan# echo 1 > /sys/block/sdc/device/rescanВот где нам пригодились имена дисков! Мы ресканим последовательно все.
- на всякий случай проверяем, что размер ресканированніх дисков изменился:# fdisk -l /dev/sda Disk /dev/sda: 32.2 GB, 32212254720 bytes 64 heads, 32 sectors/track, 30720 cylinders Units = cylinders of 2048 * 512 = 1048576 bytesDisk /dev/sda doesn't contain a valid partition tableЗамечательно, то, что нам нужно!
- Но это еще не все. Осталось всего два этапа: сообщить multipath и lvm об изменениях. Для multipath это делается командой:# multipathd -k”resize map 3600508b40010525700011000228f0000″okВот тут нам и пригодился WWID.
- проверяем, изменился ли размер:# multipath -l3600508b40010525700011000228f0000 dm-1 HP,HSV210[sizе=30G][features=1 queue_if_no_path][hwhandler=0][rw]\_ round-robin 0 [prio=0][enabled] \_ 2:0:6:1 sdm 8:192 [active][undef] \_ 2:0:2:1 sdi 8:128 [active][undef] \_ 1:0:6:1 sde 8:64 [active][undef] \_ 1:0:4:1 sda 8:0 [active][undef]\_ round-robin 0 [prio=0][enabled] \_ 2:0:7:1 sdo 8:224 [active][undef] \_ 2:0:5:1 sdk 8:160 [active][undef] \_ 1:0:5:1 sdc 8:32 [active][undef]\_ 1:0:7:1 sdg 8:96 [active][undef]Отлично, все получилось!
- теперь завершающий этап – ресайз lvm:# pvresize /dev/mapper/3600508b40010525700011000228f0000 Physical volume “/dev/mapper/3600508b40010525700011000228f0000” changed1 physical volume(s) resized / 0 physical volume(s) not resizedИ проверяем:# pvs | grep 62cf6e68-40ff-bd54-4089-5c8e3a55162a/dev/mapper/3600508b40010525700011000228f0000 VG_XenStorage-62cf6e68-40ff-bd54-4089-5c8e3a55162a lvm2 a- 29.99G 13.94G
Все получилось! Теперь на всех серверах пула повторяем процедуру, за исключением ресайза тома на SAN и ресайза LVM. Очевидно, что серверам нужно сообщить об изменениях, но повторно ресайзить не нужно. Теперь запускаем XenCenter и проверяем, что SR виден нового размера. Если виден старого размера, нужно выбрать SR в дереве слева, перейти на закладку Storage и нажать Rescan.
Все, задача выполнена. Дальнейшее увеличение размера и/или добавление диска(ов) для виртуалки внутри Xen – тривиальная задача, особенно с помощью XenCenter.
Источник: http://www.admin.dp.ua/2011/03/shared-storage-citrix-xen.html
Локальное хранилище (local storage): что это такое и как его использовать при разработке сайта
Создавая сайт, очень удобно использовать локальную базу данных, расположенную на стороне пользователя. Это решает массу проблем, и в этой статье мы поговорим о преимуществах локального хранилища и о том, как его использовать при создании сайтов.
Зачем использовать локальное хранилище? Одна из серьезных проблем HTTP – это отсутствие статичности относительно состояния приложения.
То есть, когда вы запускаете приложение, совершаете какие-то действия, а потом закрываете его, все параметры будут обнулены, и в следующий раз, когда вы его откроете, приложение будет девственно чистым.
В то же время десктопные приложения в большинстве своем сохраняют изменения состояния.
И поэтому вам как веб-разработчику нужно где-то хранить данные об интерфейсе и состоянии приложения. Как правило, информация хранится на сервере, и для проверки исходного состояния приложения при запуске нужно проверять имя пользователя. Ну, а если вы не хотите заставлять людей использовать логин и пароль?
Как раз здесь вам поможет локальное хранилище. Вы можете хранить ключ на компьютере пользователя и выводить нужные данные, считывая его, когда пользователь возвращается.
Cookies: да или нет?
Классический способ сохранять состояние приложения для конкретного пользователя – это cookies. Cookies (от англ.
cookie – «печенье») – это текстовый файл, присоединенный к домену вашего веб-сайта, который хранится на компьютере пользователя.
Когда пользователь открывает страницу вашего сайта, браузер «подтягивает» файл cookies и пересылает его на сервер. Но у cookies есть несколько серьезных ограничений и недостатков:
- они вешаются при загрузке каждого документа, открытого на домене;
- максимальный объем хранимых данных – 4 Кб;
- cookies часто незаконно используют для слежения за поведением пользователя в cети, поэтому многие люди и компании, которые беспокоятся о своей безопасности и сохранности данных, отключают cookies (или включают опцию запроса каждый раз, когда сайт пытается поставить cookies).
Кроме того, cookies имеют еще целый ряд проблем: неточная идентификация, возможность кражи или подмены, нестабильность между клиентом и сервером и так далее.
Проблемой локального хранилища данных занялись компании WHATWG и W3C. Они написали несколько спецификаций по local storage, которые изначально были частью документации по HTML5, но затем их вынесли в отдельный раздел.
Использование локального хранилища в браузерах, совместимых с HTML5
В современных браузерах использовать локальное хранилище очень просто. Вам нужно только изменить объект localStorage в JavaScript. Вы можете сделать это непосредственно или используя метод setItem() и getItem():
localStorage.setItem(‘favoriteflavor’,‘vani
Если вы введете ключ favouriteflavour, вы получите результат vanilla:
var taste = localStorage.getItem(‘favoriteflavor��// → “vanilla”
Для того чтобы удалить объект, вы можете использовать метод removeItem():
localStorage.removeItem(‘favoriteflavor’);
var taste = localStorage.getItem(‘favoriteflav// → null
Вместо localStorage можно использовать sessionStorage, если вы хотите хранить данные только во время одной сессии (пока пользователь не закроет браузер).
Проблема «Strings Only»
Одна неприятная особенность local storage – это то, что вы можете использовать в ключах только переменные типа string. То есть, если у вас есть объект, сохранить его не получится.
Для того чтобы наглядно увидеть эту проблему, попробуйте использовать следующий код:
var car = {};
car.wheels = 4;
car.doors = 2;
car.sound = ‘vroom’;
car.name = ‘Lightning McQueen’;
console.log( car );
localStorage.setItem( ‘car’, car );
console.log( localStorage.getItem
Если вы попробуете сделать то же самое в консоли, вы увидите, что данные хранятся как [object Object], но не как реальный объект:
Вы можете это обойти, используя методы JSON.stringify()и JSON.parse():
var car = {};
car.wheels = 4;
car.doors = 2;
car.sound = ‘vroom’;
car.name = ‘Lightning McQueen’;
console.log( car );
localStorage.setItem( ‘car’, JSON.stringify(car) );
console.log( JSON.parse( localStorage.getItem(
Где найти данные локального хранилища и как их удалить
Занимаясь написанием кода, вы наверняка иногда застреваете на месте и не понимаете, что происходит.
Конечно, вы всегда можете получить доступ к данным, используя нужные методы, но иногда вы просто хотите очистить все и начать с чистого листа.
В браузере Opera перейдите в меню Настройки → Расширенные→Хранилище (Preferences → Advanced → Storage), где вы увидите локальные данные всех доменов.
В Chom задача не так проста, поэтому мы сделали для вас небольшое видео:
У Mozilla сейчас нет соответствующего меню, но в будущем планируется. Сейчас вы можете воспользоваться консолью Firebug и достаточно просто удалить хранилище вручную.
Итак, вы теперь знаете, как использовать локальное хранилище. Давайте теперь разберемся, для чего нам это нужно.
#1: Локальное хранение данных веб-сервиса
Одно из главных применений локального хранилища – это кэширование данных из Веба, когда подтянуть их занимает слишком много времени. Вы можете посмотреть, что я имею в виду, если просмотрите запись в блоге Event Apart 10K.
Когда вы открываете демо в первый раз, названия подгружаются до 20 секунд (с сервиса Yahoo GeoPlanet). Во второй же раз вам не приходится ждать, так как все уже закэшировано на вашем компьютере при помощи local storage.
Следующий код показывает, как решить эту вот задачу. В локальном хранилище вызываете ключ, например, thewholefrigginworld при помощи метода render(), и он отображает нужную вам информацию.
Или иначе: показываете show a loading message и вызываете Geo API, используя getJSON().
Как только данные загрузятся, сохраните их в thewholefrigginworld и вызовите render() с теми же самыми данными:
if(localStorage && localStorage.getItem('thewholefrigginworld')){
render(JSON.parse(localStorage.getItem('thewholefrigginworld')));
} else {
$('#list').html('
<p>'+loading+'
');
var query = 'select centroid,woeid,name,boundingBox'+
' from geo.places.children(0)'+
' where parent_woeid=1 and placetype=”country”'+
' | sort(field=”name”)';
var YQL = 'http://query.yahooapis.com/v1/public/yql?q='+ encodeURIComponent(query)+'&diagnostics=false&format=json';
$.getJSON(YQL,function(data){
if(localStorage){
localStorage.setItem('thewholefrigginworld',JSON.stringify(data));
}
r
Вот наглядная демонстрация разницы во времени загрузки:
Это очень сильный инструмент. Если веб-сервер разрешает совершать только определенное количество запросов в час, но данные не меняются настолько быстро, вы можете хранить информацию в локальном хранилище и застраховаться от превышения квоты за счет пользователей. И, например, фотография будет потягиваться каждые 6 часов, а не каждую минуту.
Это очень тривиальная ситуация. И локальное кэширование данных спасет вас от бана, а кроме того, если API по какой-то причине «упадет», у вас на сайте все равно будет рабочая информация.
Но getJSON() в jQuery совершенно неудобен, когда речь идет о доступе к сервисам и breaking their cache, как описано в этой статье.
Поскольку обращение к сервису и использование getJSON() каждый раз создает уникальный URL, сервис не доставляет его кэшированную версию, а каждый раз полностью обращается к системе и базе данных.
Это достаточно неудобно, поэтому вместо того лучше кэшировать информацию локально и использовать ajax().
#2: Простой способ поддерживать состояние интерфейса
Еще один вариант, когда можно использовать локальное хранилище, – это хранение состояния интерфейсов. В одних случаях это может быть столь же грубо, как хранение всего HTML кода, а в других – столь же разумно, как поддержка объекта состоянием всех ваших виджетов.
Один из примеров, когда можно использовать локальное хранилище для кэширования HTML интерфейса – это интерфейс Yahoo Forehose (код на GitHub):
Код очень прост (с использование YUI3 и тестом для вызова локального хранилища):
YUI().use('node', function(Y) {
if(('localStorage' in window) && window['localStorage'] !== null){
var key = 'lastyahoofirehose';
<?php if(isset($_POST['sent']) || isset($_POST['moar'])){?>
localStorage.setItem(key,Y.one('form').get('innerHTML'));
<?php }else{ ?>
if(key in localStorage){
Y.one('#mainform').set('innerHTML',localStorage.getItem(key));
Y.one('#hd').append('
<p class=”message”><strong>Notice:</strong> We restored your last search for you – not live data');
}
<?php } ?>
}
});
В принципе, вам не нужен YIU, он просто упрощает задачу. Общая логика кэширования данных в локальном хранилище всегда одна и та же: проверьте, активирована ли кнопка «Submit» (в РHP, Python, Ruby и т. д.), и, если да, сохраните innerHTML всей формы. Или, в ином случае, просто считайте информацию из локального хранилища и override innerHTML формы.
Темная сторона local storage
Когда появляется какая-либо сильная и мощная технология, появляются и люди, которые пытаются использовать ее для незаконных целей.
Samy, создатель MySpace червя «Samy is my hero», недавно выпустил достаточно пугающее видео «Evercookie», которое показывает, как использовать практически любые методы, в том числе и локальное хранилище, чтобы собирать информацию о пользователе, даже с отключенными куки. Этот код можно использовать как угодно, и его пока что никак не обойти.
Обзоры, подобные этому, показывают, что нам нужно смотреть на аддоны и функции HTML5 в том числе и со стороны безопасности, чтобы не предоставлять никому шанса записывать действия пользователей против их воли.
Я думаю, что запрос на использование локального хранилища нужно сделать обязательным, так же как сделан запрос на получение географического положения. Но с точки зрения Unix это выглядит неуклюже и громоздко. Есть какие-нибудь идеи на этот счет?
Перевод статьи Local Storage And How To Use It On Websites с сайта www.smashingmagazine.com
Источник: http://todosite.ru/2011/hosting/lokalnoe-hranilishhe-local-storage-chto-eto-takoe/
HTML5 API веб-хранилища
Web Storage (Веб-Хранилище) — это технология хранения данных на стороне клиента прямиком в браузере.
Два объекта — две идеи
Веб-хранилище подразделяется на два типа:
Local Storage
Локальное хранилище — это объект localStorage, используемый для хранения данных вида «Ключ – Значение» на постоянной основе. Иначе говоря, данные хранятся до тех пор, пока их принудительно не заставят уйти, то есть удалят.
Session Storage
Хранилище данных сеансов — это объект sessionStorage, используемый для хранения данных вида «Ключ – Значение» на временной основе. Данные хранятся до тех пор, пока не будет закрыта вкладка или окно браузера.
Что можно хранить и для чего использовать?
Хранить можно всё то, что сможет уложиться в строку, так как единственным разрешенным типом данных для хранения является текстовый тип — строка.
Навскидку, веб-хранилище можно забивать следующими данными:
- Состояние работы приложения — Например, последний открытый документ, значение измененного поля ввода или история поиска по сайту.
- Настройки пользователя — Например, выбранная тема оформления сайта или вид отображения информации.
- Сохранение пользовательских данных при неудачной попытке отправки на сервер.
- Запись данных по мере их ввода — Например, редактор текста StackEdit.
Поддержка браузеров
Картина замечательная, даже лучше, чем можно было представить себе:
Оценить всю сложившуюся на данный момент ситуацию можно на сайте Can I Use.
Доступный размер
В отличии от печенек (HTTP cookie), веб-хранилище предоставляет намного больший размер — 4Кб против ~5Мб.
Проведя небольшой тест на реальных устройствах, получаем следующие данные:
- Chrome 38, FireFox 33 и Opera 25 — размер хранилища 5000 Кб.
- IE8-11 — размер хранилища 4750 Кб.
- iOS 5-8.1 Safari, OS X Safari — размер хранилища 2500 Кб.
- Android 4.x-5 — размер хранилища 5000 Кб.
- Windows Phone 7.8 — размер хранилища 4750 Кб.
Устройства проверялись с «заводскими» настройками браузера, то есть никаких настроек до тестирования не проводилось. Протестировать ваше устройство можно используя вот «этот» скрипт.
Работаем с данными
Рассмотрим традиционное использование объекта localStorage и не совсем традиционное.
Пример — Запись данных в хранилище
Записать данные в хранилище можно тремя способами:
localStorage.setItem(“key”, “value”);
// Или
localStorage.key = “value”;
// Или
localStorage[“key”] = “value”;
Пример — Чтение данных из хранилища
Считать данные из хранилища также просто как и записать:
localStorage.getItem(“key”);
// Или
localStorage.key;
// Или
localStorage[“key”];
Пример — Удаление данных из хранилища
Удаление данных имеет всего один синтаксис:
localStorage.removeItem(“key”);
Пример — Удаление всех данных из хранилища
Если вдруг вам надоело записывать и считывать данные в веб-хранилище, то в любой момент вы можете остановить это, удалив все записи:
localStorage.clear();
Пример — Количество записей в хранилище
Для того, чтобы получить общее количество записей в хранилище, необходимо использовать стандартное свойство length:
localStorage.length;
Пример — Получение всех записей хранилища
Получить все данные, записанные в хранилище, можно с помощью цикла:
for (var i = 0; i < localStorage.length; i++) { var key = localStorage.key(i); console.log(key + ' = ' + localStorage[key]); }
В цикле перебираются все элементы хранилища, получаются их ключи и значения.
Пример — Хранение не строковых данных
Если есть необходимость хранить в локальном хранилище не только строковые данные, то нужно учесть, что придётся заранее позаботиться об их преобразовании:
// В хранилище:
// a = “11”
// b = “19”
// c = “25”
Мы хотим сумму всех имеющихся элементов. Получаем:
var sum = 0; for (var i = 0; i < localStorage.length; i++) { var key = localStorage.key(i); sum += Number(localStorage[key]); } console.log(sum);
Просто используем для этого функцию Number.
Если имеем дело с датой, то придется использовать объект Date:
// В хранилище:
// date = “2014-10-30” var data = localStorage[“date”].split('-');
var data = new Date(data[0], data[1], data[2]);
console.log(data.getDate() + ' ' + data.getMonth() + ' ' + data.getFullYear());
Если перед записью есть возможность отформатировать дату в текстовую строку, то лучше сделать так:
// Запись
var currentTime = new Date();
localStorage[“date”] = currentTime.getFullYear() + '/' + currentTime.getMonth() + '/' + currentTime.getDate(); // Чтение
var data = new Date(localStorage[“date”]);
console.log(data.getDate() + ' ' + data.getMonth() + ' ' + data.getFullYear());
Пример — Записываем в хранилище массив
Вы не забыли, что веб-хранилище дружит только со строками? Нам нужно больше функционала. Исправляем.
Схема махинаций:
- Преобразование массива в строку.
- Запись строки в хранилище.
- Чтение строки из хранилища.
- Преобразование строки в массив.
Пффф. Легко!
На входе у нас есть массив:
var myArray = [“One”, “Two”, [“One”, “Two”], “four”];
Преобразуем его в строку, используя JSON.stringify, и записываем в хранилище:
localStorage[“myArray”] = JSON.stringify(myArray);
Для внутреннего удовлетворения посмотрим, что выведет console.log():
console.log(localStorage[“myArray”]);
// Вывод: [“One”,”Two”,[“One”,”Two”],”four”]
Спустя сто и один день, мы обращаемся к хранилищу и хотим заполучить наш массив обратно:
var data = JSON.parse(localStorage[“myArray”]);
И снова нужно успокоить в себе параноика тем, что ожидаемое получено в необходимой форме:
console.log(data);
// Вывод:
// [“One”, “Two”, Array[2], “four”]
// 0: “One”
// 1: “Two”
// 2: Array[2]
// 3: “four”
// length: 4
// __proto__: Array[0]
Таким путём можно пойти и при необходимости записи объектов в веб-хранилище:
// Входные данные
var article = { user: 'mrmlnc', date: '30-10-2014', star: '-1'
}; // Записываем
localStorage[“post_0”] = JSON.stringify(article); // Считываем
var post = JSON.parse(localStorage[“post_0”]); // Выводим
console.log(post);
Очень удобно и практично.
К слову, редактор StackEdit хранит так настройки и сами записи:
{ “layoutOrientation”:”horizontal”, “editMode”:”ltr”, “lazyRendering”:true, “editorFontClass”:”font-rich”, “fontSizeRatio”:1, “maxWidthRatio”:1, “cursorFocusRatio”:0.5, “defaultContent”:”
> Written with [StackEdit](https://stackedit.io/).”, …
}
В реальной жизни это выглядит так:
Пример — Отслеживание изменения хранилища
Веб-хранилище генерирует событие onStorage на каждое своё изменение: добавление, изменение или удаление.
Вешаем прослушку на событие:
// Функция обработчика события
function storageChanged(storageEvent) { alert('Событие Storage от' + storageEvent.url + '!');
}; window.addEventListener('storage', storageChanged, false);
Кстати, объект, который передается функции обработчика событий, содержит в себе немного полезной информации:
key
Ключ измененной, добавленной или удаленной записи.
oldValue
Значение ключа до изменения.
newValue
Значение ключа после изменения.
url
URL страницы, которая породила событие onStorage.
storageArea
localStorage или sessionStorage, в зависимости от того, где произошло изменение.
Стоит учитывать тот факт, что событие вызывается на всех страницах, кроме той, что его породило. Пример работы можно посмотреть на сайте html5demos.
Выводы
По сути дела, это круто!
Web Storage — это просто ещё один шаг к оффлайн HTML5 приложениям. Уже сейчас вы можете хранить настройки своих веб-приложений в удобном для вас виде прямиком в браузере.
Не маловажной ступенью дальнейшего развития вашего проекта будет сохранение введенных данных пользователя, при неудачной попытке отправки на сервер или валидации, и последующего использования их при повторном заполнении. Именно для этого можно использовать объект sessionStorage.
Согласитесь — не это ли будущее отзывчивых приложений? Я уже не представляю себе повторный ввод всех полей в форме, если была допущена ошибка ранее и страница обновилась.
Кратко о плюсах веб-хранилища:
- Достаточно большой объем хранилища.
- Приличная скорость.
- Неограниченное время жизни.
- Удобный интерфейс общения с данными.
Источник: https://canonium.com/articles/html-webstorage