There's something fundamentally broken with your problem statement. Suppose that your servers are in synch, and then you create a file
aaaa.jpg on Node 2. Should the next synchronization delete that spurious file from Node 2 (since it doesn't exist on Node 1, it must have been deleted), or should it copy the file to Node 1 (since it doesn't exist on Node 1, it must be newly created)?
The order in which you run the synchronizations will determine what happens in each case. This is practically guaranteed not to give the desired outcome in many cases. Worse, if the synchronizations run in parallel (so that one of the hosts is being updated by its own synchronization job and at the same time is being traversed by the synchronization job running on the other host), the result will look rather random.
Rsync is fundamentally designed for one-way synchronization. You can't just run two rsync jobs and hope to do two-way synchronization.
Unison is a file synchronizer designed for two-way synchronization. It's the closest thing to the right tool for your task. Set it up and run
unison -auto remote.example.com://path/to/directory /path/to/directory on one of the hosts.
No matter what tool you use, there is the potential for conflicts, for example if the same file is replaced by two different versions on the two different machines. There is no good automated way to resolve such conflicts, so manual intervention will be required.
In most setups, the right thing is to designate a single server as the place to upload, and synchronize all the other servers from that master server. If someone uploads a file to a slave, make it relay the upload to the master; don't change anything locally. Whenever a file changes on the master, push it out to the slave(s).