Обновление основной версии означает изменение номера основной версии, например, переход с версии 5.X.X на 6.0.0.
При обновлении с YMatrix 5.X до 6.X доступны два варианта. Выберите подходящий способ в зависимости от ваших требований.
Ниже приведены подробные инструкции по обоим методам, используя пример обновления с YMatrix 5.3.6 до 6.3.0.
Примечание!
Выберите только один из двух методов. Не выполняйте оба одновременно.
Этот метод позволяет выполнить локальное обновление с YMatrix 5 до YMatrix 6. Оба кластера — YMatrix 5 и YMatrix 6 — будут работать на одном хосте. Программное обеспечение обеих версий может быть установлено одновременно, и оба кластера могут функционировать независимо без взаимных помех. Однако убедитесь, что объём свободного дискового пространства на каждом хосте составляет как минимум вдвое больше текущего размера кластера.
Пример конфигурации кластера: 4 хоста, включающих 1 мастер-узел (Master), 2 сегментных узла (Segment) — каждый с зеркальными экземплярами (Mirror) — и 1 резервный мастер-узел (Standby).
Проверьте версию программного обеспечения текущего кластера YMatrix 5.
=# select version();
version
---------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 12 (MatrixDB 5.3.6-enterprise) (Greenplum Database 7.0.0+dev.18290.g7184139e3e build commit:7184139e3ebba8b77239ec19db63c04
bd43951b6) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9), 64-bit compiled on Mar 21 2023 06:51:57
(1 row)
Просмотрите конфигурацию исходного кластера.
=# select * from gp_segment_configuration order by content, dbid;
dbid | content | role | preferred_role | mode | status | port | hostname |
address | datadir
------+---------+------+----------------+------+--------+------+-------------------------------------------------+---------------------
----------------------------+----------------------------------------
1 | -1 | p | p | n | u | 5432 | ip-10-0-128-97.cn-northwest-1.compute.internal | ip-10-0-128-97.cn-no
rthwest-1.compute.internal | /mxdata_20230321075750/master/mxseg-1
10 | -1 | m | m | s | u | 5432 | ip-10-0-92-234.cn-northwest-1.compute.internal | ip-10-0-92-234.cn-no
rthwest-1.compute.internal | /mxdata_20230321075750/standby/mxseg-1
4 | 0 | p | p | s | u | 6000 | ip-10-0-101-114.cn-northwest-1.compute.internal | ip-10-0-101-114.cn-n
orthwest-1.compute.internal | /mxdata_20230321075750/primary/mxseg0
8 | 0 | m | m | s | u | 7001 | ip-10-0-137-193.cn-northwest-1.compute.internal | ip-10-0-137-193.cn-n
orthwest-1.compute.internal | /mxdata_20230321075750/mirror/mxseg0
5 | 1 | p | p | s | u | 6001 | ip-10-0-101-114.cn-northwest-1.compute.internal | ip-10-0-101-114.cn-n
orthwest-1.compute.internal | /mxdata_20230321075750/primary/mxseg1
9 | 1 | m | m | s | u | 7000 | ip-10-0-137-193.cn-northwest-1.compute.internal | ip-10-0-137-193.cn-n
orthwest-1.compute.internal | /mxdata_20230321075750/mirror/mxseg1
2 | 2 | p | p | s | u | 6000 | ip-10-0-137-193.cn-northwest-1.compute.internal | ip-10-0-137-193.cn-n
orthwest-1.compute.internal | /mxdata_20230321075750/primary/mxseg2
6 | 2 | m | m | s | u | 7000 | ip-10-0-101-114.cn-northwest-1.compute.internal | ip-10-0-101-114.cn-n
orthwest-1.compute.internal | /mxdata_20230321075750/mirror/mxseg2
3 | 3 | p | p | s | u | 6001 | ip-10-0-137-193.cn-northwest-1.compute.internal | ip-10-0-137-193.cn-n
orthwest-1.compute.internal | /mxdata_20230321075750/primary/mxseg3
7 | 3 | m | m | s | u | 7001 | ip-10-0-101-114.cn-northwest-1.compute.internal | ip-10-0-101-114.cn-n
orthwest-1.compute.internal | /mxdata_20230321075750/mirror/mxseg3
(10 rows)
Проверьте имена хостов всех машин, чтобы определить, на каких серверах развернут текущий кластер.
=# select distinct(hostname) from gp_segment_configuration ;
hostname
-------------------------------------------------
ip-10-0-101-114.cn-northwest-1.compute.internal
ip-10-0-92-234.cn-northwest-1.compute.internal
ip-10-0-137-193.cn-northwest-1.compute.internal
ip-10-0-128-97.cn-northwest-1.compute.internal
(4 rows)
Примечание!
Команды в этом разделе необходимо выполнять на всех узлах.
Установите программное обеспечение YMatrix 6.
$ sudo yum install -y matrixdb6-6.3.0+enterprise-1.el7.x86_64.rpm
Проверьте информацию об установленной версии YMatrix 5.
$ yum info matrixdb5
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: download.cf.centos.org
* centos-sclo-rh: download.cf.centos.org
* centos-sclo-sclo: download.cf.centos.org
* epel: mirrors.bfsu.edu.cn
* extras: download.cf.centos.org
* updates: download.cf.centos.org
https://apache.bintray.com/arrow/centos/7/x86_64/repodata/repomd.xml: [Errno 14] curl#51 - "Unable to communicate securely with peer: requested domain name does not match the server's certificate."
Trying other mirror.
Installed Packages
Name : matrixdb5
Arch : x86_64
Version : 5.3.6.enterprise
Release : 1.el7
Size : 287 M
Repo : installed
From repo : /matrixdb-5.3.6.enterprise-1.el7.x86_64
Summary : MatrixDB 5
URL : https://matrixdb.cn
License : MatrixDB License
Description : MatrixDB is a timeseries-optimized database based on Greenplum.
Проверьте информацию об установленной версии YMatrix 6.
$ yum info matrixdb6
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: download.cf.centos.org
* centos-sclo-rh: download.cf.centos.org
* centos-sclo-sclo: download.cf.centos.org
* epel: mirrors.bfsu.edu.cn
* extras: download.cf.centos.org
* updates: download.cf.centos.org
https://apache.bintray.com/arrow/centos/7/x86_64/repodata/repomd.xml: [Errno 14] curl#51 - "Unable to communicate securely with peer: requested domain name does not match the server's certificate."
Trying other mirror.
Installed Packages
Name : matrixdb6
Arch : x86_64
Version : 6.3.0+enterprise~beta.6
Release : 1.el7
Size : 185 M
Repo : installed
Summary : MatrixDB 6
URL : https://ymatrix.cn
License : MatrixDB License
Description : MatrixDB is a timeseries-optimized database based on Greenplum.
Проверьте состояние службы supervisor для кластера YMatrix 5.
$ systemctl status matrixdb5.supervisor.service
● matrixdb5.supervisor.service - MatrixDB 5 Supervisord Daemon
Loaded: loaded (/usr/lib/systemd/system/matrixdb.supervisor.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2023-03-21 07:45:07 UTC; 23min ago
Main PID: 1866 (supervisord)
CGroup: /system.slice/matrixdb.supervisor.service
├─1866 /usr/local/matrixdb/bin/supervisord -c /etc/matrixdb/supervisor.conf
├─1875 /usr/local/matrixdb/bin/mxui
├─1876 /usr/local/matrixdb/bin/cylinder
├─2349 /usr/local/matrixdb-4.8.1.enterprise/bin/postgres -D /mxdata_20230321075750/master/mxseg-1 -p 5432 -c gp_role=disp...
├─2350 postgres: 5432, master logger process
├─2352 postgres: 5432, checkpointer
├─2353 postgres: 5432, background writer
├─2354 postgres: 5432, walwriter
├─2355 postgres: 5432, stats collector
├─2356 postgres: 5432, dtx recovery process con1
├─2357 postgres: 5432, ftsprobe process
├─2360 postgres: 5432, monitor
├─2361 postgres: 5432, matrixgate warden
├─2363 postgres: 5432, logical replication launcher
├─2364 postgres: 5432, ic proxy process
├─2365 postgres: 5432, sweeper process
├─2366 postgres: 5432, global deadlock detector process
├─2397 postgres: 5432, walsender mxadmin 10.0.92.234(34154) streaming 0/C3BD940
├─2431 /usr/local/matrixdb/bin/mxctl telegraf exec --path /usr/local/matrixdb --gpname ip-10-0-128-97.cn-northwest-1.comp...
├─2436 /usr/local/matrixdb/bin/telegraf --config /tmp/mxui_collector_5432.conf
├─2475 postgres: 5432, mxstat reaper con29 cmd17
├─3392 postgres: 5432, mxadmin matrixmgr [local] con29 seg-1 idle
├─4594 postgres: 5432, mxadmin postgres 10.0.128.97(44034) con251 cmd2 idle
└─4598 /usr/lib64/sa/sadc -S DISK 4 2 /tmp/sysstat-141050081
Mar 21 07:45:07 ip-10-0-128-97.cn-northwest-1.compute.internal bash[1866]: time="2023-03-21T07:45:07Z" level=info msg="loaded pro...i]"
Mar 21 07:55:56 ip-10-0-128-97.cn-northwest-1.compute.internal useradd[1989]: new group: name=mxyNKVPS, GID=1002
Mar 21 07:55:56 ip-10-0-128-97.cn-northwest-1.compute.internal useradd[1989]: new user: name=mxyNKVPS, UID=1002, GID=1002, home=/...ash
Mar 21 07:55:56 ip-10-0-128-97.cn-northwest-1.compute.internal userdel[1996]: delete user 'mxyNKVPS'
Mar 21 07:55:56 ip-10-0-128-97.cn-northwest-1.compute.internal userdel[1996]: removed group 'mxyNKVPS' owned by 'mxyNKVPS'
Mar 21 07:55:56 ip-10-0-128-97.cn-northwest-1.compute.internal userdel[1996]: removed shadow group 'mxyNKVPS' owned by 'mxyNKVPS'
Mar 21 07:58:14 ip-10-0-128-97.cn-northwest-1.compute.internal useradd[2094]: new group: name=mxadmin, GID=1002
Mar 21 07:58:14 ip-10-0-128-97.cn-northwest-1.compute.internal useradd[2094]: new user: name=mxadmin, UID=1002, GID=1002, home=/h...ash
Mar 21 07:58:14 ip-10-0-128-97.cn-northwest-1.compute.internal su[2127]: (to mxadmin) root on none
Mar 21 07:58:14 ip-10-0-128-97.cn-northwest-1.compute.internal su[2141]: (to mxadmin) root on none
Hint: Some lines were ellipsized, use -l to show in full.
Проверьте состояние службы supervisor для кластера YMatrix 6.
$ systemctl status matrixdb6.supervisor.service
● matrixdb6.supervisor.service - MatrixDB 6 Supervisord Daemon
Loaded: loaded (/usr/lib/systemd/system/matrixdb6.supervisor.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Tue 2023-03-21 08:12:23 UTC; 1s ago
Process: 5229 ExecStart=/bin/bash -c PATH="$MXHOME/bin:$PATH" exec "$MXHOME"/bin/supervisord -c "$MX_SUPERVISOR_CONF" (code=exited, status=2)
Main PID: 5229 (code=exited, status=2)
Mar 21 08:12:23 ip-10-0-128-97.cn-northwest-1.compute.internal systemd[1]: matrixdb6.supervisor.service: main process exited, cod...ENT
Mar 21 08:12:23 ip-10-0-128-97.cn-northwest-1.compute.internal systemd[1]: Unit matrixdb6.supervisor.service entered failed state.
Mar 21 08:12:23 ip-10-0-128-97.cn-northwest-1.compute.internal systemd[1]: matrixdb6.supervisor.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
Примечание!
На данном этапе служба не должна запускаться из-за конфликта портов по умолчанию.
Измените файл конфигурации портов для службы supervisor и графического интерфейса (MXUI) кластера YMatrix 6 (/etc/default/matrixdb6), чтобы избежать конфликтов с кластером YMatrix 5. (Предполагается, что порты 4618, 8241 и 4628 не заняты другими процессами.)
$ cat /etc/default/matrixdb6
MXHOME=/opt/ymatrix/matrixdb6
MXLOGDIR=/var/log/matrixdb6
MXCONFDIR=/etc/matrixdb6
MX_SUPERVISOR_PID_FILE=/var/run/matrixdb6.supervisord.pid
MX_SUPERVISOR_CONF=/etc/matrixdb6/supervisor.conf
MX_SUPERVISOR_INET_GRPC_SERVER_PORT=4617
MX_UI_PORT=8240
MX_DEPLOYER_PORT=4627
export MXHOME
export MXLOGDIR
export MXCONFDIR
export MX_SUPERVISOR_INET_GRPC_SERVER_PORT
Измените порт supervisor MX_SUPERVISOR_INET_GRPC_SERVER_PORT с 4617 на 4618.
Измените порт GUI-службы MX_UI_PORT с 8240 на 8241.
Измените порт deployer MX_DEPLOYER_PORT с 4627 на 4628.
$ sudo sed -i s/4617/4618/g /etc/default/matrixdb6
$ sudo sed -i s/8240/8241/g /etc/default/matrixdb6
$ sudo sed -i s/4627/4628/g /etc/default/matrixdb6
$ cat /etc/default/matrixdb6
MXHOME=/opt/ymatrix/matrixdb6
MXLOGDIR=/var/log/matrixdb6
MXCONFDIR=/etc/matrixdb6
MX_SUPERVISOR_PID_FILE=/var/run/matrixdb6.supervisord.pid
MX_SUPERVISOR_CONF=/etc/matrixdb6/supervisor.conf
MX_SUPERVISOR_INET_GRPC_SERVER_PORT=4618
MX_UI_PORT=8241
MX_DEPLOYER_PORT=4628
export MXHOME
export MXLOGDIR
export MXCONFDIR
export MX_SUPERVISOR_INET_GRPC_SERVER_PORT
Обновите файл конфигурации портов по умолчанию (/etc/matrixdb6/defaults.conf), указав следующие значения, чтобы предотвратить конфликты с кластером YMatrix 5:
MasterPortBase = 5433
StandbyPortBase = 5433
PrimaryPortBase = 8000
MirrorPortBase = 9000
EtcdPortBase = 4689
CylinderPortBase = 4647
После завершения изменения портов перезапустите службу supervisor кластера YMatrix 6 и проверьте её статус.
$ sudo systemctl restart matrixdb6.supervisor.service
$ sudo systemctl status matrixdb6.supervisor.service
● matrixdb6.supervisor.service - MatrixDB 6 Supervisord Daemon
Loaded: loaded (/usr/lib/systemd/system/matrixdb6.supervisor.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-03-21 08:27:02 UTC; 19s ago
Process: 9483 ExecStop=/bin/bash -c exec "$MXHOME"/bin/supervisorctl shutdown (code=exited, status=0/SUCCESS)
Main PID: 9488 (supervisord)
CGroup: /system.slice/matrixdb6.supervisor.service
├─9488 /opt/ymatrix/matrixdb6/bin/supervisord -c /etc/matrixdb6/supervisor.conf
└─9496 /opt/ymatrix/matrixdb6/bin/mxui
Mar 21 08:27:02 ip-10-0-128-97.cn-northwest-1.compute.internal systemd[1]: Started MatrixDB 6 Supervisord Daemon.
Mar 21 08:27:02 ip-10-0-128-97.cn-northwest-1.compute.internal bash[9488]: time="2023-03-21T08:27:02Z" level=info msg="load confi...onf
Mar 21 08:27:02 ip-10-0-128-97.cn-northwest-1.compute.internal bash[9488]: time="2023-03-21T08:27:02Z" level=info msg="load confi...t "
Mar 21 08:27:02 ip-10-0-128-97.cn-northwest-1.compute.internal bash[9488]: time="2023-03-21T08:27:02Z" level=info msg="load confi...onf
Mar 21 08:27:02 ip-10-0-128-97.cn-northwest-1.compute.internal bash[9488]: time="2023-03-21T08:27:02Z" level=info msg="load confi...ile
Mar 21 08:27:02 ip-10-0-128-97.cn-northwest-1.compute.internal bash[9488]: time="2023-03-21T08:27:02Z" level=info msg="loaded pro...i]"
Hint: Some lines were ellipsized, use -l to show in full.
Убедитесь, что исходный экземпляр YMatrix 5 по-прежнему работает корректно.
$ sudo su - mxadmin
Last login: Tue Mar 21 08:28:34 UTC 2023
********** MatrixDB 5 Administrator **********
The MatrixDB 5 on 5432 is up for 00:30:56
Connect matrixdb5 with
psql postgres
********************************************
[mxadmin@ip-10-0-128-97 ~]$ psql postgres
psql (12)
Type "help" for help.
postgres=# select version();
version
---------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 12 (MatrixDB 5.3.6-enterprise) (Greenplum Database 7.0.0+dev.18290.g7184139e3e build commit:7184139e3ebba8b77239ec19db63c04
bd43951b6) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9), 64-bit compiled on Mar 21 2023 06:51:57
(1 row)
YMatrix 5 остаётся неизменным и продолжает работать на порту 5432.
Откройте браузер и перейдите по следующему URL-адресу, где <IP> — IP-адрес мастер-узла:
http://<IP>:8241/
Следуйте инструкциям из раздела 5 Развертывание базы данных, чтобы завершить инициализацию кластера через веб-интерфейс.
Примечание!
На странице подтверждения перед执行部署графический интерфейс автоматически назначит5433новым портом мастера. Каталог данных также будет задан отдельно от существующего кластера, что позволит оригинальному кластеру YMatrix 5 и новому кластеру YMatrix 6 сосуществовать. После проверки параметров нажмите «Deploy» и дождитесь успешного завершения развёртывания.
Измените переменную ~/.bash_profile пользователя mxadmin, чтобы можно было переключаться между окружениями YMatrix 5 и 6. Удалите следующие строки из файла ~/.bash_profile, чтобы избежать конфликтов при одновременной загрузке обоих файлов окружения:
if [ -f ~/.matrixdb5.env ]; then
source ~/.matrixdb5.env
fi
if [ -f ~/.matrixdb6.env ]; then
source ~/.matrixdb6.env
fi
Примечание!
Данный шаг необходимо выполнить на мастер-узле и резервном мастер-узле.
Затем войдите под пользователем mxadmin, открыв новую сессию.
Чтобы получить доступ к базе данных YMatrix 6, выполните команду source ~/.matrixdb6.env от имени пользователя mxadmin.
Проверьте текущее состояние кластера YMatrix 6:
$ sudo su - mxadmin
Last login: Tue Mar 21 11:36:55 UTC 2023 on pts/0
$ source ~/.matrixdb6.env
********** MatrixDB 6 Administrator **********
The MatrixDB 6 on 5433 is up for 03:01:21
Connect matrixdb with
psql postgres
********************************************
$ psql -p 5433 postgres
psql (12)
Type "help" for help.
postgres=# select version();
v
ersion
---------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------
-----
PostgreSQL 12 (MatrixDB 6.3.0-beta.6+enterprise) (Greenplum Database 7.0.0+dev.20409.gf30a45b118 build commit:f30a45b118f626c84b580ffa
7a0226a673ccae70) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9), 64-bit compiled on Mar 21 2023 02:0
5:03
(1 row)
postgres=# select * from gp_segment_configuration order by content, dbid;
dbid | content | role | preferred_role | mode | status | port | hostname |
address | datadir
------+---------+------+----------------+------+--------+------+-------------------------------------------------+---------------------
----------------------------+----------------------------------------
1 | -1 | p | p | s | u | 5433 | ip-10-0-128-97.cn-northwest-1.compute.internal | ip-10-0-128-97.cn-no
rthwest-1.compute.internal | /mxdata_20230321083551/master/mxseg-1
10 | -1 | m | m | s | u | 5433 | ip-10-0-92-234.cn-northwest-1.compute.internal | ip-10-0-92-234.cn-no
rthwest-1.compute.internal | /mxdata_20230321083551/standby/mxseg-1
4 | 0 | p | p | s | u | 6002 | ip-10-0-101-114.cn-northwest-1.compute.internal | ip-10-0-101-114.cn-n
orthwest-1.compute.internal | /mxdata_20230321083551/primary/mxseg0
8 | 0 | m | m | s | u | 7003 | ip-10-0-137-193.cn-northwest-1.compute.internal | ip-10-0-137-193.cn-n
orthwest-1.compute.internal | /mxdata_20230321083551/mirror/mxseg0
5 | 1 | p | p | s | u | 6003 | ip-10-0-101-114.cn-northwest-1.compute.internal | ip-10-0-101-114.cn-n
orthwest-1.compute.internal | /mxdata_20230321083551/primary/mxseg1
9 | 1 | m | m | s | u | 7002 | ip-10-0-137-193.cn-northwest-1.compute.internal | ip-10-0-137-193.cn-n
orthwest-1.compute.internal | /mxdata_20230321083551/mirror/mxseg1
2 | 2 | p | p | s | u | 6002 | ip-10-0-137-193.cn-northwest-1.compute.internal | ip-10-0-137-193.cn-n
orthwest-1.compute.internal | /mxdata_20230321083551/primary/mxseg2
6 | 2 | m | m | s | u | 7002 | ip-10-0-101-114.cn-northwest-1.compute.internal | ip-10-0-101-114.cn-n
orthwest-1.compute.internal | /mxdata_20230321083551/mirror/mxseg2
3 | 3 | p | p | s | u | 6003 | ip-10-0-137-193.cn-northwest-1.compute.internal | ip-10-0-137-193.cn-n
orthwest-1.compute.internal | /mxdata_20230321083551/primary/mxseg3
7 | 3 | m | m | s | u | 7003 | ip-10-0-101-114.cn-northwest-1.compute.internal | ip-10-0-101-114.cn-n
orthwest-1.compute.internal | /mxdata_20230321083551/mirror/mxseg3
(10 rows)
postgres=# select distinct(hostname) from gp_segment_configuration;
hostname
-------------------------------------------------
ip-10-0-101-114.cn-northwest-1.compute.internal
ip-10-0-92-234.cn-northwest-1.compute.internal
ip-10-0-137-193.cn-northwest-1.compute.internal
ip-10-0-128-97.cn-northwest-1.compute.internal
(4 rows)
Чтобы получить доступ к базе данных YMatrix 5, выполните команду source ~/.matrixdb5.env от имени пользователя mxadmin.
[ec2-user@ip-10-0-128-97 ~]$ sudo su - mxadmin
Last login: Tue Mar 21 11:37:38 UTC 2023 on pts/0
[mxadmin@ip-10-0-128-97 ~]$ source ~/.matrixdb5.env
********** MatrixDB 5 Administrator **********
The MatrixDB 5 on 5432 is up for 03:59:57
Connect matrixdb5 with
psql postgres
********************************************
[mxadmin@ip-10-0-128-97 ~]$ psql postgres
psql (12)
Type "help" for help.
postgres=# select version();
versi
on
---------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 12 (MatrixDB 5.3.6-enterprise) (Greenplum Database 7.0.0+dev.18290.g7184139e3e build commit:7184139e3ebba8b77239ec19db63c04
bd43951b6) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9), 64-bit compiled on Mar 21 2023 06:51:57
(1 row)
На этом этапе кластер YMatrix 6 успешно развернут на той же группе хостов, которая ранее использовалась для YMatrix 5.
См. следующие документы:
Этот подход требует сначала развернуть новый кластер, а затем использовать mxshift для миграции данных.
Подробные шаги по развёртыванию см. в:
Подробные шаги по миграции см. в: