This is an automated email from the ASF dual-hosted git repository.

wutao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pegasus.git


The following commit(s) were added to refs/heads/master by this push:
     new a938aa3  docs: add rfc for meta-proxy (#657)
a938aa3 is described below

commit a938aa3580d8cef63149e218f6edf98b1fed46d3
Author: Wu Tao <[email protected]>
AuthorDate: Sun Jan 3 23:29:50 2021 -0600

    docs: add rfc for meta-proxy (#657)
---
 rfcs/2020-12-15-meta-proxy.md | 52 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/rfcs/2020-12-15-meta-proxy.md b/rfcs/2020-12-15-meta-proxy.md
new file mode 100644
index 0000000..d83cbb9
--- /dev/null
+++ b/rfcs/2020-12-15-meta-proxy.md
@@ -0,0 +1,52 @@
+# Meta Proxy
+
+Previously, Pegasus offered every user with a list of MetaServer IP:Port 
addresses. Client queries MetaServer to locate the ReplicaServer where a 
specific data partition is hosted, and thereby it can read/write. 
+
+But static IP is unsafe for a service, especially when we need to replace a 
MetaServer node. One solution is to use domain name to access MetaServer.
+
+It's still unrealistic to manage one domain name per cluster. A better 
approach is to use one domain name for multiple clusters and hide the detail of 
clusters from users.
+
+One pratical design for this idea is to implement a proxy service, that could 
"intelligently" routing the client queries to the matched MetaServer. This 
service we call it MetaProxy.
+
+Another case of MetaProxy is the dynamic and senseless reconfiguration of the 
primary cluster during duplication. While the primary cluster is crashed, the 
proxy can forward client queries to the backup cluster for disaster recovery.
+
+The implementation of MetaProxy is a service that could process Pegasus's RPC 
protocol. It could receive and parse the RPC request from clients. After 
forwarding the query to the corresponding MetaServer, it needs to return the 
response completely to the client.
+
+Every client query, ie. QueryConfig RPC, needs to specify a table name in 
order to retrieve the addresses of partitions in the table. 
+
+```thrift
+struct query_config_request
+{
+    1:string app_name;
+    2:list<i32> partition_indices;
+}
+
+struct query_config_response
+{
+    1:base.error_code err;
+    2:i32 app_id;
+    3:i32 partition_count;
+    4:bool is_stateful;
+    5:list<partition_configuration> partitions;
+}
+```
+
+MetaProxy requires the exactly one-one mapping of table and cluster, i.e. one 
table can exist in only one globally unique cluster. Thus MetaProxy can 
certainly find the cluster using the table name.
+The one-one mapping should be guaranteed by the Pegasus service administrator.
+
+The cluster-to-table mapping is stored in MetaServer. To find cluster by 
table, we need to store the reversed mapping in Zookeeper.
+
+The zk layout:
+
+```
+<root>/c3srv-pegasus/<table>
+
+{
+  "cluster" : "c3srv-ad",
+  "meta-addrs" : ["127.0.0.1:34601"]
+}
+```
+
+All tables under one MetaProxy deployment are unique. It's impossible for two 
tables with the same name. However, we can deploy two sets of MetaProxy in two 
isolated AZs, then they can both have the same table. And consequently, we can 
achieve double-alive with intra-AZs.
+
+MetaProxy lazily caches each [zknode watch 
event](https://zookeeper.apache.org/doc/r3.3.5/zookeeperProgrammers.html#ch_zkWatches)
 for a table. If it happens to a zknode that's queried but not cached, 
MetaProxy will invoke zookeeper getData API to fetch the zknode data, and 
listens for its changes.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to