Help us shape the future of Go! Take the 2026 Go Developer Survey

zookeeper

package
v0.41.3 Latest Latest
Warning

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

Go to latest
Published: Oct 28, 2026 License: MIT Imports: 8 Imported by: 0

README

Zookeeper Backend

The Zookeeper backend enables confd to retrieve configuration data from Apache ZooKeeper, a distributed coordination service.

Configuration

Basic Connection

Connect to ZooKeeper:

confd zookeeper --node 127.0.0.1:2181 --onetime

Multiple nodes for high availability:

confd zookeeper \
  --node zk1.example.com:2181 \
  --node zk2.example.com:2181 \
  --node zk3.example.com:2181 --onetime

Options

Flag Description Default
-n, --node ZooKeeper server address (can be specified multiple times) -

Note: ZooKeeper authentication (SASL/Kerberos) is not currently supported by this backend.

Basic Example

Create znodes in ZooKeeper:

# Using zkCli.sh
zkCli.sh create /myapp ""
zkCli.sh create /myapp/database ""
zkCli.sh create /myapp/database/url "db.example.com"
zkCli.sh create /myapp/database/user "admin"
zkCli.sh create /myapp/database/password "secret123"

Or using the ZooKeeper shell:

[zk: localhost:2181(CONNECTED) 0] create /myapp ""
[zk: localhost:2181(CONNECTED) 1] create /myapp/database ""
[zk: localhost:2181(CONNECTED) 2] create /myapp/database/url "db.example.com"
[zk: localhost:2181(CONNECTED) 3] create /myapp/database/user "admin"
[zk: localhost:2181(CONNECTED) 4] create /myapp/database/password "secret123"

Create template resource (/etc/confd/conf.d/myapp.toml):

[template]
src = "myapp.conf.tmpl"
dest = "/etc/myapp/config.conf"
keys = [
  "/myapp/database",
]

Create template (/etc/confd/templates/myapp.conf.tmpl):

[database]
url = {{getv "/myapp/database/url"}}
user = {{getv "/myapp/database/user"}}
password = {{getv "/myapp/database/password"}}

Run confd:

confd zookeeper --node 127.0.0.1:2181 --onetime

Advanced Example

Service Discovery Pattern

Store service endpoints in ZooKeeper:

zkCli.sh create /services ""
zkCli.sh create /services/api ""
zkCli.sh create /services/api/node1 "10.0.1.100:8080"
zkCli.sh create /services/api/node2 "10.0.1.101:8080"
zkCli.sh create /services/api/node3 "10.0.1.102:8080"

Template for load balancer config:

upstream api {
{{range gets "/services/api/*"}}
    server {{.Value}};
{{end}}
}
Hierarchical Configuration
# Environment-specific config
zkCli.sh create /config ""
zkCli.sh create /config/production ""
zkCli.sh create /config/production/database ""
zkCli.sh create /config/production/database/host "prod-db.example.com"
zkCli.sh create /config/production/database/port "5432"

Template resource with prefix:

[template]
prefix = "/config/production"
src = "app.conf.tmpl"
dest = "/etc/app/config.conf"
keys = [
  "/database",
]
Kubernetes Deployment
apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  containers:
  - name: myapp
    command:
    - confd
    - zookeeper
    - --node=zk-0.zk-headless.default.svc:2181
    - --node=zk-1.zk-headless.default.svc:2181
    - --node=zk-2.zk-headless.default.svc:2181
    - --watch

Watch Mode Support

Watch mode is supported for the ZooKeeper backend. confd uses ZooKeeper's native watch mechanism for real-time updates.

confd zookeeper --node 127.0.0.1:2181 --watch

confd watches:

  • Data changes: NodeDataChanged events on leaf nodes
  • Child changes: NodeChildrenChanged events on parent nodes

When any watched znode changes, confd re-renders affected templates.

ZooKeeper Data Model

ZooKeeper uses a hierarchical namespace similar to a filesystem:

/
├── myapp
│   ├── database
│   │   ├── url = "db.example.com"
│   │   ├── user = "admin"
│   │   └── password = "secret"
│   └── cache
│       ├── host = "redis.example.com"
│       └── port = "6379"
  • Znodes can have both data and children
  • Leaf znodes (no children) store the actual configuration values
  • Parent znodes are traversed recursively to find all values

Per-Resource Backend Configuration

Instead of using the global backend, individual template resources can specify their own ZooKeeper backend configuration. This allows mixing backends within a single confd instance.

Add a [backend] section to your template resource file:

[template]
src = "myapp.conf.tmpl"
dest = "/etc/myapp/config.conf"
keys = [
  "/myapp/database",
]

[backend]
backend = "zookeeper"
nodes = ["zk1.example.com:2181", "zk2.example.com:2181", "zk3.example.com:2181"]

Available backend options:

  • backend - Must be "zookeeper"
  • nodes - Array of ZooKeeper server addresses

Connection Behavior

  • Session timeout: 1 second
  • Automatic reconnection: ZooKeeper client handles reconnection automatically
  • Ensemble support: Specify multiple nodes for automatic failover

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client provides a wrapper around the zookeeper client

func NewZookeeperClient

func NewZookeeperClient(machines []string, dialTimeout time.Duration) (*Client, error)

func (*Client) Close added in v0.40.0

func (c *Client) Close() error

Close closes the Zookeeper client connection.

func (*Client) GetValues

func (c *Client) GetValues(ctx context.Context, keys []string) (map[string]string, error)

func (*Client) HealthCheck added in v0.40.0

func (c *Client) HealthCheck(ctx context.Context) error

HealthCheck verifies the backend connection is healthy. It checks that the root path exists in Zookeeper.

func (*Client) HealthCheckDetailed added in v0.40.0

func (c *Client) HealthCheckDetailed(ctx context.Context) (*types.HealthResult, error)

HealthCheckDetailed provides detailed health information for the zookeeper backend.

func (*Client) WatchPrefix

func (c *Client) WatchPrefix(ctx context.Context, prefix string, keys []string, waitIndex uint64, stopChan chan bool) (uint64, error)

Jump to

Keyboard shortcuts

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