背景:
教务网系统,某时刻请求量急剧增多,mysql同时处理有限,过多即会排队。
搭载mysql的服务器崩溃,会导致网站故障
一、为什么要使用数据库集群和负载均衡?
1.高可用
集群:全国各地分布式存放数据库,不会因为单台故障,停止业务,
需要数据同步
2.高并发
负载均衡:平均分配任务
3.高性能
二、mysql数据库集群方式


replication:
相当于读写分离,n台读,n台写,通过异步方式进行同步数据
缺点,会有时间差概念,也会有时可以写,但是同步信息式丢失数据,读不出来信息

PXC:
node1同步信息 node2、node3,只会产生true or false,保证数据同步
三、使用docker安装PXC
为什么使用docker搭建 :数据卷机制
docker 创建集群 将docker的mysql 上传到阿里云服务器,当docker挂掉之后,数据不会丢失
1.拉取PXC镜像
docker pull percona/percona-xtradb-cluster:5.7
2.创建volume卷
docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
- 创建虚拟network网络
docker network create --subnet=172.18.0.0/24 net1
4.运行PXC容器
相当于三台mysql,项目开发下,每一个docker都是在不同的服务器
# 创建node1 -aliyun 1
docker run -d -p 8003:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=qwe123 -e XTRABACKUP_PASSWORD=qwe123 -e CLUSTER_NAME=PXC --name=node1 --net=net1 --ip 172.18.0.2 percona/percona-xtradb-cluster:5.7
# 创建node2 -aliyun 2
docker run -d -p 8004:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=qwe123 -e XTRABACKUP_PASSWORD=qwe123 -e CLUSTER_NAME=PXC -e CLUSTER_JOIN=node1 --name=node2 --net=net1 --ip 172.18.0.3 percona/percona-xtradb-cluster:5.7
# 创建node3 -aliyun3
docker run -d -p 8005:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=qwe123 -e XTRABACKUP_PASSWORD=qwe123 -e CLUSTER_NAME=PXC -e CLUSTER_JOIN=node1 --name=node3 --net=net1 --ip 172.18.0.4 percona/percona-xtradb-cluster:5.7
四、为什么要使用Haproxy?
1.高性能

2.使用docker安装Haproxy
# 拉取haproxy image
docker pull haproxy
# 在虚拟机中创建保存haproxy配置文件的目录
mkdir -p ~/haproxy_conf/
# 创建haproxy.cfg配置文件
global
#工作目录
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
log 127.0.0.1 local5 info
#守护进程运行
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
#监控界面
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:8888
#访问协议
mode http
#URI相对地址
stats uri /
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:qwe123
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:3306
#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
option mysql-check user haproxy
server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
option tcpka
# 运行容器
docker run -it -d -p 8078:8888 -p 8036:3306 -v /root/haproxy_conf:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.5 haproxy
# 查看端口是否启动
netstat -ltunp | grep 8078
# 进入haproxy容器,启动haproxy
docker exec -it h1 bash
# 加载haproxy配置文件
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
3.使用Navicat登录haproxy
在数据库中创建一个没有任何权限的haproxy用户,密码为空,来测试mysql负载均衡是否正常。
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
此时,本项目所有数据转为通过Haproxy 进行存储,要将原数据导入到Haproxy中在分发到node1,node2,node3,数据库接口已改变
但需要在Haproxy 创建用户, django 将数据库配置改为Haproxy的ip和端口
网友评论