'readFromBackup' defines if it's allowed to read the local value from the backup. I.e. if you're executing get(K) on the server node, this node is backup for the K and readFromBackup is false, Ignite will send the request to primary node and get the value from there. By default the value is true, so is the entry is available locally, no network trips are required.
'copyOnRead' defines whether the copy of the value is created before it's returned from the cache. Of course, this makes sense only if the value is read locally (e.g., if in case of get() on primary or backup node, in case of invoke(), etc.). Setting this to false can improve performance, because you avoid additional deserialization step, but it's not safe to mutate the value that you read in this case, so usually it's used only for immutable objects.