Merge "Marconi Operations Document"
This commit is contained in:
commit
5ce7f69610
64
doc/source/api.rst
Normal file
64
doc/source/api.rst
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
..
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
not use this file except in compliance with the License. You may obtain
|
||||||
|
a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
License for the specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
Using Marconi's Public APIs
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Marconi fully implements version 1.0 of the OpenStack Messaging API by now.
|
||||||
|
Generally, you can use any HTTP client to talk with Marconi public REST API,
|
||||||
|
though Marconi client is the recommended approach.
|
||||||
|
|
||||||
|
|
||||||
|
Marconi Client
|
||||||
|
############################################
|
||||||
|
We can easily access the Marconi REST API via Marconi client. Below is an example
|
||||||
|
to create a queue, post messages to it and finally delete it::
|
||||||
|
|
||||||
|
from marconiclient.queues.v1 import client
|
||||||
|
|
||||||
|
URL = 'http://localhost:8888'
|
||||||
|
messages = [{'body': {'id': idx}, 'ttl': 360} for idx in range(20)]
|
||||||
|
|
||||||
|
cli = client.Client(URL)
|
||||||
|
queue = cli.queue('myqueue')
|
||||||
|
queue.post(messages)
|
||||||
|
|
||||||
|
for msg in queue.messages(echo=True):
|
||||||
|
print(msg.body)
|
||||||
|
msg.delete()
|
||||||
|
|
||||||
|
queue.delete()
|
||||||
|
|
||||||
|
|
||||||
|
curl
|
||||||
|
####
|
||||||
|
|
||||||
|
Define these variables::
|
||||||
|
|
||||||
|
# USERNAME=my identity username
|
||||||
|
# APIKEY=my-long-api-key
|
||||||
|
# ENDPOINT=test-queue.mydomain.com < keystone endpoint >
|
||||||
|
# QUEUE=test-queue
|
||||||
|
# CLIENTID=c5a6114a-523c-4085-84fb-533c5ac40789
|
||||||
|
# HTTP=http
|
||||||
|
# PORT=80
|
||||||
|
# TOKEN=9abb6d47de3143bf80c9208d37db58cf < your token here >
|
||||||
|
|
||||||
|
Create the queue::
|
||||||
|
|
||||||
|
# curl -i -X PUT $HTTP://$ENDPOINT:$PORT/v1/queues/$QUEUE -H "X-Auth-Token: $TOKEN" -H "Client-ID: $CLIENTID"
|
||||||
|
HTTP/1.1 201 Created
|
||||||
|
content-length: 0
|
||||||
|
location: /v1/queues/test-queue
|
||||||
|
|
||||||
|
```HTTP/1.1 201 Created``` response proves that service is functioning properly.
|
77
doc/source/glossary.rst
Normal file
77
doc/source/glossary.rst
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
..
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
not use this file except in compliance with the License. You may obtain
|
||||||
|
a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
License for the specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
==========
|
||||||
|
Glossary
|
||||||
|
==========
|
||||||
|
|
||||||
|
Messaging Service Concepts
|
||||||
|
==========================
|
||||||
|
The Messaging Service is a multi-tenant, message queue implementation that
|
||||||
|
utilizes a RESTful HTTP interface to provide an asynchronous communications
|
||||||
|
protocol, which is one of the main requirements in today’s scalable applications.
|
||||||
|
|
||||||
|
.. glossary::
|
||||||
|
|
||||||
|
Queue
|
||||||
|
Queue is a logical entity that groups messages. Ideally a queue is created
|
||||||
|
per work type. For example, if you want to compress files, you would create
|
||||||
|
a queue dedicated for this job. Any application that reads from this queue
|
||||||
|
would only compress files.
|
||||||
|
|
||||||
|
Message
|
||||||
|
Message is sent through a queue and exists until it is deleted by a recipient
|
||||||
|
or automatically by the system based on a TTL (time-to-live) value.
|
||||||
|
|
||||||
|
Claim
|
||||||
|
Claim is a mechanism to mark messages so that other workers will not process the same message.
|
||||||
|
|
||||||
|
Worker
|
||||||
|
Worker is an application that reads one or multiple messages from the queue.
|
||||||
|
|
||||||
|
Producer
|
||||||
|
Producer is an application that creates messages in one or multiple queues.
|
||||||
|
|
||||||
|
Publish - Subscribe
|
||||||
|
Publish - Subscribe is a pattern where all worker applications have access
|
||||||
|
to all messages in the queue. Workers can not delete or update messages.
|
||||||
|
|
||||||
|
Producer - Consumer
|
||||||
|
Producer - Consumer is a pattern where each worker application that reads
|
||||||
|
the queue has to claim the message in order to prevent duplicate processing.
|
||||||
|
Later, when the work is done, the worker is responsible from deleting the
|
||||||
|
message. If message is not deleted in a predefined time (claim TTL), it can
|
||||||
|
be claimed by other workers.
|
||||||
|
|
||||||
|
Message TTL
|
||||||
|
Message TTL is time-to-live value and defines how long a message will be accessible.
|
||||||
|
|
||||||
|
Claim TTL
|
||||||
|
Claim TTL is time-to-live value and defines how long a message will be in
|
||||||
|
claimed state. A message can be claimed by one worker at a time.
|
||||||
|
|
||||||
|
Queues Database
|
||||||
|
Queues database stores the information about the queues and the messages
|
||||||
|
within these queues. Storage layer has to guarantee durability and availability of the data.
|
||||||
|
|
||||||
|
Sharding
|
||||||
|
If sharding enabled, queuing service uses multiple queues databases in order
|
||||||
|
to scale horizontally. A shard (queues database) can be added anytime without
|
||||||
|
stopping the service. Each shard has a weight that is assigned during the
|
||||||
|
creation time but can be changed later. Sharding is done by queue which
|
||||||
|
indicates that all messages for a particular queue can be found in the same shard (queues database).
|
||||||
|
|
||||||
|
Catalog Database
|
||||||
|
If sharding is enabled, catalog database has to be created. Catalog database
|
||||||
|
maintains ```queues``` to ```queues database``` mapping. Storage layer has
|
||||||
|
to guarantee durability and availability of data.
|
30
doc/source/ha.rst
Normal file
30
doc/source/ha.rst
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
..
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
not use this file except in compliance with the License. You may obtain
|
||||||
|
a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
License for the specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
Minimum Scalable HA Setup
|
||||||
|
=========================
|
||||||
|
|
||||||
|
OpenStack Queuing Service has two main layers. First one is the transport
|
||||||
|
(queuing application) layer which provides the RESTful interface, second one
|
||||||
|
is the storage layer which keeps all the data and meta-data about queues and messages.
|
||||||
|
|
||||||
|
For a HA setup, a load balancer has to be placed in front of the web servers.
|
||||||
|
Load balancer setup is out of scope in this document.
|
||||||
|
|
||||||
|
For storage we will use ```mongoDB``` in order to provide high availability with
|
||||||
|
minimum administration overhead. For transport, we will use ```wsgi```.
|
||||||
|
|
||||||
|
To have a small footprint while providing HA, we will use 2 web servers which
|
||||||
|
will host the application and 3 mongoDB servers (configured as replica-sets)
|
||||||
|
which will host the catalog and queues databases. At larger scale, catalog
|
||||||
|
database and the queues database are advised to be hosted on different mongoDB replica sets.
|
@ -1,7 +1,4 @@
|
|||||||
..
|
..
|
||||||
Copyright 2010-2014 OpenStack Foundation
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
not use this file except in compliance with the License. You may obtain
|
not use this file except in compliance with the License. You may obtain
|
||||||
a copy of the License at
|
a copy of the License at
|
||||||
@ -41,20 +38,28 @@ Concepts
|
|||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
glossary
|
||||||
|
|
||||||
Installing/Configuring Marconi
|
Installing/Configuring Marconi
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
installing
|
||||||
|
|
||||||
Operating Marconi
|
Operating Marconi
|
||||||
=================
|
=================
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
ha
|
||||||
|
|
||||||
Using Marconi
|
Using Marconi
|
||||||
=============
|
=============
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
api
|
252
doc/source/installing.rst
Normal file
252
doc/source/installing.rst
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
..
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
not use this file except in compliance with the License. You may obtain
|
||||||
|
a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
License for the specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
Installing and Configuring
|
||||||
|
============================
|
||||||
|
|
||||||
|
System Requirements
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Before you install OpenStack Queuing Service, you must meet the following system requirements.lst::
|
||||||
|
|
||||||
|
- OpenStack Compute Installation.
|
||||||
|
- Enable the Identity Service for user and project management.
|
||||||
|
- Python 2.6 or 2.7
|
||||||
|
|
||||||
|
Installing from packages
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Before you install and configure queuing service, meet the requirements in the
|
||||||
|
section called "System Requirements". Below samples are installing the packages on
|
||||||
|
RedHat operating system.
|
||||||
|
|
||||||
|
Install mongoDB on Database Servers
|
||||||
|
###################################
|
||||||
|
|
||||||
|
Install mongoDB on three servers and setup the replica-set.
|
||||||
|
|
||||||
|
Configure Package Management System (YUM)
|
||||||
|
#########################################
|
||||||
|
|
||||||
|
Create a ```/etc/yum.repos.d/mongodb.repo``` file to hold the following
|
||||||
|
configuration information for the MongoDB repository:
|
||||||
|
|
||||||
|
If you are running a 64-bit system, use the following configuration::
|
||||||
|
|
||||||
|
[mongodb]
|
||||||
|
name=MongoDB Repository
|
||||||
|
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
|
||||||
|
gpgcheck=0
|
||||||
|
enabled=1
|
||||||
|
|
||||||
|
If you are running a 32-bit system, which is not recommended for production
|
||||||
|
deployments, use the following configuration::
|
||||||
|
|
||||||
|
[mongodb]
|
||||||
|
name=MongoDB Repository
|
||||||
|
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686/
|
||||||
|
gpgcheck=0
|
||||||
|
enabled=1
|
||||||
|
|
||||||
|
Install Packages
|
||||||
|
################
|
||||||
|
|
||||||
|
Issue the following command (as root or with sudo) to install the latest stable
|
||||||
|
version of MongoDB and the associated tools::
|
||||||
|
|
||||||
|
#yum install mongo-10gen mongo-10gen-server
|
||||||
|
|
||||||
|
Edit ```/etc/sysconfig/mongod```::
|
||||||
|
|
||||||
|
logpath=/var/log/mongo/mongod.log
|
||||||
|
logappend=true
|
||||||
|
fork = true
|
||||||
|
dbpath=/var/lib/mongo
|
||||||
|
pidfilepath = /var/run/mongodb/mongod.pid
|
||||||
|
replSet = catalog
|
||||||
|
nojournal = true
|
||||||
|
profile = 1
|
||||||
|
slowms = 200
|
||||||
|
oplogSize = 2048
|
||||||
|
|
||||||
|
Start mongoDB on all database servers::
|
||||||
|
|
||||||
|
#service mongodb start
|
||||||
|
|
||||||
|
Configure Replica Set
|
||||||
|
#####################
|
||||||
|
|
||||||
|
Assuming that primary mongodb servers hostname is ```mydb0.example-queues.net```,
|
||||||
|
once you install mongoDB on three servers go to ```mydb0``` and run the commands below;::
|
||||||
|
|
||||||
|
mydb0# mongo local --eval "printjson(rs.initiate())"
|
||||||
|
mydb0# rs.add("mydb1.example-queues.net")
|
||||||
|
mydb0# rs.add("mydb2.example-queues.net")
|
||||||
|
|
||||||
|
To check if replica-set is established run this command;::
|
||||||
|
|
||||||
|
mydb0:~# mongo local --eval "printjson(rs.status())"
|
||||||
|
|
||||||
|
Install memcached on Web Servers
|
||||||
|
################################
|
||||||
|
|
||||||
|
Install memcached on web servers in order to cache identity tokens and catalog mappings.::
|
||||||
|
|
||||||
|
web# yum install memcached
|
||||||
|
|
||||||
|
Start memcached service::
|
||||||
|
|
||||||
|
web# service memcached start
|
||||||
|
|
||||||
|
Install uwsgi on Web Servers::
|
||||||
|
|
||||||
|
web# yum -y install python-pip
|
||||||
|
web# pip install uwsgi
|
||||||
|
|
||||||
|
Configure OpenStack Marconi
|
||||||
|
###########################
|
||||||
|
|
||||||
|
On web servers run these commands::
|
||||||
|
|
||||||
|
web# git clone https://github.com/openstack/marconi.git .
|
||||||
|
web# pip install . -r ./requirements.txt --upgrade --log /tmp/marconi-pip.log
|
||||||
|
|
||||||
|
Create ```/srv/marconi``` folder to store related configurations files.
|
||||||
|
|
||||||
|
Create ```/srv/marconi/marconi_uwsgi.py``` with the following content::
|
||||||
|
|
||||||
|
from keystoneclient.middleware import auth_token
|
||||||
|
from marconi.transport.wsgi import app
|
||||||
|
|
||||||
|
app = auth_token.AuthProtocol(app.app, {})
|
||||||
|
|
||||||
|
Create ```/srv/marconi/uwsgi.ini``` file with the following content::
|
||||||
|
|
||||||
|
[uwsgi]
|
||||||
|
http = 192.168.192.168:80
|
||||||
|
daemonize = /var/log/marconi.log
|
||||||
|
pidfile = /var/run/marconi.pid
|
||||||
|
gevent = 2000
|
||||||
|
gevent-monkey-patch = true
|
||||||
|
listen = 1024
|
||||||
|
enable-threads = true
|
||||||
|
module = marconi_uwsgi:app
|
||||||
|
workers = 4
|
||||||
|
|
||||||
|
The uwsgi configuration options above can be modified for different performance requirements.
|
||||||
|
|
||||||
|
Create marconi configuration file ```/etc/marconi.conf```::
|
||||||
|
|
||||||
|
[DEFAULT]
|
||||||
|
# Show more verbose log output (sets INFO log level output)
|
||||||
|
#verbose = False
|
||||||
|
|
||||||
|
# Show debugging output in logs (sets DEBUG log level output)
|
||||||
|
#debug = False
|
||||||
|
|
||||||
|
# Sharding and admin mode configs
|
||||||
|
sharding = True
|
||||||
|
admin_mode = True
|
||||||
|
|
||||||
|
# Log to this file!
|
||||||
|
log_file = /var/log/marconi-queues.log
|
||||||
|
debug = False
|
||||||
|
verbose = False
|
||||||
|
|
||||||
|
# This is taken care of in our custom app.py, so disable here
|
||||||
|
;auth_strategy = keystone
|
||||||
|
|
||||||
|
[keystone_authtoken]
|
||||||
|
admin_password = < admin password >
|
||||||
|
admin_tenant_name = < admin tenant name >
|
||||||
|
admin_user = < admin user >
|
||||||
|
auth_host = < identity service host >
|
||||||
|
auth_port = '443'
|
||||||
|
auth_protocol = 'https'
|
||||||
|
auth_uri = < identity service uri >
|
||||||
|
auth_version = < auth version >
|
||||||
|
token_cache_time = < token cache time >
|
||||||
|
memcache_servers = 'localhost:11211'
|
||||||
|
|
||||||
|
[oslo_cache]
|
||||||
|
cache_backend = memcached
|
||||||
|
memcache_servers = 'localhost:11211'
|
||||||
|
|
||||||
|
[drivers]
|
||||||
|
# Transport driver module (e.g., wsgi, zmq)
|
||||||
|
transport = wsgi
|
||||||
|
# Storage driver module (e.g., mongodb, sqlite)
|
||||||
|
storage = mongodb
|
||||||
|
|
||||||
|
[drivers:storage:mongodb]
|
||||||
|
uri = mongodb://mydb0,mydb1,mydb2:27017/?replicaSet=catalog&w=2&readPreference=secondaryPreferred
|
||||||
|
database = marconi
|
||||||
|
partitions = 8
|
||||||
|
|
||||||
|
# Maximum number of times to retry a failed operation. Currently
|
||||||
|
# only used for retrying a message post.
|
||||||
|
;max_attempts = 1000
|
||||||
|
|
||||||
|
# Maximum sleep interval between retries (actual sleep time
|
||||||
|
# increases linearly according to number of attempts performed).
|
||||||
|
;max_retry_sleep = 0.1
|
||||||
|
|
||||||
|
# Maximum jitter interval, to be added to the sleep interval, in
|
||||||
|
# order to decrease probability that parallel requests will retry
|
||||||
|
# at the same instant.
|
||||||
|
;max_retry_jitter = 0.005
|
||||||
|
|
||||||
|
# Frequency of message garbage collections, in seconds
|
||||||
|
;gc_interval = 5 * 60
|
||||||
|
|
||||||
|
# Threshold of number of expired messages to reach in a given
|
||||||
|
# queue, before performing the GC. Useful for reducing frequent
|
||||||
|
# locks on the DB for non-busy queues, or for worker queues
|
||||||
|
# which process jobs quickly enough to keep the number of in-
|
||||||
|
# flight messages low.
|
||||||
|
#
|
||||||
|
# Note: The higher this number, the larger the memory-mapped DB
|
||||||
|
# files will be.
|
||||||
|
;gc_threshold = 1000
|
||||||
|
|
||||||
|
[limits:transport]
|
||||||
|
queue_paging_uplimit = 1000
|
||||||
|
metadata_size_uplimit = 262144
|
||||||
|
message_paging_uplimit = 10
|
||||||
|
message_size_uplimit = 262144
|
||||||
|
message_ttl_max = 1209600
|
||||||
|
claim_ttl_max = 43200
|
||||||
|
claim_grace_max = 43200
|
||||||
|
|
||||||
|
[limits:storage]
|
||||||
|
default_queue_paging = 10
|
||||||
|
default_message_paging = 10
|
||||||
|
|
||||||
|
Start queuing service::
|
||||||
|
|
||||||
|
#/usr/bin/uwsgi --ini /srv/marconi/uwsgi.ini
|
||||||
|
|
||||||
|
|
||||||
|
Configure Shards
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
To have a functional queuing service, we need to define a shard. On one of the
|
||||||
|
web servers run this command::
|
||||||
|
|
||||||
|
curl -i -X PUT -H 'X-Auth-Token: $TOKEN' -d '{"weight": 100, "uri": "mongodb://mydb0,mydb1,mydb2:27017/?replicaSet=catalog&w=2&readPreference=secondaryPreferred", "options": {"partitions": 8}}' http://localhost:8888/v1/shards/shard1
|
||||||
|
|
||||||
|
Above ```$TOKEN``` is the authentication token retrieved from identity service.
|
||||||
|
If you choose not to enable keystone authentication you won't have to pass a token.
|
||||||
|
|
||||||
|
Reminder: In larger deployments, catalog database and queues databases (shards)
|
||||||
|
are going to be on different mongoDB replica-sets.
|
Loading…
Reference in New Issue
Block a user