The sync part is easy for rsync; with the proper set of parameters, it can sync in a variety of ways.
The non-disruptive part, however, would be a problem. Your best bet may be to programatically handle the final sync yourself. You could run an rsync on a live database to copy over what could be done, then quiesce the database/application, flush the data to the volume if need be, and then run a final 'rsync --inplace' to grab the updated blocks.