ZEO/ZRS bad handshake 'zrs2.1'

I'm setting up ZRS between two machines running Plone 4.3.7.

On the master at, I keep seeing this traceback:

2016-02-04T04:30:49 ( Error caught in asyncore
Traceback (most recent call last):
  File "/usr/lib/python2.7/asyncore.py", line 83, in read
  File "/usr/lib/python2.7/asyncore.py", line 449, in handle_read_event
  File "/usr/local/plone-4.3/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZEO/zrpc/smac.py", line 240, in handle_read
  File "/usr/local/plone-4.3/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZEO/zrpc/connection.py", line 631, in recv_handshake
    Connection.recv_handshake(self, proto)
  File "/usr/local/plone-4.3/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZEO/zrpc/connection.py", line 406, in recv_handshake
    raise ZRPCError("bad handshake %r" % proto)
ZRPCError: bad handshake 'zrs2.1'
2016-02-04T04:30:49 (unconnected) disconnected

On the slave at, I see this:

2016-02-04T04:30:28 IPv4Address(TCP, '', 2201): Connected
2016-02-04T04:30:28 IPv4Address(TCP, '', 2201): Disconnected <twisted.python.failure.Failure twisted.internet.error.ConnectionDone: Connection was closed cleanly.>

Their buildouts are almost identical, here are the relevant sections:


recipe = plone.recipe.zeoserver[zrs]
zeo-address =
replicate-to =
plone.recipe.zope2instance = 4.2.16
plone.recipe.zeoserver = 1.2.7
zc.zrs = 2.4.4


recipe = plone.recipe.zeoserver[zrs]
zeo-address =
replicate-from =
plone.recipe.zope2instance = 4.2.16
plone.recipe.zeoserver = 1.2.7
zc.zrs = 2.4.4

Have I perhaps got the versions wrong? If I change them or comment them out, I get 'bad restraint' errors. The buildout-cache are identical between the boxes, and the output of bin/buildout is also identical. They are running identical ubuntus, and they're even both xeon raid things bought from the same place. Various greps on the filesystems of the two machines return identical results. There is relatively little documentation on the web about zrs, I've read all that I can find. The zeo servers were installed by the plone.ansible_playbook and are managed by supervisor as setup by the playbook,

I hope someone can give me a wedge and a crack to stick it into!


I think you have it backwards.

replicate-to should be the network interface and port to listen on for slave servers to connect to and replicate-from should match that setting.

Once I'd got up and dusted myself off, I went and read the readme carefully - and sure enough, it's very clear about this. Thanks.

I got it wrong the first time too. It is counter intuitive.