Игрушечная Exadata, она же Exadata Simulator

Статейка о том, как сделать виртуальную Exadata. Источник вдохновения: http://dsvolk.blogspot.ru/

Картинка для привлечения внимания:

Sarah_Palin_Flight_Simulator

 

Сразу хочу сказать, что все мы люди разумные и понимаем — таковая игрушка пригодна для обучения, некоторого функционального тестирования, но никоим образом не предназначена для промэкплуатации и/или нагрузочных тестов.

Если с этим определились, то ОК, поехали. Делаем аналог 1/4: две DBnode в RAC, 3 ячейки хранения.

У меня есть среда виртуализации — пара серверов ProLiant под управлением Vmware vSphere 6.0, в ней и будем упражняться. Схема того, что должно получиться приведена ниже:

ExaToy

Все компоненты в ней (за исключением сетей, конечно же) — виртуальные машины:

  • 2 сервера СУБД в RAC (каждый 8 x vcore CPU; 8GB RAM, 100GB HDD)
  • 3 ячейки хранения (каждая 8 x vcore CPU; 16GB RAM; 100GB HDD)

Поскольку делаем игрушку, то и объемы будут игрушечные: на ячейку 12 якобы HDD по 1GB; посольку SSD на моих серверах нет, то вместо в качестве flash буду использовать RAMDISK, общим объемом 4GB.

Транспорт между серверами СУБД и ячейками хранения —  RDS over TCP. Согласно изысканиям Д. Волкова rds over tcp/ip работает на ядре 2.6.39-300.26.1, а дальше он был сломан. В OEL 5.10 уже не работает. Сам это не проверял — не знаю, просто принял за аксиому, что мы ограничены OEL 5.9 с ядром 2.6.39-300.26.1.el5uek.

Поехали!

1. Устанавливаем на все виртуальные машины ОС  OEL 5.9 с ядром 2.6.39-300.26.1.el5uek (качаем с edelivery.oracle.com).

2. Отключаем SELinux, firewall, обновляемся, ставим ядро 2.6.39-300.26.1.el5uek и конфигурируем его загрузку по умолчанию, затем перезагружаемся. По желанию настраиваем NTP-клиент.

3. Пробуем прогрузить модули rds:

# modprobe rds rds_tcp rds_rdma

Все ОК, прописываем автозагрузку модулей и еще одну волшебную строчку в /etc/rc.local (можно в celld см ниже):

/sbin/modprobe rds
/sbin/modprobe rds_tcp
/sbin/modprobe rds_rdma

chown -R celladmin.celladmin /opt/oracle/cell12.1.1.1.1_LINUX.X64_140712/disks/raw/cell1_FLASH*

4. Все имена и адреса прописываем в  /etc/hosts. У меня так:

# Cells

10.0.61.11 cell01.test.local cell01
10.0.61.12 cell02.test.local cell02
10.0.61.13 cell03.test.local cell03

#DB nodes
10.0.60.101 dbnode01.test.local dbnode01
10.0.60.102 dbnode02.test.local dbnode02
10.0.61.101 dbnode01-priv.test.local dbnode01-priv
10.0.61.102 dbnode02-priv.test.local dbnode02-priv

# VIP
10.0.60.111 dbnode01-vip.test.local dbnode01-vip
10.0.60.112 dbnode02-vip.test.local dbnode02-vip
# SCAN
10.0.60.201 db-scan.test.local db-scan
10.0.60.202 db-scan.test.local db-scan
10.0.60.203 db-scan.test.local db-scan
5. Настраиваем создание ramdisk-ов в /etc/grub.conf (добавляем ramdisk_size=262144)

kernel /vmlinuz-2.6.39-300.26.1.el5uek ro root=/dev/VolGroup00/LogVol00 rhgb quiet numa=off transparent_hugepage=never ramdisk_size=262144

Перезагружаемся, проверяем, что ram-диски на месте: # ls -l /dev/ram*

6. Далее хитрость: мне, чтобы собрались и заработали дисковые группы, пришлось увеличить размеры ограничений по сетевым буферам, по сравнению со значениями, которые  автоматически поставил Oracle-Validated

# nano /etc/sysctl.conf

….
# Настройки, отличные от тех, которые автоматически поставил Oracle-Validated

# For 11g, Oracle-Validated setting for net.core.rmem_max is 4194304
# For 10g, uncomment ‘net.core.rmem_max = 2097152’, comment ‘net.core.rmem_max = 4194304’ entry and re-run sysctl -p
# net.core.rmem_max = 2097152
net.core.rmem_max = 8388608

