Docker续9:使用docker-compose部署nmt项目,在haproxy中代理mysql负载均衡
为之前的docker-compose添加mysql负载均衡
[root@localhost pes]# rm -rf mysql/data/auto.cnf //先删除这个文件,这个文件保证了mysql的唯一,因为待会要做一个从mysql,所以必须删除
[root@localhost pes]# cp -r mysql/data mysql/data0 //为从mysql复制一个data文件出来,用来挂载
[root@localhost pes]# vim docker-compose.yml
version: "3"
services:
web0:
container_name: web0
image: nginx:latest
volumes:
- /root/pes/web/src/dist:/usr/share/nginx/html
hostname: web01.yuanyu.zhangmin
expose:
- 80
web1:
container_name: web1
image: nginx:latest
volumes:
- /root/pes/web/src/dist:/usr/share/nginx/html
hostname: web01.yuanyu.zhangmin
expose:
- 80
web2:
container_name: web2
image: nginx:latest
volumes:
- /root/pes/web/src/dist:/usr/share/nginx/html
hostname: web01.yuanyu.zhangmin
expose:
- 80
java0:
container_name: java0
build: ./java
volumes:
- /root/pes/java/src/:/java/src/
hostname: java01.yuanyu.zhangmin
java1:
container_name: java1
image: pes_java0:latest
volumes:
- /root/pes/java/src/:/java/src/
hostname: java01.yuanyu.zhangmin
depends_on:
- java0
java2:
container_name: java2
image: pes_java0:latest
volumes:
- /root/pes/java/src/:/java/src/
hostname: java01.yuanyu.zhangmin
depends_on:
- java0
mysql:
container_name: mysql01
image: mysql:5.7.44
expose:
- 3306
volumes:
- /root/pes/mysql/data:/var/lib/mysql/
mysqla:
container_name: mysql02
image: mysql:5.7.44
expose:
- 3306
volumes:
- /root/pes/mysql/data0:/var/lib/mysql/
haproxy:
container_name: haproxy01
image: haproxy:latest
volumes:
- ./haproxy/:/haproxy-override
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
ports:
- "5000:5000"
- "8888:8888"
- "8080:8080"
expose:
- 5000
- 8888
- 8080
- 3306
[root@localhost pes]# vim haproxy/haproxy.cfg
global
daemon
# nbproc 1
# pidfile /var/run/haproxy.pid
# 工作目录
# chroot /usr/local/etc/haproxy
defaults
log 127.0.0.1 local0 err #[err warning info debug]
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option dontlognull #日志中不记录负载均衡的心跳检测记录
maxconn 4096 #默认的最大连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
#timeout check 2000 #=心跳检测超时
######## 监控界面配置 #################
listen admin_status
# 监控界面访问信息
bind 0.0.0.0:8888
mode http
# URI相对地址
stats uri /dbs
# 统计报告格式
stats realm Global\ statistics
# 登录账户信息
stats auth admin:123456
########frontend配置##############
######## mysql负载均衡配置 ###############
listen proxy-mysql
bind 0.0.0.0:3306
mode tcp
# 负载均衡算法
# static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
balance roundrobin
# 日志格式
option tcplog
# 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
# create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
option mysql-check user haproxy
# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
server MYSQL_1 mysql01:3306 check weight 1 maxconn 2000
server MYSQL_2 mysql02:3306 check weight 1 maxconn 2000
#server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
# 使用keepalive检测死链
# option tcpka
#########################################
######## java负载均衡配置 ###############
listen proxy-java
bind 0.0.0.0:8080
mode tcp
# 负载均衡算法
# static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
balance roundrobin
# 日志格式
option tcplog
# 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
# create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
#option mysql-check user haproxy
# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
server java0 java0:8080 check weight 1 maxconn 2000
server java1 java1:8080 check weight 1 maxconn 2000
server java2 java2:8080 check weight 1 maxconn 2000
#server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
# 使用keepalive检测死链
# option tcpka
#########################################
######## web负载均衡配置 ###############
listen proxy-web
bind 0.0.0.0:5000
mode http
# 负载均衡算法
# static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
balance roundrobin
# 日志格式
option tcplog
# 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
# create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
#option mysql-check user haproxy
# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
server web0 web0:80 check weight 1 maxconn 2000
server web1 web1:80 check weight 1 maxconn 2000
server web2 web2:80 check weight 1 maxconn 2000
#server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
# 使用keepalive检测死链
# option tcpka
#########################################
[root@localhost pes]# vim java/src/application.properties
spring.application.name=Project_ExamSystem
# 优化部分 -----------------start---------------
# Tomcat
server.port=8080
server.tomcat.uri-encoding=utf-8
#最小线程数
server.tomcat.threads.min-spare=500
#最大链接数
server.tomcat.max-connections=6500
#最大等待队列长度
server.tomcat.accept-count=500
#最大线程数
server.tomcat.threads.max=2500
#请求头最大长度kb
server.max-http-request-header-size=1048576
#请请求体最大长度kb
server.tomcat.max-http-form-post-size=2MB
## Hikari 连接池配置 ------ 详细配置请访问:https://github.com/brettwooldridge/HikariCP
## 最小空闲连接数量
spring.datasource.hikari.minimum-idle=30
## 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=180000
## 连接池最大连接数,默认是10
spring.datasource.hikari.maximum-pool-size=100
## 此属性控制从池返回的连接的默认自动提交行为,默认值:true
spring.datasource.hikari.auto-commit=true
## 连接池母子
spring.datasource.hikari.pool-name=PES_HikariCP
## 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
spring.datasource.hikari.max-lifetime=1800000
## 数据库连接超时时间,默认30秒,即30000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT now()
# 优化部分 -----------------stop---------------
spring.datasource.url=jdbc:mysql://haproxy01:3306/project_exam_system
spring.datasource.username=zhangmin
spring.datasource.password=zhangmin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#日志设置 显示MyBatis SQL语句
logging.level.root=INFO
logging.level.com.dn.es.mapper=DEBUG
# 配置静态资源路径
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/static/
#spring.web.resources.static-locations=classpath:/static/,file:E:/static/
#Redis 配置
#spring.data.redis.host=127.0.0.1
#spring.data.redis.database=0
#spring.data.redis.password=
#spring.data.redis.port=6379
#spring.data.redis.timeout=10s
# Redis 连接池
#spring.data.redis.lettuce.pool.enabled=true
# 最大空闲连接
#spring.data.redis.lettuce.pool.max-idle=10
# 最小空闲连接
#spring.data.redis.lettuce.pool.min-idle=0
# 阻塞等待时间
#spring.data.redis.jedis.pool.max-wait=-1ms
# 最大连接数
#spring.data.redis.jedis.pool.max-active=200
# @Autowrid
# private RedisTemplate<String,Object> redisTmplate;
#
注意:
最新版的docker-compose已经不再推荐使用 links 来连接容器。现在,Docker Compose 默认会为同一网络中的所有服务创建一个 DNS 解析,这样服务之间可以通过服务名称直接相互访问。
[root@localhost pes]# docker-compose up -d
[root@localhost pes]# docker exec -it mysql01 mysql -proot //为haproxy创建一个没有密码,没有任何权限的用户
mysql>create user 'haproxy'@'%' identified by '';
[root@localhost pes]# docker exec -it mysql02 mysql -proot
mysql>create user 'haproxy'@'%' identified by '';
主从读写分离可以看前面的文章配置
浏览器访问