You’re right, Ignite does not provide any built-in facilities for this. There are some commercial solutions for replication, or you could write code that listens to changes and pushes them on a queue/message bus.
Whether this is worth doing depends on how reliable and fast your network is, and your RPO/RTO requirements. > On 16 Aug 2021, at 12:30, Courtney Robinson <courtney.robin...@hypi.io> wrote: > > Hi Stephen, > We've been considering those points you've raised. The challenge with having > isolated clusters is how to deal with synchronisation issues. In one cluster, > Ignite will handle an offline node re-joining the cluster. If there are > multiple clusters we'd need to detect and replay changes from the application > side effectively duplicating a part of what Ignite's doing. > > Did I miss anything and if not, how would you suggest handling this in the > case of multiple clusters - one in each data centre? > > Regards, > Courtney Robinson > Founder and CEO, Hypi > Tel: ++44 208 123 2413 (GMT+0) <https://hypi.io/> > > <https://hypi.io/>https://hypi.io <https://hypi.io/> > > On Mon, Aug 16, 2021 at 10:19 AM Stephen Darlington > <stephen.darling...@gridgain.com <mailto:stephen.darling...@gridgain.com>> > wrote: > A word of caution: you’re generally better replicating your data across > clusters than stretching a single cluster across data centres. If the latency > is very low it should work, but it could degrade your throughput and you need > to be careful about split-brain and other networking issues. > > Regards, > Stephen > >> On 5 Aug 2021, at 15:24, Courtney Robinson <courtney.robin...@hypi.io >> <mailto:courtney.robin...@hypi.io>> wrote: >> >> Hi Alex, >> Thanks for the reply. I'm glad I asked before the team went any further. >> So we can achieve this with the built in affinity function and the backup >> filter. The real complexity is going to be in migrating our existing caches. >> >> So to clarify the steps involved here are >> because Ignite registers all env. vars as node attributes we can set e.g. >> NODE_DC=<EU_WEST|EU_EAST|CAN0> as an environment var in each k8s cluster >> Then set the backup filter's constructor-arg.value to be NODE_DC. This will >> tell Ignite that two backups cannot be placed on any two nodes with the same >> NODE_DC value - correct? >> When we call create table, we must set template=myTemplateName >> Before creating any tables, myTemplateName must be created and must include >> the backup filter with NODE_DC >> Have I got that right? >> >> If so, it seems simple enough. Now the real challenge is where you said the >> cache has to be re-created. >> >> I can't see how we do this without major down time, we have functionality in >> place that allows customers to effectively do a "copy from table A to B and >> then delete A" but it will be impossible to get all of them to do this any >> time soon. >> >> Has anyone else had to do something similar, how is the community generally >> doing migrations like this? >> >> Side note: The only thing that comes to mind is that we will need to build a >> virtual catalog that we maintain so that there isn't a one to one mapping >> between customer tables and the actual Ignite table name. >> So if a table is currently called A and we add a virtual catalog then we >> keep a mapping that says when the user wants to call "A" it should really go >> to table "A_v2" or something. This comes with its own challenge and a >> massive testing overhead. >> >> Regards, >> Courtney Robinson >> Founder and CEO, Hypi >> Tel: ++44 208 123 2413 (GMT+0) <https://hypi.io/> >> >> <https://hypi.io/>https://hypi.io <https://hypi.io/> >> >> On Thu, Aug 5, 2021 at 11:43 AM Alex Plehanov <plehanov.a...@gmail.com >> <mailto:plehanov.a...@gmail.com>> wrote: >> Hello, >> >> You can create your own cache templates with the affinity function you >> require (currently you use a predefined "partitioned" template, which only >> sets cache mode to "PARTITIONED"). See [1] for more information about cache >> templates. >> >> > Is this the right approach >> > How do we handle existing data, changing the affinity function will cause >> > Ignite to not be able to find existing data right? >> You can't change cache configuration after cache creation. In your example >> these changes will be just ignored. The only way to change cache >> configuration - is to create the new cache and migrate data. >> >> > How would you recommend implementing the affinity function to be aware of >> > the data centre? >> It's better to use the standard affinity function with a backup filter for >> such cases. There is one shipped with Ignite (see [2]). >> >> [1]: >> https://ignite.apache.org/docs/latest/configuring-caches/configuration-overview#cache-templates >> >> <https://ignite.apache.org/docs/latest/configuring-caches/configuration-overview#cache-templates> >> [2]: >> https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/cache/affinity/rendezvous/ClusterNodeAttributeAffinityBackupFilter.html >> >> <https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/cache/affinity/rendezvous/ClusterNodeAttributeAffinityBackupFilter.html> >> чт, 5 авг. 2021 г. в 09:40, Courtney Robinson <courtney.robin...@hypi.io >> <mailto:courtney.robin...@hypi.io>>: >> Hi all, >> Our growth with Ignite continues and as we enter the next phase, we need to >> support multi-cluster deployments for our platform. >> We deploy Ignite and the rest of our stack in Kubernetes and we're in the >> early stages of designing what a multi-region deployment should look like. >> We are 90% SQL based when using Ignite, the other 10% includes Ignite >> messaging, Queues and compute. >> >> In our case we have thousands of tables >> CREATE TABLE IF NOT EXISTS Person ( >> id int, >> city_id int, >> name varchar, >> company_id varchar, >> PRIMARY KEY (id, city_id) >> ) WITH "template=..."; >> In our case, most tables use a template that looks like this: >> >> partitioned,backups=2,data_region=hypi,cache_group=hypi,write_synchronization_mode=primary_sync,affinity_key=instance_id,atomicity=ATOMIC,cache_name=Person,key_type=PersonKey,value_type=PersonValue >> >> I'm aware of affinity co-location >> (https://ignite.apache.org/docs/latest/data-modeling/affinity-collocation >> <https://ignite.apache.org/docs/latest/data-modeling/affinity-collocation>) >> and in the past when we used the key value APIs more than SQL we also used >> custom affinity a function to control placement. >> >> What I don't know is how to best do this with SQL defined caches. >> We will have at least 3 Kubernetes clusters, each in a different data >> centre, let's say EU_WEST, EU_EAST, CAN0 >> >> Previously we provided environment variables that our custom affinity >> function would use and we're thinking of providing the data centre name this >> way. >> >> We have 2 backups in all cases + the primary and so we want the primary in >> one DC and each backup to be in a different DC. >> >> There is no syntax in the SQL template that we could find to enables >> specifying a custom affinity function. >> Our instance_id column currently used has no common prefix or anything to >> associate with a DC. >> >> We're thinking of getting the cache for each table and then setting the >> affinity function to replace the default RendevousAffinityFunction the way >> we did before we switched to SQL. >> Something like this: >> repo.ctx.ignite.cache("Person").getConfiguration(org.apache.ignite.configuration.CacheConfiguration) >> .setAffinity(new org.apache.ignite.cache.affinity.AffinityFunction() { >> ... >> }) >> >> There are a few things unclear about this: >> Is this the right approach? >> How do we handle existing data, changing the affinity function will cause >> Ignite to not be able to find existing data right? >> How would you recommend implementing the affinity function to be aware of >> the data centre? >> Are there any other caveats we need to be thinking about? >> There is a lot of existing data, we want to try to avoid a full copy/move to >> new tables if possible, that will prove to be very difficult in production. >> >> Regards, >> Courtney Robinson >> Founder and CEO, Hypi >> Tel: ++44 208 123 2413 (GMT+0) <https://hypi.io/> >> >> <https://hypi.io/>https://hypi.io <https://hypi.io/> >