At first, I do like the idea of this guy about solutions of encountered problem in OpenStack that is Synchronization of multiple distributed workers (https://julien.danjou.info/blog/2014/python-distributed-membership-lock-with-tooz).

We can see that there is a lots of dependencies and interactions between services of OpenStack. It does really take time for services cooperating for each wanted task, for example, if we want to boot an instance, Nova has to make a lots of calls to Neutron, Glance, Storage and does a lots of internal self actions like conducting, scheduling, etc. In the distributed architecture of OpenStack, some internal components of each service are distributed (e.g Nova compute, l3-agent, etc.). We have some solutions for distributed systems such as Zookeeper, Redis, Memcached, etc. and their roles are reporting to controllers about the status of members in the group that they take care about (which one is online, which one is responding, which one is offline, leaving the group, etc.). But the main problem is that not all of the solutions have the same robustness, functionalities. The fact that if we implement only one solution for all of the services, it does not utilize the advantages of others or even make some obstacles for implementing new applications, plugins to OpenStack environment. On the other hand, if we use multiple solutions for each service, it will create some of asynchronization, uncooperative between them.

The idea for this concept is creating a general solution by which developers, operators can choose whichever backend to use due to the purpose of usage or applications, plugins implementation. Tooz is nothing else but the abstraction layers for some current supported backends such as memcached, zookeeper, etc.(http://docs.openstack.org/developer/tooz/drivers.html).

In this below example, I will show you how to use zookeeper backend with Tooz on localhost:

I use magic vagrant to boot a virtual machine with Trusty image of Ubuntu and do some below steps:

1. Down load zookeeper package:

2. Execute the following instructions:

  • tar -xvf zookeeper-3.4.6.tar.gz
  • mkdir -p /var/lib/zookeeper

3. Put the “1” to myid in /var/lib/zookeeper/myid (or any id number if you want but you must provide the same ID in zoo.cfg):

  • echo “1” > /var/lib/zookeeper/myid

4. Put the following configs to conf/zoo.cfg in zookeeper directory:

tickTime=2000

dataDir=/var/lib/zookeeper

clientPort=2181

server.1=127.0.0.1:2888:3888

Note that the above values are default of zookeeper except server ID and host (127.0.0.1). You can change the tickTime or ports if you want.

5. Activate zookeeper:

  • cd zookeeper-3.4.6
  • bin/zkServer.sh start
  • bin/zkCli.sh -server 127.0.0.1:2181

If you see some errors, that means Java is not installed in your Ubuntu:

  • apt-get install -y python-software-properties
  • add-apt-repository ppa:webupd8team/java
  • apt-get update
  • apt-get install -y oracle-java8-installer

Run again:

  • bin/zkCli.sh -server 127.0.0.1:2181

zookeeper

 

6. Install Tooz:

  • pip install tooz

7. Check the list of backends of tooz:

>>> from pkg_resources import iter_entry_points

>>> for object in iter_entry_points( group='tooz.backends', name=None):

...             print object

...

ipc = tooz.drivers.ipc:IPCDriver

postgresql = tooz.drivers.pgsql:PostgresDriver

kazoo = tooz.drivers.zookeeper:KazooDriver

zookeeper = tooz.drivers.zookeeper:KazooDriver

redis = tooz.drivers.redis:RedisDriver

zake = tooz.drivers.zake:ZakeDriver

file = tooz.drivers.file:FileDriver

mysql = tooz.drivers.mysql:MySQLDriver

memcached = tooz.drivers.memcached:MemcachedDriver

8. I use zookeeper in this example so I will use kazoo driver. Install kazoo:

  • pip install kazoo

9. Using zookeeper to call tooz:

>>> from tooz import coordination

>>> coordinator = coordination.get_coordinator('kazoo://127.0.0.1:2181', b'host-1')

>>> coordinator.start()

 

10. Check with zookeeper cli:

  • bin/zkCli.sh -server 127.0.0.1:2181

zk_tooz

 

You can extend this example by using this below instruction:

http://docs.openstack.org/developer/tooz/tutorial/index.html

Otherwise, this Tooz is now useful for solving the problems of group membership, leader election for distributed components in OpenStack. We can easily contribute more for Tooz project or write plugins to enforce Tooz to do more fucntions such as VM monitoring, host monitoring, etc.

In Nova, there is a spec that will replace service group primitives such as Zookeeper, Memcached by Tooz. Actually, tooz is now implemented in Ceilometer, Nova is on its way:

http://specs.openstack.org/openstack/nova-specs/specs/liberty/approved/service-group-using-tooz.html

 

8/8/2015

VietStack team