一、Docker安装
根据操作系统,根据docker官方要求,安装docker环境。
二、镜像重构
docker pull hub.c.163.com/library/mysql:latest
本地持久化:D:\docker\servers\mysql\data:/var/lib/mysql
D:\docker\servers\mysql\etc\my-master.cnf etc/mysql/my.cnf(主)
D:\docker\servers\mysql\etc\my-slave.cnf etc/mysql/my.cnf(备)
Docker tag hub.c.163.com/library/mysql localhost:5000/mysql
Docker push localhost:5000/mysql
docker run -p 3306:3306 -v D:\docker\servers\mysql\data:/var/lib/mysql --name mysql -e MYSQL_ROOT_PASSWORD=loulou -e MYSQL_DATABASE=sdb -d localhost:5000/mysql
docker exec -it -u mysql mysql /bin/bash //密码loulou
三、compose编排
在需要编排的组合的compost的yml文件中,增加mysql的容器配置。若需要增加主备模式,参考附录
mysql:
image: localhost:5000/mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=loulou
- MYSQL_DATABASE=sdb
volumes:
- D:\docker\servers\mysql\data:/var/lib/mysql
cap_add:
- NET_ADMIN
hostname: mysql
restart: always
四、高可用模式
常见的mysql的高可用模式,可分为以下几种:
互备模式 :资源紧张时可考虑
一主一备模式 :常用模式
一主多备模式 :读性能扩展
备份传递 :多中心模式
集群模式 :高性能需求
备份模式的相关案例,可通过下图docker部署案例实现,供日常环境验证:
五、高可用构建
复制参数梳理
参考各个节点的cnf文件,内容上在mysqld服务端模块:
server-id=200 #服务器ID,节点不能重复
log-bin=mysql-bin #binlog日志文件名,不需要修改
innodb_flush_log_at_trx_commit=2 #[复制上游]保证一致性 性能
sync_binlog=1 #[复制上游]保证一致性 性能
log_slave_updates=1 #[多级复制]多级复制中中间节点通过该选项进行操作日志传输
replicate-wild-do-table=udp.% #[复制上游] 复制范围-白名单
replicate-wild-do-table=oup.% #[复制上游] 复制范围-白名单
#replicate-wild-ignore-table=mysql.% #[复制上游] 复制范围-黑名单
Compose编排
构建目录以及mysql配置,并构建启动配置,依据第四章节图初始化如下:
D:\docker\compose\docker-compose-mysql.yml
注:在其中一个节点需要挂载D:\docker\servers\mysql\conf:/conf 方便自动化挂载主备模式。
初始化主备关系
登录挂载mysql容器的/conf目录节点的数据库,然后执行以下脚本初始化主备节点。
/mysql-rep-list.sh #包含主备节点注册清单,首次全量安装使用。
/mysql-m-s.sh $1 $2 #单个主备链条增加时,一句话快速挂载。
注意:1、$1为上游节点 $2为下游备份节点。
2、详细的上游节点和下游备份节点操作,参考脚本(附录也可以)
3、由于不能挂载附件,sh脚本的内容若有需要,加我微信。
测试验证
0-master:新增udp,然后建表,增加数据。验证1-master、0-slave1、0-slave2、1-slave1
1-master:新增oup,然后建表,增加数据。验证0-master、0-slave1、0-slave2、1-slave1
六、操作命令-全部
Compost.bat mysql up -d [restart/stop/rm]
Docker exec -it compose_mysql_1 /bin/bash
/conf/mysql-rep-list.sh
七、附录
主备关系清单--手工脚本
1-master-->0-master:(由0-master的cnf文件决定复制库oup) 【注意根据上游节点,调整bin文件和pos数值】
1-master:【关注File/Position】
GRANT FILE ON *.* TO 'root'@'0-master' IDENTIFIED BY 'loulou';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'0-master' IDENTIFIED BY 'loulou';
FLUSH PRIVILEGES;
show master status;
0-master:[调整master_log_file/master_log_pos]
stop slave;
change master to master_host='1-master',master_port=3306,master_user='root',master_password='loulou',master_log_file='mysql-bin.000003', master_log_pos=873;
commit;
start slave;
show slave status\G;
0-master-->1-master(由1-master的cnf文件决定复制库udp) 【注意根据上游节点,调整bin文件和pos数值】
0-master: 【关注File/Position】
GRANT FILE ON *.* TO 'root'@'1-master' IDENTIFIED BY 'loulou';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'1-master' IDENTIFIED BY 'loulou';
FLUSH PRIVILEGES;
commit;
show master status;
1-master: [调整master_log_file/master_log_pos]
stop slave;
change master to master_host='0-master',master_user='root',master_password='loulou',master_log_file='mysql-bin.000004', master_log_pos=6336;
start slave;
show slave status\G;
0-master-->0-slave1(udp/oup) 【注意根据上游节点,调整bin文件和pos数值】
0-master: 【关注File/Position】
GRANT FILE ON *.* TO 'root'@'0-slave1' IDENTIFIED BY 'loulou';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'0-slave1' IDENTIFIED BY 'loulou';
FLUSH PRIVILEGES;
show master status;
0-slave1: [调整master_log_file/master_log_pos]
stop slave;
change master to master_host='0-master',master_user='root',master_password='loulou',master_log_file='mysql-bin.000005', master_log_pos=6187;
start slave;
show slave status\G;
0-master-->1-slave1【注意根据上游节点,调整bin文件和pos数值】
0-master: 【关注File/Position】
GRANT FILE ON *.* TO 'root'@'1-slave1' IDENTIFIED BY 'loulou';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'1-slave1' IDENTIFIED BY 'loulou';
FLUSH PRIVILEGES;
show master status;
1-slave1: [调整master_log_file/master_log_pos]
stop slave;
change master to master_host='0-master',master_user='root',master_password='loulou',master_log_file='mysql-bin.000005', master_log_pos=6938;
start slave;
show slave status\G;
0-slave1-->0-slave2【注意根据上游节点,调整bin文件和pos数值】
0-slave1: 【关注File/Position】
GRANT FILE ON *.* TO 'root'@'0-slave2' IDENTIFIED BY 'loulou';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'0-slave2' IDENTIFIED BY 'loulou';
FLUSH PRIVILEGES;
show master status;
0-slave2: [调整master_log_file/master_log_pos]
stop slave;
change master to master_host='0-slave1',master_user='root',master_password='loulou',master_log_file='mysql-bin.000005', master_log_pos=2717;
start slave;
show slave status\G;
主备关系清单--自动脚本
Mysql-rep-list.sh
#!/bin/bash
/conf/mysql-m-s.sh 1-master 0-master
/conf/mysql-m-s.sh 0-master 1-master
/conf/mysql-m-s.sh 0-master 0-slave1
/conf/mysql-m-s.sh 0-master 1-slave1
/conf/mysql-m-s.sh 0-slave1 0-slave2
mysql-m-s.sh
#!/bin/bash
MASTER_NODE=$1
SLAVE_NODE=$2
ROOT_PASSWD=loulou
LOGFILE=/conf/$MASTER_NODE----$SLAVE_NODE.log
echo "mysql $MASTER_NODE init start!!!"
mysql -h $MASTER_NODE -uroot -p$ROOT_PASSWD<< EOF
GRANT FILE ON *.* TO 'root'@'$SLAVE_NODE' IDENTIFIED BY '$ROOT_PASSWD';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'$SLAVE_NODE' IDENTIFIED BY '$ROOT_PASSWD';
FLUSH PRIVILEGES;
show master status;
EOF
mysql -h $MASTER_NODE -uroot -p$ROOT_PASSWD -e "show master status">>$LOGFILE
mysql -h $MASTER_NODE -uroot -p$ROOT_PASSWD -e "show master status">$LOGFILE.txt
FILENAME=`grep mysql-bin $LOGFILE.txt | cut -f1`
POSITION=`grep mysql-bin $LOGFILE.txt | cut -f2`
rm -f $LOGFILE.txt
echo "FILENAME:$FILENAME">>$LOGFILE
echo "POSITION:$POSITION">>$LOGFILE
echo "mysql $MASTER_NODE init end!!!">>$LOGFILE
echo "mysql $SLAVE_NODE init start!!!">>$LOGFILE
mysql -h $SLAVE_NODE -uroot -p$ROOT_PASSWD<< EOF
stop slave;
change master to master_host='$MASTER_NODE',master_user='root',master_password='$ROOT_PASSWD',master_log_file='$FILENAME', master_log_pos=$POSITION;
start slave;
show slave status\G;
EOF
mysql -h $SLAVE_NODE -uroot -p$ROOT_PASSWD -e "show slave status\G">>$LOGFILE
echo "mysql SLAVE_NODE init end!!!">>$LOGFILE