I am trying to integrate a Paxos framework with Redis, so that Redis can be made strongly consistent (I am aware about the RedisRaft alternative approaches but I am very keen to explore this). I am designing it in a modular way such that Paxos and Redis can work on their own, if needed.
I have a Go-Lang Paxos implementation that has two components: 1) Paxos replica and 2) Client
Paxos replica exposes the Propose() and onCommit() APIs. The Propose() API is used by the client and the onCommit() API is used by an upper layer software (such as Redis)
In the standalone Paxos implementation, the clients send request to one of the replicas (there are 3 replicas), and the Paxos replicas consistency replicate the request in at least a majority of the nodes. Upon deciding on a value, Paxos replicas will mark the request as committed and call the upper layer using onCommit().
For this implementation I used Go-Lang gRPC. All the client-replica and replica-replica messages are sent using gRPC.
Now I integrate Redis to this system such that Paxos can be used to make Redis consistent (by default Redis is eventually consistent). The way I envision this is as follows.
Each physical machine has two processes running; 1) Redis server and 2) Paxos replica. Each Paxos Replica uses a go-redis-client to communicate with its Redis instance. Upon deciding on an value, the Paxos replica invokes the go-redis-client to call the Redis server. The requests sent by the client has two fields: 1) unique ID and 2) payload. The Redis command (get key, put key) is embedded in the payload. Upon deciding on a value the Paxos replica will call the go-redis-client with the command.
Everything works fine for the above scenario. Now I want to use YCSB with this setup, and I don’t find a straight forward answer to this.
YCSB is a client that can generate workloads for different databases including Redis. In a default YCSB Redis setup, the YCSB client will directly send traffic to the Redis server. However in my scenario, this gets complicated because there is a level of indirection: the requests should be sent in the gRPC format because the Paxos replicas are configured to receive gRPC requests.
How can I use YCSB in this setup? Is there a way to make the YCSB generate gRPC requests that are compatible with my setup?