mycat数据库集群系列之mysql主从同步设置
最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考。本次系列终结大概包括以下内容:多数据库安装、mycat部署安装、数据库之读写分离主从复制、数据库之双主多重、数据库分库分表。每一个点,有可能会对应一篇或者多篇文章,由于还要继续上班工作,所以本系列分享预计持续时间需要10天左右,有兴趣的您可以持续关注。我是一个菜鸟,如果写的不好的地方,望多多指点和包涵。
好了,不逼逼了,直接进入本次的主题:mycat的数据集群方式有很多种,比如:主从复制、多主多重等等,本次先从最简单的主从复制开始说起。
主从复制,其实我前段时间也整理了一篇文章,那是在liux环境的设置,有兴趣的可以了解了解https://www.cnblogs.com/xiaoXuZhi/p/xyh_mysqlsynchro.html。其实liux和Windows的mysql主从设置在本质上一样的,只是有点细微的不同,本次主要是针对windows环境的一个完整的流程搭建,所以也在专门梳理一下主从复制。
一、mysql主从复制简介
原理:
master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
从库会生成两个线程,一个I/O线程,一个SQL线程;
I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
主库会生成一个log dump线程,用来给从库I/O线程传binlog;
SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
概述:
从库会生成两个线程,一个I/O线程,一个SQL线程;
I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
主库会生成一个log dump线程,用来给从库I/O线程传binlog;
SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
二、前期配置文件准备
服务器说明:
我在本机启动了多个数据库实例,具体的每一个实例如下:
² 主数据库:192.168.1.88:3306
² 从数据库1:192.168.1.88:3307
² 从数据库2:192.168.1.88:3308
通过前面的对主从复制的介绍,我们知道主从复制其实最终是通过日志文件来进行交互,那么具体的日志文件怎么开启?具体的同步策略如何设置?下面将简单的介绍,一步一步的走下去。
主从同步的配置文件都是在数据库安装目录的下的更目录的my.ini(liux是my.cnf)文件,在前一篇文章关于mysql多实例安装中也提到了这个文件,这个次是直接在上面做配置新增即可,具体的配置文件如下,具体的配置参数值可以根据实际需要进行修正:
主数据库的3306中的 my.ini配置文件如下:
[Client]
port =
[mysqld]
#设置3306端口
port =
# 设置mysql的安装目录
basedir=C:\Program Files (x86)\MySQL\MySQL Server 5.7
# 设置mysql数据库的数据的存放目录
datadir=C:\Program Files (x86)\MySQL\MySQL Server 5.7\data
# 允许最大连接数
max_connections=
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 主从复制设置
# 设置服务id,注意改id值在同一个数据库集群中要保持唯一
server-id =
# 写入磁盘策略 该参数的有效值有 、、
# :事务提交时,不将重做日志缓冲写入磁盘。因此如果 MySQL 发生宕机,那么就有可能丢失一部分事务。
# :事务提交时,会将重做日志缓冲写入磁盘,并且立即刷新(fsync())。保证一定持久化到了硬盘中。
# :事务提交时,会将重做日志缓冲写入磁盘,但是不会立即进行刷新操作。此时若操作系统发生宕机,也可能会丢失一部分数据。
# 可以看到,只有1才能真正地保证事务的持久性,但是由于刷新操作 fsync() 是阻塞的,性能会明显地下降。如果不在乎事务丢失,,0和2能获得更高的性能。
# 默认值为1,在实际使用过程中,为了效率,我们一般会在设置为2
innodb_flush_log_at_trx_commit=
# 开启binlog日志同步功能
# 这个参数直接影响mysql的性能和完整性。
# sync_binlog= 当事务提交后,Mysql仅仅是将binlog_cache中的数据写入binlog文件,但不执行fsync之类的磁盘,同步指令通知文件系统将缓存刷新到磁盘,而让Filesystem自行决定什么时候来做同步,这个是性能最好的。
# sync_binlog=n,在进行n次事务提交以后,Mysql将执行一次fsync之类的磁盘同步指令,通知文件系统将Binlog文件缓存刷新到磁盘。
# Mysql中默认的设置是sync_binlog=,即不做任何强制性的磁盘刷新指令,这时性能是最好的,但风险也是最大的。一旦系统Crash,在文件系统缓存中的所有Binlog信息都会丢失。
# 可根据自身项目的数据要求,进行灵活的设置
sync_binlog=
# 二进制日志保留天数
expire_logs_days=
# binlog日志文件名(可以任意命名)
log-bin=mysql-bin # 同步的数据库设置方式有两种:
# binlog_do_db:设置需要同步的数据库
# binlog-ignore-db:设置不需要同步的数据库
# 其中两者只需要设置一个即可,根据我们平时的项目情况,都是设置binlog-ignore-db 排除不需要同步的一些系统级数据
# 这样设置有一个好处就是:如果业务数据库有新增,那么也不需要再次来更新设置该配置
# 两种设置方式,都可以多条数据
#同步的数据库,除此之外别的不同步(和下面binlog-ignore-db二选一)
# binlog_do_db=testdb
#不同步数据库,除此之外都同步
binlog-ignore-db = information_schema
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = sys [mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
从数据库的my.ini配置都很简单了,只需要配置server-id,binlog-do-db,binlog-ignore-db即可。
其中的server-id必须配置
binlog-do-db,binlog-ignore-db可根据实际需要设置,如果是主设置的数据库全部同步到从,那么这两个值就没必要设置了,如果从只同步主的某一些库,那么需要设置,在数据项目中,绝大部分都不需要设置的。
从数据库的3307中的 my.ini配置文件如下:
[Client]
port = [mysqld]
#设置3307端口
port =
server-id =
# 设置mysql的安装目录
basedir=C:\Program Files (x86)\MySQL\MySQL Server 5.7.
# 设置mysql数据库的数据的存放目录
datadir=C:\Program Files (x86)\MySQL\MySQL Server 5.7.\data
# 允许最大连接数
max_connections=
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB [mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
从数据库的3308中的 my.ini配置文件如下:
[Client]
port = [mysqld]
#设置3308端口
port =
server-id =
# 设置mysql的安装目录
basedir=C:\Program Files (x86)\MySQL\MySQL Server 5.7.
# 设置mysql数据库的数据的存放目录
datadir=C:\Program Files (x86)\MySQL\MySQL Server 5.7.\data
# 允许最大连接数
max_connections=
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB [mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
三、主数据库创建同步账号
在处理前,由于上面刚刚设置了数据库的配置文件,为了能够生效,首先是重启一下主数据库。只需要执行如下两个命令即可:
net stop mysql
net start mysql
创建主数据用户同步使用的账号:
登录数据库:mysql -uroot -pxuyuanhong -P 3306
创建数据同步用户slaveData:
CREATE USER 'slaveData'@'%' IDENTIFIED BY '用户登录密码';
- 设置权限:
GRANT REPLICATION SLAVE ON *.* to 'slaveData'@'%' identified by '用户登录密码';
- 刷新权限:FLUSH PRIVILEGES;
- 查看主机状态:show master status;
四、从数据库同步设置
前置条件:从数据库同步设置,只以数据库3307为例来说明:
从数据设置前,也还是按照主数据设置一样,先重启一下。只需要执行如下两个命令即可:
net stop mysql3307
net start mysql3307
登录从数据库:
mysql -uroot -pxuyuanhong -P 3307
执行手动同步命令:
CHANGE MASTER TO MASTER_HOST='192.168.3.205',MASTER_PORT=3306,MASTER_USER='slaveData',MASTER_PASSWORD='xuyuanhong',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=844;
其中的参数值说明:
master_host:主数据库IP地址
master_user:主数据库连接用户名
master_password:主数据量连接密码
master_port:主数据端口
master_log_file:开始同步的主数据库日志名称,主数据库show master status
队列的Flie列数据
master_log_pos:开始同步的主数据库日志开始位置,主数据库show master status
队列的Position列数据
启动主从同步:
start slave;
查看主从同步状态
show slave status\G;
主从同步状态结果图如下:如果Slave_IO_Running: Yes,Slave_SQL_Running: Yes时说明两个线程已启动,主从复制配置成功。
主从同步设置失败如何处理
主从状态的结果Slave_IO_Running: Yes,Slave_SQL_Running不都为true,那么需要根据提示结果,重新设置。重新设置的流程如下:
停止slave:stop slave;
重置slave:reset slave;
重复上面的:执行手动同步命令开始流程
五、sql同步执行失败后不再同步处理
主从同步在实际使用过程中,如果处理的不好,可能会导致同步失败,比如:从数据库也在做新增操作,如果有自增主键约束,那么就可能导致同步失败。因为主从同步最终目的是实现数据的一致性,所有当某一项同步失败,那么就不会再做后同步处理。那么如果出现同步失败后又该如何处理呢?
在实际处理过程中,大概有两种处理方式:
1、主从数据差异小,并且不管最终数据的一致性,那么可以设置直接跳过同步出差的日志,继续同步后续数据,具体操作命令如下:
第一步:停止主从同步
stop slave;
第二步:跳过错误的日志位置,继续后续同步,后面的数字可变
set global
sql_slave_skip_counter =1;
第三步:继续开启主从同步
start slave;
2、如果主从数据差异大,并且要求主从数据完全一致,那么需要:重新做主从,完全同步。
第一步:删除从数据库,将主数据库备份到从数据库(确保主从数据完全一致)
第二步:按照上面的流程,重新配置主从同步
六、自我一些总结
1、 主从同步数据库,一定要注意读写分离。从数据库做读操作,不要做写操作,最好直接只给从数据库读权限,不给写权限
2、 数据库设置主从同步账号时,最好创建专门的账号用来做主从同步
有关mysql的主从同步就分享到这儿了,下一篇将和大家一起分享mycat的多安装配置、主从同步、读写分离等知识点,有兴趣的小伙伴,可以持续关注,谢谢!
END
为了更高的交流,欢迎大家关注我的公众号,扫描下面二维码即可关注,谢谢:
mycat数据库集群系列之mysql主从同步设置的更多相关文章
- mycat数据库集群系列之数据库多实例安装
mycat数据库集群系列之数据库多实例安装 最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据 ...
- mycat数据库集群系列之mycat读写分离安装配置
最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据库安装.mycat部署安装.数据库之读写分离 ...
- 聊一聊mycat数据库集群系列之双主双重实现
最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据库安装.mycat部署安装.数据库之读写分离 ...
- 数据库集群 MySQL主从复制
MySQL主从复制 本节内容我们联系使用MySQL的主从复制功能配置Master和Slave节点,验证数据MySQL的数据同步功能. 因为要使用多个MySQL数据库,所以不建议在电脑上安装多个MySQ ...
- docker应用-6(mysql+mycat 搭建数据库集群)
上一节,通过使用overlay网络,搭建了跨主机的docker容器集群.下面,在这个跨主机的docker容器集群环境下,搭建mysql 数据库集群. mysql主从自动备份和自动切换 从数据安全性考虑 ...
- 这次一定要教会你搭建Redis集群和MySQL主从同步(非Docker)
前言 一直都想自己动手搭建一个Redis集群和MySQL的主从同步,当然不是依靠Docker的一键部署(虽然现在企业开发用的最多的是这种方式),所以本文就算是一个教程类文章吧,但在动手搭建之前,会先聊 ...
- 【Data Cluster】真机环境下MySQL数据库集群搭建
真机环境下MySQL-Cluster搭建文档 摘要:本年伊始阶段,由于实验室对不同数据库性能测试需求,才出现MySQL集群搭建.购置主机,交换机,双绞线等一系列准备工作就绪,也就开始集群搭建.起初笔 ...
- 生产环境MySQL数据库集群MHA上线实施方案
生产环境MySQL数据库集群MHA上线实施方案 一.不停库操作 1.在所有节点安装MHAnode所需的perl模块(需要有安装epel源) yum install perl-DBD-MySQL -y ...
- MySQL数据库集群进行正确配置步骤
MySQL数据库集群进行正确配置步骤 2010-06-09 10:47 arrowcat 博客园 字号:T | T 我们今天是要和大家一起分享的是对MySQL数据库集群进行正确配置,我前两天在相关网站 ...
随机推荐
- [spring cloud] -- 服务注册与服务发现篇
eureka 服务发现客户端 DiscoveryClinet职责(核心) 注册服务无试了到Eureka Server中; 发送新塘更新与Eureka Server的租约: 在服务关闭时从Eureka ...
- jsp课堂笔记2
jsp页面的基本结构 jsp标记 普通html标记 变量和方法的声明 java程序片 java表达式 变量和方法的声明 <%! %> 标记符号之间声明变量和方法 成员变量即全局变 ...
- xctf-web supersqli
单引号注入,用order by查到了两个column.用union select的时候发现select关键字被过滤了 用分号尝试堆叠注入显示出了两张表 分别查询字段 flag在表19198109311 ...
- python如何支持并发?
由于GIL(Global Interpreter Lock)的存在使得在同一时刻Python进程只能使用CPU的一个核心,也就是对应操作系统的一个 内核线程,对于一个Python web程序,如果有个 ...
- 对于Javaweb初学者的一些坑。#Javaweb
1.在配置好Tomcat之后 ,编译阶段发现报错 这种对于我个人来说一般有两种情况: ①在编写代码时(比如servlet)发现爆红,一般是maven的依赖没有导入,这个时候在xml文件中导入需要的包的 ...
- PHP diskfreespace() 函数
定义和用法 diskfreespace() 函数返回指定目录的可用空间,以字节为单位. 该函数是 disk_free_space() 函数的别名. 语法 diskfreespace(directory ...
- Win10系统安装MySQL Workbench 8
系统:Window10 专业版 MySQL Workbench 8.0.19 下载地址:https://dev.mysql.com/downloads/workbench/8.0.html 点击Dow ...
- Spring中使用MyBatis Generator
简介 MyBatis Generator 是由MyBatis官方提供的MyBatis代码生成器.可以根据数据库表生成相关代码,比如POJO.Mapper接口.SQL Map xml等. 使用方式 MB ...
- JS中的数组复制问题
JS中的数组复制问题 前言 首先提到复制,也就是拷贝问题,就必须要明确浅拷贝和深拷贝. 浅拷贝:B由A复制而来,改变B的内容,A也改变 深拷贝:B由A复制而来,改变B的内容,A的内容不会改变 总的来说 ...
- 19-关键字package和import
1. package的使用1.1 使用说明: * 1.为了更好的实现项目中类的管理,提供包的概念 * 2.使用package声明类或接口所属的包,声明在源文件的首行 * 3.包,属于标识符,遵循标识符 ...