From 24bdb8ac937e8414b37ef00c817589ae2e80af30 Mon Sep 17 00:00:00 2001 From: Kunal Mehta Date: Mon, 6 Mar 2017 02:01:03 -0800 Subject: [PATCH] Add a class implementing DNS Discovery etcd supports using SRV records to help clients discover the etcd cluster: . This implements a basic class to get a list of servers in the cluster, and a helper function to pick one in accordance with RFC 2782. --- src/SrvDiscoverer.php | 71 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/SrvDiscoverer.php diff --git a/src/SrvDiscoverer.php b/src/SrvDiscoverer.php new file mode 100644 index 0000000..098ce9e --- /dev/null +++ b/src/SrvDiscoverer.php @@ -0,0 +1,71 @@ +domain = $domain; + } + + /** + * Fetch the servers with a DNS SRV request + * + * @return array + */ + public function getServers() + { + $records = dns_get_record($this->domain, DNS_SRV); + $result = []; + foreach ($records as $record) { + $result[] = [ + 'target' => $record['target'], + 'port' => $record['port'], + 'pri' => $record['pri'], + 'weight' => $record['weight'], + ]; + } + + return $result; + } + + /** + * Pick a server according to the priority fields. + * Note that weight is currently ignored. + * + * @param array $servers from getServers + * @return array|bool + */ + public function pickServer(array $servers) + { + if (!$servers) { + return false; + } + $by_prio = []; + foreach ($servers as $server) { + $by_prio[$server['pri']][] = $server; + } + + $min = min(array_keys($by_prio)); + if (count($by_prio[$min]) == 1) { + return $by_prio[$min][0]; + } else { + // Choose randomly + $rand = mt_rand(0, count($by_prio[$min])-1); + return $by_prio[$min][$rand]; + } + } +}