zookeeper集群安装
查找镜像
docker search zookeeper
拉取镜像
这里我去zookeeper官网查看,稳定版本为3.6.2版本,因此这里拉取3.6.2版本的镜像
docker pull zookeeper:3.6.2
编写docker-compose.yml文件
version: '3'
services:
zkui:
image: maauso/zkui
container_name: zkui
labels:
- "traefik.enable=true"
- "traefik.http.routers.zkui.rule=Host(`www.zookeeper.com.cn`)"
- "traefik.http.services.zkui.loadbalancer.server.scheme=http"
- "traefik.http.services.zkui.loadbalancer.server.port=9090"
- "traefik.http.routers.zkui.entrypoints=web"
environment:
ZKLIST: "10.100.10.21:2181,10.100.20.21:2181,10.100.30.21:2181"
networks:
- zookeeper
#ports: #如果不使用traefik,则关闭这里的注释,通过ip访问即可
#- 9090:9090
depends_on:
- zk1
- zk2
- zk3
zk1:
image: zookeeper:3.6.2
restart: always
container_name: zk1
hostname: zk1
volumes:
- ./zookeeper/zk1/data:/data
- ./zookeeper/zk1/datalog:/datalog
environment:
TZ: Asia/Shanghai
JVMFLAGS: "-Xmx256m -Xms256m -Duser.timezone=Asia/Shanghai"
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
networks:
zookeeper:
ipv4_address: 10.100.10.21
zk2:
image: zookeeper:3.6.2
restart: always
container_name: zk2
hostname: zk2
volumes:
- ./zookeeper/zk2/data:/data
- ./zookeeper/zk2/datalog:/datalog
environment:
TZ: Asia/Shanghai
JVMFLAGS: "-Xmx256m -Xms256m -Duser.timezone=Asia/Shanghai"
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
networks:
zookeeper:
ipv4_address: 10.100.20.21
zk3:
image: zookeeper:3.6.2
restart: always
container_name: zk3
hostname: zk3
volumes:
- ./zookeeper/zk3/data:/data
- ./zookeeper/zk3/datalog:/datalog
environment:
TZ: Asia/Shanghai
JVMFLAGS: "-Xmx256m -Xms256m -Duser.timezone=Asia/Shanghai"
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
networks:
zookeeper:
ipv4_address: 10.100.30.21 #固定ip
networks:
zookeeper:
#driver: bridge
#ipam:
#driver: default
#config:
#- subnet: 10.100.0.0/16 如果不使用traefik,则关掉这里的注释,将traefik相关的东西注释即可
external:
name: traefik_traefik #使用traefik那张网卡
这里使用了traefik作为网关
博客地址: docker篇-(docker-compose安装web网关traefik)
执行docker-compose.yml
docker-compose up -d
配置域名映射
浏览器访问 www.zookeeper.com.cn
进入需要登录,用户名 admin 密码 manager
就可以实现查看zookeeper集群里面的数据并且操作了
配置负载均衡
因为zookeeper集群节点过多,不可能每次部署项目的时候都去填写这些节点,同时,如果这些节点宕机了,重启之后如果ip产生了变化怎么办,不利于维护,所以这里使用负载均衡的方式,在zookeeper和业务中间加上一个代理,让业务只需要关心这个代理的ip,而不需要去管zk集群
1.修改docker-compose.yml文件
添加nginx作为负载均衡的服务器
version: '3'
services:
zkui:
image: maauso/zkui
container_name: zkui
labels:
- "traefik.enable=true"
- "traefik.http.routers.zkui.rule=Host(`www.zookeeper.com.cn`)"
- "traefik.http.services.zkui.loadbalancer.server.scheme=http"
- "traefik.http.services.zkui.loadbalancer.server.port=9090"
- "traefik.http.routers.zkui.entrypoints=web"
#- "traefik.http.routers.zkui.tls=true"
#- "traefik.http.routers.zkui.middlewares=ssl@docker"
environment:
ZKLIST: "10.100.100.100:2181"
networks:
- zookeeper
#ports: #如果不使用traefik,则关闭这里的注释,通过ip访问即可
#- 9090:9090
depends_on:
- lb-nginx
lb-nginx:
image: nginx:alpine
container_name: lb-nginx
ports:
- 2181:2181
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf #挂载修改过后的主配置文件
- ./conf.d/stream:/opt/nginx/stream/conf.d #挂载负载均衡的stream配置文件
- ./conf.d/http:/etc/nginx/conf.d #挂载默认的http配置文件,可有可无,这里实际上不会用到
networks:
zookeeper:
ipv4_address: "10.100.100.100"
depends_on:
- zk1
- zk2
- zk3
zk1:
image: zookeeper:3.6.2
restart: always
container_name: zk1
hostname: zk1
volumes:
- ./zookeeper/zk1/data:/data
- ./zookeeper/zk1/datalog:/datalog
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
networks:
zookeeper:
ipv4_address: 10.100.10.21
zk2:
image: zookeeper:3.6.2
restart: always
container_name: zk2
hostname: zk2
volumes:
- ./zookeeper/zk2/data:/data
- ./zookeeper/zk2/datalog:/datalog
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
networks:
zookeeper:
ipv4_address: 10.100.20.21
zk3:
image: zookeeper:3.6.2
restart: always
container_name: zk3
hostname: zk3
volumes:
- ./zookeeper/zk3/data:/data
- ./zookeeper/zk3/datalog:/datalog
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
networks:
zookeeper:
ipv4_address: 10.100.30.21
networks:
zookeeper:
#driver: bridge
#ipam:
#driver: default
#config:
#- subnet: 10.100.0.0/16 如果不使用traefik,则关掉这里的注释,将traefik相关的东西注释即可
external:
name: traefik_traefik
2.因为nginx要支持tcp代理,需要配置stream模块,所以我们对nginx.conf配置文件进行修改
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
# 添加stream模块,实现tcp反向代理
stream {
include /opt/nginx/stream/conf.d/*.conf; #加载 /opt/nginx/stream/conf.d目录下面的所有配置文件
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
3.编写zk负载均衡的配置文件zk-lb.conf
proxy_timeout 30m;
upstream zk {
server 10.100.10.21:2181 weight=1;
server 10.100.20.21:2181 weight=1;
server 10.100.30.21:2181 weight=1;
}
server {
listen 0.0.0.0:2181;
proxy_pass zk;
}
4.目录结构如下图
5.执行docker-compose.yml
docker-compose up -d
6.通过浏览器访问
可以看到,这是nginx负载均衡的ip节点
7.通过代码测试
测试数据已经查找到了
8.通过浏览器查看数据已经写入成功了
9.进入zk集群的所有节点数据,可以看到数据以及同步到所有节点了
节点1
节点2
节点3