MySQL高可用

MySQL高可用

MySQL数据库简单介绍

MySQL作为世界上使用最为广泛的数据库之一,免费是其原因之一。但不可忽略的是它本身的功能的确很强大。随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求。此时数据库集群就很好的解决了这个问题了。采用MySQL分布式集群,能够搭建一个高并发、负载均衡的集群服务器(这篇博客暂时不涉及)。在此之前我们必须要保证每台MySQL服务器里的数据同步。数据同步我们可以通过MySQL内部配置就可以轻松完成,主要有主从(master slave )复制和主主复制。

 

注意:

设置Root账户远程连接密码

 mysql -u root -p

GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; 

 远程连接 不在同一个服务器连接 其他主机可以连接

重启服务器 service mysqld restart

关闭防火墙

systemctl stop firewalld.service

 

 MySQL集群如果集群的话,需要考虑的问题,数据实时同步。

 MySQL高可用_第1张图片

MySQL主从复制:

   MySQL高可用_第2张图片

 

主从复制介绍
相信很多人在学习Redis的时候,已经了解过主从复制的作用。在MySQL集群环境中,可以分为主节点与从节点,通过主从复制可以实现数据备份(备机同步主机数据)、故障转移、MySQL集群、高可用、读写分离等。
MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为我再Master端执行了一条SQL命令,那么在Salve端同样会执行一遍,从而达到主从复制的效果。
主从复制原理
MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为我再Master端执行了一条SQL命令,那么在Salve端同样会执行一遍,从而达到主从复制的效果。
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

主从复制环境配置
服务器准备两台
192.168.91.8
192.168.91.9
主服务器配置


从服务器配置

主从复制原理:

    一主一备

   MySQL高可用_第3张图片

注意: 主的MySQL会单独开启一个线程为logDump线程给mysql传输二进制执行文件

注意MySQL主从复制,是本身自带的!! MyCat做读写分离

   

 从的MySQL配置要同步的那个主的MySQL, 从MySQL会开启一个IO线程获取主的MySQL二进制执行文件

 主的MySQL会开启一个logDump线程 返回本底binlog二进制文件给从节点

 在从节点中,SQL线程作用:就是IO线程获取二进制执行文件之后,通过SQL线程进行执行二进制执行文件。

  
(如果同步过程中 从服务器宕机 重启后还是会从断开的地方继续同步所以没有毛影响)

  

  IO线程和SQL线程

  

 在集群配置中 老套路就是 Server_id 全局的一个标识

 

注意: 在主从复制时候,如果网络延迟。会导致数据延迟!同步的数据丢失。

          如果主没有宕机,备宕机的情况。备机会记录上次读取到哪一行的日志。备启动后继续接着读。

           重要的是同步时候产生网络延迟,数据短暂的误差。需要优化!

         

 优化方案半行同步并行同步

 首先上面提到的传统MySQL主从复制基本原理:

主从复制通过三个线程来完成,在master节点运行的binlog dump的线程,I/O线程和SQL线程运行在slave 节点

  •         master节点的Binlog dump线程,当slave节点与master正常连接的时候,master把更新的binlog 内容推送到slave节点。
  •         slave节点的I/O 线程 ,该线程通过读取master节点binlog日志名称以及偏移量信息将其拷贝到本地relay log日志文件。
  •         slave节点的SQL线程,该线程读取relay log日志信息,将在master节点上提交的事务在本地回放,达到与主库数据保持一致的目的。

问题1:

        Master节点的数据库实例并发跑多个线程同时提交事务,提交的事务按照逻辑的时间(数据库LSN号)顺序地写入binary log日志,,slave节点通过I/O线程写到本地的relay log日志,但是slave节点只有SQL单线程来执行relay log中的日志信息重放主库提交得事务,造成主备数据库存在延迟(lag)

思考1:

        那么为了减少主备数据同步延迟时间,由于备库只有单线程补偿数据的原因而造成延迟,那么能否使slave节点同时运行多个如SQL线程一样的功能来重放在主库执行的事务?答案当然是:可以!但是我们需要解决以下问题:

        1、slave本地的relay log记录的是master 的binary log日志信息,日志记录的信息按照事务的时间先后顺序记录,那么为了保证主备数据一致性,slave节点必须按照同样的顺序执行,如果顺序不一致容易造成主备库数据不一致的风险。

   这样就是并行同步。

  

  异步复制即是master数据库把binlog日志发送给 slave数据库,当slave服务器发生故障了,那么肯定会导致主从数据库服务器的数据不一致。 
  为了解决上面的问题,MySQL5.5引入一种叫做半行同步复制模式。开启这种模式,可以保证slave数据库接收完master数据库发送过来的binlog日志并写入自己的中继日志中,然后反馈给master数据库,告知已   经复制完毕。 

  半同步复制就是为了解决数据一致性问题。保障复制不会出错。
 开启这种模式后,当出现超时,主数据库将会自动转为异步复制模式,直到至少有一台从服务器接受到主数据库的binlog并且反馈给主数据库。这时主数据库才会切换回半同步复制模式 

MySQL高可用_第4张图片

半行同步

 

主的MySQL配置:


 

vi /etc/my.cnf  新增以下内容

server_id=7  ###服务器id

log-bin=mysql-bin   ###开启日志文件

MySQL高可用_第5张图片

 

重启mysql服务 service mysqld restart

验证是否已经配置成功

show variables like '%server_id%';

MySQL高可用_第6张图片

 

能够查询对应配置文件中的server_id 说明已经配置成功

show master status;

能够看到同步的文件,和行数 说明已经配置成功。 154行

 

从的MySQL配置:

  

vi /etc/my.cnf

server_id=8  ###从服务器server_id

log-bin=mysql-bin  ###日志文件同步方式

binlog_do_db=test   ###同步数据库

 

 

重启mysql服务 service mysqld restart

验证是否已经配置成功

show variables like '%server_id%';

能够查询对应配置文件中的server_id 说明已经配置成功

 

 

从服务器同步主服务器配置   表示从节点同步主节点数据  在从节点服务器运行:

change master to master_host='192.168.91.8',master_user='root',master_password='root', master_log_file='mysql-bin.000004',master_log_pos=154;   

注意:master_log_file='mysql-bin.000002',master_log_pos=17731;     与 show master status; 一样   同步的二进制文件 和 位置

先执行执行stop slave  停下来然后执行上面的指令!!!!

 

从节点开始同步(从节点运行)

start slave

检查从服务器复制功能状态

SHOW SLAVE STATUS

 

看到:

 

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

因为服务器克隆的时候交UUID产生了重复 (虚拟机克隆导致的),解决办法

cat  /etc/my.cnf

cd /var/lib/mysql

rm -rf auto.cnf

重启服务器即可

service mysqld restart

 

验证:

在主上面创建数据库

在从上面查询到!

然后

在主上面创建表

在从上面查询到!

 

你可能感兴趣的:(MySQL)