For Solaris-only, look at "ZFS send" (assuming Solaris 10 update 2 or later).
The process is to first take a snapshot, and then "send" it to another place. Eg:
zfs snapshot POOL/dataset@backup1
zfs send POOL/dataset@backup1 | ssh $USER@$HOST zfs receive $TARGETPOOL/$TARGETDATASET
The above solution have rock solid reliability.
rsync is your second best option, but gives you the added benefit of being cross-platform. rsync does not ship with Solaris by default but can be easily installed from, eg Solaris Free Ware.
You should clean up your snapshots when you do not want them any longer. Keeping them around for a little while is good - you can use them to send incremental streams.
To do incremental streams, your second (and subsequent) backups will look like this:
zfs snapshot POOL/dataset@backup2
zfs send -i backup1 POOL/dataset@backup2 | ssh $USER@$HOST zfs receive $TARGETPOOL/$TARGETDATASET
zfs destroy POOL/dataset@backup1
Note: Destroy the previous-to-last snapshot, allowing you to do an incremental again next time!!!
Having many hundreds or thousands of snapshots lying around can be problematic. Firstly it severely affects the performance of management utilities, such as
zfs list. Secondly, as data changes under them, they start to hog space (They initially don't take up any disk space)
Tied with rsync is using cpio (in a similar way to how you use tar) ... cpio handles more strange files better than tar. In particular it handles sparse files, will re-create hard links if possible, and handles other file types properly.
find /backup_directory | cpio -o | ssh $USER@$HOST cpio -idm /target_directory
cpio -o = Create backup (Copy Out)
cpio -i = Restore from backup (Copy in)
The -d and -m are to re-create the directory structure and maintain permissions/modification times, etc, respectively.
tar is everybody's favourite because .... well, there is no good reason. tar works fine if you know you will only ever have plain files.