Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question regarding ZkBookieRackAffinityMapping #151

Closed
estebangarcia opened this issue Dec 21, 2016 · 3 comments
Closed

Question regarding ZkBookieRackAffinityMapping #151

estebangarcia opened this issue Dec 21, 2016 · 3 comments

Comments

@estebangarcia
Copy link

estebangarcia commented Dec 21, 2016

Hi. I couldn't find any information on the docs on how to tell pulsar to write on different bookies depending on which rack/region/az they are.

Searching the code I found the class ZkBookieRackAffinityMapping, that (correct me if I'm wrong), expects a json with the 'topology' on a znode called /bookie that will use to determine on which bookie write.

So we went ahead and created a little java process that checks the available bookies on /ledgers/available and writes that json, the output is similar to the one I've attached.

My main question here is, are we doing it right ? 😛
And how can we check if it's working?
Should we tell pulsar to use this class ?

Any help will be much appreciated. Thanks

bookie.txt

@merlimat
Copy link
Contributor

Yes, this is another area where we need to add more documentation.

We use the BookKeeper rack-aware placement policy. The "rack" concept can be anything, (rack/region/availability zone). The base idea is: when forming the ensemble for a new ledger, pick bookies from different racks, to reduce the chances of data unavailability.

If bookies from different racks are not available, the policy falls back to chose randomly across available bookies.

The ZkBookieRackAffinityMapping is a way to feed the rack information into the rack-aware policy. The JSON z-node content you've attached looks correct. The first level is the group-name, and can be used to provide bookie isolation (strictly picking from a subset of bookies).

You only need to update the /bookies z-node when you add new bookies. There is no need to update it when processes are up or down, that is controlled by the list in /ledgers/available.

If the /bookies z-node is not there, the BK client will choose randomly. Same thing if all bookies are in the same "rack" (whatever that means).

So, in AWS, you'd probably want to create instances in different AZs and update the /bookies z-node to reflect that.

My main question here is, are we doing it right ? 😛

Yes, just make sure you have bookies from different "racks" in the configuration.

And how can we check if it's working?

You should be able to verify that all ledgers should have the ensemble containing bookies from different AZs :

bin/bookkeeper shell ledgermetadata -ledgerid $MY_LEDGER_ID

Should we tell pulsar to use this class ?

It's automatically used when bookkeeperClientRackawarePolicyEnabled=true is set on conf/broker.conf.

@estebangarcia
Copy link
Author

estebangarcia commented Jan 30, 2017

@merlimat We're getting lots of this messages:

2017-01-30 19:44:40,500 - WARN - [pulsar-io-39-5:RackawareEnsemblePlacementPolicy@526] - Failed to choose a bookie from /default-rack : excluded [], fallback to choose bookie randomly from the cluster.

Is this normal? It looks like our topolopgy is not being used. Contents of our znode /bookie

{"us-east-1":{"10.64.103.105:3181":{"rack":"us-east-1d","hostname":"ip-10-64-103-105.ec2.internal"},"10.64.102.228:3181":{"rack":"us-east-1c","hostname":"ip-10-64-102-228.ec2.internal"},"10.64.102.146:3181":{"rack":"us-east-1c","hostname":"ip-10-64-102-146.ec2.internal"},"10.64.103.213:3181":{"rack":"us-east-1e","hostname":"ip-10-64-103-213.ec2.internal"},"10.64.102.121:3181":{"rack":"us-east-1a","hostname":"ip-10-64-102-121.ec2.internal"},"10.64.102.43:3181":{"rack":"us-east-1a","hostname":"ip-10-64-102-43.ec2.internal"}}}

@estebangarcia
Copy link
Author

Looking at a random ledger metadata, we can see the ensemble members are all from different AZs, but we don't know if it's just a coincidence or if the affinity is really working and that WARN is expected.

sijie pushed a commit to sijie/pulsar that referenced this issue Mar 4, 2018
* fixing spacing

* adding end file newline
sijie pushed a commit that referenced this issue Jun 22, 2018
### Motivation

Currently we don't have tools to manage the rack placement configuration for bookies in a Pulsar cluster. 

### Modifications

 * Added `/admin/v2/bookie` REST handler
 * Added `admin.bookie()` in Java admin client
 * Added `pulsar-admin bookies ...` CLI tool 
 * Worked around an issue with bookie hostname and hostname:port that prevented BK client to detect the correct rack.

Fixes #151
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants