Глава 3. Работа с хранилищем объектов Ceph

В данной главе мы охватим:

  • Понимание хранения объектов Ceph

  • Стандартные наладку, установку и настройку шлюза RADOS

  • Создание пользователя radosgw

  • Доступ к хранилищу объектов Ceph с применением S3 API

  • Доступ к хранилищу объектов Ceph с применением Swift API

  • Интеграцию шлюза RADOS с OpenStack Keystone

  • Настройку федеративных шлюзов Ceph

  • Тестирование федеративных настроек radosgw

  • Построение служб файловой синхронизации и совместного использования с применением RGW

 Введение

Основанные на объектах хранилища получают всё больше внимания к себе, так как организации ищут гибкости для своих огромных данных. Системы хранения объектов являются подходом к сохранению данных в форме объектов как для обычных файлов и блоков, так и для и всех хранящих объекты данных, метаданных и уникальных идентификаторов. В данной главе мы получим представление о хранилище объектов как части Ceph и получим практические знания по настройке шлюза Ceph RADOS.

 Понимание хранения объектов Ceph

Хранилище объектов не может быть доступно напрямую из операционной системы в качестве дисковой файловой системы. Наоборот, оно может быть доступно только через API на прикладном уровне. Ceph является распределённой системой системой хранения объектов, которая предоставляет интерфейс хранения объектов через шлюз объектов Ceph, также называемый интерфейсом RADOS Gateway (RGW, шлюза Безотказного автономного распределенного хранилища объектов), который строится поверх уровня Ceph RADOS. RGW использует librgw (RADOS Gateway Library) и librados, позволяя приложениям устанавливать соединение с хранилищем объектов Ceph. RGW снабжает приложения API- интерфейсом совместимым с RESTful S3/ Swift для хранения данных в форме приложений в вашем кластере Ceph. Ceph также поддерживает доступное через RESTful API хранение объектов со множеством владельцев (multitenant). В дополнение к этому RGW также предоставляет API администрирования Ceph, который может применяться для управления кластером хранения Ceph с использованием внутренних API вызовов.

Библиотека программного обеспечения librados является очень гибкой и позволяет пользовательским приложениям осуществлять прямой доступ к кластеру хранения Ceph из связываний (binding) C, C++, Java, Python и PHP. Хранилище объектов Ceph также имеет возможности множества площадок, то есть предоставляет решения для восстановления после сбоев.

Следующий рисунок представляет хранение объектов Ceph:

 

Рисунок 3.1. Хранение объектов Ceph



 Стандартные наладка, установка и настройка шлюза RADOS

Для промышленных окружений рекомендуется чтобы вы настраивали свои RGW на физических, выделенных машинах. Однако, если рабочая нагрузка хранилища объектов не очень велика, вы можете рассмотреть возможность использования всех машин монитора в качестве узла RGW. RGW является отдельной службой, которая внутренне связана с кластером Ceph и предоставляет своим клиентам доступ к хранимым объектам. В промышленных средах рекомендуется чтобы вы выполняли более одного экземпляра своих RGW, маскируемых балансировщиком нагрузки, как показано на следующей схеме:

 

Рисунок 3.2. Балансировка нагрузки



Начиная с выпуска Ceph Firefly был введён новый интерфейс RGW: Civetweb, который является автономным лёгким веб сервером. Civetweb был непосредственно встроен в службу ceph-radosgw, делая развёртывание хранилища объектов Ceph более быстрым и простым.

В следующих рецептах мы продемонстрируем настройки RGW, применяющие Civetweb на виртуальной машине, которая взаимодействует с тем же кластером Ceph, который мы создали в Главе 1. Введение и за его пределами.

  Сборка узла шлюза RADOS

Для выполнения службы хранения объектов нам необходим работающий кластер Ceph и узел RGW должен иметь доступ к сетевой среде Ceph.

  Как это сделать...

Как это уже демонстрировалось в предыдущих главах, мы будем загружать виртуальную машину применяя Vagrant и настраивать её для нашего узла RGW.

  1. Запустите rgw-node1 с помощью Vagrantfile, как мы это делали для узлов Ceph в Главе 1. Введение и за его пределами. Убедитесь что вы находитесь на машине хоста под репозиторием ceph-cookbook перед приведением в действие rgw-node1 с помощью Vagrant:

    
    # cd ceph-cookbook
    # vagrant up rgw-node1
    
    	teeri:ceph-cookbook ksinghS vagrant up rgw-node1 
    	Bringing machine 'rgw-node1' up with 'virtualbox' provider... 
    	rgw-node1: Importing base box 'centos7-standard'.... 
    	==> rgw-node1: matching MAC address for NAT networking... 
    	==> rgw-node1: Setting the name of the vm: rgw-node1 
    	==> rgw-node1: Fixed port collision for 22 ==> 2222. NOW on port 2202. 
    	==> rgw-node1: Clearing any previously set network interfaces... 
    	==> rgw-node1: Preparing network interfaces based on configuration... 
    	       rgw-node1: Adapter 1: nat 
    		   rgw-node1: Adapter 2: hostonly 
    	==> rgw-node1: Forwarding ports... 
    	       rgw-node1: 22 => 2202 (adapter 1) 
    	==> rgw-node1: Running 'pre-boot' VM customizations... 
    	==> rgw-node1: Booting vm... 
     	   
  2. Когда rgw-node1 поднимется, проверьте состояние Vagrant и зарегистрируйтесь на этом узле:

    
    $ vagrant status rgw-node1
    $ vagrant ssh rgw-node1
    
    	teeri:ceph-cookbook ksinghS vagrant status rgw-node1 
    	Current machine states: 
    	
    	rgw-node1                 running (virtualbox) 
    	
    	The vm is running. To stop this vm, you can run `vagrant halt` to 
    	shut it down forcefully, or you can run 'vagrant suspend' to simply 
    	suspend the virtual machine. In either case, to restart it again, 
    	simply run `vagrant up`. 
    	teeri:ceph-cookbook ksinghS vagrant ssh rgw-node1 
    	Last login: Sun Apr 5 19:31:52 2015 
    	[vagrant@rgw-node1 ~]$ 
     	   
  3. Проверьте что rgw-node1 может взаимодействовать с кластером Ceph:

    
    # ping ceph-node1 -c 3
    # ping ceph-node2 -c 3
    # ping ceph-node3 -c 3
     	   
  4. Удостоверьтесь в правильности записей локально файла host, имени хоста и FQDN для rgw-node1:

    
    # cat /etc/hosts | grep -i rgw
    # hostname
    # hostname -f
    
    	[root@rgw-node1 ~]# cat /etc/hosts | grep rgw 
    	127.0.0.1 rgw-node1.cephcookbook.com rgw-node1 localhost localhost.localdomain localhost4 localhost4.localdomain4 
    	192.168.1.106 rgw-node1.cephcookbook.com rgw-node1 
    	[root@rgw-node1 ~]# 
    	[root@rgw-node1 ~]# hostname rgw-node1.cephcookbook.com 
    	[root@rgw-node1 ~]# 
    	[root@rgw-node1 ~]# hostname -f rgw-node1.cephcookbook.com 
    	[root@rgw-node1 ~]# 
     	   

  Установка шлюза RADOS

Предыдущий рецепт был посвящён сборке виртуальной машины для RGW. В этом рецепте мы изучим как собрать на этом узле вашу службу ceph-radosgw.

  Как это сделать...

Как это уже демонстрировалось в предыдущих главах, мы будем загружать виртуальную машину применяя Vagrant и настраивать её для нашего узла RGW.

  1. Вначале нам нужно установить пакеты Ceph на rgw-node1. Для этого мы воспользуемся инструментарием ceph-deploy с ceph-node1, который является нашим узлом монитора Ceph. Зарегистрируйтесь на ceph-node1 и выполните следующие команды:

    1. Проверьте что для ceph-node1 доступен в сетевой среде rgw-node1 применив следующую команду:

      
      # ping rgw-node1 -c 1
       	   
    2. Позвольте ceph-node1 регистрацию SSH без пароля и проверьте соединение.

      [Замечание]Замечание

      Пароль для rgw-node1 тот же, что и ранее, то есть vagrant.

      
      # ssh-copy-id rgw-node1
      # ssh rgw-node1 hostname
       	     

      
      	[root@ceph-node1 ceph]# ping rgw-node1 -c 1 
      	PING rgw-node1.cephcookbook.com (192.168.1.106) 56(84) bytes of data. 
      	64 bytes from rgw-node1.cephcookbook.com (192.168.1.106): icmp_seq.1 tt1.64 time.0.745 ms 
      	
      	--- rgw nodel.cephcookbook.com ping statistics ---
      	1 packets transmitted, 1 received, 0% packet loss, time Oms 
      	rtt min/avg/max/mdev = 0.745/0.745/0.745/0.000 ms 
      	[root@ceph-node1 ceph]# 
      	[root@ceph-node1 ceph]# ssh-copy-id rgw-node1 the authenticity of host 'rgw-node1 (192.168.1.106)' can't be established. 
      	ECDSA key fingerprint is af:2a:a5:74:a7:0b:f5:5b:ef:c5:4b:2a:fe:ld:30:8e. 
      	Are you sure you want to continue connecting (yes/no)? yes 
      	/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed 
      	/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@rgw-node1's password: 
      	
      	Number of key(s) added: 1 
      	Now try logging into the machine, with: "ssh 'rgw-node1'" 
      	and check to make sure that only the key(s) you wanted were added. 
      	
      	[root@ceph-node1 ceph]# ssh rgw-node1 hostname rgw-node1.cephcookbook.com 
      	[root@ceph-node1 ceph]# 
       	   
    3. Применяя ceph-node1 установите пакеты Ceph и скопируйте файл ceph.conf на rgw-node1:

      
      # cd /etc/ceph
      # ceph-deploy install rgw-node1
      # ceph-deploy config push rgw-node1
       	   
  2. Наконец, зарегистрируйтесь на rgw-node1 и установите пакет ceph-radosgw:

    
    # yum install ceph-radosgw
     	   

  Настройка шлюза RADOS

Так как для RGW мы используем встроенный веб- сервер Civetweb, большинство вещей уже установлено службой ceph-radosgw. В этом рецепте мы создадим ключи аутентификации для пользователя Ceph RGW и обновим файл ceph.conf.

  Как это сделать...

