赞
踩
集群流程(我采用SLB做负载均衡,也可自行配置nginx做负载):
nginx负载均衡的配置参考如下(仅供参考):
-
- #user nobody;
- worker_processes 1;
-
- #error_log logs/error.log;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
-
- #pid logs/nginx.pid;
-
-
- events {
- worker_connections 1024;
- }
-
-
- http {
- include mime.types;
- default_type application/octet-stream;
-
- log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
-
-
- #access_log logs/access.log main;
-
-
- sendfile on;
- #tcp_nopush on;
-
- #keepalive_timeout 0;
- keepalive_timeout 65;
-
- #gzip on;
- upstream apisix{
- ip_hash;
- server 12.10.8.92:9000 weight=1;
- server 12.10.8.93:9000 weight=2;
- server 12.10.8.93:9000 weight=3;
-
- }
- upstream nacos{
- ip_hash;
- server 12.10.8.92:8848 weight=1;
- server 12.10.8.93:8848 weight=2;
- server 12.10.8.94:8848 weight=3;
-
- }
-
- server {
- listen 8080;
- server_name localhost;
-
- #charset koi8-r;
- if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') {
- set $time $1;
- }
- access_log logs/$time.access.log main;
- #access_log logs/host.access.log main;
-
-
-
- location / {
- proxy_pass http://apisix/;
- #proxy_set_header Host $host;
- proxy_set_header Host $host:$server_port;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
-
-
- #error_page 404 /404.html;
-
- # redirect server error pages to the static page /50x.html
- #
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
-
-
- }
-
- server {
- listen 8082 ;
- client_max_body_size 20M;
- proxy_read_timeout 600s;
-
-
-
- #charset koi8-r;
- if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') {
- set $time $1;
- }
- access_log logs/$time.access.log main;
- #access_log logs/host.access.log main;
-
-
-
- location / {
- proxy_pass http://nacos/;
-
- }
- #error_page 404 /404.html;
-
- # redirect server error pages to the static page /50x.html
- #
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
-
-
- }
-
-
-
- }

IP地址 | 需安装服务(仅限docker方式) | 备注 |
12.10.8.92 | Docker+docker-compose+Apisix+nacos,etcd, dashboard, Grafana, prometheus | 红色为必装服务 |
12.10.8.93 | Docker+docker-compose+Apisix+nacos,etcd,dashboard,Grafana, prometheus等 | 红色为必装服务 |
12.10.8.94 | Docker+docker-compose+Apisix+nacos,etcd,dashboard,Grafana, prometheus等 | 红色为必装服务 |
安装docker:https://blog.csdn.net/BThinker/article/details/123358697
安装docker-compose: https://blog.csdn.net/pushiqiang/article/details/78682323
Docker 配置:
- mkdir -p /etc/docker/
-
- vim /etc/docker/daemon.json
#需要配置docker和docker-compose的默认网段,避免网段冲突,daemon.json添加以下内容。
- { "registry-mirrors": ["https://hub-mirror.c.163.com"],
-
- "bip": "192.168.0.1/24",
-
- "default-address-pools": [{"base":"10.10.0.0/16","size":24}]
-
- }
创建安装目录:
- mkdir -p /data/soft/
-
- cd /data/soft/
通过 git 命令克隆 apisix-docker 仓库:
- git clone https://github.com/apache/apisix-docker.git
-
- cd apisix-docker/example
-
- vim docker-compose.yml
然后在docker-compose.yml里配置etcd集群(由于网上无任何docker安装方式的apisix集群配置,下面配置都是自行研究而来,如有错误还请指正)。
这里遇到一个问题,官方配置apache/apisix:latest拉取的版本和etcd版本由冲突,需要修改docker-compose.yml下APISIX镜像的版本,如:apache/apisix:3.0.0-centos
- apisix:
- image: apache/apisix:3.0.0-centos
- restart: always
- volumes:
- - ./apisix_log:/usr/local/apisix/logs
- - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
- depends_on:
- - etcd
- ##network_mode: host
- ports:
- - "9180:9180/tcp"
- - "9080:9080/tcp"
- - "9091:9091/tcp"
- - "9443:9443/tcp"
- - "9092:9092/tcp"
- networks:
- apisix:

