前面已经将了如何利用composer 快速搭建mysql服务。本篇文章将在原来的基础配置出,2台Mysql 服务器。一台做为Master 服务器,一台做为Slave 服务器。html
version: '3'
networks: #定义网路
backend:
driver: ${NETWORKS_DRIVER}
services:
### MySQL ################################################
mysql-master:
build:
context: ./mysql #自定义镜像
args:
- MYSQL_VERSION=${MYSQL_VERSION}
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE} #默认建立数据库
- MYSQL_USER=${MYSQL_USER} #建立用户
- MYSQL_PASSWORD=${MYSQL_PASSWORD} #用户密码
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} #root 用户秘密
- TZ=${WORKSPACE_TIMEZONE}
volumes:
- ${DATA_PATH_HOST}/mysql:/var/lib/mysql
- ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
ports:
- "${MYSQL_PORT}:3306"
networks:
- backend
mysql-slave:
build:
context: ./mysql_slave #自定义镜像
args:
- MYSQL_VERSION=${MYSQL_VERSION}
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE} #默认建立数据库
- MYSQL_USER=${MYSQL_USER} #建立用户
- MYSQL_PASSWORD=${MYSQL_PASSWORD} #用户密码
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} #root 用户秘密
- TZ=${WORKSPACE_TIMEZONE}
volumes:
- ${DATA_PATH_HOST}/mysql_slave:/var/lib/mysql
- ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
ports:
- "${MYSQL_PORT_SLAVE}:3306"
networks:
- backend
复制代码
先给出完整版的docker-compose.yml。不过先把关注点放在mysql-master
这个服务上,mysql-slave
先放一边,不去管他。
比对上一篇中的内容,mysql-master
的配置没有变化,咱们须要将mysql-master
做为Master节点。主要的工做在于mysql目录下的my.cnf文件。
mysql
修改后的my.cnfweb
# The MySQL Client configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysql]
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
## 主库配置
## 设置server_id,通常设置为IP,保证惟一就好
server_id=100
# 开启binlog,名字能够随意取
log-bin=mysql-bin
## binlog日志格式,(mixed,statement,row,默认格式是statement)
binlog_format=row
## 日志自动删除日期,默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的全部错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是由于主从数据库数据不一致
slave_skip_errors=1062
## 复制过滤:也就是指定哪一个数据库不用同步(mysql库通常不一样步)
binlog-ignore-db=mysql
#控制binlog的写入频率。每执行多少次事务写入一次(这个参数性能消耗很大,但可减少MySQL崩溃形成的损失)
sync_binlog = 1
#这个参数通常用在主主同步中,用来错开自增值, 防止键值冲突
auto_increment_offset = 1
#这个参数通常用在主主同步中,用来错开自增值, 防止键值冲突
auto_increment_increment = 1
复制代码
参数的意义备注都有说明了,着重讲解下如下几个sql
delete from student where id = 1。
那么binlog日志中也会如实记录这条信息。优势:占用空间少,缺点:误删则没法恢复数据,在某些状况下,可能形成主备不一致。docker-compose up -d --build mysql-master
复制代码
--build
参数可让镜像强制从新生成。
查看Master服务binlog状况docker
show VARIABLES like 'log_%';
复制代码
展现内容以下:
数据库
log_bin
为ON。
grant file,select,replication slave on *.* to 'slave'@'%' identified by '123456';
复制代码
这里'slave'@'%' 让slave 能够在任何机器均可以登陆,固然若是知道Slave节点IP ,建议使用IP,增长帐号安全性。
缓存
show master status;
复制代码
复制mysql 目录 生成一个mysql_slave目录,改后目录结构为
安全
# The MySQL Client configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysql]
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
## 从库配置
## 设置server_id,通常设置为IP,保证惟一就好
server_id=101
# 开启binlog,名字能够随意取
log-bin=mysql-slave-bin
## binlog日志格式,(mixed,statement,row,默认格式是statement)
binlog_format=row
## 日志自动删除日期,默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的全部错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是由于主从数据库数据不一致
slave_skip_errors=1062
## 复制过滤:也就是指定哪一个数据库不用同步(mysql库通常不一样步)
binlog-ignore-db=mysql
#牺牲必定可靠性,增强并发能力
sync_binlog = 0
innodb_flush_log_at_trx_commit = 0
## 只读
read_only=1
复制代码
和Master 项目比:bash
sync_binlog 和 ``innodb_flush_log_at_trx_commit 设置为0,
加快事务处理速度,牺牲了必定的可靠性。因为Slave 是Master 的备份,因此即便Slave 服务崩溃或者断点丢失数据,也能够从新启动后从主库恢复。docker-compose up -d --build mysql-slave
复制代码
mysql-slave节点在.env中,我配置成了3309端口。
服务启动后,链接上Slave节点,设置Master 信息:服务器
change master to master_host='mysql-master',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1311;
复制代码
简单来讲Slave 服务器,经过master_log_file和master_log_pos 两个参数知道本身经过Master中的哪一个binlog信息开始同步。
stop slave;
start slave;
复制代码
开启同步,查看同步信息
mysql>SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: mysql-master
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1311
Relay_Log_File: aee031481732-relay-bin.000002
Relay_Log_Pos: 232
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1311
Relay_Log_Space: 1401
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
复制代码
Slave_IO_Running 和 Slave_SQL_Running
两列的值都为"Yes",这代表 Slave 的 I/O 和 SQL 线程都在正常运行。Seconds_Behind_Master
表示延迟多少,通常状况为0
经过今天的配置,咱们搭建了2台Mysql 服务器,一台Master ,一台Slave。了解binlog日志的不一样格式,以主从服务器为了效率不一样的配置信息。下一篇将讲解怎么作双主
。
docker 搭建Mysql 集群:使用composer 启动Mysql服务