leadership election with spring cloud cluster

21
Locks and Leaders with Spring Integration Dave Syer, 2016 Twitter: @david_syer (see also @artem_bilan, @gprussell) Email: [email protected]

Upload: spring-by-pivotal

Post on 16-Apr-2017

1.046 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Leadership Election with Spring Cloud Cluster

Locks and Leaders with SpringIntegration

Dave Syer, 2016 Twitter: @david_syer (see also @artem_bilan, @gprussell) Email: [email protected]

Page 2: Leadership Election with Spring Cloud Cluster

AgendaWhat is a distributed lock?

What is a leader election?

What is it good for?

How do I do it?

Some tools for thinking about failure

Warning: Here be Dragons!

Page 3: Leadership Election with Spring Cloud Cluster

A Simple Distributed Operation

Page 4: Leadership Election with Spring Cloud Cluster

Two Clients

Page 5: Leadership Election with Spring Cloud Cluster

Shuffle!

Page 6: Leadership Election with Spring Cloud Cluster

Shuffle!

Page 7: Leadership Election with Spring Cloud Cluster

Shuffle!

Page 8: Leadership Election with Spring Cloud Cluster

Shuffle!

Page 9: Leadership Election with Spring Cloud Cluster

Shuffle!

Page 10: Leadership Election with Spring Cloud Cluster

Shuffle!

Page 11: Leadership Election with Spring Cloud Cluster

Scary, Eh?

Page 12: Leadership Election with Spring Cloud Cluster

LocksExample code using java.util.concurrent.locks.Lock:

boolean acquired = false; try acquired = lock.tryLock(10, TimeUnit.SECONDS); if (acquired) // Do something unique! catch (InterruptedException e) Thread.currentThread().interrupt(); throw new RuntimeException("Interrupted"); finally if (acquired) lock.unlock();

Page 13: Leadership Election with Spring Cloud Cluster

Spring Integration: LockRegistrypublic interface LockRegistry Lock obtain(Object lockKey);

Page 14: Leadership Election with Spring Cloud Cluster

Locks with Spring IntegrationExample code using LockRegistry:

boolean acquired = false; try acquired = lock.tryLock(10, TimeUnit.SECONDS); if (acquired) // Do something unique! catch (InterruptedException e) Thread.currentThread().interrupt(); throw new RuntimeException("Interrupted"); finally if (acquired) lock.unlock();

(same code)

Page 15: Leadership Election with Spring Cloud Cluster

Locks and LeasesA distributed lock nearly always has a shelf life (it expires).

Technically, that makes it a "lease".

Without expiry system can't make progress when a lock holder dies.

Page 16: Leadership Election with Spring Cloud Cluster

Dragons(At least) two problems are lurking:

1. Acquiring a lock requires consensus.

2. Leases expire and holder can never be sure when that happens.

Read this: http://martin.kleppmann.com/2016/02/08/how­to­do­distributed­locking.html

TL;DR If using a lock for "correctness" not "efficiency" be very careful.

Important: you can tune the system to adjust the probability, or how long it lasts, but fundamentally you cannotprevent the system from ever allowing more than one holder of a lock.

Page 17: Leadership Election with Spring Cloud Cluster

Leader Elections

Simple idea: if you hold a lock you are the leader.

What can you do with it?

Highly available globally unique things, often with messages

sequences

message aggregation

scheduling, e.g. cron service

Page 18: Leadership Election with Spring Cloud Cluster

Spring Integration: Leader InitiatorImplementations of leader election need to be able to start an election and fire events on granted and revoked.

Zookeeper

Hazelcast

Etcd(*)

Generic (lock­based)

For a user it looks like this (create a new bean which is a SmartLifecycle):

@Bean public LeaderInitiator leaderInitiator(CuratorFramework client, Candidate candidate) return new LeaderInitiator(client, candidate);

(*) No support for etcd v3. Probably dead.

Page 19: Leadership Election with Spring Cloud Cluster

Spring Integration: CallbacksCallbacks on leadership events:

public interface Candidate void onGranted(Context ctx) throws InterruptedException; void onRevoked(Context ctx); ...

See also:

@EventListener(OnGrantedEvent.class) public void start()

@EventListener(OnRevokedEvent.class) public void stop()

Page 20: Leadership Election with Spring Cloud Cluster

ClosingWhen to use locks and leaders: HA active/passive failover

How to avoid it: latency from restarting a failed app might be fine

Otherwise, be idempotent. For correctness, de­duplication store has to be ACID.

Relational databases can be really useful, as is Zookeeper.

Careful with the physics.

Page 21: Leadership Election with Spring Cloud Cluster

Linkshttp://presos.dsyer.com/decks/locks­and­leaders.html

Sample code: https://github.com/SpringOnePlatform2016/dsyer­locks­and­leaders

Spring Integration: https://github.com/spring­projects/spring­integration

Spring Cloud Cluster: https://github.com/spring­cloud/spring­cloud­cluster