# For 11g, Oracle-Validated setting for net.core.wmem_max is 1048576
# For 10g, uncomment ‘net.core.wmem_max = 262144’, comment ‘net.core.wmem_max = 1048576’ entry for this parameter and re-run sysctl -p
# net.core.wmem_max = 262144
net.core.wmem_max = 8388608

Руководствовался этой статьей и логикой «Евреи, не жалейте заварки!». До внесения этих изменений в параметры, дисковые группы собирались с десятого раза, а запись/чтение на них не работали, все зависало.

7. Обычные приседания, добавления в файлы /etc/security/limits.conf

* soft nofile 655360
* hard nofile 655360
* soft memlock 409600000
* hard memlock 409600000

и /etc/pam.d/login

session required /lib64/security/pam_limits.so
session required pam_limits.so

8. Далее начинаем устанавливать Cellsrv на трех наших ячейках хранения (следующие телодвижения нужно сделать на каждой):

8.1  Подготовительные мероприятия:

# mkdir /var/log/oracle
# chmod 775 /var/log/oracle
# yum install perl-XML-Simple
Скачиваем и уставливаемRPM JDK: # rpm -ivh ./jdk-7u101-linux-x64.rpm
8.2 Скачиваем с edelivery.oracle.com ПО Oracle Exadata Storage Server (12.1.1.1.1).  Причем именно этой версии, с версией 12.1.2.3 у меня (пока?) ничего не вышло.

ExaToy2

Расковыряв архив, находим внутри dl180/boot/cellbits/cell.bin. На самом  деле  это тоже zip-архив, смело открываем его и находим, наконец, внутри искомый cell-12.1.1.1.1_LINUX.X64_140712-1.x86_64.rpm

Устанавливаем его: # rpm -ivh ./cell-12.1.1.1.1_LINUX.X64_140712-1.x86_64.rpm
8.3 Создаем якобы диски:

# cd /opt/oracle/cell12.1.1.1.1_LINUX.X64_140712/
# mkdir -p disks/raw
# chown -R celladmin.celladmin disks/

# dd if=/dev/zero of=cell1_DISK01 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK02 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK03 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK04 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK05 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK06 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK07 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK08 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK09 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK10 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK11 bs=1048576 count=1024
# dd if=/dev/zero of=cell1_DISK12 bs=1048576 count=1024
# ln -s /dev/ram0 ./cell1_FLASH01
# ln -s /dev/ram1 ./cell1_FLASH02
# ln -s /dev/ram2 ./cell1_FLASH03
# ln -s /dev/ram3 ./cell1_FLASH04
# ln -s /dev/ram4 ./cell1_FLASH05
# ln -s /dev/ram5 ./cell1_FLASH06
# ln -s /dev/ram6 ./cell1_FLASH07
# ln -s /dev/ram7 ./cell1_FLASH08
# ln -s /dev/ram8 ./cell1_FLASH09
# ln -s /dev/ram9 ./cell1_FLASH10
# ln -s /dev/ram10 ./cell1_FLASH11
# ln -s /dev/ram11 ./cell1_FLASH12
# ln -s /dev/ram12 ./cell1_FLASH13
# ln -s /dev/ram13 ./cell1_FLASH14
# ln -s /dev/ram14 ./cell1_FLASH15
# ln -s /dev/ram15 ./cell1_FLASH16
# chown -R celladmin.celladmin /opt/oracle/cell12.1.1.1.1_LINUX.X64_140712/disks/raw/cell1_FLASH*
8.4 Создаем файл конфигурации:

# nano /opt/oracle/cell12.1.1.1.1_LINUX.X64_140712/cellsrv/deploy/config/cellinit.ora

У меня такой:

#CELL Initialization Parameters
version=0.0
_cell_oflsrv_heartbeat_timeout_sec=60
_cell_fc_bootstrap_timeout=50000000
RMI_PORT=23791
HTTP_PORT=8888
JMS_PORT=9127
BMC_SNMP_PORT=162
_reconnect_to_cell_attempts=4
DEPLOYED=TRUE
ipaddress1=10.0.61.11/24
SSL_PORT=23943
bbuTempThreshold=60
_cell_cd_metadata_prepare_timeout_in_sec=50
_cellrsdef_max_auto_timeout=200
_cell_state_dump_timeout_in_sec=10
_cell_executing_in_vm=TRUE
_cellrsdef_heartbeat_timeout=600
_skgxp_udp_use_tcb=true
_cell_gd_io_quiescent_timeout=100
_cell_fc_persistence_state=Off
_skgxp_udp_use_tcb_client=true
_skgxp_gen_ant_off_rpc_timeout_in_sec=300
_cell_fc_scan_threshold_timeout=10
bbuChargeThreshold=800
_reconnect_to_cell_freq_in_sec=4
_cellrsos_start_timeout=300

8.5 И, наконец, создаем cell.

# su — celladmin

$ cellcli

CellCLI>ALTER CELL SHUTDOWN SERVICES CELLSRV;
CellCLI>create cell cell01 interconnect1=eth0  (имейте в виду: 1) имена cell-ов должны быть уникальны 2) нежелательно в именах хостов и cell-ов использовать тире 3) желательно чтобы имя виртуальной машины, на которой живет ячейка, и cell-а совпадали)
CellCLI>create celldisk all harddisk
CellCLI>create celldisk all flashdisk
CellCLI>drop flashlog all
CellCLI>drop flashcache all
CellCLI>CREATE FLASHLOG ALL SIZE=512M
CellCLI>CREATE FLASHCACHE ALL
CellCLI>create griddisk all harddisk prefix=DATA, size=750M
CellCLI>create griddisk all harddisk prefix=FRA, size=210M
CellCLI>create griddisk all harddisk prefix=DBFS_DG, size=30M

8.6 Отредактируем содержимое /etc/init.d/celld: поскольку у меня в качестве flash выступают ramdisk-и то после каждой перезагрузки flash-диски нужно переинициализировать, а flashcache/flashlog пересоздавать. Мой файл — здесь.

9. Настраиваем dbnode-ы:

9.1 Cтавим ОС, делаем те же приседания с 1 по 7 пункт включительно.

