Easy Scaling with Open Source Data Structures, by Talip Ozturk
-
Upload
zeroturnaround -
Category
Technology
-
view
1.636 -
download
1
Transcript of Easy Scaling with Open Source Data Structures, by Talip Ozturk
![Page 1: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/1.jpg)
Easy scaling with distributed data
structures
Talip Ozturk@oztalip
![Page 2: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/2.jpg)
Keywords
In-memory data grid
Distributed(Elastic) Cache
NoSQL
Clustering, Scalability, Partitioning
Cloud Computing
![Page 3: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/3.jpg)
Map
import java.util.Map; import java.util.HashMap;
Map map = new HashMap();map.put(“1”, “value”); map.get(“1”);
![Page 4: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/4.jpg)
Concurrent Map
import java.util.Map; import java.util.concurrent.*;
Map map = new ConcurrentHashMap();map.put(“1”, “value”); map.get(“1”);
![Page 5: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/5.jpg)
Distributed Map
import java.util.Map; import com.hazelcast.core.Hazelcast;
Map map = Hazelcast.getMap(“mymap”);map.put(“1”, “value”); map.get(“1”);
![Page 6: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/6.jpg)
HAZELCAST
Art of Data Distributionopen source, in-memory data grid
Talip Ozturk@oztalip
![Page 7: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/7.jpg)
Who uses Hazelcast?
Financials
Telco
Gaming
e-commerce
Every sec. one Hazelcast node starts around the globe
![Page 8: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/8.jpg)
9th Fastest Growing Skill
![Page 9: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/9.jpg)
Why Hazelcast?
To build highly available and scalable applications
![Page 10: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/10.jpg)
Alternatives
Oracle Coherence
IBM Extreme Scale
VMware Gemfire
Gigaspaces
Redhat Infinispan
Gridgain
Terracotta
![Page 11: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/11.jpg)
Difference
License/Cost
Feature-set
API
Ease of use
Main focus (distributed map, tuple space, cache, processing vs. data)
Light/Heavy weight
![Page 12: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/12.jpg)
HAZELCAST
![Page 13: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/13.jpg)
Apache License
![Page 14: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/14.jpg)
1.7 MB jar
Lightweight without any dependency
![Page 15: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/15.jpg)
Introducing Hazelcast
Map, queue, set, list, lock, semaphore, topic and executor service
Native Java, C#, REST and Memcache Interfaces
Cluster info and membership events
Dynamic clustering, backup, fail-over
Transactional and secure
![Page 16: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/16.jpg)
Use-cases
Scale your application
Share data across cluster
Partition your data
Send/receive messages
Balance the load
Process in parallel on many JVM
![Page 17: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/17.jpg)
Where is the Data?
![Page 18: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/18.jpg)
Data Partitioning in a Cluster
Fixed number of partitions (default 271)
Each key falls into a partition
partitionId = hash(keyData)%PARTITION_COUNT
Partition ownerships are reassigned upon membership change
A B C
![Page 19: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/19.jpg)
New Node Added
DA B C
![Page 20: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/20.jpg)
Migration
DA B C
![Page 21: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/21.jpg)
Migration
DA B C
![Page 22: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/22.jpg)
Migration
DA B C
![Page 23: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/23.jpg)
Migration
DA B C
![Page 24: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/24.jpg)
Migration
DA B C
![Page 25: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/25.jpg)
Migration
DA B C
![Page 26: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/26.jpg)
Migration Complete
DA B C
Crash
![Page 27: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/27.jpg)
Node Crashes
DA B C
Crash
![Page 28: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/28.jpg)
Restoring Backups
DA B C
Crash
![Page 29: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/29.jpg)
Restoring Backups
DA B C
Crash
![Page 30: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/30.jpg)
Restoring Backups
DA B C
Crash
![Page 31: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/31.jpg)
Restoring Backups
DA B C
Crash
![Page 32: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/32.jpg)
Restoring Data from Backup
DA B C
Crash
![Page 33: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/33.jpg)
Data is Recovered from Backup
DA B C
Crash
![Page 34: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/34.jpg)
Backup for Recovered Data
DA B C
Crash
![Page 35: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/35.jpg)
Backup for Recovered Data
DA B C
Crash
![Page 36: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/36.jpg)
Backup for Recovered Data
DA B C
Crash
![Page 37: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/37.jpg)
All Safe
DA C
![Page 38: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/38.jpg)
Node Types
![Page 39: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/39.jpg)
Topology
Native Client:
HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);
Lite Member:
-Dhazelcast.lite.member=true
![Page 40: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/40.jpg)
Hazelcast Enterprise
![Page 41: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/41.jpg)
Community vs Enterprise
Enterprise =
Community +
Elastic Memory + Security + Man. Center
![Page 42: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/42.jpg)
Elastic Memory is OFF-HEAP storage
<hazelcast>
... <map name="default"> ... <storage-type>OFFHEAP</storage-type> </map></hazelcast>
![Page 43: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/43.jpg)
JAAS based Security
Credentials
Cluster Login Module
Cluster Member Security
Native Client Security
Authentication
Authorization
Permission
![Page 44: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/44.jpg)
Code Samples
![Page 45: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/45.jpg)
Hazelcast
Hazelcast is thread safe
Many instances on the same JVMConfig config = new Config();HazelcastInstance h1 = Hazelcast.newHazelcastInstance(config)HazelcastInstance h2 = Hazelcast.newHazelcastInstance(config)
All objects must be serializableclass Employee implements java.io.Serializable //betterclass Employee implements com.hazelcast.nio.DataSerializable
Map<String, Employee> = Hazelcast.getMap(“employees”);List<Users> = Hazelcast.getList(“users”);
![Page 46: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/46.jpg)
Cluster Interface
import com.hazelcast.core.*; import java.util.Set;
Cluster cluster = Hazelcast.getCluster(); cluster.addMembershipListener(listener);
Member localMember = cluster.getLocalMember(); System.out.println (localMember.getInetAddress());
Set<Member> setMembers = cluster.getMembers();
![Page 47: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/47.jpg)
Distributed Map
import com.hazelcast.core.*; import java.util.ConcurrentMap;
Map<String, Customer> map = Hazelcast.getMap("customers"); map.put ("1", customer); Customer c = map.get("1");
//ConcurrentMap methodsmap.putIfAbsent ("2", new Customer(“Chuck Norris”));map.replace ("3", new Customer(“Bruce Lee”));
![Page 48: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/48.jpg)
Distributed Queue
import com.hazelcast.core.Hazelcast; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit;
BlockingQueue<Task> queue = Hazelcast.getQueue(“tasks");
queue.offer(task);Task t = queue.poll();
//Timed blocking Operationsqueue.offer(task, 500, TimeUnit.MILLISECONDS)Task t = queue.poll(5, TimeUnit.SECONDS);
//Indefinitely blocking Operationsqueue.put(task)Task t = queue.take();
![Page 49: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/49.jpg)
Distributed Lock
import com.hazelcast.core.Hazelcast; import java.util.concurrent.locks.Lock;
Lock mylock = Hazelcast.getLock(mylockobject); mylock.lock(); try {// do something} finally { mylock.unlock();}
//Lock on MapIMap<String, Customer> map = Hazelcast.getMap("customers");map.lock("1");try {// do something} finally { map.unlock("1");}
![Page 50: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/50.jpg)
Distributed Topic
import com.hazelcast.core.*;
public class Sample implements MessageListener { public static void main(String[] args) { Sample sample = new Sample(); ITopic<String> topic = Hazelcast.getTopic ("default"); topic.addMessageListener(sample); topic.publish ("my-message-object"); } public void onMessage(Object msg) { System.out.println("Got msg :" + msg); }}
![Page 51: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/51.jpg)
Distributed Events
import com.hazelcast.core.*;
public class Sample implements EntryListener { public static void main(String[] args) { Sample sample = new Sample(); IMap map = Hazelcast.getMap ("default"); map.addEntryListener (sample, true); map.addEntryListener (sample, "key"); } public void entryAdded(EntryEvent event) { System.out.println("Added " + event.getKey() + ":" + event.getValue()); } public void entryRemoved(EntryEvent event) { System.out.println("Removed " + event.getKey() + ":" + event.getValue()); } public void entryUpdated(EntryEvent event) { System.out.println("Updated " + event.getKey() + ":" + event.getValue()); }}
![Page 52: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/52.jpg)
Executor Service
![Page 53: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/53.jpg)
Hello Task
A simple task
Execute on any memberExecutorService ex = Hazelcast.getExecutorService();Future<String> future = executor.submit(new HelloTask());// ...String result = future.get();
Attach a callbackDistributedTask task = ... task.setExecutionCallback(new ExecutionCallback() { public void done(Future f) {
// Get notified when the task is done! }});
public class HelloTask implements Callable<String>, Serializable{ @Override public String call(){ Cluster cluster = Hazelcast.getCluster(); return “Hello from ” + cluster.getLocalMember();}
![Page 54: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/54.jpg)
Hazelcast can execute a task ...
ExecutorService executor = Hazelcast.getExecutorService(); FutureTask<String> task1, task2;
// CASE 1: Run task on a specific member.Member member = ... task1 = new DistributedTask<String>(new HelloTask(), member); executor.execute(task1);
// CASE 2: Run task on a member owning the key.Member member = ... task1 = new DistributedTask<String>(new HelloTask(), “key”); executor.execute(task1);
// CASE 3: Run task on group of members.Set<Member> members = ... task = new MultiTask<String>(new HelloTask(), members); executor.execute(task2);
1. On a specific node2. On any available node3. On a collection of defined nodes4. On a node owning a key
![Page 55: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/55.jpg)
Executor Service Scenario
public int removeOrder(long customerId, long orderId){ IMap<Long, Customer> map = Hazelcast.getMap("customers"); map.lock(customerId); Customer customer = map.get(customerId); customer.removeOrder (orderId); map.put(customerId, customer); map.unlock(customerId); return customer.getOrderCount();}
![Page 56: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/56.jpg)
Add Bonus Task
public class OrderDeletionTask implements Callable<Integer>, PartitionAware, Serializable {
private long customerId; private long orderId;
public OrderDeletionTask(long customerId, long orderId) { super(); this.customerId = customerId; this.orderId = orderId; }
public Integer call () { IMap<Long, Customer> map = Hazelcast.getMap("customers"); map.lock(customerId); customer customer = map. get(customerId); customer.removeOrder (orderId); map.put(customerId, customer); map.unlock(customerId); return customer.getOrderCount(); }
public Object getPartitionKey() { return customerId; }}
![Page 57: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/57.jpg)
Send computation over data
public static int removeOrder(long customerId, long orderId){ ExecutorService es = Hazelcast.getExecutorService(); OrderDeletionTask task = new OrderDeletionTask(customerId, orderId); Future future = es.submit(task); int remainingOrders = future.get(); return remainingOrders;}
![Page 58: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/58.jpg)
Query
![Page 59: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/59.jpg)
Code Samples – Querypublic class Customer { private boolean active; private String name; private int age; // getters
// setters
}
![Page 60: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/60.jpg)
Code Samples – Queryimport com.hazelcast.core.Hazelcast;import com.hazelcast.core.IMap;import com.hazelcast.query.SqlPredicate;import java.util.Collection;
IMap map = Hazelcast.getMap(“customers”);
map.addIndex(“active” ,false);map.addIndex(“name” ,false);map.addIndex(“age” ,true);
Collection<Customer> customers = map.values(new SqlPredicate(“active AND age <= 30”));
![Page 61: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/61.jpg)
Persistence
![Page 62: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/62.jpg)
import com.hazelcast.core.MapStore,import com.hazelcast.core.MapLoader,
public class MyMapStore implements MapStore, MapLoader { public Set loadAllKeys () {
return readKeys();}
public Object load (Object key) {return readFromDatabase(key);
}
public void store (Object key, Object value) { saveIntoDatabase(key, value);}
public void remove(Object key) { removeFromDatabase(key);}
}
Persistence
![Page 63: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/63.jpg)
Write-Behind : asynchronously storing entriesWrite-Through : synchronousRead-Through : if get(key) is null, load it
Persistence
![Page 64: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/64.jpg)
Recap
• Distributed implementation of
• Map
• Queue
• Set
• List
• MultiMap
• Lock
• Executor Service
• Topic
• Semaphore
• AtomicLong
• CountDownLatch
• Embedded, but accessible through
• Native Java & C# Client
• REST
• Memcache
• Dynamic
• Cluster
• Add/ remove nodes
• Backup
• Fail-over
![Page 65: Easy Scaling with Open Source Data Structures, by Talip Ozturk](https://reader034.fdocuments.net/reader034/viewer/2022042814/554d1985b4c905d4568b5736/html5/thumbnails/65.jpg)
Q & A
Thank you!!!
@oztalip