使用 Docker Compose 安装
使用 0.2.0 集群镜像启动三个 Meta 投票成员和一组主从 Data 节点。
理解示例
这个单机实验使用 Docker Hub 上的 eloqdata/lavik:0.2.0-cluster,在 Redis Cluster 模式下运行三个 Meta 投票成员和两个 Data 节点。一个 Group 持有全部 16,384 个槽。命名卷保留 Meta 和 Data 状态。单台主机上的三个容器不提供主机级高可用;应将成员分布到不同主机。
私有 Docker 网络为 172.30.92.0/24,启动前检查冲突。主机端口 6379 和 6380 仅绑定回环。Cluster 客户端必须能访问通告的容器地址,因此示例客户端在 Compose 网络内运行。本地实验的内部控制流量使用明文。
1. 下载并启动
# Run in Bash; stop on a failed download, checksum, extraction or image pull.
set -euo pipefail
mkdir -p lavik-0.2.0-build
cd lavik-0.2.0-build
curl -fLO --retry 3 https://github.com/eloqdata/lavik-agent/releases/download/docker-v0.2.0-2/docker-source.tar.gz
printf '%s\n' '2e7493cd2e1a4d5c115589aa3bd599ef8366779cb722b93baba7a096535b1d9d docker-source.tar.gz' | sha256sum -c -
tar -xzf docker-source.tar.gz
cd lavik-0.2.0-docker
docker compose pullset -euo pipefail
docker compose up -d
# Allow transient not-ready (2) and unavailable (3) responses during recovery.
wait_for_cluster() {
local attempt status
for attempt in {1..60}; do
if docker compose exec -T meta-1 lavik-ctl cluster-status \
--socket /data/meta/meta-admin.sock --allow-plaintext-admin \
--timeout-ms 3000 --json; then
return 0
else
status=$?
fi
case "$status" in
2|3) sleep 2 ;;
*) return "$status" ;;
esac
done
echo 'Cluster was not ready within 60 checks; inspect docker compose logs.' >&2
return 1
}
wait_for_cluster
docker compose logs bootstrap
docker compose psData 在 Meta 提交创建后才开放 Redis 端口。bootstrap 服务等待 Meta 健康和 Data 进程启动,然后仅创建一次拓扑。cluster-status 返回 2 或 3 表示未就绪或不可用;应检查进度并重试状态读取,不要重复 cluster-create。
2. 读写数据
docker compose exec -T primary redis-cli -c SET greeting 'hello from Lavik'
docker compose exec -T primary redis-cli -c GET greeting
docker compose exec -T follower redis-cli --raw <<'COMMANDS'
READONLY
GET greeting
COMMANDS从节点读取可能落后于主节点。READONLY 和 GET 必须使用同一连接。Cluster 模式的多键请求必须位于同一哈希槽。
3. 保留状态重启
set -euo pipefail
docker compose stop --timeout 60
docker compose up -d
# Allow transient not-ready (2) and unavailable (3) responses during recovery.
wait_for_cluster() {
local attempt status
for attempt in {1..60}; do
if docker compose exec -T meta-1 lavik-ctl cluster-status \
--socket /data/meta/meta-admin.sock --allow-plaintext-admin \
--timeout-ms 3000 --json; then
return 0
else
status=$?
fi
case "$status" in
2|3) sleep 2 ;;
*) return "$status" ;;
esac
done
echo 'Cluster was not ready within 60 checks; inspect docker compose logs.' >&2
return 1
}
wait_for_cluster保留五个命名卷。不要用 docker compose down -v 重启,这会删除状态。0.2.0 镜像通过 Meta 的 RAFT 标记识别重启,并省略初始清单参数。应保留原成员标识和清单。