一,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...