使用容器对于部署来说省了不少事情,容器也有利于自己做各种分布式的架构实验。这里说一下使用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配置日志位置
配置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
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负载均衡
主节点执行如下命令,自动会在从节点执行同样的命令
create user 'admin'@'172.22.16.%' identified by 'nmamtfnmamtf';
grant all on *.* to 'admin'@'172.22.16.%';
创建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
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 镜像名
需要挂载配置文件