Hi, 1. By default get() will read backups if node, on which it's invoked is affinity node. In other words, if current node has backups, Ignite prefer to read local data from backup rather requesting primary node over network. This can be changed by setting CacheConfiguration.setReadFromBackup(false) [1].
2. It depends on operations that you call. If you use get() - request will go to primary node only. If you do SQL query by primary key or affinity key - it will go to primary node too. In other cases SQL will be invoked on all nodes as it doesn't know beforehand what data nodes have data satisfied your query. 3. Optimal configuration is highly depends on your cluster size and hardware resources. In your case, you have three node and 2 backups, that means each node keeps full dataset and if two of three nodes failed, you don't loose data. But if you have more data than available memory for one node, than it's better either reduce number of backups or increase number of nodes. IMO the best backup configuration is that allows you to loose 20-30% of nodes without loosing data. 4. On node fail, affinity function will re-maps partitions between live nodes, re-balance them and restores number of backups. The more sophisticated behavior if you use persistence, because baseline topology will try to avoid re-balancing [2]. [1] https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/configuration/CacheConfiguration.html#setReadFromBackup-boolean- [2] https://apacheignite.readme.io/docs/baseline-topology Thanks! -Dmitry -- Sent from: http://apache-ignite-users.70518.x6.nabble.com/