进度记录【Day5】pxc集群/haproxy代理

Day5

常见的mysql集群解决方案

1. Replication方案

  • 速度快
  • 弱一致性:存储数据时,主节点存储成功后直接回复成功,其他节点同步情况不影响回复结果(数据同步是异步的)
  • 适合存储低价值数据
  • 例如:系统日志、新闻、帖子

2. PXC方案

  • 速度慢
  • 强一致性:存储数据时,数据同步都完成后回复成功,有一个节点不成功都回复失败
  • 适合存储高价值数据
  • 例如:订单 账户 财务

两种集群方案是互补的关系。

PXC集群方案

  • 全称 percona-xtradb-cluster

1、拉取pxc镜像

  • 拉取镜像

docker pull percona/percona-xtradb-cluster

  • 做镜像副本

docker tag percona/percona-xtradb-cluster pxc

  • 删除原镜像

docker rmi percona/percona-xtradb-cluster

2、创建新的网络

  • 出于安全考虑,将pxc集群部署在另一个局域网
  • redis集群部署在172.17.0.1这个局域网内
  • 把pxc集群部署在172.18.0.1这个局域网内
  • 用docker新建一个局域网

docker network create --subnet=172.18.0.1/24 net_pxc
172.18.0.1是新建的网络虚拟网卡地址
/24是子网掩码 → 255.255.255.0

3、创建5个volume挂载卷

docker volume create pxc_v1
docker volume create pxc_v2
docker volume create pxc_v3
docker volume create pxc_v4
docker volume create pxc_v5

4、启动5个pxc容器

  • 启pxc1容器

docker run -d -p 3001:3306
-e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=root -v pxc_v1:/var/lib/mysql
–privileged --name=pxc1 --net=net_pxc --ip 172.18.0.11 pxc

  • -p 3001:3306 端口映射【改】
  • -e MYSQL_ROOT_PASSWORD=root 指定mysql的密码
  • -e CLUSTER_NAME=PXC 指定集群的名字
  • -e XTRABACKUP_PASSWORD=root 指定集群中节点同步密码
  • -v pxc_v1:/var/lib/mysql 指定挂载卷【改】
  • –privileged 赋予权限
  • –name=pxc1指定容器名字【改】
  • –net=net_pxc 指定网络(如果不指定,默认是docker0网络,即172.17.0.1)
  • –ip 172.18.0.11 指定容器ip地址(如果不指定,会随机分配)【改】
  • pxc 镜像的名字

以pxc1为集群的第一个节点,其他节点都加入pxc1节点,所以在启其他pxc容器都要加一个参数(-e CLUSTER_JOIN=pxc1),pxc1容器启动后,不能立即创建pxc2,因为pxc1容器创建后,容器中的mysql服务还处于启动中,集群的状态也处于启动中,如果立即创建pxc2,可能会创建失败,需要用navicat工具验证pxc1是否完全启动成功。

navicat新建连接并测试

  • 启pxc2/pxc3/pxc4/pxc5容器

docker run -d -p 3002:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxc1 -v pxc_v2:/var/lib/mysql --privileged --name=pxc2 --net=net_pxc --ip 172.18.0.12 pxc

docker run -d -p 3003:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxc1 -v pxc_v3:/var/lib/mysql --privileged --name=pxc3 --net=net_pxc --ip 172.18.0.13 pxc

docker run -d -p 3004:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxc1 -v pxc_v4:/var/lib/mysql --privileged --name=pxc4 --net=net_pxc --ip 172.18.0.14 pxc

docker run -d -p 3005:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxc1 -v pxc_v5:/var/lib/mysql --privileged --name=pxc5 --net=net_pxc --ip 172.18.0.15 pxc

  • 同理,用navicat工具连接5个容器数据库,在pxc1中创建school数据库,在数据库中创建school表,增加数据后查看其它容器数据库是否同步。
    创建school表

任意一个节点的数据改变都会同步给其他的容器数据库

  • 被连接的节点工作量比较大,不仅需要存储数据还要将数据同步给其他节点
    解决方法:负载均衡,用haproxy,程序连接haproxy代理节点间接连接pxc mysql集群。

制作haproxy镜像

1、不使用官方的haproxy镜像的原因

  • 官方的haproxy镜像使用Ubuntu操作系统,不是centOS7,不方便使用

2、制作haproxy镜像的步骤

mkdir haproxy
wget https://www.haproxy.org/download/2.0/src/haproxy-2.0.5.tar.gz

  • 将Dockerfile和haproxy.cffg文件拷贝到安装包同级目录下
    dockerfile文件
  • 写Dockerfile文件【改-y和暴露端口8888】