9.2. Ставим grid infrastructure 12.1.0.2.0 и dbms 12.1.0.2.0 (см. например https://oracle-base.com/articles/12c/oracle-db-12cr1-rac-installation-on-oracle-linux-6-using-virtualbox, только для grid и dbms нужно завести разных пользователей, например grid и oracle)

9.3 Создаем конфигурационные файлы для настройки доступа узлов к ячейкам хранения:

# mkdir -p /etc/oracle/cell/network-config
# chown oracle:dba /etc/oracle/cell/network-config
# chmod ug+wx /etc/oracle/cell/network-config

# su — oracle

Определяем, через какой сетевой интерфейс db-ноды ходим к cell-ам.

$ cat /etc/oracle/cell/network-config/cellinit.ora
ipaddress1=10.0.61.101/24 # Db Node IP — fake Infiniband network

Определяем перечень cell-ов, с которыми работаем.
$ cat /etc/oracle/cell/network-config/cellip.ora
cell=»10.0.61.11″ # Cell01 ip address
cell=»10.0.61.12″ # Cell02 ip address
cell=»10.0.61.13″ # Cell03 ip address

9.4 Останавливаем кластер и на каждой ноде меняем протокол interconnect-а, которым пользуется ASM:

# export ORACLE_HOME=/u01/app/12.1.0.2/grid/

# make -C /u01/app/12.1.0.2/grid/rdbms/lib/ -f ins_rdbms.mk  ipc_rds ioracle

# chown grid.oinstall /u01/app/12.1.0.2/grid/bin/oracle
# chmod 6751 /u01/app/12.1.0.2/grid/bin/oracle

Стартуем кластер, проверяем:

# su — grid
$ skgxpinfo
rds

Для DBMS нужно сделать то же самое, только под пользователем oracle и вместо GRID_HOME (/u01/app/12.1.0.2/grid) будет ORACLE_HOME.

10. С помощью asmca создаем дисковые группы DATA и FRA (для того, чтобы griddisk-и с ячеек увиделись, в asm_diskstring нужно добавить o/*/*  )

11. После создания дисковой группы DATA необходимо проверить и, в случае необходимости, включить для нее функционал smart scan:

# su — grid

$ sqlplus / as sysasm
SQL> select dg.name, a.value from v$asm_diskgroup dg,v$asm_attribute a where a.GROUP_NUMBER=dg.GROUP_NUMBER and a.name=’cell.smart_scan_capable’;

Если для дисковой группы DATA значение FALSE, то нужно включить:
SQL> alter diskgroup DATA set attribute ‘cell.smart_scan_capable’ = ‘TRUE’;

Вот, собственно, и все. Далее создание БД, наполнение и тестирование ее swingbench-ем.

До кучи пара полезностей:

1. Определение cache hit ratio

$ sqlplus sys/password@TEST as sysdba

Для каждого инстанса по отдельности:

SQL>select a.instance_number, c.snap_time, sum(a.value) physical_read_IO_requests, sum(b.value) flash_cache_read_hits, round((sum(b.value)/sum(a.value) * 100),2) flash_cache_hit_ratio from
(select SNAP_ID, instance_number,value from dba_hist_sysstat where stat_id=3343375620) a,
(select SNAP_ID, instance_number,value from dba_hist_sysstat where stat_id=2923827453) b,
(select to_char(begin_interval_time,’YYYY-MM-DD hh24′) snap_time,snap_id from DBA_HIST_SNAPSHOT) c
where
a.snap_id=b.snap_id and a.instance_number=b.instance_number and a.snap_id=c.snap_id
group by a.instance_number, c.snap_time
order by 2
;

Для всех инстансов суммарно (средняя температура по кластерной базе):

select c.snap_time, sum(a.value) physical_read_IO_requests, sum(b.value) flash_cache_read_hits, round((sum(b.value)/sum(a.value) * 100),2) flash_cache_hit_ratio from
(select SNAP_ID,value from dba_hist_sysstat where stat_id=3343375620) a,
(select SNAP_ID,value from dba_hist_sysstat where stat_id=2923827453) b,
(select to_char(begin_interval_time,’YYYY-MM-DD hh24′) snap_time,snap_id from DBA_HIST_SNAPSHOT) c
where
a.snap_id=b.snap_id and a.snap_id=c.snap_id
group by c.snap_time
order by 1;

Посмотреть счетчики:

SQL>SELECT name,value
FROM v$sysstat
WHERE name IN
(‘physical read flash cache hits’,
‘physical reads’,
‘consistent gets’,
‘db block gets’,
‘flash cache inserts’);

2. Иллюстрация работы SmartScan

Если тестовая БД наполнялась с помощью swingbench (тест «Order Entry«), то можно проверить так:

$ sqlplus sys/password@TEST as sysdba

SQL> set autotrace on explain
SQL> set timing on

SQL> select count(*) from soe.customers where CUSTOMER_CLASS=’Occasional’;

COUNT(*)
———-
2003827

Elapsed: 00:00:00.51

Execution Plan
———————————————————-
Plan hash value: 296924608

—————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
—————————————————————————————-
| 0 | SELECT STATEMENT | | 1 | 10 | 13895 (1)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 10 | | |
|* 2 | TABLE ACCESS STORAGE FULL| CUSTOMERS | 740K| 7228K| 13895 (1)| 00:00:01 |
—————————————————————————————-

Predicate Information (identified by operation id):
—————————————————

2 — storage(«CUSTOMER_CLASS»=’Occasional’)
filter(«CUSTOMER_CLASS»=’Occasional’)

Как видим, запрос offload-ится на ячейках. Проверим эффективность:

SQL> SELECT s.name, m.value/1024/1024 MB FROM V$SYSSTAT s, V$MYSTAT m WHERE s.statistic# = m.statistic# AND (s.name LIKE ‘physical%total bytes’ OR s.name LIKE ‘cell phys%’ OR s.name LIKE ‘cell IO%’);

NAME MB
—————————————————————- ———-
physical read total bytes 817.564453
physical write total bytes 0
cell physical IO interconnect bytes 50.2040176
cell physical IO bytes saved during optimized file creation 0
cell physical IO bytes saved during optimized RMAN file restore 0
cell physical IO bytes eligible for predicate offload 817.5625
cell physical IO bytes saved by storage index 0
cell physical IO bytes sent directly to DB node to balance CPU 0
cell physical IO interconnect bytes returned by smart scan 50.2020645
cell physical IO bytes saved by columnar cache 0
cell physical write bytes saved by smart file initialization 0

NAME MB
—————————————————————- ———-
cell IO uncompressed bytes 817.679688
cell physical write IO bytes eligible for offload 0
cell physical write IO host network bytes written during offloa 0

Как видно,  польза от ячеек есть. Вместо 817МБ от ячеек в сторону dbnode ушло всего 50МБ.

3. Суммарная статистика эффективности работы SmartScan по всем запросам

SQL> SELECT s.name, s.value/1024/1024 MB FROM V$SYSSTAT s WHERE  s.name LIKE ‘physical%total bytes’ OR s.name LIKE ‘cell phys%’ OR s.name LIKE ‘cell IO%’;

За сим прощаюсь. Stay tuned.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s