MySQL数据库主从双向同步

MySQL数据库主从双向同步

  • 一 环境
  • 二 主从同步
    • 1.主服务器配置
    • 2.从服务器配置
  • 二 双向同步
  • 三 其他相关参数配置
  • 四 后记

一 环境

由于开发需要,需要两台服务器进行负载均衡,两台服务器配置完全相同,均为windows server 2012,且MySQL数据库版本为Mysql5.6,连接工具使用Navicat Premium 12,使用默认安装。
MySql数据库配置文件 My.ini 位于C:\ProgramData\MySQL\MySQL Server 5.6。
假设两台服务器IP分别为:192.168.1.101,192.168.1.102
注意,在以下操作中最好不要有数据的读写,且保证两台服务器上要同步的数据库完全一致

二 主从同步

1.主服务器配置

我们以192.168.1.101为主服务器,以192.168.1.102为从服务器,让102服务器主动来同步101上的内容。
一般情况下,我们使用数据库的二进制日志文件来同步数据。
1.打开主服务器的mysql数据库配置文件my.ini,找到server-id=1这部分内容,在后面添加对应的内容。

# 数据库服务ID,同步时保证不重复即可
server-id=1
# 需要记录日志的数据库,这里记录test数据库的日志,有多个数据库时再来一条即可
binlog-do-db=test1
# 需要同步数据的数据库
replicate-do-db=test1

# 不需要同步数据的数据库,有多个数据库时再来一条即可,如果没有则可以不用
replicate-ignore-db=mysql1
# replicate-ignore-db=mysql2

# 日志文件的名称
log-bin=mysql_log_bin

修改完成之后保存,然后重启MySQL服务,使用命令或者在服务中重启都可以

net stop MySQL56
net start MySQL56

重启完成之后在MySql终端使用 show master status 查看状态
MySQL数据库主从双向同步_第1张图片
此处记录下 FilePosition 的值,分别为 mysql_log_bin.000001157,这两个值是同步成功的关键。
一切就绪好之后,需要添加一个允许进行数据库同步的用户,当然也可以使用其他拥有同步权限的账号,但是这里不推荐,建议创建一个只有同步权限且仅允许要同步的服务器访问。这里添加一个仅允许 192.168.1.102 访问且只有同步权限的用户。

--  添加用户 backuser,密码为 123456
grant replication slave on *.* to 'backuser'@'192.168.1.102' identified by '123456';
-- 刷新权限让其立即生效
flush privileges;

在mysql8.0版本中,下列的SQL语句无法执行,需要拆分成两句

create user 'backuser'@'192.168.1.102' identified by '123456';
grant replication slave on *.* to 'backuser'@'192.168.1.102';
flush privileges;

也可以在数据库连接工具中直接添加,只要赋予对应的权限即可,我是用的是Navicat Premium 12
MySQL数据库主从双向同步_第2张图片
MySQL数据库主从双向同步_第3张图片
至此,主服务器配置完成

2.从服务器配置

1.打开192.168.1.102的数据库配置文件 my.ini,找到 Server Id 节点,修改为以下内容

# Server Id. 保证不和另一台服务器的Server Id重复即可
server-id=2
# 要同步的数据库
replicate-do-db=test1
# 中继日志,一般情况下它在MySQL主从同步读写分离集群的从节点才开启
relay-log=mysqld-relay-bin

修改完成之后保存,重启数据库服务,然后使用 sql 语句设置需要同步的数据库的信息

-- 
CHANGE MASTER TO 
MASTER_HOST='192.168.1.101', 
MASTER_USER='backuser', 
MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql_log_bin.000001', 
MASTER_LOG_POS= 157;

记录的 FILE 的值就是此处 MASTER_LOG_FILE 的值,Position 的值就是此处 MASTER_LOG_POS 的值。
注意,运行前最好再去主服务器上运行 show master status 查一下 Position 的值,如果设置期间数据库发生过变化,这个值也会变化。
如果已经存在进行中的同步,则先运行 stop slave 停止,再运行以上内容。
最后使用 start slave 开启同步即可。

-- 停止同步
STOP SLAVE;
-- 开启同步
START SLAVE;
-- 使用账号密码启动同步(推荐)
start slave user='backuser' password='123456';
-- 查看同步状态
show slave status

以上步骤全部完成时,使用 show slave status 查看同步的状态。
MySQL数据库主从双向同步_第4张图片
如果在cmd窗口中时,则可以使用 show slave status\G; 来查看同步的状态
MySQL数据库主从双向同步_第5张图片

