disq

package module
v0.0.0-...-a7fb08b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 13, 2022 License: AGPL-3.0 Imports: 12 Imported by: 0

README

Nothing-Shared distributed dnsmasq for datacenters

何もデータの共有をしない(〜デバッグが楽)なdnsmasq(のようなもの)。

disqがしてくれること

  • jsonファイルに書かれた、次の設定について理解する:
    • DNSサーバとして振る舞うべきポートと、応答してもよいネットワーク
    • disqの走るサーバにつかがれた0個以上のipv4ネットワーク
      • netmaskやdefault gatewayなどの、ネットワークに繋がれたコンピュータが知るべき情報
    • disqが面倒を見る0台以上のコンピュータ
      • と、さらにコンピュータに繋がれた0個以上のNICとそれに対応するIPアドレスと対応するFQDN
  • DHCPサーバとして振る舞い、ipアドレスをサーバに割り当てる
  • 複数のdisqが協業し、DHCPとDNSを冗長化して提供する
  • WarningとErrorはZabbixへ通知を行う

disqが目指すこと

  • DNSがめっちゃ早い。弊データセンターで起こった瞬間最大トラフィックである3000req/secでも壊れないこと。
    • 解決先はdisqのconfigに書かれているサーバの解決なので、よほどひどいコードを書かないかぎり可能

アルゴリズムの概要

アドレスは事前に与えておく

DHCPサーバですが、コンピュータに割り当てるIPアドレスやホスト名は、事前にjsonファイルに書いて決定します。

それ以外のコンピュータが繋いできた時は、何もしない上でzabbixに通知を投げます(何かしらの不正アクセスである可能性があります)。

DNSの冗長化

DHCPのメッセージにDNSを複数書けるので、そのままです。特になにもする必要はありません。

挙動を観察した限り、DHCPで送った時のリストの順に使う(アクセスできない時は次のDNSにフォールバックする)ようなので、DHCPで送るときにリストをシャッフルします。

DHCPの冗長化

WiFiやイーサネットの衝突回避などと同じアルゴリズムを使います。

すなわち、応答するまでにランダムな待ち時間を入れ、その時間内にリプライを検知したら応答しません。

逆に、その時間内に他のマシンからブロードキャストでリプライが飛んで来なかったら、「自分の番」として応答します。

…と思ったものの、ほぼ同じ内容のメッセージを複数送り返しても問題なさそうなので気にせず送ることにしました。

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type DHCP4Error

type DHCP4Error struct {
	Err     error
	Network string
}

func (*DHCP4Error) Error

func (e *DHCP4Error) Error() string

type DHCP4WrongAddressRequestedError

type DHCP4WrongAddressRequestedError struct {
	SName        string
	HardwareAddr net.HardwareAddr
	Requested    net.IP
	Expected     net.IP
}

func (*DHCP4WrongAddressRequestedError) Error

type DNSError

type DNSError struct {
	Err error
}

func (*DNSError) Error

func (e *DNSError) Error() string

type Server

type Server struct {
	ErrorStream chan error
	// contains filtered or unexported fields
}

func FromBook

func FromBook(book *book.Book) *Server

func (*Server) Reload

func (s *Server) Reload(b *book.Book) error

Reload book. But do not stop server.

func (*Server) ServeDNS

func (s *Server) ServeDNS(w dns.ResponseWriter, r *dns.Msg)

func (*Server) Start

func (s *Server) Start()

func (*Server) Stop

func (s *Server) Stop()

Graceful shutdown

Directories

Path Synopsis
cmd
disq command
Package implement zabbix sender protocol for send metrics to zabbix.
Package implement zabbix sender protocol for send metrics to zabbix.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL