基于docker搭建mysql主从+haproxy负载均衡

    使用容器对于部署来说省了不少事情,容器也有利于自己做各种分布式的架构实验。这里说一下使用docker搭建mysql主从以及通过haproxy做从库的负载均衡。

    一、mysql主从

  • 主节点

    1、创建用户,授权

create user 'repl'@'172.22.16.%' identified by 'repl';

grant replication slave on *.* to 'repl'@'172.22.16.%' identified by 'repl';

    2、开启bin-log日志

    查看bin-log日志是否开启

show variables like 'log_bin';

    配置my.conf文件 

server-id=1
log-bin=/var/lib/mysql/mysql-bin

server-id每个节点不能相同,log-bin配置日志位置

  • 从节点
   1、配置同步日志

   配置my.conf文件

server-id=2
relay-log=/var/lib/mysql/relay-bin
relay-log-index=/var/lib/mysql/repl-bin.index

    relay-log指定同步日志位置,relay-log-index指定同步索引日志位置

  • 指定主节点

    1、查看主节点状态

show master status
CHANGE MASTER TO MASTER_HOST='172.22.16.2',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=107;

    其中MASTER_LOG_FILE,MASTER_LOG_POS是上一部查询出来的结果

    2、查看从节点状态

show slave status\G;

    如果发现从节点配置没有成功,可以重启从节点mysql服务,重启slave

stop slave;
start slave;

    再调用CHANGE MASTER命令

  • 旧数据迁移

    1、导出主节点数据

FLUSH TABLES WITH READ LOCK;

mysqldump -h172.22.16.2 -u root -p123456 --opt -R test > test.sql

UNLOCK TABLES;

    2、建立从节点数据

    如果没有数据库,建立数据库,然后倒入数据

mysql -h172.22.16.3 -u root -p123456 test < test.sql

    3、重新绑定主节点

SLAVE STOP;

RESET SLAVE;

CHANGE MASTER TO MASTER_HOST='172.22.16.2',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=330;

start slave;

     4、查看从节点状态

show slave status\G;

    如果从节点没有设置成功,参考之前的处理方式

二、在docker中运行mysql

  • 从官方库拉取mysql镜像
docker pull mysql:5.5
  • 修改官方镜像

   1、启动基于官方镜像的容器

docker run -p 3306:3306 镜像名

   2、进入docker容器

docker exec -it 容器id

   3、修改自己的配置

   4、提交容器生成新的镜像

docker commit 容器id 镜像名

  • 创建基于网桥的自定义网络
docker network create --driver bridge --subnet 172.22.16.0/16 --gateway 172.22.16.1 my_net
   subnet为子网,gateway为网关
   
  • 启动基于修改过的镜像的容器
docker run -p 3306:3306 --name mysql-node1 -it --network=自定义网络名 --ip 自定义网络ip -v /usr/local/mysql/node1/logs:/logs -v /usr/local/mysql/node1/config/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql/node1/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --privileged=true 镜像名

   注意:需要挂载日志文件,配置文件和数据文件

三、haproxy负载均衡

  • 创建统一的mysql用户名密码,权限

主节点执行如下命令,自动会在从节点执行同样的命令

create user 'admin'@'172.22.16.%' identified by 'nmamtfnmamtf';

grant all on *.* to 'admin'@'172.22.16.%';
  • 配置haproxy

创建haproxy.conf文件

global
        daemon #后台方式运行
        nbproc 1
        pidfile /usr/local/haproxy/conf/haproxy.pid

defaults
        mode tcp  #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
        retries 2  #两次连接失败就认为是服务器不可用,也可以通过后面设置
        option redispatch  #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
        option abortonclose  #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
        maxconn 4096   #默认的最大连接数
        timeout connect 5000ms  #连接超时
        timeout client 30000ms  #客户端超时
        timeout server 30000ms  #服务器超时
        #timeout check 2000     #=心跳检测超时
        log 127.0.0.1 local0 err #[err warning info debug]

        ########test1配置#################
listen test1  #这里是配置负载均衡,test1是名字,可以任意
        bind 0.0.0.0:33060   #这里是监听的IP地址和端口,端口号可以在0-65535之间,要避免端口冲突
        mode tcp   #连接的协议,这里是tcp协议
        #maxconn 4086
        #log 127.0.0.1 local0 debug
        server s1 172.22.16.3:3306 #负载的机器
        server s2 172.22.16.4:3306 #负载的机器,负载的机器可以有多个,往下排列即可

四、在docker中运行haproxy

  • 从官方拉取haproxy镜像
docker pull haproxy:1.7
  • 启动基于官方镜像的容器
docker run -p 33060:33060 --name haproxy -e LANG=en_US.UTF-8 --network=自定义网络名 --ip 自定义网络ip -v /usr/local/haproxy/conf/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg 镜像名

需要挂载配置文件


基于容器搭建mysql主从+haproxy负载均衡基本就这些内容了。只不过在生产环境是容器间通信,需要进行额外的处理。这里是同宿主机中的容器通信,只需要用默认的网桥模式,或者自定义基于网桥的网络即可。

你可能感兴趣的:(数据库)