如果 Slave_IO_RunningSlave_SQL_Running 的值均为 Yes,则说明数据库主从同步的设置已经完成。
如果不是的话,无非就是密码不对或者Pos值不对,再或者防火墙拦截等原因,仔细检查一下即可解决。
以上内容可用于数据库读写分离时,主数据库负责写入数据,从数据库负责读数据。
Master_Info_File 表示主机的配置数据存放的位置,根据地址,我们可以找到该文件,打开查看主机配置数据
MySQL数据库主从双向同步_第6张图片
一起来看看这个 master.info 文件的内容
MySQL数据库主从双向同步_第7张图片
虽然一部分内容看得懂,但是大部分内容看起来还是很懵逼,这是因为主机的配置数据默认以 File 的形式保存了。我们现在修改 my.ini文件的内置信息,加上 master-info-repository = TABLE ,然后重启MySQL服务,配置就会生效。
注意:master-info-repository 只有 TABLEFile 两个值。

port=3306
# 禁用IP反向解析域名
skip-name-resolve
# 将Master配置信息写入到表中
master-info-repository = TABLE
# 将中继日志信息写入到表中
relay-log-info-repository = TABLE

重启以后再次查看从机状态
MySQL数据库主从双向同步_第8张图片
发现现在master的配置数据被存储到 mysql 数据库的 slave_master_info 的表中了,找到这个表打开看一下。
MySQL数据库主从双向同步_第9张图片
发现原先存在于 master.info 中的数据,此时被保存到这里来了,而且原先的 master.info 文件也不见了。而且这张表还自带注释,这样就很容易知道各个参数是做什么的了。
MySQL数据库主从双向同步_第10张图片
关于中继日志的配置 relay-log-info-repository,与 master-info-repository 配置一样,配置完成后在 slave_relay_log_info 表中找到相关参数。

二 双向同步

双向同步即在主从同步的基础上调换角色再设置一遍即可,两台服务器互为主从。

三 其他相关参数配置

  1. skip-name-resolve 禁用IP反向解析域名
    数据库错误日志中会提示连接不到xxx.xxx.xxx.xxx的主机,这是由于IP反向解析域名造成的,如果IP未绑定域名,则会提示以上内容,在MySQL.ini中的 [mysqld],下面添加 skip-name-resolve,然后重启MySQL服务,则该提示不会再出现,但是注意,禁用IP反向解析域名后,数据库连接只能使用IP地址去访问,localhost 将不被识别。所以如果你的 root 账户的 Host 如果是 localhost 的话,则需要修改为 127.0.0.1。
[mysqld]
port=3306
# 禁用IP反向解析域名
skip-name-resolve
  1. slave_net_timeout 从机重连超时时间
    简单来说就是当在 slave_net_timeout 时间内主机(master)未向从机(slave)发送任何数据时,从机(slave)就认为连接已断开,然后去重新连接主机(master),使用 show variables like ‘slave_net_timeout’ 可以查看当前 slave_net_timeout 的默认值,以秒数为单位。
    MySQL数据库主从双向同步_第11张图片
    可以根据实际情况去设置重连的时间,在MySQL5.7以后默认是60s,前边的版本都是3600s。
-- 重设 slave_net_timeout 值
set global slave_net_timeout=50;
-- 重新查询 slave_net_timeout 的值
show variables like 'slave_net_timeout';
  1. master_heartbeat_period 主机心跳时间
    当主机(master)间隔 master_heartbeat_period 时间未更新数据时,主机(master)会主动向从机(slave)发送一个心跳告知从机(slave),表示主机(master)还健在。master_heartbeat_period 默认是 slave_net_timeout 时间的一半,但是当 slave_net_timeout 修改时,master_heartbeat_period 并不会去修改。

使用 sql 语句来查询几个关键配置参数

select Connect_retry,Heartbeat, Retry_count from mysql.slave_master_info;

MySQL数据库主从双向同步_第12张图片
可以看到,现在的 Heartbeat (即master_heartbeat_period)值是 1800s,根据实际实际需求修改即可。
4. master_connect_retry 重连时间间隔
Connect_retry(即master_connect_retry)表示从机(slave)重新连接主机(master)的时间间隔,以秒数为单位。
可以使用 change master to master_connect_retry=xx 修改。

change master to  master_connect_retry=50

还可以在 mysql.slave_master_info 表中直接进行修改,推荐使用命令修改。
5.master_retry_count 最大重试次数
表示从机尝试连接主机的最大尝试次数,可根据实际情况修改。修改方式同上。

change master to  master_retry_count=1000

四 后记

部分细节描述的不够详细,后边有机会再补充。
过程中踩到很多坑,各种搜搜搜,最终以自己的理解编辑一篇,方便查阅。
1.2022.04.20 补充第三节内容,修改、补充前两节中的将master配置信息存储到表中的方式。

你可能感兴趣的:(数据库,数据库开发)