节点1 ETCD集群配置:
- etcd:
-
- image: bitnami/etcd:3.4.15
-
- restart: always
-
- volumes:
-
- - etcd_data:/bitnami/etcd
-
- environment:
-
- ETCD_NAME: "etcd1"
-
- ETCD_ENABLE_V2: "true"
-
- ALLOW_NONE_AUTHENTICATION: "yes"
-
- ETCD_INITIAL_CLUSTER_STATE: "new"
-
- ETCD_ADVERTISE_CLIENT_URLS: "http://12.10.8.92:2379"
-
- ETCD_INITIAL_ADVERTISE_PEER_URLS: "http://12.10.8.92:2380"
-
- ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
-
- ETCD_INITIAL_CLUSTER_TOKEN: "etcd-cluster"
-
- ETCD_LISTEN_PEER_URLS: "http://0.0.0.0:2380"
-
- ETCD_INITIAL_CLUSTER: "etcd1=http://12.10.8.92:2380,etcd2=http://12.10.8.93:2380,etcd3=http://12.10.8.94:2380"
-
- ports:
-
- - "2379:2379/tcp"
-
- - "2380:2380/tcp"
-
- networks:
-
- apisix:

节点2 ETCD集群配置:
- etcd:
-
- image: bitnami/etcd:3.4.15
-
- restart: always
-
- volumes:
-
- - etcd_data:/bitnami/etcd
-
- environment:
-
- ETCD_NAME: "etcd2"
-
- ETCD_ENABLE_V2: "true"
-
- ALLOW_NONE_AUTHENTICATION: "yes"
-
- ETCD_INITIAL_CLUSTER_STATE: "new"
-
- ETCD_ADVERTISE_CLIENT_URLS: "http://12.10.8.93:2379"
-
- ETCD_INITIAL_ADVERTISE_PEER_URLS: "http://12.10.8.93:2380"
-
- ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
-
- ETCD_INITIAL_CLUSTER_TOKEN: "etcd-cluster"
-
- ETCD_LISTEN_PEER_URLS: "http://0.0.0.0:2380"
-
- ETCD_INITIAL_CLUSTER: "etcd1=http://12.10.8.92:2380,etcd2=http://12.10.8.93:2380,etcd3=http://12.10.8.94:2380"
-
- ports:
-
- - "2379:2379/tcp"
-
- - "2380:2380/tcp"
-
- networks:
-
- apisix:

节点3 ETCD集群配置:
- etcd:
-
- image: bitnami/etcd:3.4.15
-
- restart: always
-
- volumes:
-
- - etcd_data:/bitnami/etcd
-
- environment:
-
- ETCD_NAME: "etcd3"
-
- ETCD_ENABLE_V2: "true"
-
- ALLOW_NONE_AUTHENTICATION: "yes"
-
- ETCD_INITIAL_CLUSTER_STATE: "new"
-
- ETCD_ADVERTISE_CLIENT_URLS: "http://12.10.8.94:2379"
-
- ETCD_INITIAL_ADVERTISE_PEER_URLS: "http://12.10.8.94:2380"
-
- ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
-
- ETCD_INITIAL_CLUSTER_TOKEN: "etcd-cluster"
-
- ETCD_LISTEN_PEER_URLS: "http://0.0.0.0:2380"
-
- ETCD_INITIAL_CLUSTER: "etcd1=http://12.10.8.92:2380,etcd2=http://12.10.8.93:2380,etcd3=http://12.10.8.94:2380"
-
- ports:
-
- - "2379:2379/tcp"
-
- - "2380:2380/tcp"
-
- networks:
-
- apisix:

