Docker安装MySQL主节点
Mysql主节点 端口是为3306
Mysql从节点 端口是为3307
-
使用docker启动mysql 主节点
docker run --name mysql_master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
说明:
--name 为容器指定名称,这里是master
-p 将容器的指定端口映射到主机的指定端口,这里是将容器的3306端口映射到主机的3306端口
-e 设置环境变量,这里是指定root账号的密码为root
-d 后台运行容器,并返回容器ID
mysql:5.7.13 指定运行的mysql版本
-
创建从节点账号
连接主节点上执行:
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by 'slave';
show grants for 'slave'@'%';
- 创建文件夹
mkdir -p /usr/local/mysql/master
mkdir -p /usr/local/mysql/slave
- 将容器中的/etc/mysql/my.cnf 拷贝到容器外部
docker cp mysql_master:/etc/mysql/my.cnf /usr/local/mysql/master/my.cnf
将容器中 /etc/mysql/my.cnf 拷贝 容器外部中 /usr/local/mysql/master/my.cnf
- 进入外部 : cd /usr/local/mysql/master
Vi my.cnf
新增:
log-bin=mysql-bin
server-id=1
log-bin=mysql-bin 使用binary logging,mysql-bin是log文件名的前缀
server-id=1 唯一服务器ID,非0整数,不能和其他服务器的server-id重复
- 将修改后的文件覆盖Docker中MySQL中的配置文件
docker cp /usr/local/mysql/master/my.cnf mysql_master:/etc/mysql/my.cnf
容器外部 中的文件 /usr/local/mysql/master/my.cnf
mysql_master(容器名称):/etc/mysql/my.cnf
- 进入 docker mysql 主节点 容器
docker exec -it mysql_master bash
cd etc/mysql/
- 重启 mysql 的docker , 让配置生效
docker restart mysql_master
- 查看服务器是否开启binlog
show variables like 'log_bin';
show master status
show variables like '%server%';
show variables like '%datadir%';
Docker安装MySQL从节点
1.## 启动mysql 从节点 容器
docker run --name mysql_slave -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
2.将容器中的/etc/mysql/my.cnf 拷贝到容器外部
docker cp mysql_slave:/etc/mysql/my.cnf /usr/local/mysql/slave/my.cnf
3.cd /usr/local/mysql/slave
Vi my.conf
log-bin=mysql-bin
server-id=2
4.将修改后的文件覆盖Docker中MySQL中的配置文件
docker cp /usr/local/mysql/slave/my.cnf mysql_slave:/etc/mysql/my.cnf
5.重启容器
docker restart mysql_slave
show variables like '%server%';
show variables like '%datadir%';
show variables like 'log_bin';
Docker-compose 配置文件 自动启动2个容器
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='连接Navicat的ip',
MASTER_PORT=正确的端口,
MASTER_USER='正确的用户名',
MASTER_PASSWORD='正确的密码';
START SLAVE;
CHANGE MASTER TO
MASTER_HOST='192.168.43.135',
MASTER_PORT=3306,
MASTER_USER='slave',
MASTER_PASSWORD='slave';
START SLAVE;
My.conf 相关配置
[mysqld]
设置server_id,一般设置为IP,同一局域网内注意要唯一
server_id=100
复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=edu-mysql-bin
为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
状态内容
状态解释:
1.Slave_IO_State: Waiting for master to send event
这里显示了当前slave I/O线程的状态。状态信息和使用show processlist显示的内容一样。
slave I/O线程的状态,有以下几种:
1) waiting for master update
这是connecting to master状态之前的状态
2) connecting to master
I/O线程正尝试连接到master
3) checking master version
在与master建立连接后,会出现该状态。该状态出现的时间非常短暂。
4) registering slave on master
在与master建立连接后,会出现该状态。该状态出现的时间非常短暂。
5) requesting binlog dump
在与master建立连接后,会出现该状态。该状态出现的时间非常短暂。在这个状态下,I/O线程向master发送请求,请求binlog,位置从指定的binglog 名字和binglog的position位置开始。
6) waiting to reconnect after a failed binlog dump request
如果因为连接断开,导致binglog的请求失败,I/O线程会进入睡眠状态。然后定期尝试重连。尝试重连的时间间隔,可以使用命令"change master to master_connect_trt=X;"改变。
7) reconnecting after a failed binglog dump request
I/O进程正在尝试连接master
8) waiting for master to send event
说明,已经成功连接到master,正等待二进制日志时间的到达。如果master 空闲,这个状态会持续很长时间。如果等待的时间超过了slave_net_timeout(单位是秒)的值,会出现连接超时。在这种状态下,I/O线程会人为连接失败,并开始尝试重连
9) queueing master event to the relay log
此时,I/O线程已经读取了一个event,并复制到了relay log 中。这样SQL 线程可以执行此event
10) waiting to reconnect after a failed master event read
读取时出现的错误(因为连接断开)。在尝试重连之前,I/O线程进入sleep状态,sleep的时间是master_connect_try的值(默认是60秒)
11) reconnecting after a failed master event read
I/O线程正尝试重连master。如果连接建立,状态会变成"waiting for master to send event"
12) waiting for the slave sql thread to free enough relay log space
这是因为设置了relay_log_space_limit,并且relay log的大小已经整张到了最大值。I/O线程正在等待SQL线程通过删除一些relay log,来释放relay log的空间。
13) waiting for slave mutex on exit
I/O线程停止时会出现的状态,出现的时间非常短。
- Master_Host: 10.1.8.62
Master_User: rep_user
Master_Port: 3306
这3条信息,显示了slave连接master时,使用的master的主机---master_host、连接master用的用户---master_user、连接master的端口---master_port。 - Connect_Retry: 10
连接中断后,重新尝试连接的时间间隔。默认值是60秒。 - Master_Log_File: binlog.000026
Read_Master_Log_Pos: 446
这两条信息,显示了与master相关的日志的信息。master_log_file:当前I/O线程正在读取的master 二进制日志的文件名;read_master_log_pos:当前I/O线程正在读取的二进制日志的位置 - Relay_Log_File: relay.000008
Relay_Log_Pos: 589
Relay_Master_Log_File: binlog.000026
这3条信息,显示了与relay log相关的信息。relay_log_file:当前SQL线程正在读取并执行的relay log的文件名;relay_log_pos:当前SQL线程正在读取并执行的relay log文件的位置;relay_master_log_file:master 二进制日志的文件名。该文件包含当前SQL执行的事物 - Slave_IO_Running: Yes
Slave_SQL_Running: Yes
显示了当前I/O线程和SQL线程的状态 - Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
这部分显示的是关于复制DB和table的信息。 - Last_Errno: 0
Last_Error:
laster_errno和laster_error是 Last_SQL_Errno和Last_SQL_Error的同义词。 - Skip_Counter: 0
系统参数sql_slave_skip_counter的值。sql_slave_skip_counter:slave应该跳过的事件数 - Exec_Master_Log_Pos: 446
sql线程当前执行的事件,在master 二进制日志中的position - Relay_Log_Space: 878
所有存在relay log的大小 - Seconds_Behind_Master: 0
这个值是时间戳的差值。是slave当前的时间戳和master记录该事件时的时间戳的差值 - Replicate_Ignore_Server_Ids:
slave当前会跳过的事件号 - Master_Server_Id: 2211
master的server-id;如果master和slave的server-id相同,在启动slave时,会报错