Как это уже демонстрировалось в предыдущих главах, мы будем загружать виртуальную машину применяя Vagrant и настраивать её для нашего узла RGW.

  1. Чтобы создать пользователя RGW и кольцо ключей выполните следующие команды с ceph-node1:

    1. Создайте кольцо ключей при помощи следующей команды:

      
      # cd /etc/ceph
      # ceph-authtool --create-keyring \
      /etc/ceph/ceph.client.radosgw.keyring
      # chmod +r /etc/ceph/ceph.client.radosgw.keyring
       	   
    2. Сгенерируйте пользователя шлюза и ключ для экземпляра RGW; имя нашего экземпляра RGW gateway:

      
      # ceph-authtool /etc/ceph/ceph.client.radosgw.keyring \
      -n client.radosgw.gateway --gen-key
       	   
    3. Добавьте ключу возможности:

      
      # ceph-authtool -n client.radosgw.gateway --cap osd 'allowrwx' \
      --cap mon 'allow rwx' /etc/ceph/ceph.client.radosgw.keyring
       	   
    4. Добавьте ключ в свой кластер Ceph:

      
      # ceph auth add client.radosgw.gateway \
      -i /etc/ceph/ceph.client.radosgw.keyring
       	   
    5. Распространите ключ на свой узел Ceph RGW:

      
      # scp /etc/ceph/ceph.client.radosgw.keyring \
      rgw-node1:/etc/ceph/ceph.client.radosgw.keyring
      
      	[root@ceph-node1 ceph]# ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.keyring 
      	creating /etc/ceph/ceph.client.radosgw.keyring 
      	[root@ceph-node1 ceph]# [root@ceph-node1 ceph]# chmod +r /etc/ceph/ceph.client.radosgw.keyring 
      	[root@ceph-node1 ceph]# ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client. radosgw.gateway --gen-key 
      	[root@ceph-node1 ceph]# ceph-authtool -n client.radosgw.gateway --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph ceph.client.radosgw.keyring 
      	[root@ceph-node1 ceph]# ceph auth add client. radosgw.gateway /etc/ceph/ceph.client.radosgw.keyring 
      	added key for client.radosgw.gateway 
      	[root@ceph-node1 ceph]# 
      	[root@ceph-node1 ceph]# scp /etc/ceph/ceph.client.radosgw.keyring rgw-node1:/etc/ceph/ceph.client.radosgw.keyring ceph.client.radosgw.keyring 
      	100% 121 0.1KB/s 00:00 
      	[root@ceph-node1 ceph]# 
       	   
  2. Добавьте раздел client.radosgw.gateway в ceph.conf на rgw-node1. Убедитесь что имя хоста то же что и в выводе команды # hostname -s:

    
    [client.radosgw.gateway]
    host = rgw-node1
    keyring = /etc/ceph/ceph.client.radosgw.keyring
    rgw socket path = /var/run/ceph/ceph.radosgw.gateway.fastcgi.sock
    log file = /var/log/ceph/client.radosgw.gateway.log
    rgw dns name = rgw-node1.cephcookbook.com
    rgw print continue = false
    
    	[root@rgw-node1 ceph]# tail -7 ceph.conf 
    	[client.radosgw.gateway] 
    	host = rgw-node1 
    	keyring = /etc/ceph/ceph.client.radosgw.keyring 
    	rgw socket path = /var/run/ceph/ceph.radosgw.gateway.fastcgi.sock 
    	log file = /var/log/ceph/client.radosgw.gateway.log 
    	rgw dns name = rgw-node1.cephcookbook.com 
    	rgw print continue = false 
    	[root@rgw-node1 ceph]# 
     	   
  3. По умолчанию сценарий запуска ceph-radosgw выполняется от пользователь по умолчанию, apache. Измените пользователя по умолчанию с apache на root:

    
    # sed -i s"/DEFAULT_USER.*=.*'apache'/DEFAULT_USER='root'"/g /etc/rc.d/init.d/ceph-radosgw
     	   
    [Замечание]Замечание

    В промышленных средах не выполняйте ceph-radosgw от имени пользователя 'root', вместо этого применяйте 'apache' или другого пользователя не- root.

  4. Запустите службу Ceph radosgw и проверьте её состояние:

    
    # service ceph-radosgw start
    # service ceph-radosgw status
     	   
  5. Веб-сервер Civetweb который встроен в ваш демон ceph-radosgw теперь должен работать по порту по умолчанию, 7489:

    
    # netstat -nlp | grep -i 7480
    
    	[root@rgw-node1 ceph]# netstat -nlp | grep -i 7480 
    	tcp        0      0 0.0.0.0:7480            0.0.0.0:*                 LISTEN      3635/radosgw 
    	[root@rgw-node1 ceph]# 
     	   

 Создание пользователя radosgw

Для применения хранилища объектов Ceph нам необходимо создать начального пользователя шлюза объектов Ceph для интерфейса S3 и затем создать подпользователя для интерфейса Swift.

  Как это сделать...

  1. Проверьте что rgw-node1 способен осуществлять доступ к кластеру Ceph:

    
    # ceph -s -k /etc/ceph/ceph.client.radosgw.keyring --name client.radosgw.gateway
     	   
  2. Создайте пользователя шлюза RADOS для S3 доступа:

    
    # radosgw-admin user create --uid=mona --display-name="MonikaSingh" --email=mona@cephcookbook.com -k /etc/ceph/ceph.client.radosgw.keyring --name client.radosgw.gateway
    
    	[root@rgw-node1 ceph]# radosgw-admin user create --uid=mona --display-name="MonikaSingh" --email=mona@cephcookbook.com -k /etc/ceph/ceph.client.radosgw.keyring --name client.radosgw.gateway 
    	{ "user_id": "mona", 
    	  "display_name": "Monika Singh", 
    	  "email": "mona@cephcookbook.com", 
    	  "suspended": 0, 
    	  "max_buckets": 1000, 
    	  "auid": 0, 
    	  "subusers": [], 
    	  "keys": [ 
    	        { "user": "mona", 
    	    	  "access_key": "C162E2F8w98A0M3KK99", 
    	    	  "secret_key": "J21mow6EPs6Sz4xtT7h+piDmhQBv1gWqVeicSRMg"}], 
    	  "swift_keys": [), 
    	  "caps": [], 
    	  "op_mask": "read, write, delete", 
    	  "default_placement": "",
    	  "placement_tags": [], 
    	  "bucket_quota": { "enabled": false, 
    	      "max_size_kb": -1, 
    	      "max_objects": -1}, 
    	  "user_quota": { "enabled": false, 
    	      "max_size_kb": -1, 
    	      "max_objects": -1}, 
    	  "temp_url_keys": []}
    	[root@rgw-node1 ceph]# 
     	   
  3. Ваши ключи значений (access_key) и ключи (secret_key) понадобятся позже в данной главе для проверки подлинности доступа.

  4. Чтобы применять хранилище объектов Ceph в API Swift нам необходимо создать подпользователя Swift в Ceph RGW:

    
    # radosgw-admin subuser create --uid=mona --subuser=mona:swift --access=full -k /etc/ceph/ceph.client.radosgw.keyring --name client.radosgw.gateway
    
    	[root@rgw-node1 ceph]# radosgw-admin subuser create --uid=mona --subuser=mona:swift --access=full -k /etc/ceph/ceph.client.radosgw.keyring --name client.radosgw.gateway 
    	{ "user_id": "mona", 
    	  "display_name": "Monika Singh", 
    	  "email": "mona@cephcookbook.com", 
    	  "suspended": 0, 
    	  "max_buckets": 1000, 
    	  "auid": 0, 
    	  "subusers": [ 
    	        { "id": "mona:swift", 
    	          "permissions": "full-control"}], 
    	  "keys": [ 
    	        { "user": "mona:swift", 
    	          "access_key": "580V73F5AXX3CGNEZ9HV", 
    	          "secret_key": ""}, 
    	        { "user": "mona", 
    	          "access_key": "C162E2F8WZ98A0M3KK99", 
    	          "secret_key": "J21mow6EPs6Sz4xtT7h+piDmhQBvlgWqVeicSRMg"}], 
    	  "swift_keys": [], 
    	  "caps": [], 
    	  "op_mask": "read, write, delete", 
    	  "default_placement": "", 
    	  "placement_tags": [], 
    	  "bucket_quota": { "enabled": false, 
    	       "max_size_kb": -1, 
    	       "max_objects": -1}, 
    	  "user_quota": { "enabled": false, 
    	       "max_size_kb": -1, 
    	       "max_objects": -1}, 
    	  "temp_url_keys": [] } 
    	[root@rgw-node1 ceph]# 
     	   
  5. Создайте ключ безопасности для подпользователя mona:swift; они будут применяться позже в этой главе:

    
    # radosgw-admin key create --subuser=mona:swift --key-type=swift --gen-secret -k /etc/ceph/ceph.client.radosgw.keyring --name client.radosgw.gateway
    
    	[root@rgw-node1 ceph]# radosgw-admin key create --subuser=mona:swift --key-type=swift --gen-secret -k /etc/ceph/ceph.client.radosgw.keyring --name client.radosgw.gateway 
    	{ "user_id": "mona", 
    	  "display_name": "monika Singh", 
    	  "email": "mona@cephcookbook.com", 
    	  "suspended": 0, 
    	  "max_buckets": 1000, 
    	  "auid": 0, 
    	  "subusers": [ 
    	        { "id": "mona:swift", 
    	          "permissions": "full-control"}], 
    	  "keys": [ 
    	        { "user": "mona:swift", 
    	          "access_key": "580V73FSAXX3CGNEz9Hv", 
    	          "secret_key": ""}, 
    	        { "user": "mona", 
    	          "access_key": "C162E2F8WZ98A0M3KK99", 
    	          "secret_key": "J21mow6EPs6Sz4xtT7h+piDmhQBvlgWqVeic5RMg"}], 
    	  "swift_keys": [ 
    	        { "user": "mona:swift", 
    	          "secret_key": "6vxGDhuEBsPSyXlE7VYVFrTXLVqoJByMHT+jnXPV"}], 
    	  "caps": [], 
    	  "op_mask": "read, write, delete", 
    	  "default_placement": "", 
    	  "placement_tags": [], 
    	  "bucket_quota": { "enabled": false, 
    	      "max_size_kb": -1, 
    		  "max_objects": -1}, 
    	  "user_quota": { "enabled": false, 
    	      "max_size_kb": -1, 
    		  "max_objects": -1}, 
    	  "temp_url_keys": []}
    	[root@rgw-node1 ceph]# 
     	   

  Смотрите также...

Рецепт Доступ к хранилищу объектов Ceph с применением Swift API.

 Доступ к хранилищу объектов Ceph с применением S3 API

Веб службы Amazon предлагают Simple Storage Service (S3), который предоставляет хранение через веб- интерфейс такой как REST. Ceph расширяет свою совместимость с S3 посредством RESTful API. Приложения клиента S3 могут получать доступ к хранилищу объектов Ceph на основе ключей безопасности.

Для S3 также требуется присутствие службы DNS если она применяет соглашения именования ваших сегментов виртуальных хостов, т.е. <object_name>.<RGW_Fqdn>. Например, если у вас имеется сегмент с именем jupiter, то доступ к нему будет возможен поверх HTTP через URL http://jupiter.rgw-node1.cephcookbook.com.

  Как это сделать...