注意:各个节点etcd的2379和2380需要互通。ETCD_LISTEN_PEER_URLS和ETCD_LISTEN_CLIENT_URLS的IP最好是0.0.0.0如果按网上或者官方的配置会导致启动失败。
/data/soft/apisix-docker/example/apisix_conf/config.yaml
修改config.yaml的etcd如下:
- etcd:
-
- host:
-
- - "http://12.10.8.92:2379"
-
- - "http://12.10.8.93:2379"
-
- - "http://12.10.8.94:2379"
-
- # multiple etcd address
-
- prefix: "/apisix" # apisix configurations prefix
-
- timeout: 30 # 30 seconds
配置dashboard的配置文件(三个节点都需要修改):
/data/soft/apisix-docker/example/dashboard_conf/conf.yaml
- etcd:
-
- endpoints:
-
- - "http://12.10.8.92:2379"
-
- - "http://12.10.8.93:2379"
-
- - "http://12.10.8.94:2379"
配置完成,启动APISIX(三个节点都需要启动):
- cd /data/soft/apisix-docker/example
-
- docker-compose -p docker-apisix up -d
安装完成后,你可以在运行 Docker 的宿主机上执行 curl 命令访问 Admin API,根据返回数据判断 APISIX 是否成功启动。X-API-KEY在apisix_conf/config.yaml配置文件里可找到。
# 注意:请在运行 Docker 的宿主机上执行 curl 命令。
curl "http://127.0.0.1:9180/apisix/admin/services/" -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
如果返回数据如下所示,则表示 APISIX 成功启动:
- {
- "count":0,
- "node":{
- "key":"/apisix/services",
- "nodes":[],
- "dir":true
- }
- }
验证etcd集群:
docker exec -it ***** /bin/bash
etcdctl member list
b99e84a8f163a77, started, etcd1, http://12.10.8.92:2380, http://12.10.8.92:2379, false
78d14fd665ac2577, started, etcd2, http://12.10.8.93:2380, http://12.10.8.93:2379, false
d72f728605b522c2, started, etcd3, http://12.10.8.94:2380, http://12.10.8.94:2379, false
验证APISIX集群:
1.后台查看docker服务日志看看是否有报错
Docker logs docker-apisix_apisix_1
2.登录:http://12.10.8.92:9000/serverinfo 三个节点能正常显示则代表集群安装成功。
3.停止其中一个节点的容器服务:
docker-compose -p docker-apisix stop
查看其它容器的etcd日志,发现已经在重新选举:
#集群测试验证(停止其中一台node后会重新选举主席)
raft2023/01/09 00:50:52 INFO: b99e84a8f163a77 [term: 18] received a MsgVote message with higher term from d72f728605b522c2 [term: 19]
raft2023/01/09 00:50:52 INFO: b99e84a8f163a77 became follower at term 19
raft2023/01/09 00:50:52 INFO: b99e84a8f163a77 [logterm: 18, index: 80, vote: 0] cast MsgVote for d72f728605b522c2 [logterm: 18, index: 80] at term 19
raft2023/01/09 00:50:52 INFO: raft.node: b99e84a8f163a77 lost leader 78d14fd665ac2577 at term 19
raft2023/01/09 00:50:52 INFO: raft.node: b99e84a8f163a77 elected leader d72f728605b522c2 at term 19
2023-01-09 00:50:52.680807 W | rafthttp: lost the TCP streaming connection with peer 78d14fd665ac2577 (stream MsgApp v2 reader)
2023-01-09 00:50:52.681175 W | rafthttp: lost the TCP streaming connection with peer 78d14fd665ac2577 (stream Message reader)
2023-01-09 00:50:52.683499 E | rafthttp: failed to dial 78d14fd665ac2577 on stream MsgApp v2 (peer 78d14fd665ac2577 failed to find local node b99e84a8f163a77)
2023-01-09 00:50:52.683509 I | rafthttp: peer 78d14fd665ac2577 became inactive (message send to peer failed)
启动刚刚停止的容器。
APISIX集群搭建完成。
官网的集群搭建步骤不适合我们本地,所以我自己写了docker-compose.yml。官网的配置步骤不够明确,所以不作为参考。我是直接把nacos 的docker-compose配置写在了 apisix 的docker-compose.yml里面,为了方便不再重新创建新的docker-compose。
修改config.yaml,把nacos集成到apisix(三个节点都需要配置)
在文件 /data/soft/apisix-docker/example/apisix_conf/config.yaml
中添加以下配置(域名下来后host只需要配置一个,如:https://nacos.qx.com):
- discovery:
-
- nacos:
-
- host:
-
- - "http://12.10.8.92:8848"
-
- - "http://12.10.8.93:8848"
-
- - "http://12.10.8.94:8848"
-
- prefix: "/nacos/v1/"
-
- fetch_interval: 30 # default 30 sec
-
- weight: 200 # default 100
-
- timeout:
-
- connect: 3000 # default 2000 ms
-
- send: 3000 # default 2000 ms
-
- read: 6000 # default 5000 ms

修改docker-compose.yml(三个节点都需要配置),NACOS_SERVER_IP 需要改为当前宿主机IP
在/data/soft/apisix-docker/example/docker-compose.yml中services下添加以下配置:
- nacos:
-
- image: nacos/nacos-server:v2.2.0
-
- container_name: nacos
-
- environment:
-
- - MODE=cluster # 集群模式
-
- - NACOS_SERVERS=12.10.8.92:8848,12.10.8.93:8848,12.10.8.94:8848 # IP1,IP2是对应的宿主服务器IP,PORT1,PORT2是对应的nacos服务端口
-
- - PREFER_HOST_MODE=ip
-
- - NACOS_SERVER_IP=12.10.8.92 # 服务器外网
-
- - SPRING_DATASOURCE_PLATFORM=mysql
-
- - MYSQL_SERVICE_HOST=***** # mysql数据库对应的ip
-
- - MYSQL_SERVICE_PORT=3306 # mysql数据库对应的端口
-
- - MYSQL_SERVICE_DB_NAME=*** # mysql数据库
-
- - MYSQL_SERVICE_USER=**# mysql数据库对应的用户名
-
- - MYSQL_SERVICE_PASSWORD=***# mysql数据库对应的密码
-
- - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=10000&socketTimeout=10000&autoReconnect=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true # mysql8数据库必须配置参数否则报错
-
- - MYSQL_DATABASE_NUM=1 # 数据源为1个
-
- volumes:
-
- - ./nacos/nacos_log:/home/nacos/logs # 日志的挂在
-
- ports:
-
- - "8848:8848"
-
- - "9848:9848"
-
- - "9849:9849"
-
- - "7848:7848"
-
- restart: always
-
- networks:
-
- apisix:
-
- apisix-dashboard:
-
- image: apache/apisix-dashboard:2.15.0-alpine
-
- restart: always
-
- volumes:
-
- - ./dashboard_conf/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
-
- ports:
-
- - "9000:9000"
-
- networks:
-
- apisix:

在官网指定版本,如releases v2.2,下找到最新的SQL初始化文件,一般在conf目录下面:
https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.zip,
在nacos数据库执行SQL初始化数据。如果没有执行这一步会导致启动报错。
启动容器服务(三个节点都需要):
docker-compose -p docker-apisix up -d
验证集群:http://12.10.8.92:8848/nacos/
用户密码:nacos/nacos
Nacos
APISIX
1.更新apisix集群需要删除数据,并重新创建文件夹,否则集群无法启动
rm -rf /var/lib/docker/volumes/docker-apisix_etcd_data
mkdir -p /var/lib/docker/volumes/docker-apisix_etcd_data
2. ETCD_LISTEN_PEER_URLS和ETCD_LISTEN_CLIENT_URLS的IP最好是0.0.0.0如果按网上或者官方的配置会导致etcd启动失败。
3. 官方配置apache/apisix:latest拉取的版本和etcd版本由冲突,需要修改docker-compose.yml下APISIX镜像的版本,如:apache/apisix:3.0.0-centos
4. 各个节点服务最好在几分钟内都能启动
5. docker-compose.yml下etcd的2380端口也需要映射出来,不然集群无法启动。
6. ETCD_LISTEN_CLIENT_URLS 按网上或者官方的配置会报错etcd bind: cannot assign requeste d address,IP需设置为0.0.0.0
7. apisix [error]failed to set upstream: no valid upstream node 接口服务没有配置好,网上文档有问题,端口是9180,不是9080。
8. etcd_ cluster 的版本不对导致集群启动失败,需要更新etcd_cluster的版本。
https://blog.51cto.com/waringid/5845100
https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
https://www.bookstack.cn/read/apisix-3.0-zh/7c42ab4f372353b1.md
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。