mysql 主从复制的原理理解以及搭建

一,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 [email protected]:/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标志设置成功


测试:
主节点:

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')


从库可见刚才建的表以及表里的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时,要注意这两个值的正确输入。

错误点二:主库虚拟机防火墙的问题;

第二种解决方案

主库在开启同步之前,两库的数据不统一;

将两库的数据做到统一再重新启动数据库即可。

 

猜你喜欢

转载自blog.csdn.net/xys2333/article/details/87907491