乐趣区

关于java:MySQL主从复制配置说明一文教你搞懂数据库主从复制

一,MySQL 主从配置原理

1. mysql 反对的复制格局

基于语句复制(STATEMENT)

  • (长处)基于 statement 复制的长处很显著,简略的记录执行语句同步到从库执行同样的语句,占用磁盘空间小,网络传输快,并且通过 mysqlbinlog 工具容易读懂其中的内容。
  • (毛病)并不是所有语句都能复制的比方:insert into table1(create_time) values(now()),取的是数据以后工夫,不同的数据可能工夫不统一,另外像存储过程和触发器也可能存在问题。

基于行复制(ROW)

  • (长处)从 MySQL5.1 开始反对基于行的复制,最大的益处是能够正确地复制每一行数据。一些语句能够被更加无效地复制,另外就是简直没有基于行的复制模式无奈解决的场景,对于所有的 SQL 结构、触发器、存储过程等都能正确执行。
  • (毛病)次要的毛病就是二进制日志可能会很大,比方:update table1 set name=’admin’ where id<1000,基于行复制可能须要复制 1000 条记录,而基于语句复制只有一条语句,另外一个毛病就是不直观,所以,你不能应用 mysqlbinlog 来查看二进制日志。

混合类型的复制(MIXED)

  • 混合复制是借用语句复制和行复制的有点进行整合,MIXED 也是 MySQL 默认应用的二进制日志记录形式,但 MIXED 格局默认采纳基于语句的复制,一旦发现基于语句的无奈准确的复制时,就会采纳基于行的复制。比方用到 UUID()、USER()、CURRENT_USER()、ROW_COUNT()等无奈确定的函数。

2. mysql 主从复制作用

  • 数据分布

  • 主从摊派负载。
  • 高可用性和故障切换。
  • 数据备份。
  • 利用从服务器做查问。

    《2020 最新 Java 根底精讲视频教程和学习路线!》

3. mysql 主从复制原理

  • binlog Events 咱们晓得 binlog 日志用于记录所有对 MySQL 的操作的变更,而这每一个变更都会对应的事件,也就是 Event。index 文件记录了所有的 binlog 地位 每个 binlog 会有 heade,event,rotate 三个 event,binlog 的构造如下。

常见 event 如下:

  • Format_desc:一个全新的 binlog 日志文件 event 信息
  • Rotate:日志宰割时完结 event。
  • Table_map:表,列等元数据的 event。
  • Query:查问,就是 DDL 这类的 Event,如果 binlog 格局为 STATEMENT 格局,增删改都属于 Qeury event。
  • Write_rows:Binlog 为 ROW 格局时的插入 event。
  • Update_rows:Binlog 为 ROW 格局时的更新 event。
  • Delete_rows:Binlog 为 ROW 格局时的删除 event。

咱们也能够通过 binlog 看到这些事件,通过 mysql 提供的工具查看 binlog 日志,如下:

主从复制流程

  • 当从库收回 start slave 命令时,从库会创立 I / O 线程和 SQL thread(SQL 线程)
  • 从库的 IO 和主库的 dump 线程建设连贯 并监听 binlog 二进制日志事件
  • 从库依据 change master to 语句提供的 file 名和 position 号,IO 线程向主库发动 binlog 的申请
  • 主库 dump 线程依据从库的申请,将本地 binlog 以 events 的形式发给从库 IO 线程
  • 从库 IO 线程接管 binlog evnets,并存放到本地 relay-log 中,传送过去的信息,会记录到 master.info 中。
  • 从库 SQL 线程利用 relay-log,并且把利用过的记录到 relay-log.info, 默认状况下,曾经利用过的 relay 会主动被清理 purge。

二,MySQL 只从配置缺点

MySQL 的复制(replication)性能配置简略,深受开发人员的喜爱,基于复制的读写拆散计划也十分风行。而 MySQL 数据库高可用大多也是基于复制技术,然而 MySQL 复制自身仍然存在局部缺点,最为次要的问题如下:复制代码
  • 数据失落问题(consistency)
  • 数据同步提早问题(delay)
  • 扩展性问题(scalability)

