一,mysql主从复制的理解图:
二,mysql主从复制的概念和好处:
mysql的主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是实时的业务数据操作,从数据库常用的读取为主。
优点主要有
(1) 可以作为备用数据库进行操作,当主数据库出现故障之后,从数据库可以替代主数据库继续工作,不影响业务流程
(2) 读写分离,将读和写应用在不同的数据库与服务器上。一般读写的数据库环境配置为,一个写入的数据库,一个或多个读的数据库,各个数据库分别位于不同的服务器上,充分利用服务器性能和数据库性能;当然,其中会涉及到如何保证读写数据库的数据一致,这个就可以利用主从复制技术来完成。
(3) 吞吐量较大,业务的查询较多,并发与负载较大。
主从复制的必要条件:
1.主库开启binlog日志(设置log-bin参数)
2.主从server-id不同
3.从库服务器能连同主库
主从复制原理:
1.从库生成两个线程,一个i/o线程,一个SQL线程;
2.i/o线程去请求主库的二进制日志binlog,并且得到的binlog日志写道relay log(中继日志)文件中,
3.主库会生成一个log dump线程,用来给从库的i/o线程传二进制日志binlog;
4.SQL线程,会读取中继日志文件,并解析成具体的操作执行,这样主从的操作就一致了,而最终的数据也就一直了。
主从复制存在的问题以及解决办法
问题:
1.主库宕机之后,数据可能会丢失
2.从库只有一个sql Thread,主库写压力大,复制很可能延时
解决方法:
1.半同步复制解决--解决数据丢失的问题
2.并行复制--解决从库复制延时的问题
1.数据库同步是怎样进行的?
master用户写入数据,生成event记到binary log中.
slave接收master上传来的binlog,然后按顺序应用,重现master上的用户操作。
2.数据库是靠什么同步的?
主从复制,默认是通过pos复制(postion),就是说在日志文档里,将用户进行的每一项操作都进行编号(pos),每一个event都有一个起始编号,一个终止编号,我们在配置主从复制时从节点时,要输入master的log_pos值就是这个原因,要求它从哪个pos开始同步数据库里的数据,这也是传统复制技术,
MySQL5.6增加了GTID复制,GTID就是类似于pos的一个作用,不过它是整个mysql复制架构全局通用的,就是说在这整个mysql冗余架构中,它们的日志文件里事件的GTID值是一致的.
3.从节点怎么知道要从哪块进行同步?
上面也说了,一开始是自己设置的从节点从主节点的日志文件里的pos开始复制,以后就自己去读取上一次同步到哪一块,接着同步.
4:pos与GTID有什么区别?
两者都是日志文件里事件的一个标志,如果将整个mysql集群看作一个整体,pos就是局部的,GTID就是全局的.
三.环境的搭建:
实验准备:
下载mysql5.7版本
说明:
此实验需要两台7.3版本的虚拟机
我将server4作为主数据库,server2作为从数据库;
step1:解压
tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
step2:下载安装
yum install mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm -y
step3:将软件包复制到server2上
scp mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm root@172.25.17.2:/root/
step4:server2下载安装:yum install * -y
step5:编写主库配置文件:
vim /etc/my.cnf
在最后编辑:
log-bin=mysql-bin
server-id=1
step6:开启mysql服务:systemctl start mysqld
step7:查看server4的mysql生成的初始密码
cat /var/log/mysqld.log | grep password
step8:数据库初始化:mysql_secure_installation
step9:进库:mysql -p
master给slave作授权,让slave可以连接
mysql> grant replication slave on *.* to repl@'172.25.17.%' identified by 'Westos-6';
mysql> Flush privileges;
mysql> show master databases;
从数据库的搭建:
step1:修改配置文件:
vim /etc/my.cnf
在最后编辑:
server-id=2
step2:开启数据库:systemctl start mysqld
step3:查看server4的mysql生成的初始密码
cat /var/log/mysqld.log | grep password
step4:数据库初始化:mysql_secure_installation
step5:进入数据库:mysql -p
改变主master值
mysql> change master to master_host='172.25.17.4', master_user='repl', master_password='Westos-6', master_log_file='mysql-bin.000002', master_log_pos=1003;
Query OK, 0 rows affected, 2 warnings (0.39 sec)
注:master_log_file='mysql-bin.000002', master_log_pos=1003;此处的两个值为主数据库上的数值:
mysql> start slave;
mysql> show slave status\G;
此处的两个yes标志设置成功
![](https://i-blog.csdnimg.cn/blog_migrate/9b46b5efac20921060b9863a10f28019.png)
测试:
主节点:
1.
mysql> create database westos;
mysql> show databases;
mysql> show master status;
# server2中可见新建的westos
mysql> show databases;
2.
主节点新建表格:
mysql> use westos;
Database changed
mysql> create table usertb(
-> username varchar(10) not null,
-> password varchar(10) not null);
表里插入value值;
insert into usertb values ('user1','123')
![](https://i-blog.csdnimg.cn/blog_migrate/98eb8a1cf46e91ed32fd4921c3622974.png)
从库可见刚才建的表以及表里的value;
mysql> use westos;
mysql> select * from usertb;
此搭建经常出现的错误以及解决方案:
主库:show slave status\G;
经常出现IO=NO
或者myse=no
第一种解决方案
错误点一:经常是主库进行show master status时,
master_log_file='mysql-bin.000002', master_log_pos=1003,此处的两个值经常改变。所以在开启slave时,要注意这两个值的正确输入。
错误点二:主库虚拟机防火墙的问题;
第二种解决方案
主库在开启同步之前,两库的数据不统一;
将两库的数据做到统一再重新启动数据库即可。