Для настройки DNS выполните следующие шаги на узле rgw-node1. Если у вас имеется работающий сервер DNS вы можете пропустить настройку DNS и использовать свой сервер DNS.

  Настройка DNS

  1. Установите пакеты bind на вашем узле ceph-rgw:

    
    # yum install bind* -y
     	   
  2. Исправьте /etc/named.conf и добавьте информацию для IP адресов, IP диапазонов и зон, которые упоминаются далее. Вы можете следовать изменениям авторской версии файла named.conf предоставляемого данной книгой:

    
    listen-on port 53 { 127.0.0.1;192.168.1.106; }; ### Add DNS IP ###
    allow-query { localhost;192.168.1.0/24; }; ### Add IP Range ###
    
    	options { 
    	        listen-on port 53 { 127.0.0.1;192.168.1.106; }; ### Add DNS IP ### 
    	        listen-on-v6 port 53 { ::1; }; 
    	        directory       "/var/named"; 
    	        dump-file       "/var/named/data/cache_dump.db"; 
    	        statistics-file "/var/named/data/named_stats.txt"; 
    	        memstatistics-file "/var/named/data/named_mem_stats.txt"; 
    	        allow-query     { localhost;192.168.1.0/24; }; ### Add IP Range ### 
    	        }
    
    ### Add new zone for domain cephcookbook.com before EOF ###
    zone "cephcookbook.com" IN {
    type master;
    file "db.cephcookbook.com";
    allow-update { none; };
    };
    
    	### Add new zone for domain cephcookbook.com before EOF ### 
    	zone "cephcookbook.com" IN { 
    	type master; 
    	file "db.cephcookbook.com"; 
    	allow-update { none; }; 
    	include "/etc/named.rfc1912.zones"; 
    	include "/etc/named.root.key";
     	   
  3. Создайте файл зоны, /var/named/db.cephcookbook.com со следующим содержимым. Вы можете следовать изменениям авторской версии файла db.objectstore.com предоставленного в том же файле каталога с именем named.conf.rtf в котором содержится пакет кодов данной главы:

    
    @ 86400 IN SOA cephcookbook.com. root.cephcookbook.com. (
            20091028 ; serial yyyy-mm-dd
            10800 ; refresh every 15 min
            3600 ; retry every hour
            3600000 ; expire after 1 month +
            86400 ); min ttl of 1 day
    @ 86400 IN NS cephbookbook.com.
    @ 86400 IN A 192.168.1.106
    * 86400 IN CNAME @
    
    	[root@rgw-node1 ~]# cat /etc/db.cephcookbook.com 
    	@ 86400 IN SOA cephcookbook.com. root.cephcookbook.com. (
    	        20091028 ; serial yyyy-mm-dd 
    	    	10800 ; refresh every 15 min 
    	    	3600 ; retry every hour 
    	    	3600000 ; expire after 1 month + 
    	    	86400 ); min ttl of 1 day 
    	@ 86400 IN NS cephbookbook.com. 
    	@ 86400 IN A 192.168.1.106 
    	* 86400 IN CNAME @ 
    	[root@rgw-node1 ~]# 
     	   
  4. Измените /etc/resolve.conf и добавьте следующее содержание:

    
    search cephcookbook.com
    nameserver 192.168.1.106
     	   
  5. Запустите службу named:

    
    # service named start
     	   
  6. Проверьте ваши файлы настройки DNS на наличие синтаксических ошибок:

    
    # named-checkconf /etc/named.conf
    # named-checkzone cephcookbook.com /var/named/db.cephcookbook.com
    
    	[root@rgw-node1 ~]# service named start 
    	Redirecting to /bin/systemctl start named.service 
    	[root@rgw-node1 ~]# 
    	[root@rgw-node1 ~]# named-checkconf /etc/named.conf 
    	[root@rgw-node1 ~]# named-checkzone cephcookbook.com /var/named/db.cephcookbook.com zone cephcookbook.com/IN: loaded serial 20091028 
    	OK 
    	[root@rgw-node1 ~]# 
     	   
  7. Проверьте ваш сервер DNS:

    
    # dig rgw-node1.cephcookbook.com
    # nslookup rgw-node1.cephcookbook.com
     	   

  Настройка вашего клиента s3cmd

Для доступа к хранилищу объектов Ceph через API S3 вам необходимо настроить клиентскую машину при помощи s3cmd а также установки вашего клиента DNS. Выполните следующие шаги для настройки клиентской машины s3cmd:

  1. Поднимите вашу виртуальную машину client-node1 воспользовавшись Vagrant. Эта виртуальная машина будет использоваться в качестве машины клиента для хранилища объектов S3:

    
    $ vagrant up client-node1
     	   
  2. На вашей машине client-node1 обновите записями сервера DNS /etc/resolve.conf:

    
    search cephcookbook.com
    nameserver 192.168.1.106
     	   
  3. Проверьте настройки DNS на client-node1:

    
    # dig rgw-node1.cephcookbook.com
    # nslookup rgw-node1.cephcookbook.com
     	   
  4. client-node1 должен быть способен разрешать поддомены для rgw-node1.cephcookbook.com:

    
    # ping mj.rgw-node1.cephcookbook.com -c 1
    # ping anything.rgw-node1.cephcookbook.com -c 1
    
    	root@client-node1:~# ping mj.rgw-nodel.cephcookbook.com -c 1 
    	PING cephcookbook.com (192.168.1.106) 56(84) bytes of data. 
    	64 bytes from 192.168.1.106: icmp_seq=1 tt1=64 time=0.475 ms 
    	
    	--- cephcookbook.com ping statistics --- 
    	1 packets transmitted, 1 received, 0% packet loss, time Oms 
    	rtt min/avg/max/mdev = 0.475/0.475/0.475/0.000 ms 
    	root@client-node1:~# 
    	root@client-node1:~# ping anything.rgN-nodeLcephcookbook.com -c 1 
    	PING cephcookbook.com (192.168.1.106) 56(84) bytes of data. 
    	64 bytes from 192.168.1.106: icmp_seq=1 tt1=64 time=0.413 ms 
    	
    	--- cephcookbook.com ping statistics ---
    	1 packets transmitted, 1 received, 0% packet loss, time Oms 
    	rtt min/avg/max/mdev = 0.413/0.413/0.413/0.000 ms 
    	root@client-node1:~# 
     	   
  5. Настройте клиента S3 (s3cmd) на client-node1:

    1. Установите s3cmd используя следующую команду:

      
      # apt-get install -y s3cmd
       	   
    2. Настройте s3cmd предоставив access_key и secret_key вашего пользователя mona, которого мы создали ранее в этой главе. Выполните следующую команду и следуйте за приглашениями:

      
      # s3cmd --configure
      
      	root@client-node1:Ё# s3cmd --configure 
      	
      	Enter new values or accept defaults in brackets with Enter. 
      	Refer to user manual for detailed description of all options. 
      	{Введите новые значения или примите значения по умолчанию в скобках нажав Ввод.
      	За дополнительными пояснениями всех параметров обращайтесь к пользовательской документации.}
      	
      	Access key and secret key are your identifiers for Amazon S3 
      	{Ключ доступа и ключ безопасности являются вашими идентификаторами для Amazon S3}
      	Access Key: С162E2F8wZ98A0M3KK99 
      	Secret Key: 321mow6EPs6Sz4xtT7h+rpiDmhQBvlgwqVeic5RMg 
      	
      	Encryption password is used to protect your files from reading 
      	by unauthorized persons while in transfer to S3	
      	{Пароль шифрования применяется для защиты ваших файлов от чтения
      	неавторизованым персоналом при передаче на S3}
      	Encryption password: 
      	Path to GPG program [/usr/bin/gpg]: 
      	
      	When using secure HTTPS protocol all communication with Amazon S3 
      	servers is protected from 3rd party eavesdropping. This method is slower 
      	than plain HTTP and can't be used if you're behind a proxy 
      	{При использовании безопасного протокола HTTPS всё взаимодействие с серверами 
      	Amazon S3 защищено от подслушивания 3ми сторонами. Этот метод медленнее
      	чем простой HTTP и не может применяться если вы используете proxy}
      	use HTTPS protocol [No]: 
      	
      	On some networks all internet access must go through a HTTP proxy. 
      	Try setting it here if you can't connect to S3 directly 
      	{В некоторых сетевых средах весь доступ в интернет должен проходить сквозь HTTP proxy.
      	Попробуйте настроить его здесь если вы не можете соединиться с S3 напрямую}
      	HTTP Proxy server name: 
      	
      	New settings: 
      	 Access Key: C162E2F8wZ98A0M3KK99 
      	 Secret Key: 321mow6EPs6Sz4xtT7h+rpiDmhQBvlgwqVeic5RMg 
      	 Encryption password: 
      	 Path to GPG program: /usr/bin/gpg 
      	 Use HTTPS protocol: False 
      	 HTTP Proxy server name: 
      	 HTTP Proxy server port: 0 
      	
      	Test access with supplied credentials? [Y/n] n 
      	
      	Save settings? [y/N] y 
      	configuration saved to '/root/.s3cfg' 
      	root@client-node1:~# 
       	   
    3. Команда ~# s3cmd --configure command создаст /root/.s3cfg. Измените этот файл для внесения подробностей вашего хоста RGW. Измените host_base и host_bucket, как показано далее. Убедитесь что эти строки не имеют пробельных символов в конце:

      
      host_base = rgw-node1.cephcookbook.com:7480
      host_bucket = %(bucket)s.rgw-node1.cephcookbook.com:7480
       	   

      Вы можете взять за основу авторскую версию файла /root/.s3cfg предоставленного в пакете кода данной главы.

      
      	root@client node1:~# cat /root/.s3cfg 
      	[default] access_key = C162E2F8WZ98A0M3KK99 
      	bucket_location = US 
      	cloudfront_host = cloudfront.amazonaws.com 
      	default_mime_type = binary/octet-stream 
      	delete_removed = False 
      	dry_run = False 
      	enable_multipart = True 
      	encoding = UTF-8 
      	encrypt = False 
      	follow_symlinks = False 
      	force = False 
      	get_continue = False 
      	gpg_command = /usr/bin/gpg 
      	gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s 
      	gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s 
      	gpg_passphrase = 
      	guess_mime_type = True 
      	host_base = rgw 
      	node1.cephcookbook.com:7480 
      	host_bucket = %(bucket)s.rgw 
      	node1.cephcookbook.com:7480 
      	human_readable_sizes = False 
      	invalidate_on_cf = False 
      	list_mdS = False 
      	log_target_prefix = 
      	mime_type = 
      	multipart_chunk_size_mb = 15 
      	preserve_attrs = True 
      	progress_meter = True 
      	proxy_host = 
      	proxy_port = 0 
      	recursive = False 
      	recv_chunk = 4096 
      	reduced_redundancy = False 
      	secret_key = 321mow6EPs6Sz4xtT7h+rpiDmhQBvlgwqVeic5RMg 
      	send_chunk = 4096 
      	simpledb_host = sdb.amazonaws.com 
      	skip_existing = False 
      	socket_timeout = 300 
      	urlencoding_mode = normal 
      	use_https = False 
      	verbosity = WARNING 
      	website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/ 
      	website_error = 
      	website_index = index.html 
       	   
  6. Наконец мы создаём пакеты (buckets) и помещаем объекты в них:

    
    # s3cmd mb s3://first-bucket
    # s3cmd ls
    # s3cmd put /etc/hosts s3://first-bucket
    # s3cmd ls s3://first-bucket
    
    	root@client-node1:~# s3cmd mb s3://first-bucket 
    	Bucket 's3://first-bucket/' created 
    	root@client-node1:~# 
    	root@client-node1:~# s3cmd ls 
    	2015-04-11 23:55  s3://first-bucket 
    	root@client-node1:~# 
    	root@client-node1:~# s3cmd put /etc/hosts s3://first-bucket 
    	WARNING: Module python-magic is not available. Guessing MIME types based on file extensions. 
    	/etc/hosts -> s3://first-bucket/hosts [1 of 1] 
    	601 of 601    100% in    ls   436.06 B/s  done 
    	root@client-node1:~# 
    	root@client-node1:~# 
    	root@client-node1:~# s3cmd ls s3://first-bucket 
    	2015-04-11 23:55       601   s3://first-bucket/hosts 
    	root@client-node1:~# 
     	   

 Доступ к хранилищу объектов Ceph с применением Swift API

Ceph поддерживает RESTful API который совместим с основной моделью доступа API Swift. В последнем разделе мы рассказывали о доступе к кластеру Ceph через API S3; в этом разделе мы изучим доступ через API Swift.

  Как это сделать...

Чтобы использовать хранилище объектов Ceph при промощи API Swift нам необходим подпользователь Swift и ключ безопасности который мы создали ранее в этой главе. Эта информация о пользователе будет затем передана с применением интструментария Swift CLI чтобы осуществить доступ к хранилищу объектов Ceph:

  1. На client-node1 виртуальная машина установит вашего клиента python Swift:

    
    # apt-get install python-setuptools
    # easy_install pip
    # pip install --upgrade setuptools
    # pip install --upgrade python-swiftclient
     	   
  2. Получите подпользователя Swift и ключи безопасности:

    
    # radosgw-admin user info --uid mona
     	   
  3. Получите доступ к хранилищу объектов Ceph просмотрев список сегмента (bucket) по умолчанию:

    
    # swift -A http://192.168.1.106:7480/auth/1.0 -U mona:swift -K 6vxGDhuEBsPSyX1E7vYvFrTXLVqoJByMHT+jnXPV list
     	   
  4. Добавьте новый сегмент, second-bucket:

    
    # swift -A http://192.168.1.106:7480/auth/1.0 -U mona:swift -K 6vxGDhuEBsPSyX1E7vYvFrTXLVqoJByMHT+jnXPV post second-bucket
     	   
  5. Выведите перечень сегментов (bucket); он также отобразит ваш новый second-bucket:

    
    # swift -A http://192.168.1.106:7480/auth/1.0 -U mona:swift -K 6vxGDhuEBsPSyX1E7vYvFrTXLVqoJByMHT+jnXPV list
    
    	root@client-node1:~# swift -A http://192.168.1.106:7480/auth/1.0 -U mona:swift -K 6vxGDhuEBsPSyX1E7vYvFrTXLVqoJByMHT+jnXPV list 
    	first-bucket 
    	root@client-node1:~# 
    	root@client-node1:~# swift -A http://192.168.1.106:7480/auth/1.0 -U mona:swift -K 6vxGDhuEBsPSyX1E7vYvFrTXLVqoJByMHT+jnXPV post second-bucket 
    	root@client-node1:~# swift -A http://192.168.1.106:7480/auth/1.0 -U mona:swift -K 6vxGDhuEBsPSyX1E7vYvFrTXLVqoJByMHT+jnXPV list 
    	first-bucket 
    	second-bucket 
    	root@client-node1:~#
     	   

  Смотрите также...

Рецепт Создание пользователя radosgw.

 Интеграция шлюза RADOS с OpenStack Keystone

Ceph может быть интегрирован с вашей службой управления идентификацией OpenStack, 'Keystone'. При такой интеграции RGW Ceph настраивается принимать маркеры (token) Keystone для авторизации пользователей. Таким образом, все удостоверенные Keystone пользователи получат права для доступа к RGW.

  Как это сделать...

Выполните следующие команды на вашем openstack-node1, если не предписано иное:

  1. Настройте OpenStack для указания на Ceph RGW создав соответствующую службу и её терминалы:

    
    # keystone service-create --name swift --type object-store --description "ceph object store"
    # keystone endpoint-create --serviceid 6614554878344bbeaa7fec0d5dccca7f --publicurl
    http://192.168.1.106:7480/swift/v1 --internalurl
    http://192.168.1.106:7480/swift/v1 --adminurl
    http://192.168.1.106:7480/swift/v1 --region RegionOne
    
    	[root@os-node1 ~(keystone_admin)]# keystone service-create --name swift --type object-store --description "ceph object store" 
    	+-------------+----------------------------------+
    	|   Property  |              Value               | 
    	+-------------+----------------------------------+
    	| description |        ceph object store         | 
    	|   enabled   |               True               |
    	|      id     | 6614554878344bbeaa7fec0d5dccca7f |
    	|     name    |              swift               |
    	|     type    |           object-store           |
    	+-------------+----------------------------------+
    	[root@os-node1 ~(keystone_admin)]# 
    	[root@os-node1 ~(keystone_admin)]# keystone endpoint-create --service-id 6614554878344bbeaa7fec0d5dccca7f --publicurl http://192.168.1.106:7480 /swift/vl --internalurl http://192.168.1.106:7480/swift/v1 --adminurl http://192.168.1.106:7480/swift/v1 --region RegionOne 
    	+-------------+------------------------------------+
    	|  Property   |              Value                 |   
    	+-------------+------------------------------------+
    	|  adminurl   | http://192.168.1.106:7480/swift/v1 |
    	|      id     |  1f962773df6c438e9658fc8cc027d86f  |
    	| internalurl | http://192.168.1.106:7480/swift/v1 |
    	|  publicurl  | http://192.168.1.106:7480/swift/v1 |
    	|    region   |            RegionOne               |
    	|  service_id |  6614554878344bbeaa7fec0d5dccca7f  |
    	+-------------+------------------------------------+
    	[root@os-node1 ~(keystone_admin)]# 
     	   
  2. Получите свой маркер администратора Keystone, который будет использоваться для настройки RGW:

    
    # cat /etc/keystone/keystone.conf | grep -i admin_token
     	   
  3. Создайте каталог для сертификатов:

    
    # mkdir -p /var/ceph/nss
     	   
  4. Сгененрируйте сертификаты openssl:

    
    # openssl x509 -in /etc/keystone/ssl/certs/ca.pem -pubkey|certutil -d /var/ceph/nss -A -n ca -t "TCu,Cu,Tuw"
    # openssl x509 -in /etc/keystone/ssl/certs/signing_cert.pem -pubkey | certutil -A -d /var/ceph/nss -n signing_cert -t "P,P,P"
    
    	[root@os-node1 ~(keystone_admin)]# mkdir -p /var/ceph/nss 
    	[root@os-node1 ~(keystone_admin)]# openssl x509 -in /etc/keystone/ssl/certs/ca.pem -pubkey|certutil -d /var/ceph/nss -A -n ca -t "TCu,Cu,Tuw" 
    	Notice: Trust flag u is set automatically if the private key is present. 
    	[root@os-node1 ~(keystone_admin)]# 
    	[root@os-node1 ~(keystone_admin)]# openssl x509 -in /etc/keystone/ssl/certs/signing_cert.pem -pubkey | certutil -A -d /var/ceph/nss -n signing_cert -t "P,P,P" 
    	[root@os-node1 ~(keystone_admin)]# ls -1 /var/ceph/nss/ 
    	total 76 
    	-rw------- 1 root root 65536 Apr 17 00:40 cert8.db 
    	-rw------- 1 root root 16384 Apr 17 00:40 key3.db
    	-rw------- 1 root root 16384 Apr 17 00:38 secmod.db 
    	[root@os-node1 ~(keystone_admin)]# 
     	   
  5. Создайте /var/ceph/nss directory на rgw-node1:

    
    # mkdir -p /var/ceph/nss
     	   
  6. Скопируйте openssl сертификаты с openstack-node1 на rgw-node1. Если вы регистрируетесь в первый раз, вы получите кведомление SSH; наберите yes, затем введите пароль root, который установлен в значение vagrant для всех ваших машин:

    
    # scp /var/ceph/nss/* rgw-node1:/var/ceph/nss
     	   
  7. На rgw-node1 создайте каталоги и измените их владельца на Apache:

    
    # mkdir /var/run/ceph
    # chown apache:apache /var/run/ceph
    # chown -R apache:apache /var/ceph/nss
     	   
  8. На client-node1 rgw-node1 :

    
    # apt-get install python-setuptools
     	   
  9. Измените /etc/ceph/ceph.conf на rgw-node1 следующими записями в разделе [client.radosgw.gateway]:

    
    rgw keystone url = http://192.168.1.111:5000
    rgw keystone admin token = f72adb0238d74bb885005744ce526148
    rgw keystone accepted roles = admin, Member, swiftoperator
            rgw keystone token cache size = 500
            rgw keystone revocation interval = 60
            rgw s3 auth use keystone = true
    nss db path = /var/ceph/nss
     	   
    [Замечание]Замечание

    rgw keystone url должен быть вашим URL управления кольцом ключей который может быть получен командой # keystone endpoint-list.

    rgw keystone admin token является значением маркера который мы сохранили на 2 шаге этого рецепта.

  10. Наконец запустите службу ceph-radosgw:

    
    # systemctl restart ceph-radosgw
     	   
  11. Теперь чтобы протестировать интеграцию Keystone и Ceph, переключимся назад на openstack-node1 и выполним основные команды Swift, причём они не должны запрашивать у нас никаких ключей пользователей:

    
    # swift list
    # swift post swift-test-bucket
    # swift list
    
    	[root@os-node1 ~(keystone_admin)]# swift list 
    	[root@os-node1 ~(keystone_admin)]# swift post swift-test-bucket 
    	[root@os-node1 ~(keystone_admin)]# swift list swift-test-bucket 
    	[root@os-node1 ~(keystone_admin)]# 
     	   
  12. Вы должны быть в состоянии выполнять любые операции с сегментами (bucket) с применением как swift cli, так и из инструментальной панели OpenStack Horizon, в разделе Object storage, без каких- либо запросов полномочий для пользователя RGW Ceph; это обусловлено выполненными нами изменениями настроек, проверяемые Keystone маркеры (token) теперь принимаются вашим RGW Ceph.

 Настройка федеративных шлюзов Ceph

Ceph RGW может быть развёрнут в федеративных конфигурациях с множеством регионов, а также множеством зон для региона. Как показано на схеме ниже, множественные экземпляры Ceph radosgw могут быть развёрнуты географически разделяемым образом. Настройка регионов шлюзов объектов Ceph и агенты синхронизации метаданных помогают поддерживать единое пространство имён, даже если экземпляры radosgw работают в различных географических местоположениях или различных кластерах хранения Ceph.

 

Рисунок 3.3. Гографически разделённое развёртывание экземпляров radosgw



Другой подход состоит в размещении одного или более экземпляров Ceph radosgw которые ещё географически разделены в пределах региона в раздельных логических контейнерах, называемых зонами. В этом случае агент синхронизации данных также делает возможным вашей службе поддерживать одну или более копий данных вашей главной зоны в пределах региона в том же кластере Ceph. Эти дополнительные копии данных важны для вариантов применения резервного копирования или восстановления после отказов.

 

Рисунок 3.4. 



В данном рецепте мы изучим как размещать последним методом федерации Ceph radosgw. В соответствии с этим, мы создадим главный (master) регион, US,который будет размещать две зоны: master zone: us-east, содержащую экземпляр RGW us-east-1, и secondary zone: us-west, содержащую экземпляр RGW us-west-1. Далее приводятся параметры и их значения, которые мы будем применять:

  • Главный Регион → Соединённые Штаты: us

  • Главная Зона → зона восточного региона Соединённых Штатов: us-east

  • Вторичная Зона → зона западного региона Соединённых Штатов: us-west

  • Экземпляр-1 radosgw → Экземпляр1 зоны восточного региона Соединённых Штатов: us-east-1

  • Экземпляр-2 radosgw → Экземпляр1 зоны западного региона Соединённых Штатов: us-west-1

  Как это сделать...

  1. На вашей машине хоста поднимите виртуальные машины us-east-1 и us-west-1 с применением Vagrant:

    
    $ cd ceph-cookbook
    $ vagrant status us-east-1 us-west-1
    $ vagrant up us-east-1 us-west-1
    $ vagrant status us-east-1 us-west-1setuptools
    
    	teeri:ceph-cookbook ksingh$ vagrant status us-east-1 us-west-1 
    	Current machine states: 
    	
    	us-east-1       running (virtualbox)
    	us-west-1       running (virtualbox)
    	
    	This environment represents multiple vms. The vms are all listed 
    	above with their current state. For more information about a specific 
    	VM, run `vagrant status NAME`. 
    	teeri:ceph-cookbook ksingh$ 
     	   

    С этого момента мы будем выполнять все команды с любой из ваших машин монитора Ceph пока не определено иное. В нашем случае мы будем применять ceph-node1. Далее мы создадим пулы Ceph, которые будут применяться для хранения пучка критически важной информации о данных хранилища объектов, такие как сегмент (bucket), индекс сегмента, глобального каталога, журналов, идентификаторов пользователя S3, учётных записей пользователя Swift, адресов электронной почты и тому подобного.

  2. Создайте пулы Ceph для вашей зоны us-east:

    
    # ceph osd pool create .us-east.rgw.root 32 32
    # ceph osd pool create .us-east.rgw.control 32 32
    # ceph osd pool create .us-east.rgw.gc 32 32
    # ceph osd pool create .us-east.rgw.buckets 32 32
    # ceph osd pool create .us-east.rgw.buckets.index 32 32
    # ceph osd pool create .us-east.rgw.buckets.extra 32 32
    # ceph osd pool create .us-east.log 32 32
    # ceph osd pool create .us-east.intent-log 32 32
    # ceph osd pool create .us-east.usage 32 32
    # ceph osd pool create .us-east.users 32 32
    # ceph osd pool create .us-east.users.email 32 32
    # ceph osd pool create .us-east.users.swift 32 32
    # ceph osd pool create .us-east.users.uid 32 32
     	   
  3. Создайте пулы Ceph для вашей зоны us-west:

    
    # ceph osd pool create .us-west.rgw.root 32 32
    # ceph osd pool create .us-west.rgw.control 32 32
    # ceph osd pool create .us-west.rgw.gc 32 32
    # ceph osd pool create .us-west.rgw.buckets 32 32
    # ceph osd pool create .us-west.rgw.buckets.index 32 32
    # ceph osd pool create .us-west.rgw.buckets.extra 32 32
    # ceph osd pool create .us-west.log 32 32
    # ceph osd pool create .us-west.intent-log 32 32
    # ceph osd pool create .us-west.usage 32 32
    # ceph osd pool create .us-west.users 32 32
    # ceph osd pool create .us-west.users.email 32 32
    # ceph osd pool create .us-west.users.swift 32 32
    # ceph osd pool create .us-west.users.uid 32 32
     	   
  4. Проверьте только что созданные пулы Ceph:

    
    # ceph osd lspools
    
    	[root@ceph-node1 ~]# ceph osd lspools 
    	0 rbd,1 images,2 volumes,3 vms,4 .rgw.root,5 .rgw.contro1,6 .rgw,7 .rgw.gc,8 .users.uid,9 .users.emai1,10 .users,11 .users.swift,12 .rgw.buckets.index,13 .rgw.buckets,14 .us-east.rgw.root,15 .us-east.rgw.contro1,16 .us-east.rgw.gc,1 7 .us-east.rgw.buckets,18 .us-east. rgw.buckets.index,19 .us-east.rgw.buckets.extra,20 .us-east.log,21 .us-east.inten t-log,22 .us-east.usage,23 .us-east.users,24 .us-east.users.emai1,25 .us-east.users.swift,26 .us-east.users.uid,27 . us-west.rgw.root,28 .us-west.rgw.contro1,29 .us-west.rgw.gc,30 .us-west.rgw.buckets,31 .us-west.rgw.buckets.index,32 .us-west.rgw.buckets.extra,33 .us-west.log,34 .us-west.intent-log,35 .us-west.usage,36 .us-west.users,37 .us-west.0 sers.emai1,38 .us-west.users.swift,39 .us-west.users.uid, 
    	[root@ceph-node1 ~]# 
     	   
  5. Экземпляру RGW требуется пользователь и ключ для общения с вашим кластером хранения Ceph:

    1. При помощи следующей команды создайте кольцо ключей:

      
      # ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.keyring
      # chmod +r /etc/ceph/ceph.client.radosgw.keyring
       	   
    2. Сгенерируйте имя пользователя и ключ шлюза для каждого экземпляра:

      
      # ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client.radosgw.us-east-1 --gen-key
      # ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client.radosgw.us-west-1 --gen-key
       	   
    3. Добавьте возможности ключам:

      
      # ceph-authtool -n client.radosgw.us-east-1 --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.client.radosgw.keyring
      # ceph-authtool -n client.radosgw.us-west-1 --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.client.radosgw.keyring
       	   
    4. Добавьте ключи в ваш кластер хранения Ceph:

      
      # ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.us-east-1 -i /etc/ceph/ceph.client.radosgw.keyring
      # ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.us-west-1 -i /etc/ceph/ceph.client.radosgw.keyring
      
      	[root@ceph-node1 ~]# ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.keyring 
      	creating /etc/ceph/ceph.client.radosgw.keyring 
      	[root@ceph-node1 ~]# chmod +r /etc/ceph/ceph.client.radosgw.keyring 
      	[root@ceph-node1 ~]# ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client.radosgw.us-east-1 --gen-key 
      	[root@ceph-node1 ~]# ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client.radosgw.us-west-1 --gen-key 
      	[root@ceph-node1 ~]# ceph-authtool -n client.radosgw.us-east-1 --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.client.radosgw.keyring 
      	[root@ceph-node1 ~]# ceph-authtool -n client.radosgw.us-west-1 --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.client.radosgw.keyring 
      	[root@ceph-node1 ~]# 
      	[root@ceph-node1 ~]# ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.us-east-1 /etc/ceph/ceph.client.radosgw.keyring 
      	added key for client.radosgw.us-east-1 
      	[root@ceph-node1 ~]# 
      	[root@ceph-node1 ~]# ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.us-west-1 	/etc/ceph/ceph .client.radosgw.keyring 
      	added key for client. radosgw.us-west-1 
      	[root@ceph-node1 ~]# 
       	   
  6. Добавьте экземпляры RGW в ваш файл настроек Ceph, то есть /etc/ceph/ceph.conf:

    
    [client.radosgw.us-east-1]
    host = us-east-1
    rgw region = us
    rgw region root pool = .us.rgw.root
    rgw zone = us-east
    rgw zone root pool = .us-east.rgw.root
    keyring = /etc/ceph/ceph.client.radosgw.keyring
    rgw dns name = rgw-node1
    rgw socket path = /var/run/ceph/client.radosgw.us-east-1.sock
    log file = /var/log/ceph/client.radosgw.us-east-1.log
    
    [client.radosgw.us-west-1]
    host = us-west-1
    rgw region = us
    rgw region root pool = .us.rgw.root
    rgw zone = us-west
    rgw zone root pool = .us-west.rgw.root
    keyring = /etc/ceph/ceph.client.radosgw.keyring
    rgw dns name = rgw-ndoe1
    rgw socket path = /var/run/ceph/client.radosgw.us-west-1.sock
    log file = /var/log/ceph/client.radosgw.us-west-1.log
    
    	[root@ceph-node1 ceph]# tail -22 ceph.conf 
    	
    	[client.radosgw.us-east-1] 
    	host = us-east-1 
    	rgw region = us 
    	rgw region root pool = .us.rgw.root 
    	rgw zone = us-east 
    	rgw zone root pool = .us-east.rgw.root 
    	keyring = /etc/ceph/ceph.client.radosgw.keyring 
    	rgw dns name = rgw-node1 
    	rgw socket path = /var/run/ceph/client.radosgw.us-east-1.sock log file = /var/log/ceph/client.radosgw.us-east-1.log 
    	
    	[client. radosgw.us-west-1] 
    	host = us-west-1 
    	rgw region = us 
    	rgw region root pool = .us.rgw.root 
    	rgw zone = us-west 
    	rgw zone root pool = .us-west.rgw.root 
    	keyring = /etc/ceph/ceph.client.radosgw.keyring 
    	rgw dns name = rgw-node1 
    	rgw socket path = /var/run/ceph/client.radosgw.us-west-1.sock log file = /var/log/ceph/client.radosgw.us-west-1.log 
    	[root@ceph-node1 ceph]# 
     	   
  7. Далее мы установим пакеты Ceph на узлы us-east-1 и us-west-1 с помощью ceph-deploy с вашей машины ceph-node1. Наонец, мы добавим файлы настроек на эти узлы:

    1. Позволим cep-node1 выполнять регистрацию на ваших узлах RGW без паролей. Пароль root установлен по умолчанию, то есть vagrant:

      
      # ssh-copy-id us-east-1
      # ssh-copy-id us-west-1
       	   
    2. Установите пакеты Ceph на ваши экземпляры RGW:

      
      # ceph-deploy install us-east-1 us-west-1
       	   
    3. Когда пакеты Ceph установятся на ваш экземпляр RGW, поместите файлы настроек Ceph:

      
      # ceph-deploy --overwrite-conf config push us-east-1 uswest-1
       	   
    4. Скопируйте кольца ключей RGW с ceph-node на экземпляр шлюза:

      
      # scp ceph.client.radosgw.keyring us-east-1:/etc/ceph
      # scp ceph.client.radosgw.keyring us-west-1:/etc/ceph
       	   
    5. Далее установите пакеты ceph-radosgw и radosgw-agent на экземпляры radosgw us-east-1 и us-west-1:

      
      # ssh us-east-1 yum install -y ceph-radosgw radosgw-agent
      # ssh us-west-1 yum install -y ceph-radosgw radosgw-agent
       	   
    6. Для простоты мы запретим межсетевые экраны на ваших узлах:

      
      # ssh us-east-1 systemctl disable firewalld
      # ssh us-east-1 systemctl stop firewalld
      # ssh us-west-1 systemctl disable firewalld
      # ssh us-west-1 systemctl stop firewalld
       	   
  8. Создайте регион us. Зарегистрируйтесь на us-east-1 и выполните следующие команды:

    1. Создайте infile региона с названием us.json в каталоге /etc/ceph со следующим содержимым. Вы можете использовать для справки авторскую версию вашего файла us.json поставляемого с пакетом кода данной главы:

      
      { "name": "us",
        "api_name": "us",
        "is_master": "true",
        "endpoints": [
          "http:\/\/us-east-1.cephcookbook.com:7480\/"],
        "master_zone": "us-east",
        "zones": [
        { "name": "us-east",
          "endpoints": [
            "http:\/\/us-east-1.cephcookbook.com:7480\/"],
          "log_meta": "true",
          "log_data": "true"},
        { "name": "us-west",
          "endpoints": [
            "http:\/\/us-west-1.cephcookbook.com:7480\/"],
          "log_meta": "true",
          "log_data": "true"}],
        "placement_targets": [
        {
          "name": "default-placement",
          "tags": []
        }
        ],
        "default_placement": "default-placement"}
      
      	[root@us-east-1 ceph]# cat us.json
      	{ "name": "us",
      	  "api_name": "us",
      	  "is_master": "true",
      	  "endpoints": [
      	        "http:\/\/us-east-1.cephcookbook.com:7480\/"],
      	  "master_zone": "us-east",
      	  "zones": [
      	       { "name": "us-east",
      	         "endpoints": [
      	               "http:\/\/us-east-1.cephcookbook.com:7480\/"],
      	         "log_meta": "true",
      	         "log_data": "true"},
      	       { "name": "us-west",
      	         "endpoints": [
      	               "http:\/\/us-west-1.cephcookbook.com:7480\/"],
      	         "log_meta": "true",
      	         "log_data": "true"}],
      	  "placement_targets": [
      	  {
      	    "name": "default-placement",
      	    "tags": []
      	  }
      	  ],
      	  "default_placement": "default-placement"}
      	[root@us-east-1 ceph]#
       	   
    2. Создайте регион us с только что созданным вами infile us.json:

      
      # cd /etc/ceph
      # radosgw-admin region set --infile us.json --name client.radosgw.us-east-1
       	   
    3. Удалите регион по умолчанию, если он существует:

      
      # rados -p .us.rgw.root rm region_info.default --name client.radosgw.us-east-1
       	   
    4. Установите регион us в качестве региона по умолчанию:

      
      # radosgw-admin region default --rgw-region=us --name client.radosgw.us-east-1
       	   
    5. Наконец, обновите карту региона:

      
      # radosgw-admin regionmap update --name client.radosgw.us-east-1
       	   
  9. Сгенерируйте access_keys и secret_keys для зон us-east и us-west:

    1. Сгенерируйте access_keys для вашей зоны us-east:

      
      # < /dev/urandom tr -dc A-Z-0-9 | head -c${1:-20};echo;
       	   
    2. Сгенерируйте secret_keys для вашей зоны us-east:

      
      # < /dev/urandom tr -dc A-Z-0-9-a-z | head -c${1:-40};echo;
      
      	[root@us-east-1 ceph]# < /dev/urandom tr -dc A-Z-0-9 | head -c$11:-20};echo; 
      	XNK0ST8WXTMWZGN29NF9 
      	[root@us-east-1 ceph]# 
      	[root@us-east-1 ceph]# < /dev/urandom tr -dc A-Z-0-9-a-z | head -c$11:-40};echo; 
      	7VJm8uAp7lxKQZkjoPZmHu4sACA1SY8jTjay9dP5 
      	[root@us-east-1 ceph]#
       	   
    3. Сгенерируйте access_keys для вашей зоны us-west:

      
      # < /dev/urandom tr -dc A-Z-0-9 | head -c${1:-20};echo;
       	   
    4. Сгенерируйте secret_keys для вашей зоны us-west:

      
      # < /dev/urandom tr -dc A-Z-0-9-a-z | head -c${1:-40};echo;
      
      	[root@us-east-1 ceph]# < /dev/urandom tr -dc A-Z-0-9 | head -c${1:-20};echo; 
      	AAK0ST8WXTMWZGN29NF9 
      	[root@us-east-1 ceph]# < /dev/urandom tr -dc A-Z-0-9-a-z | head -c${1:-40};echo; 
      	AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dPS 
      	[root@us-east-1 ceph]# 
       	   
  10. Создайте infile зоны с названием us-east.json для вашей зоны us-east. Вы можете применять для справки авторский файл us-east.json предоставляемый пакетом кода данной главы:

    
    { "domain_root": ".us-east.domain.rgw",
      "control_pool": ".us-east.rgw.control",
      "gc_pool": ".us-east.rgw.gc",
      "log_pool": ".us-east.log",	
      "intent_log_pool": ".us-east.intent-log",
      "usage_log_pool": ".us-east.usage",
      "user_keys_pool": ".us-east.users",
      "user_email_pool": ".us-east.users.email",
      "user_swift_pool": ".us-east.users.swift",
      "user_uid_pool": ".us-east.users.uid",
      "system_key": { "access_key": " XNK0ST8WXTMWZGN29NF9", 
                      "secret_key": "7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"},
      "placement_pools": [
        { "key": "default-placement",
          "val": { "index_pool": ".us-east.rgw.buckets.index",
                   "data_pool": ".us-east.rgw.buckets"}
         } 
      ] 
    }
    
    	[root@us-east-1 ceph]#  cat us-east.json
    	{ "domain_root": ".us-east.domain.rgw",
    	  "control_pool": ".us-east.rgw.control",
    	  "gc_pool": ".us-east.rgw.gc",
    	  "log_pool": ".us-east.log",
    	  "intent_log_pool": ".us-east.intent-log",
    	  "usage_log_pool": ".us-east.usage",
    	  "user_keys_pool": ".us-east.users",
    	  "user_email_pool": ".us-east.users.email",
    	  "user_swift_pool": ".us-east.users.swift",
    	  "user_uid_pool": ".us-east.users.uid",
    	  "system_key": { "access_key": "XNK0ST8WXTMWZGN29NF9", 
    	                            "secret_key": "7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"},
    	  "placement_pools": [
            { "key": "default-placement",
              "val": { "index_pool": ".us-east.rgw.buckets.index",
                                 "data_pool": ".us-east.rgw.buckets"}
            } 
    	  ] 
    	}
    	[root@us-east-1 ceph]#
     	   
  11. Добавьте применение infile зоны us-east и в east, и в west пулы:

    
    # radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-east-1
    
    	[root@us-east-1 ceph]# radosgw-admin zone set --rgw-zone.us-east --infile us-east.json --name client.radosgw.us-east-1 
    	2015-05-03 21:56:38.878117 7fc365bd5880 0 couldn't find old data placement pools config, setting up new ones for the zone 
    	{ "domain_root": ".us-east.domain.rgw", 
    	  "control pool": ".us-east.rgw.control", 
    	  "gc_pool": ".us-east.rgw.gc", 
    	  "log_pool": ".us-east.log", 
    	  "intent_log_pool": ".us-east.intent-log", 
    	  "usage_log_pool": ".us-east.usage", 
    	  "user_keys_pool": ".us-east. users", 
    	  "user_email_pool": ".us-east.users.email", 
    	  "user_swift_pool": ".us-east.users.swift", 
    	  "user_uid_pool": ".us-east.users.uid", 
    	  "system_key": { 
    	    "access_key": "XNK0ST8WXTMWZGN29NF9", 
    	    "secret_key": "7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5", 
    	    "placement_pools": [ 
    	      { "key": "default-placement", 
    	        "van { "index_pool": ".us-east.rgw.buckets.index", 
    	                    "data_pool": ".us-east.rgw.buckets", 
    	                    "data_extra_pool": ""}
    	      }]
    	}
    	[root@us-east-1 ceph]# 
    	[root@us-east-1 ceph]# 
     	  

    Теперь выполните следующую команду:

    
    # radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-west-1
    
    	[root@us-east-1 ceph]# radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-west-1 
    	2015-05-03 21:58:58.982509 7f4b14f47880 0 couldn't find old data placement pools config, setting up new ones for the zone 
    	{ "domain_root": ".us-east.domain.rgw", 
    	  "control_pool": ".us-east.rgw.control", 
    	  "gc_pool": ".us-east.rgw.gc", 
    	  "log_pool": ".us-east.log", 
    	  "intent_log_pool": ".us-east.intent-log", 
    	  "usage_log_pool": ".us-east.usage", 
    	  "user_keys_pool": ".us-east.users", 
    	  "user_email_pool": ".us-east.users.email", 
    	  "user_swift_pool": ".us-east.users.swift", 
    	  "user_uid_pool": ".us-east.users.uid", 
    	  "system_key": { 
    	    "access_key": "XNK0ST8WXTMWZGN29NF9", 
    	    "secret_key": "7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"}, 
    	    "placement_pools": [ 
    	      "key": "default-placement", 
    	      "val": { "index_pool": ".us-east.rgw.buckets.index", 
    	               "data_pool": ".us-east.rgw.buckets", 
    	               "data_extra_pool": ""}
    	             }]
    	}
    	[root@us-east-1 ceph]# 
    	[root@us-east-1 ceph]# 
     	   
  12. Аналогично, для зоны us-west создайте infile us-west.json со следующим содержимым. Вы можете для справки использовать авторскую версию файла us-west.json предоставляемую пакетом кода для данной главы:

    
    { "domain_root": ".us-west.domain.rgw",
      "control_pool": ".us-west.rgw.control",
      "gc_pool": ".us-west.rgw.gc",
      "log_pool": ".us-west.log",
      "intent_log_pool": ".us-west.intent-log",
      "usage_log_pool": ".us-west.usage",
      "user_keys_pool": ".us-west.users",
      "user_email_pool": ".us-west.users.email",
      "user_swift_pool": ".us-west.users.swift",
      "user_uid_pool": ".us-west.users.uid",
      "system_key": { 
        "access_key": "AAK0ST8WXTMWZGN29NF9", 
        "secret_key": "AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"},
        "placement_pools": [
        { "key": "default-placement",
          "val": { "index_pool": ".us-west.rgw.buckets.index",
                   "data_pool": ".us-west.rgw.buckets"}
        }]
    }
    
    	[root@us-east-1 ceph]# cat us-west.json 
    	{ "domain_root": ".us-west.domain.rgw", 
    	  "control_pool": ".us-west.rgw.control", 
    	  "gc_pool": ".us-west.rgw.gc", 
    	  "log_pool": ".us-west.log", 
    	  "intent_logpool": ".us-west.intent-log", 
    	  "usage_log_pool": ".us-west.usage", 
    	  "user_keys_pool": ".us-west.users", 
    	  "user_email_pool": ".us-west.users.email", 
    	  "user_swift_pool": ".us-west.users.swift", 
    	  "user_uid_pool": ".us-west.users.uid", 
    	  "system_key": { 
    	    "access_key": "AAK0ST8WXTMWZGN29NF9", 
    	    "secret_key": "AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"}, 
    	    "placement_pools": [ 
    	    {"key": "default-placement", 
    	     "val: 
    	     {"index_pool": ".us-west.rgw.buckets.index", 
    	      "data_pool": ".us-west.rgw.buckets"}
    	    }]
    	}
    	[root@us-east-1 ceph]# 
     	   
  13. Добавьте зону us-west с использованием infile в east и west пулы:

    
    # radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-east-1
    
    	[root@us-east-1 ceph]# radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-east-1 
    	2015-05-03 22:03:16.279758 7f4ac6bd4880 0 couldn't find old data placement pools config, setting up new ones for the zone 
    	{ "domain_root": ".us-west.domain.rge", 
    	  "control_pool": ".us-west.rgw.control", 
    	  "gc_pool": ".us-west.rgw.gc", 
    	  "log_pool": ".us-west.log", 
    	  "intent_log_pool": ".us-west.intent-log", 
    	  "usage_log_pool": ".us-west.usage", 
    	  "user_keys_pool": ".us-west.users", 
    	  "user_email_pool": ".us-west.users.email", 
    	  "user_swift_pool": ".us-west.users.swift", 
    	  "user_uid_pool": ".us-west.users.uid", 
    	  "system_key": 
    	  {"access_key": "AAK0ST8WXTMWZGN29NF9", 
    	   "secret_key": "AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"}, 
    	  "placement_pools": [ 
    	  { "key": "default-placement", 
    	    "val": 
    	    { "index_pool": ".us-west.rgw.buckets.index", 
    	      "data_pool": ".us-west.rgw.buckets", 
    	      "data_extra_pool": ""}
    	  }]
    	}
    	[root@us-east-1 ceph]# 
    	[root@us-east-1 ceph]# 
    
    # radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-west-1
    
    	[root@us-east-1 ceph]# radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-west-1 
    	2015-05-03 22:04:48.050644 7f74fd327880 0 couldn't find old data placement pools config, setting up new ones for the zone 
    	{ "domain_root": ".us-west.domain.rgw", 
    	  "control_pool": ".us-west.rgw.control", 
    	  "gc_pool": ".us-west.rgw.gc", 
    	  "log_pool": ".us-west.log", 
    	  "intent_log_pool": ".us-west.intent-log", 
    	  "usage_log_pool": ".us-west.usage", 
    	  "user_keys_pool": ".us-west.users", 
    	  "user_email_pool": ".us-west.users.email", 
    	  "user_swift_pool": ".us-west.users.swift", 
    	  "user_uid_pool": ".us-west.users.uid", 
    	  "system_key": 
    	  { "access_key": "AAKOST8WXTMWZGN29NF9", 
    	    "secret_key": "AA3m8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"}, 
    	    "placement_pools": [ 
    	      { "key": "default-placement", 
    	        "val": { "index_pool": ".us-west.rgw.buckets.index", 
    	        "data_pool": ".us-west.rgw.buckets", 
    	        "data_extra_pool": ""}
    	      }]
    	}
    	[root@us-east-1 ceph]# 
    	[root@us-east-1 ceph]# 
     	   
  14. Удалите зону по умолчанию, если она существует:

    
    # rados -p .rgw.root rm zone_info.default --name client.radosgw.us-east-1
     	   
  15. Обновите карту региона:

    
    # radosgw-admin regionmap update --name client.radosgw.us-east-1
     	   
  16. После настройки зон создайте пользователей зон:

    1. Создайте своего пользователя зоны us-east для вашего экземпляра шлюза us-east-1. Применяйте те же access_key и secret_key, которые мы сгенерировали ранее для зоны us-east:

      
      # radosgw-admin user create --uid="us-east" --displayname="Region-US Zone-East" --name client.radosgw.useast-1 --access_key="XNK0ST8WXTMWZGN29NF9" --secret="7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5" --system
       	  
      	[root@us-east-1 ceph]# radosgw-admin user create --uid="us-east" --displayname="Region-US Zone-East" --name client.radosgw.useast-1 --access_key="XNK0ST8WXTMWZGN29NF9" --secret="7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5" --system
      	{ "user_id": "us-east", 
      	  "display_name": "Region-US Zone-East", 
      	  "email": "", 
      	  "suspended": 0, 
      	  "max_buckets": 1000, 
      	  "auid": 0, 
      	  "subusers": [], 
      	  "keys": [ 
      	    { "user": "us-east", 
      	      "access_key": "XNK0ST8WXTMWZGN29NF9", 
      	      "secret_key": "7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"}], 
      	  "swift_keys": [], 
      	  "caps": [], 
      	  "op_mask": "read, write, delete", 
      	  "system": "true", 
      	  "default_placement": "", 
      	  "placement_tags" : [], 
      	  "bucket_quota": 
      	    { "enabled": false, 
      	      "max_size_kb": -1, 
      	      "max_objects": -1}, 
      	  "user_quota": 
      	    { "enabled": false, 
      	      "max_size_kb": -1, 
      	      "max_objects": -1}, 
      	  "temp_url_keys": []
      	} 
      	[root@us-east-1 ceph]# 
      	  
    2. Создайте своего пользователя зоны us-west для вашего экземпляра шлюза us-west-1. Применяйте те же access_key и secret_key, которые мы сгенерировали ранее для зоны us-west:

      
      # radosgw-admin user create --uid="us-west" --displayname="Region-US Zone-West" --name client.radosgw.uswest-1 --access_key="AAK0ST8WXTMWZGN29NF9" --secret="AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5" --system
      
      	[root@us-east-1 ceph]# radosgw-admin user create --uid="us-west" --displayname="Region-US Zone-West" --name client.radosgw.uswest-1 --access_key="AAK0ST8WXTMWZGN29NF9" --secret="AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5" --system
      	{ "user_id": "us-west", 
      	  "display_name": "Region-US zone-West", 
      	  "email": "", 
      	  "suspended": 0, 
      	  "max_buckets": 1000, 
      	  "auid": 0, 
      	  "subusers": [], 
      	  "keys": [ 
      	    { "user": "us-west", 
      	      "access_key": "AAK0ST8WXTMWZGN29NF9", 
      	      "secret_key": "AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"}], 
      	  "swift_keys": [], 
      	  "caps": [], 
      	  "op_mask": "read, write, delete", 
      	  "system": "true", 
      	  "default_placement": "", 
      	  "placement_tags": [], 
      	  "bucket_quota": 
      	    { "enabled": false, 
      	      "max_size_kb": -1, 
      	      "max_objects": -1}, 
      	  "user_quota": 
      	    { "enabled": false, 
      	      "max_size_kb": -1, 
      	      "max_objects": -1}, 
      	  "temp_url_keys": []
      	} 
      	[root@us-east-1 ceph]#
       	   
    3. Создайте своего пользователя зоны us-east для вашего экземпляра шлюза us-west-1. Применяйте те же access_key и secret_key, которые мы сгенерировали ранее для зоны us-east:

      
      # radosgw-admin user create --uid="us-east" --displayname="Region-US Zone-East" --name client.radosgw.uswest-1 --access_key="XNK0ST8WXTMWZGN29NF9" --secret="7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5" --system
      
      	[root@us-east-1 ceph]# radosgw-admin user create --uid="us-east" --displayname="Region-US Zone-East" --name client.radosgw.uswest-1 --access_key="XNK0ST8WXTMWZGN29NF9" --secret="7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5" --system
      	{ "user_id": "us-east", 
      	  "display_name" : "Region-US zone-East", 
      	  "suspended": 0, 
      	  "max.buckets" : 1000, 
      	  "auid" : 0, 
      	  "subusers": [] , 
      	  "keys": [ 
      	    { "user": "us-east", 
      	      "access_key" : "XNK0ST8WXTMWZGN29NF9", 
      	      "secret_key" : "7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"}] , 
      	  "swift-keys": [], 
      	  "caps": [], 
      	  "op_mask" : "read, write, delete", 
      	  "system" : "true", 
      	  "default_placement" : "" , 
      	  "placement_tags": [] , 
      	  "bucket_guota" : 
      	    { "enabled": false, 
      	      "max_size_kb": -1, 
      	      "max_objects, -1}", 
      	  "user_guota": 
      	    { "enabled": false, 
      	      "max_size_kb": -1, 
      	      "max_objects": -1}, 
      	  "temp_url_keys": [] 
      	} 
      	[root@us-east-1 ceph]#
      	   
    4. Создайте своего пользователя зоны us-west для вашего экземпляра шлюза us-east-1. Применяйте те же access_key и secret_key, которые мы сгенерировали ранее для зоны us-west:

      
      # radosgw-admin user create --uid="us-west" --displayname="Region-US Zone-West" --name client.radosgw.useast-1 --access_key="AAK0ST8WXTMWZGN29NF9" --secret="AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5" --system
      
      	[root@us-east-1 ceph]# radosgw-admin user create --uid="us-west" --displayname="Region-US Zone-West" --name client.radosgw.useast-1 --access_key="AAK0ST8WXTMWZGN29NF9" --secret="AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5" --system
      	{ "user_id": "us-west", 
      	  "display_name" : "Region-US zone-west", 
      	  "suspended" : 0, 
      	  "max_buckets" : 1000, 
      	  "auid" : 0, 
      	  "subusers" : [] , 
      	  "keys": [ 
      	    { "user" : "us-west", 
      	      "access_key" : "AAK0ST8WXTMWZGN29NF9" , 
      	      "secret_key" : "AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"}] , 
      	  "swift_keys" : [] , 
      	  "caps" : [] , 
      	  "op_mask" : "read, write, delete", 
      	  "system" : "true", 
      	  "default_placement" : "" , 
      	  "placement_tags" : [] , 
      	  "bucket_guota" : 
      	    { "enabled": false, 
      	      "max_size_kb": -1, 
      	      "max_objects" : -1} , 
      	  "user_quota" : 
      	    { "enabled": false, 
      	      "max_size_kb" : -1, 
      	      "max_objects" : -1} , 
      	  "temp_url _keys" : [] 
      	} 
      	[root@us-east-1 ceph]#
       	   
  17. Обновите сценарий инициализации ceph-radosgw и установите пользователем по умолчанию root. По умолчанию выполнение ceph-radosgw применяет пользователя Apache и вы можете столкнуться с ошибками если пользователь Apache отсутствует:

    
    # sed -i s"/DEFAULT_USER.*=.*'apache'/DEFAULT_USER='root'"/g /etc/rc.d/init.d/ceph-radosgw
    
    	[root@us-east-1 ceph]# cat /etc/rc.d/init.d/ceph-radosgw | grep -i root 
    	DEFAULT_USEIR = 'root' 
    	[root@us-east-1 ceph]# 
     	   
  18. Зарегистрируйтесь на ваших узлах us-east-1 и us-west-1 и перезапустите службу ceph-radosgw:

    
    # systemctl restart ceph-radosgw
     	   
  19. Проверьте что настройки региона, зоны и ceph-radosgw верны, выполните следующие команды с узла us-east-1:

    
    # radosgw-admin regions list --name client.radosgw.us-east-1
    # radosgw-admin regions list --name client.radosgw.us-west-1
    # radosgw-admin zone list --name client.radosgw.us-east-1
    # radosgw-admin zone list --name client.radosgw.us-west-1
    # curl http://us-east-1.cephcookbook.com:7480
    # curl http://us-west-1.cephcookbook.com:7480
    
    	[root@us-east-1 ceph]# radosgw-admin regions list --name client.radosgw.us-east-1 
    	{ "default_info": {"default_region": "us"}, 
    	  "regions": [ 
    	       "us"]} 
    	[root@us-east-1 ceph]# radosgw-admin regions list --name client.radosgw.us-west-1 
    	{ "default_info": "default_region": "us"}, 
    	  "regions": [ 
    	       "us"]} 
    	[root@us-east-1 ceph]# radosgw-admin zone list --name client.radosgw.us-east-1 
    	{ "zones": [ 
    	       "us-west", 
    	       "us-east"]} 
    	[root@us-east-1 ceph]# radosgw-admin zone list --name client.radosgw.us-west-1 
    	{ "zones": [ 
    	      "us-west", 
    	      "us-east"]} 
    	[root@us-east-1 ceph]# curl http://us-east-1.cephcookbook.com:7480 
    	<?xml version="1.0" encoding="UTF-8"?>
    	  <ListAllMyBucketsResult xmlns="http://s3.amazona ws.com/doc/2006-03-01/">
    	  <Owner>
    	  <ID>anonymous</ID>
    	  <DisplayName></DisplayName>
    	  </Owner>
    	  <Buckets></Buckets>
    	  </ListAllMyBucketsResult>
    	[root@us-east-1 ceph]# 
    	[root@us-east-1 ceph]# curl http://us-west-1.cephcookbook.com:7480 
    	<?xml version="1.0" encoding="UTF-8"?>
    	 <ListAllMyBucketsResult xmlns="http://s3.amazona ws.com/doc/2006-03-01/">
    	 <Owner>
    	 <ID>anonymous</ID>
    	 <DisplayName></DisplayName>
    	 </Owner>
    	 <Buckets></Buckets>
    	 </ListAllMyBucketsResult>
    	[root@us-east-1 ceph]# 
    	[root@us-east-1 ceph]# 
     	   
  20. Настройте репликацию множества площадок создав файл cluster-data-sync.conf со следующим содержимым:

    
    src_zone: us-east
    source: http://us-east-1.cephcookbook.com:7480
    src_access_key: XNK0ST8WXTMWZGN29NF9
    src_secret_key: 7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5
    dest_zone: us-west
    destination: http://us-west-1.cephcookbook.com:7480
    dest_access_key: AAK0ST8WXTMWZGN29NF9
    dest_secret_key: AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5
    log_file: /var/log/radosgw/radosgw-sync-us-east-west.log
    
    	[root@us-east-1 ceph]# cat cluster-data-sync.conf 
    	srczone: us-east 
    	source: http://us-east-1.cephcookbook.com:7480 
    	src_access_key: XNK0ST8WXTMWZGN29NF9 
    	src_secret_key: 7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5 
    	dest_zone: us-west 
    	destination: http://us-west-1.cephcookbook.com:7480 
    	dest_access_key: AAK0ST8WXTMWZGN29NF9 
    	dest_secret_key: AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5
    	/var/log/radosgw/radosgw-sync-us-east-west.log 
    	[root@us-east-1 ceph]# 
     	   
  21. Активируйте агента синхронизации данных. Когда синхронизация данных запустится, вы должны увидеть вывод аналогичный показанному ниже:

    
    # radosgw-agent -c cluster-data-sync.conf
     	   
     

    Рисунок 3.5. 



 Тестирование федеративных настроек radosgw

