version: '3.7'
services:
server1:
image: base-server
container_name: server1
command: ["sh", "-c", "/scripts/start_services.sh"]
environment:
- VT_HOSTNAME=server1
- VT_TOPOLOGY=etcd:http://server1:2379
ports:
- "15000:15000"
- "15306:3306"
networks:
vitess-network:
ipv4_address: 172.16.0.101
volumes:
- ./scripts:/scripts
- etcd-data:/var/lib/etcd # 修改挂载路径
server2:
image: mysql-server
container_name: server2
command: ["sh", "-c", "while ! nc -z server1 2379; do sleep 1; done; /scripts/init_master.sh"]
environment:
- VT_HOSTNAME=server2
- VT_TOPOLOGY=etcd:http://server1:2379
- VTDATAROOT=/vt/vtdataroot # 显式指定数据目录
networks:
vitess-network:
ipv4_address: 172.16.0.102
volumes:
- ./scripts:/scripts
- mysql-master:/vt/vtdataroot
depends_on:
- server1
server3:
image: mysql-server
container_name: server3
command: ["sh", "-c", "while ! nc -z server1 2379; do sleep 1; done; /scripts/init_replica.sh"]
environment:
- VT_HOSTNAME=server3
- VT_TOPOLOGY=etcd:http://server1:2379
- VTDATAROOT=/vt/vtdataroot
networks:
vitess-network:
ipv4_address: 172.16.0.103
volumes:
- ./scripts:/scripts
- mysql-replica:/vt/vtdataroot
depends_on:
- server1
volumes:
etcd-data:
mysql-master:
mysql-replica:
networks:
vitess-network:
driver: bridge
ipam:
config:
- subnet: 172.16.0.0/24
Dockerfile.base:
FROM vitess/base
USER root
RUN chmod 777 /var/lib/etcd
USER vitess
Dockerfile.server:
FROM vitess/base
USER root
RUN apt-get update && apt-get install -y netcat || yum install -y nc || apk add --no-cache gnu-netcat
# 安装 etcdctl 和网络检测工具
RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/*
USER vitess
start_services.sh:
#!/bin/bash
RUN apt-get update && apt-get install -y netcat || yum install -y nc || apk add --no-cache gnu-netcat
# 启动 etcd、vtctld、vtgate
etcd --data-dir /etcd &
sleep 5
vtctld --topo_implementation etcd2 --topo_global_server_address http://localhost:2379 &
vtgate --topo_implementation etcd2 --topo_global_server_address http://localhost:2379 --mysql_server_port 3306 &
init_master.sh 和 init_replica.sh :
#!/bin/bash
# 启动 MySQL 从实例和 vttablet
vttablet \
--topo_implementation etcd2 \
--topo_global_server_address server1:2379 \
--tablet-path "zone1-101" \
--init_keyspace "test_keyspace" \
--init_shard "0" \
--init_tablet_type "replica" \
--port 15002 \
--grpc_port 16002 \
--db_port 3306
2025-05-21 15:41:10.240 | /scripts/start_services.sh: line 3: RUN: command not found
2025-05-21 15:41:10.244 | /scripts/start_services.sh: line 3: yum: command not found
2025-05-21 15:41:10.248 | /scripts/start_services.sh: line 3: apk: command not found
2025-05-21 15:41:11.117 | {"level":"info","ts":"2025-05-21T07:41:11.109Z","caller":"etcdmain/etcd.go:73","msg":"Running: ","args":["etcd","--data-dir","/etcd"]}
2025-05-21 15:41:11.119 | {"level":"info","ts":"2025-05-21T07:41:11.117Z","caller":"embed/etcd.go:124","msg":"configuring peer listeners","listen-peer-urls":["http://localhost:2380"]}
2025-05-21 15:41:11.124 | {"level":"info","ts":"2025-05-21T07:41:11.124Z","caller":"embed/etcd.go:132","msg":"configuring client listeners","listen-client-urls":["http://localhost:2379"]}
2025-05-21 15:41:11.125 | {"level":"info","ts":"2025-05-21T07:41:11.125Z","caller":"embed/etcd.go:306","msg":"starting an etcd server","etcd-version":"3.5.6","git-sha":"cecbe35ce","go-version":"go1.16.15","go-os":"linux","go-arch":"amd64","max-cpu-set":12,"max-cpu-available":12,"member-initialized":false,"name":"default","data-dir":"/etcd","wal-dir":"","wal-dir-dedicated":"","member-dir":"/etcd/member","force-new-cluster":false,"heartbeat-interval":"100ms","election-timeout":"1s","initial-election-tick-advance":true,"snapshot-count":100000,"max-wals":5,"max-snapshots":5,"snapshot-catchup-entries":5000,"initial-advertise-peer-urls":["http://localhost:2380"],"listen-peer-urls":["http://localhost:2380"],"advertise-client-urls":["http://localhost:2379"],"listen-client-urls":["http://localhost:2379"],"listen-metrics-urls":[],"cors":["*"],"host-whitelist":["*"],"initial-cluster":"default=http://localhost:2380","initial-cluster-state":"new","initial-cluster-token":"etcd-cluster","quota-backend-bytes":2147483648,"max-request-bytes":1572864,"max-concurrent-streams":4294967295,"pre-vote":true,"initial-corrupt-check":false,"corrupt-check-time-interval":"0s","compact-check-time-enabled":false,"compact-check-time-interval":"1m0s","auto-compaction-mode":"periodic","auto-compaction-retention":"0s","auto-compaction-interval":"0s","discovery-url":"","discovery-proxy":"","downgrade-check-interval":"5s"}
2025-05-21 15:41:11.125 | {"level":"info","ts":"2025-05-21T07:41:11.125Z","caller":"embed/etcd.go:373","msg":"closing etcd server","name":"default","data-dir":"/etcd","advertise-peer-urls":["http://localhost:2380"],"advertise-client-urls":["http://localhost:2379"]}
2025-05-21 15:41:11.125 | {"level":"info","ts":"2025-05-21T07:41:11.125Z","caller":"embed/etcd.go:375","msg":"closed etcd server","name":"default","data-dir":"/etcd","advertise-peer-urls":["http://localhost:2380"],"advertise-client-urls":["http://localhost:2379"]}
2025-05-21 15:41:11.125 | {"level":"warn","ts":"2025-05-21T07:41:11.125Z","caller":"etcdmain/etcd.go:146","msg":"failed to start etcd","error":"cannot access data directory: mkdir /etcd: permission denied"}
2025-05-21 15:41:11.126 | {"level":"fatal","ts":"2025-05-21T07:41:11.125Z","caller":"etcdmain/etcd.go:204","msg":"discovery failed","error":"cannot access data directory: mkdir /etcd: permission denied","stacktrace":"go.etcd.io/etcd/server/v3/etcdmain.startEtcdOrProxyV2\n\tgo.etcd.io/etcd/server/v3/etcdmain/etcd.go:204\ngo.etcd.io/etcd/server/v3/etcdmain.Main\n\tgo.etcd.io/etcd/server/v3/etcdmain/main.go:40\nmain.main\n\tgo.etcd.io/etcd/server/v3/main.go:32\nruntime.main\n\truntime/proc.go:225"}
nc: getaddrinfo for host "server1" port 2379: No address associated with hostname
nc: getaddrinfo for host "server1" port 2379: No address associated with hostname
nc: getaddrinfo for host "server1" port 2379: No address associated with hostname
nc: getaddrinfo for host "server1" port 2379: No address associated with hostname
nc: getaddrinfo for host "server1" port 2379: No address associated with hostname
启动失败
最新发布