从 MySQL 5.7 的 lossless semi-sync replication 曾经解决了主从数据失落的问题,MySQL 5.7 的 multi-thread slave 也很大水平地解决了数据同步提早的问题,MySQL 5.7 的 Group replication 也很大水平地解决了扩展性问题。另外,MySQL 5.7.22 backlog 了 MySQL 8.0 中的基于 WriteSet 的并行复制,能够说齐全解决了主从数据提早的问题。能够看出,MySQL 正在朝着一个十分好的方向倒退

三,筹备工作

筹备 3 台服务器别离为:

Master 192.168.1.234

Slave 192.168.1.235

Slave 192.168.1.236

四,MySQL 装置配置

下载 MySQL 安装包

下载地址:cdn.mysql.com//Downloads/…

解压安装文件:

[root@localhost ~]# cd /software[root@localhost software]# tar -zxzf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
复制代码

拷贝安装文件到指定文件夹:

[root@localhost ~]# cp /software/mysql-5.7.17-linux-glibc2.5-x86_64/* /usr/local/mysql -r
复制代码

增加零碎 mysql 组和 mysql 用户

[root@localhost ~]# groupadd mysql[root@localhost ~]# useradd -r -g mysql mysql
复制代码

进入装置 mysql 软件目录:执行命令 cd /usr/local/mysql

批改当前目录拥有者为 mysql 用户:执行命令 chown -R mysql:mysql ./

装置数据库:

5.6 以及之前版本装置数据库

/usr/local/mysql/bin/mysql_install_db –user=mysql –basedir=/usr/local/mysql/ –datadir=/usr/local/mysql/data/

5.7 版本装置数据库:

/usr/local/mysql/bin/mysqld –user=mysql –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data/ –initialize

拷贝配置文件到指定文件夹

[root@localhost mysql]# cp -a ./support-files/my-default.cnf /etc/my.cnf

[root@localhost mysql]# cp -a ./support-files/mysql.server /etc/init.d/mysqld

后盾启动 mysql

[root@localhost mysql]# ./bin/mysqld_safe –user=mysql &

重启 mysql

执行命令:/etc/init.d/mysqld restart

设置为开机启动:

执行命令:chkconfig –level 35 mysqld on

初始化明码:

根据官网阐明 5.6 当前版本,第一次启动时会在 root 目录下生产一个随机明码文件名.mysql_secret。

cat /root/.mysql_secret

批改 root 明码:

/usr/local/mysql/bin/mysqladmin -u root -h localhost password ‘123456’ -p

Enter password 处输出输出.mysql_secret 里第二行内容

遇上 -bash: mysql: command not found(未找到命令)的状况别着急,这个是因为 /usr/local/bin 目录下缺失 mysql 导致,只须要一下办法建设软链接,即能够解决

ln -s /usr/local/mysql/bin/mysql /usr/bin

五,MySQL 主从复制配置

下载 MySQL 安装包

Master 服务器 my.cnf 减少配置:

#GTID:server_id=234              #服务器 id,个别为 IP 末位 gtid_mode=on                 #开启 gtid 模式 enforce_gtid_consistency=on  #强制 gtid 一致性,开启后对于特定 create table 不被反对 #binloglog_bin=/usr/local/mysql/binlogs/master-binloglog-slave-updates=1    binlog_format=row            #强烈建议,其余格局可能造成数据不统一 #relay logskip_slave_start=1
复制代码

Slave 服务器 my.cnf 减少配置:

#GTID:gtid_mode=onenforce_gtid_consistency=onserver_id=235 #binloglog-bin=/usr/local/mysql/binlogs/slave-binloglog-slave-updates=1binlog_format=row      #强烈建议,其余格局可能造成数据不统一 #relay logskip_slave_start=1read-only = ON   #这项性能只对非管理员组认为的用户无效
复制代码

Master 服务器上创立用于同步的账号:

create user ‘cspmslave’@’192.168.1.%’ identified by ‘cspm-slave’;

对账号进行 Slave 受权:

grant replication slave on . to cspmslave@’192.168.1.%’;

从库连贯主库

mysql> change master to master_host=’192.168.1.234′, master_port=3306, master_user=’cspmslave’, master_password=’cspm-slave’, master_auto_position=1;

mysql> start slave;

查看从服务器连贯状态(下图所示,两个 Yes 示意连贯胜利):

mysql> show slave status G;

链接:https://juejin.cn/post/690749…

退出移动版