Для того, чтобы протестировать федеративную конфигурацию мы вначале добавим некоторые объекты в нашу зону us-east через экземпляр radosgw, us-east-1, используя Swift. Затем, после синхронизации данных между зонами us-east и us-west, мы получим доступ к тем же объектам из зоны us-west через интерфейс шлюза us-west-1.

  Как это сделать...

  1. Создайте подпользователя Swift для пользователя зоны us-east:

    
    # radosgw-admin subuser create --uid="us-east" --subuser="useast:swift" --access=full --name client.radosgw.us-east-1 --keytype swift --secret="7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"
    # radosgw-admin subuser create --uid="us-east" --subuser="useast:swift" --access=full --name client.radosgw.us-west-1 --keytype swift --secret="7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"
    
    	[root@us-east-1 ceph]# radosgw-admin subuser create --uid="us-east" --subuser="useast:swift" --access=full --name client.radosgw.us-east-1 --keytype swift --secret="7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"
    	{ "user_id": "us-east", 
    	  "display_name:" "Region-US Zone-East", 
    	  "email": "", 
    	  "suspended": 0, 
    	  "max_buckets": 1000, 
    	  "avid": 0, 
    	  "subusers": [ 
    	    { "id": "us-east:swift", 
    	      "permissions": "full-control"}], 
    	  "keys": [ 
    	    { "user": "us-east", 
    	      "access_key": "XNK0ST8WXTMWZGN29NF9", 
    	      "secret_key": "7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"}], 
    	  "swiftkeys": [ 
    	  { "user": "us-east:swift", 
    	    "secret_key": "7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"}], 
    	  "caps" : [], 
    	  "op_mask" : "read, write, delete", 
    	  "system": "true", 
    	  "default_placement": 
    	  "placement_tags": [], 
    	  "bucket_quota": 
    	    { "enabled": false, 
    	      "max_size_kb": -1, 
    	      "max_objects": -1}, 
    	  "user_quota": 
    	    { "enabled": false, 
    	      "max_size_kb": -1, 
    	      "max_objects": -1}, 
    	  "temp_url_keys.: []
    	} 
    	[root@us-east-1 ceph]#
     	   
  2. Аналогично, создадим подпользователя Swift для пользователя зоныus-west:

    
    # radosgw-admin subuser create --uid="us-west" --subuser="us-west:swift" --access=full --name client.radosgw.us-east-1 --key-type swift --secret="AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"
    # radosgw-admin subuser create --uid="us-west" --subuser="us-west:swift" --access=full --name client.radosgw.us-west-1 --key-type swift --secret="AAJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5"
     	   
  3. Установите клиента python-swift на узлах us-east-1 и us-west-1:

    
    # yum install python-swift
    # yum install python-setuptools
    # easy_install pip
    # pip install --upgrade setuptools
    # pip install python-swiftclient
     	   
  4. Соберите python-swiftclient на узле us-east-1:

    
    # export ST_AUTH="http://us-east-1.cephcookbook.com:7480/auth/1.0"
    # export ST_KEY=7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5
    # export ST_USER=us-east:swift
     	   
  5. Выведите перечень и создайте некоторые объекты на узле us-east-1:

    
    # swift list
    # swift upload container-1 us.json
    # swift list
    # swift list container-1
    
    	[root@us-east-1 ceph]# export ST_AUTH="http://us-east-l.cephcookbook.com:7480/auth/1.0" 
    	[root@us-east-1 ceph]# export ST_KEY=7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5 
    	[root@us-east-1 ceph]# export ST_USER=us-east:swift 
    	[root@us-east-1 ceph]# swift list 
    	[root@us-east-1 ceph]# swift upload container-1 us.json 
    	us.json 
    	[root@us-east-1 ceph]# swift list 
    	container-1 
    	[root@us-east-1 ceph]# 
    	[root@us-east-1 ceph]# swift list container-1 
    	us.json 
    	[root@us-east-1 ceph]#
     	   
  6. Активируем агента синхронизации данных:

    
    # radosgw-agent -c cluster-data-sync.conf
     	   
  7. Когда синхронизация данных завершится, попытайтесь осуществить доступ из зоны us-west применяя экземпляр шлюза us-west-1. На данном этапе данные должны быть доступными для вас из экземпляра шлюза us-west-1:

    
    # export ST_AUTH="http://us-west-1.cephcookbook.com:7480/auth/1.0"
    # export ST_KEY=7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5
    # export ST_USER=us-east:swift
    # swift list
    
    	[root@us-west-1 ceph]# export ST_AUTH="http://us-west-1.cephcookbook.com:7480/auth/1.0"
    	[root@us-west-1 ceph]# export ST_KEY=7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5
    	[root@us-west-1 ceph]# export ST_USER=us-east:swift
    	[root@us-west-1 ceph]# swift list
    	container-1
    	[root@us-west-1 ceph]# swift list container-1
    	us.json
    	[root@us-west-1 ceph]#
     	   

 Построение служб файловой синхронизации и совместного использования с применением RGW

