docker 安装mysql(单机版以及 主从模式)

单机版 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"

猜你喜欢

转载自blog.csdn.net/wangxuelei036/article/details/107457533