FROM centos:7  #指定centos7为基础镜像
#将同级目录下的文件haproxy-2.0.5.tar.gz拷贝到该目录下
ADD haproxy-2.0.5.tar.gz /usr/local/etc/
## 安装编译工具,开始安装编译haproxy
RUN yum install -y gcc gcc-c++ glibc glibc-devel pcre \
                pcre-devel openssl openssl-devel systemd-devel \
                net-tools vim iotop bc zip unzip zlib-devel lrzsz \
                tree screen lsof tcpdump wget ntpdate –y \
      && cd /usr/local/etc/haproxy-2.0.5 \
      && make ARCH=x86_64 TARGET=linux-glibc \
              USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 \
              USE_SYSTEMD=1 USE_CPU_AFFINITY=1 \
              PREFIX=/usr/local/haproxy \
      && make install PREFIX=/usr/local/haproxy \
      && cp haproxy /usr/sbin/ \
      && mkdir /usr/local/haproxy/run
# 将Dockerfile同级目录下的haproxy.cfg配置文件拷贝到镜像的该目录下
ADD haproxy.cfg /etc/haproxy/
ADD haproxy.cfg /usr/local/etc/haproxy-2.0.5/
# 将 run_haproxy.sh 启动脚本文件拷贝到镜像的该目录下
ADD run_haproxy.sh /usr/bin
# 赋予 run_haproxy.sh 运行权限
RUN chmod +x /usr/bin/run_haproxy.sh
# 向外暴露 80 和 8888 端口
EXPOSE 80 8888
#执行 run_haproxy.sh 脚本
CMD ["/usr/bin/run_haproxy.sh"]
  • 写 haproxy.cfg 配置文件【改路径src和ip/端口11:3306/12:3306…】
global
	#工作目录
	chroot /usr/local/etc/haproxy-2.0.5
	#日志文件,使用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   /dbs
	#统计报告格式
    stats realm     Global\ statistics
	#登陆帐户信息
    stats auth  admin:admin
#数据库负载均衡
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  pxc_node1 172.18.0.11:3306 check weight 1 maxconn 2000  
    server  pxc_node2 172.18.0.12:3306 check weight 1 maxconn 2000  
	server  pxc_node3 172.18.0.13:3306 check weight 1 maxconn 2000 
	server  pxc_node4 172.18.0.14:3306 check weight 1 maxconn 2000
	server  pxc_node5 172.18.0.15:3306 check weight 1 maxconn 2000
	#使用keepalive检测死链
    option  tcpka  
 
  • 写run_haproxy.sh 脚本
#!/bin/bash
haproxy -f /etc/haproxy/haproxy.cfg
tail -f /etc/hosts

  • 执行构建haproxy镜像命令

docker build -t mars/haproxy .
.表示执行该目录下的Dockerfile文件

  • 使用mars/haproxy镜像启动一个容器

docker run -d -p 80:80 -p 3000:8888 mars/haproxy
因为已经配置了haproxy.cfg,所以容器启动后会自动代理pxc集群

  • 访问haproxy的监控界面

192.168.87.101:3000/dbs

3、在 pxc集群中创建一个用户给 haproxy使用

CREATE USER 'haproxy'@'%' IDENTIFIED BY '';

这个用户创建好后,会自动同步给其他的pxc节点

  • 需要指定haproxy节点和pxc集群节点在同一个局域网中
    重新启动一个haproxy容器

docker run -d -p 80:80 -p 8888:8888 -p 3306:3306 --name haproxy --privileged --net=net_pxc --ip 172.18.0.10 mars/haproxy
haproxy镜像代理成功
此时镜像代理成功

  • 暂停pxc2和pxc4检查检测页面

docker pause pxc2
docker pause pxc4

  • 恢复pxc2和pxc4检查检测页面

docker unpause pxc2
docker unpause pxc4

4、集群的伸缩:在 pxc集群中再添加一个pxc6节点

  • 创建新的volume挂载卷

docker volume create pxc_v6

  • 启动新的pxc节点6

docker run -d -p 3006:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxc1 -v pxc_v6:/var/lib/mysql --privileged --name=pxc6 --net=net_pxc --ip 172.18.0.16 pxc

  • 此时发现监控页面中并没有代理到pxc6:原因是haproxy.cfg配置文件中只配置了pxc1-pxc5,需要修改haproxy.cfg配置文件
  • 加入 server pxc_node6 172.18.0.16:3306 check weight 1 maxconn 2000
  • 保存退出文件
  • 删除haproxy容器

docker rm -f haproxy容器ID

  • 重新启动一个haproxy容器,并挂载haproxy.cfg文件到容器中

docker run -d -p 80:80 -p 8888:8888 -p 3306:3306 -v /root/docker/haproxy/haproxy.cfg:/etc/haproxy/haproxy.cfg --name haproxy --privileged --net=net_pxc --ip 172.18.0.10 mars/haproxy

4、启一个tomcat部署EasyBuy项目访问haproxy节点

EasyBuy项目访问的mysql地址是haproxy代理地址
注册用户,查看是否能在每个pxc节点中添加数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值