单机版 Mysql
1、拉取镜像:docker pull daocloud.io/library/mysql:5.7.6(根据自己的来)
2、准备Mysql数据存放目录,我这里是:/home/docker-volume/data/mysql-master(我在后面要搭建读写分离)
3、执行指令启动Mysql
docker run --name mysql-master --privileged=true -v /home/docker-volume/mysql-master/data:/var/lib/mysql -v /home/docker-volume/mysql-master/conf:/etc/mysql/conf.d -p 9091:3306 -e MYSQL_ROOT_PASSWORD=123456 -d daocloud.io/library/mysql:5.7.6
注意这里: --privileged=true 需要加,这个参数的作用是:使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
如果不加该参数,挂载卷那会提示报错,如下:
加入参数后成功:
使用GUI工具连接
成功
主从复制安装
master节点
在宿主机上找个目录创建 my.cnf文件,写入
[mysqld]
#唯一ID
server-id=1
# 开启binlog 文件记录
log-bin=mysql-bin
#记录日志的数据库
binlog-do-db=test
#不记录数据库
binlog-ignore-db=mysql
注:也可以先启动容器,不用提前写好配置,后面改也行,只是要重启而已,按自己的方式来就行
启动master
docker run --name mysql-master --privileged=true -v /home/docker-volume/mysql-master/data:/var/lib/mysql -v /home/docker-volume/mysql-master/conf:/etc/mysql/conf.d -p 9091:3306 -e MYSQL_ROOT_PASSWORD=123456 -d daocloud.io/library/mysql:5.7.6
尝试远程连接
查看master状态
show master status;
注:记住File 和 Position参数,后面要用
创建连接账户
进入mysql操作界面,在主服务器上为从服务器建立一个连接帐户,该帐户必须授予REPLICATION SLAVE权限。因为从mysql版本3.2以后就可以通过REPLICATION对其进行双机热备的功能操作。
GRANT REPLICATION SLAVE ON *.* to 'back'@'%' identified by 'back';
刷新权限
flush privileges;
查看是否成功
show grants for 'replicate'@'%';
从服务器
创建配置文件
[mysqld]
server-id=2
log-bin=mysql-bin
replicate-do-db=test
replicate-ignore-db=mysql,information_schema,performance_schema
运行容器
docker run --name mysql-slave --privileged=true -v /home/docker-volume/mysql-slave/data:/var/lib/mysql -v /home/docker-volume/mysql-slave/conf:/etc/mysql/conf.d -p 9092:3306 -e MYSQL_ROOT_PASSWORD=123456 -d daocloud.io/library/mysql:5.7.6
这时候 master 和 slave都已经正常启动,现在就是同步
注:这里最好进入容器进行远程连接master数据库,验证是否能够连通,避免网络问题
进入容器命令
docker exec -it mysql-slave /bin/bash
在容器中尝试远程连接命令
mysql -h 172.17.0.3 -P 3306 -u back -p
设置主从同步
先停止主从同步,不然没法进行修改
stop slave;
修改slave status ,一定要先停止
change master to master_host='172.17.0.3',master_port=3306,master_user='back ',master_password='back',master_log_file='mysql-bin.000006',master_log_pos=728;
启动slave
start slave;
如果显示
Slave_IO_State : Connecting to master
Slave_IO_Running: NO
Slave_IO_SQL_Runing : NO
一般来说都是失败的
一般来说:
- 网络不通
- 密码不对
- pos不对
- 授权问题
如果所有参数显示正常,但是同步数据同步不了
重置以下slave 配置
stop slave;
reset slave;
change master to master_host='172.17.0.3',master_port=3306,master_user='back',master_password='back',master_log_file=
'mysql-bin.000007',master_log_pos=2164;
start slave;
show slave status;
测试效果
主机运行
INSERT INTO `t_user`
VALUES
(5,"shuen" );
查看从机已经获取了数据
搞定,一般来说 按照步骤都是没有问题的,最可能出问题的是在进行start slave; 一般网络问题偏多,多注意以下防火墙等。遇到问题不要慌,先确定问题点,再进行处理。
思考
Mysql主从延时一直都是个问题,网上很多资料都有说过使用Mysql的半同步状态可以很好的解决主同步延时问题。
理想的情况下:
- 数据库硬件性能好
- 数据库、表结构设计合理
- SQL语句优化得好。
在这样的情况下应该不会有什么延时问题。但事实上就我所在的公司里数据库的设计、表的设计、SQL语句等都是一个问题。正因为这些问题导致了再牛B的半同步复制都无法解决到我的主从数据延时问题。
解决方案 : 基于GTID 同步复制 + 插件(Semi-sync) 实现半同步复制
基于GTID 复制
GTID介绍
从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。
GTID (Global Transaction ID)是全局事务ID,当在主库上提交事务或者被从库应用时,可以定位和追踪每一个事务,对DBA来说意义就很大了,我们可以适当的解放出来,不用手工去可以找偏移量的值了,而是通过CHANGE MASTER TO MASTER_HOST='xxx', MASTER_AUTO_POSITION=1的即可方便的搭建从库,在故障修复中也可以采用MASTER_AUTO_POSITION=‘X’的方式。
主服务器配置
[mysqld]
server-id=110
#开启binlog
log_bin=master-bin
#binlog 模式 有三种
binlog_format=row
expire_logs_days=10
#gtid 同步复制
gtid_mode=on
enforce-gtid-consistency
log-slave-updates=ON
#记录哪些库 忽略哪些库
binlog-do-db = campus_20191011_online
binlog-ignore-db=mysql
innodb_flush_log_at_trx_commit=1
log_error = /data/mysql/mysql-error.log
slow_query_log = On
long_query_time = 2
slow_query_log_file = /data/mysql/mysql-slow.log
log-queries-not-using-indexes
sync_binlog=1
#1表明不区分大小写 默认0 区分
lower_case_table_names=1
从服务器
[mysqld]
server-id = 61
#开启binlog
log_bin=slave-bin
binlog_format=row
#gtid 同步复制
gtid_mode=on
enforce-gtid-consistency
log-slave-updates=1
#从服务器启动时候,跳过启动主从复制
skip_slave_start=1
master_info_repository=table
relay_log_info_repository=table
relay_log_recovery=1
replicate-do-db=campus_20191011_online
replicate-ignore-db=mysql,information_schema,performance_schema
log_error = /data/mysql/mysql-error.log
slow_query_log = On
long_query_time = 2
slow_query_log_file = /data/mysql/mysql-slow.log
log-queries-not-using-indexes
innodb_flush_log_at_trx_commit=2
sync_binlog=0
#1表明不区分大小写 默认0 区分
lower_case_table_names=1
#并行复制 5.7 正式启用
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
slave_pending_jobs_size_max = 2147483648
slave_preserve_commit_order=1
GTID 复制可以单独使用,因此本文就到这里了,后续更新semi_sync 半同步复制插件使用
查看GTID参数
show global variables like '%GTID%';
查看binlog_format
show global variables like "binlog_format"