Сслужбы синхронизации и совместного использования файлов, такие как Dropbox, Box, Google Drive и многие прочие, становятся чрезвычайно популярными в последние несколько лет. При помощи Ceph вы можете развёртывать локальную синхронизацию файлов и службы совместного использования применяя любые интерфейсы приложений на основе S3 или Swift, в этом рецепте мы продемонстрируем как построить синхронизацию файлов и службы совместного использования на основе Ceph и ownCloud.

Для построения такой службы нам понадобятся работающий кластер, экземпляр RGW, способный осуществлять дотуп к хранилищу Ceph через S3 и интерфейс среды ownClowd, как это показано ниже:

 

Рисунок 3.6. Схема служб файловой синхронизации и совместного использования Ceph и ownCloud



  Приготовление

В последнем рецепте мы настроили экземпляр radosgw, us-east-1; мы будем использовать тот же экземпляр шлюза в этом разделе для построения службы синхронизации файлоы и их совместного использования. Мы также применяем службу DNS, которая настроена на rgw-node1 для поддержки вызовов поддомена S3 для нашего экземпляра RGW us-east-1; однако, мы также можем применять любой другой DNS сервер если он позволяет разрешать поддомены для us-east-1.

  Как это сделать...

  1. Зарегистриуйтесь на rgw-node1, который также является нашим сервером DNS и создайте файл /var/named/us-east-1.cephcookbook.com со следующим содержимым:

    
    @ 86400 IN SOA cephcookbook.com. root.cephcookbook.com. (
    	    20091028 ; serial yyyy-mm-dd
    	    10800 ; refresh every 15 min
    	    3600 ; retry every hour
    	    3600000 ; expire after 1 month +
    	    86400 ); min ttl of 1 day
    @ 86400 IN NS cephbookbook.com.
    @ 86400 IN A 192.168.1.107
    * 86400 IN CNAME @
    
    	[root@rgw-node1 ~]# cat /var/named/us-east-1.cephcookbook.com
    	@ 86400 IN SOA cephcookbook.com. root.cephcookbook.com. (
    	        20091028 ; serial yyyy-mm-dd
    	        10800 ; refresh every 15 min
    	        3600 ; retry every hour
    	        3600000 ; expire after 1 month +
    	        86400 ); min ttl of 1 day
    	@ 86400 IN NS cephbookbook.com.
    	@ 86400 IN A 192.168.1.107
    	* 86400 IN CNAME @
    	[root@rgw-node1 ~]#
     	   
  2. Настройте ваш узел us-east-1 на применение вашего сервера DNS. Измените /etc/resolve.conf своими адресами rgw-node1 и выполните ping любого поддомена; это должно разрешить адрес us-east-1.

    
    	[root@us-east-1 ~]# cat /etc/resolv.conf 
    	# Generated by NetworkManager 
    	search cephcookbook.com 
    	nameserver 192.168.1.106 
    	[root@us-east-1 ~]# 
    	[root@us-east-1 ~]# ping anything.us-east-l.cephcookbook.com -c 1 
    	PING us-east-l.cephcookbook.com (192.168.1.107) 56(84) bytes of data. 
    	64 bytes from us-east-l.cephcookbook.com (192.168.1.107): icmp_seq=1 tt1=64 time=0.038 ms 
    	
    	--- us east-1.cephcookbook.com ping statistics ---
    	1 packets transmitted, 1 received, 0% packet loss, time Oms 
    	rtt min/avg/max/mdev = 0.038/0.038/0.038/0.000 ms 
    	[root@us-east-1 ~]#
     	   
  3. Убедитесь, что ваш узел us-east-1 может соединиться с кластером хранения Ceph поверх S3. В последнем рецепте мы создали пользователя с именем us-east и воспользуемся его доступом и ключом безопасности с помощью s3cmd:

    1. Установите s3cmd:

      
      # yum install -y s3cmd
       	   
    2. Настройте s3cmd и предоставьте access_key установленный в XNK0ST8WXTMWZGN29NF9 и secret_key установленный в 7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5:

      
      # s3cmd --configure
       	   
    3. Измените /root/.s3cmd подробностями хоста:

      
      host_base = us-east-1.cephcookbook.com:7480
      host_bucket = %(bucket)s.us-east-1.cephcookbook.com:7480
       	   
    4. Проверьте соединение s3cmd:

      
      # s3cmd ls
       	   
    5. Создайте сегмент (bucket) для ownCloud, который будет применяться для сохранения его объектов:

      
      # s3cmd mb s3://owncloud
       	   
  4. Далее мы установим ownCloud, который снабдит нас внешним и пользовательским интерфейсами для службы синхронизации и совместного применения файлов:

    1. Поднимите виртуальную машину ownCloud с помощью Vagrant и зарегистрируйтесь на этой ВМ:

      
      # vagrant up owncloud
      # vagrant ssh owncloud
       	   
    2. Установите репозиторий ownCloud следующим образом:

      
      # cd /etc/yum.repos.d/
      # wget http://download.opensuse.org/repositories/isv:ownCloud:community/CentOS_CentOS-7/isv:ownCloud:community.repo
       	   
    3. Установите ownCloud как показано ниже:

      
      # yum install owncloud -y
       	   
    4. Поскольку это пробная сборка, запретим межсетевой экран:

      
      # systemctl disable firewalld
      # systemctl stop firewalld
       	   
    5. Попытайтесь получитьдоступ к веб- интерфейсу ownCloud набрав на своём хосте в веб браузере http://192.168.1.120/owncloud/. Создайте учётную запись администратора с именем owncloud и паролем owncloud:

       

      Рисунок 3.7. 



    6. Первый экран регистрации будет выглядеть как это отображено ниже; в любое время мы можем применять ownClowd в качестве рабочего стола или мобильного приложения:

       

      Рисунок 3.8. 



  5. Настройте ownCloud для применения Ceph в качестве внешнего хранилища S3:

    1. Из учётной записи администратора ownClowd сделайте доступным внешнее хранилище переместившись в Files | Apps | Not enabled | External Storage и кликнув на Enable it.

    2. Далее настройте внешнее хранилище на применение Ceph. Для этого переместитесь в правую сторону окна и выберите пользователя ownCloud, затем выберите admin, а потом переместитесь в панель с левой стороны и выберите External Storage.

    3. Настройте Amazon S3 и соответствующее хранилище под ownCloud, выбрав Enable User External Storage, а затем переместившись в Amazon S3 and compliant | Add Storage | Amazon S3 and Compliant.

  6. Снабдите пользователя Ceph radosgw подробностями ключей доступа и безопасности, а также имени хоста:

    • Folder name: Введите имя вашей папки, которую вы хотите показывать на своей странице файлов ownCloud.

    • Access key: Введите ваш код доступа S3, XNK0ST8WXTMWZGN29NF9

    • Secret key: Введите ваш код безопасности S3, 7VJm8uAp71xKQZkjoPZmHu4sACA1SY8jTjay9dP5

    • Bucket: Введите имя вашего S3 сегмента, который мы создали на 3м шаге

    • : Введите us-east-1.cephcookbook.com

    • Port: Введите 7480

    • Region (не обязательно): Введите US

    • Available for: Введите owncloud (не обязательно)

     

    Рисунок 3.9. 



  7. Как только вы введёте предыдущие подробности, ownCloud должен соединиться с кластер Ceph поверх S3 и вы должны увидеть зелёную окружность сразу перед именем вашей папки, как это отображено на предыдущем снимке.

  8. Далее загрузите файлы через ownCloud своим пользовательским веб- интерфейсом. Для выполнения этого переместитесь в Files | External Storage и кликните на свой ceph-s3 загрузки файлов или каталогов.

  9. Убедитесь что файлы были добавлены в ваш кластер хранения Ceph переключившись на узел us-east-1 и выполнив команду s3cmd ls s3://owncloud; вы должны получить файл, который вы загрузили через пользовательский веб- интерфейс ownCloud.

    
    	[root@us-east-1 ~]# s3cmd ls s3://owncloud 
    	                       DIR   s3://owncloud/mona/ 
    	2015-05-05 21:32    148481   s3://owncloud/eknumber.jpg 
    	[root@us-east-1 ~]#
     	   
  10. Поздравляем! Вы научились строить свои частные службы синхронизации и совместного применения файлов с использованием хранилища объектов Ceph S3 и ownCloud.

  Смотрите также...

Для получения дополнительной информации по ownCloud, посетите https://owncloud.org/.