(一、主从复制)

一、mysql主从复制原理

   mysql的默认复制方式是主从复制。Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

   注意:进行复制的时候,对复制的表的更新操作必须在master中完成。若是对从服务器上的表进行更新,将会导致主从服务器的数据库数据不一致,继而产生冲突。

二、mysql支持复制的类型

   1)基于语句的复制:在主服务器中执行的语句,在从服务器中再执行一遍。(默认为基于语句的复制)

   2)基于行复制:把改变的内容复制过去,而不是在从服务器上再执行一遍主服务器上的命令。(从mysql5.0后开始支持)

   3)混合型的复制:默认采用语句复制,若发现语句不能精准定位,则会执行行的复制。

三、复制的具体步骤

   1)首先master将改变记录到二进制日志(binary log)中。

   2)slave中的IO线程将master中的日至信息拷贝到中继日志(relay log)。

   3)slave中的sql线程将中继日至的记录再执行一遍。(这样就达到了mysql的复制)

  

   第一个过程中,master在每个事务(操作)完成数据更新之后,把这些改变记录到二进制日志中。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

   在slave将master的binary log拷贝到它自己的中继日志过程中,首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump
process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。

   SQL slave
thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数
据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

   此外,在master中也有一个工作线程:和其它
MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是
串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

四、操作步骤

   环境:rhel6.5  Server2:master  Server3:slave 

   1)在server2上安装mysql服务,作为master。

   --->  yum install -y mysql-community-client-5.7.17-1.el6.x86_64.rpm

         mysql-community-common-5.7.17-1.el6.x86_64.rpm

         mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm

         mysql-community-libs-5.7.17-1.el6.x86_64.rpm

         mysql-community-server-5.7.17-1.el6.x86_64.rpm

   --->  vim  /etc/my.cnf            # 添加如下(服务器id和二进制文件)

   --->  /etc/init.d/mysqld  start        # 打开数据库(得等一会)

   --->  grep  password /var/log/mysqld.log        # 在日志中查看生成的随机密码 

   --->  mysql_secure_installation            # 进行数据库初始化

   # 此处填写上面生成的随机密码

   # 填写自己设置的密码。格式必须要注意:由大小写字母、数字、特殊字符组成。例如:Xniu+123

  
  
  
  
  

   --->  mysql  -p            # 进行密码登陆(并查看数据库,如下表示安装成功)

   mysql >  grant  replication  slave on *.* To  repl@’172.25.2.%’  identified by  ‘Xniu-123’;

   mysql >  flush privileges; 

   2)在srver3检查授权是否成功;并进行mysql的安装,作为slave。

   --->  mysql -u xniu -p -h 172.25.2.2    # 查看授权是否成功

   --->  vim  /etc/my.cnf              # 在最后一行给slave设置id    

         Server-id=2

    # 接下来启动mysql服务,设置密码server2中步骤相同。

   --->  /etc/init.d/mysqld  start      

   --->  grep  password /var/log/mysqld.log

   --->  mysql_secure_installation

   --->  mysql -p              # 此时server3也可登陆成功

   3)在srever2中查看master的状态

   --->  show  master  status; 

   4)在server3中给建立slave并查看状态

   mysql>  change master to master_host='172.25.2.2',master_user='repl',master_password='Xniu+123', master_log_file='mysql-bin.000003',master_log_pos=842;   
# 在slave中添加master主机的信息(注意,此处的master_log_file和master_log_pos要和master中的一致) 

   mysql>  start  slave;   

   mysql> show slave status\G;       # 此时当io和sql状态均为yes的时候,表示正常

   5)测试。当我们在master中进行数据库和表的建立,此时slave中可以查看到master中建立的信息。   

   # 在server2中建立数据库xniu;

  

   # 在server3中查看:

(二、基于GTID的主从复制)

一、什么是GTID

   全称Global transaction identifiers;包含两部分,一部分为服务的UUid(保存在mysql数据目录的auto.cnf文件中); 另一部分为事物ID。在整个复制架构中,GTID是不会变化的,即是在多个连环主从中也不会变。 

二、GTID的工作原理

   1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。

   2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。

   3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。

   4、如果有记录,说明该GTID的事务已经执行,slave会忽略。

   5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。

   6、在解析过程中会判断是否有主键,如果有就用二级索引,如果没有就用全部扫描。

   注意:与mysql5.7默认的主从复制不同之处在与,从服务器在中继日志中执行语句的时候,只需要根据uuid来判断新的变更信息,从而执行;不需挨个进行查找。

三、环境搭建

   在主从同步的基础上进行添加GTID的模块,具体步骤如下:(注意,当配置文件修改之后)

   1)在master中修改配置文件 

   --->  vim  /etc/my.cnf          # 开启gtid模式
  

   --->  /etc/init.d/mysqld restart

# 登陆mysql之后,修改root用户密码,并授权复制用户

   2)在slave中进行如下配置

   --->  vim /etc/my.cnf
  

   --->  /etc/init.d/mysqld  restart 

   3)在server3中,登陆mysql并修改master相关信息

   mysql> stop salve;

   mysql>  change master to master_host=’172.25.2.2’,master_user=’repl’,master_password=’Xniu+123’,

MASTER_AUTO_POSITION=1; 

   mysql>  start slave;

   mysql>  show  slave status\G; 

   3)测试时,我们在master中对之前建立的数据库进行修改,在slave中可以看到已经修改的数据库。此时,达到了主从复制的效果。

   # 在master中对对创建的数据库插入信息 

   # 在server3中进行查看

(三、基于GTID的并行复制)

一、什么是并行复制

   由于master是多线程的,而slave是单线程的,所以在复制的时候,会出现读取和执行速度不一致。此时,我们可以通过设置sql线程的个数来实现,进行线程的优化;当master中把数据库的更改写入二进制文件中,并通知slave来进行读取;然后slave的io进程把读取到的数据存储在中继日志中;最后slave的多个线程对中继日志进行回放并执行命令,从而达到了并行复制。

二、环境搭建

   1)在GTID的基础上,对slave中配置文件进行。

   --->  vim /etc/my.conf         # 如下图所示,添加16个worker线程。    

   注意:若将slave_parallel_workers设置为0,则MySQL 5.7退化为原单线程复制,但将slave_parallel_workers设置为1,则SQL线程功能转化为coordinator线程,但是只有1个worker线程进行回放,也是单线程复制。然而,这两种性能却又有一些的区别,因为多了一次coordinator线程的转发,因此slave_parallel_workers=1的性能反而比0还要差。开启MTS功能后,务必将参数master_info_repostitory设置为TABLE,这样性能可以有50%~80%的提升。这是因为并行复制开启后对于元master.info这个文件的更新将会大幅提升,资源的竞争也会变大。在之前InnoSQL的版本中,添加了参数来控制刷新master.info这个文件的频率,甚至可以不刷新这个文件。因为刷新这个文件是没有必要的,即根据master-info.log这个文件恢复本身就是不可靠的。在MySQL 5.7中,Inside君推荐将master_info_repository设置为TABLE,来减小这部分的开销。

   2)查看slave中sql线程数

   mysql > show  processlist;                # 此时会产称16个sql线程。(只截取部分)

(四、GTID一主多从的复制)

一、环境搭建

   server2   master           A

   server3   slave、master    B

   server4   slave            C 

   当有多台从服务器时,向如:A --> B --> C,A是B的master,B是C的master。此时,B既是master又是slave。在上述配置的基础上,再多加一台server4作为slave。

   1)server4中配置文件内容如下:(首先安装mysql,再这就不多加阐述了)

   --->  vim  /etc/my.conf

   --->  /etc/init.d/mysqld  start         # 启动mysql服务

   2)设置server3的配置文件,并进行用户授权。

   --->  vim /etc/my.cnf

   --->  /etc/init.d/mysqld restart

   --->  mysql  -p

   mysql>  grant replication  slave on *.* to repl@'172.25.2.%' identified by 'Xniu+123'; 

   3)完成之后,我们要进行数据库的复制。在server2中进行数据备份。

   --->  mysqldump -p  xniu > xniu.sql         

   --->  scp  xniu.sql  server4:/root/    

   4)在server4中对xniu.sql进行修改。

   --->  vim  /root/xniu.sql         #在drop语句上面添加两条语句。

         create  database xniu;

         user  xniu;

   

   --->  msyql -p  < xniu.sql         # 把xniu.sql拷贝到mysql中

   5)server4中进行数据库的登陆。在mysql中添加master信息(此时master设置为B)。

   mysql> stop  slave;

   mysql> change master to master_host='172.25.2.3',master_user='repl',master_password='Xniu+123',master_auto_position=1;

   mysql> start  slave;

   mysql> show slave status\G;           # 此时状态都是可以的

   6)此时可以进行测试。在server2中插入数据,在server3和server4中均可以看到。

Mysql5.7实现主从复制、基于GTID的主从复制、并行复制的更多相关文章

  1. mysql主从之基于gtid的主从复制

    一 GITD介绍 1.1 gtid的含义 Global Transaction Identifier,全局事务标识 阿里云的rds目前已经使用gtid 基于gtid的主从复制原理 每个mysql数据库 ...

  2. MySQL 5.7基于组提交的并行复制

    参考链接: http://mysql.taobao.org/monthly/2016/08/01/ https://www.kancloud.cn/thinkphp/mysql-parallel-ap ...

  3. MySQL5.7.18基于GTID的主从复制过程实现

    GTID是5.6时加入的,在5.7中被进一步完善,生产环境建议在5.7版本中使用.GTID全称为Global Transaction Identifiers,全局事务标识符.GTID的复制完全是基于事 ...

  4. percona mysql server5.7基于gtid的主从复制

    配置mysql基于gtid主从复制架构 一.二进制安装mysql [root@node5 data]# --Linux.x86_64.ssl101.tar.gz [root@node5 data]# ...

  5. 实现mysql的读写分离(mysql-proxy)____1(mysql的主从复制,基于gtid的主从复制,半同步复制,组复制)

    主从复制原理: 从库生成两个线程,一个I/O线程,一个SQL线程: i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中:主库会生成一个 log ...

  6. MySQL5.6基于GTID的主从复制配置

    全局事务标示符(Global Transactions Identifier)是MySQL 5.6复制的一个新特性. GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标 ...

  7. mysql5.7.26 基于GTID的主从复制环境搭建

    简单工作原理: (1)从库执行 change master to 语句,会立即将主库信息记录到master.info中 (2)从库执行 start slave语句,会立即生成IO_T和SQL_T (3 ...

  8. MySQL5.6:基于GTID的主从复制

    一.GTID简介 MySQL 5.6 的新特性之一,是加入了全局事务 ID (GTID) 来强化数据库的主备一致性,故障恢复,以及容错能力. 什么是GTID? 官方文档:http://dev.mysq ...

  9. mysql5.7 基于gtid的主从复制

    基本环境 版本 5.7.14 主库ip:192.168.1.100 port:3306 从库ip:102.168.1.101 port:3306 搭建注意事项 主库配置 gtid-mode=on en ...

随机推荐

  1. java线程学习之线程创建

    线程是程序控制的一个内部数据流.线程的状态转化如下 或者 在java中创建线程有两种方式: 1.实现runnable接口(这个比较好,推荐这个.原因是:用的时候比较灵活,相比较继承Thread类,用接 ...

  2. win10忘记开机密码无法进入桌面

    第一种: 电脑用微软账户登录,但密码始终不正确. 登陆这个网址    https://account.live.com/password/reset 按照提示的操作利用之前注册信息一步步重设密码 最后 ...

  3. BIOS备忘录之x86硬件编程(寄存器与IO)

    SOC固件(BIOS)开发: 1.熟悉硬件原理图:要弄清楚pin脚的功能: 2.配置GPIO引脚,配置成Native功能还是GPIO功能(如果是配置成GPIO,需要在code里面显式的使用): 3.硬 ...

  4. Python 协程并发爬虫网页

    简单爬虫实例: 功能:通过urllib.request实现网站爬虫,捕获网站内容. from urllib import request def f(url): print("GET:%s& ...

  5. 【题解】Luogu P2057 [SHOI2007]善意的投票

    原题传送门 我们一眼就能看出这是一道最小割的题 我们设不睡觉这种状态为S,睡觉这种状态为T 对于每个人,如果不想睡觉,就从S向这个人连流量为1的边,否则,就从这个人向T连流量为1的边 对于每一对朋友, ...

  6. 安装cmake

    $ sudo apt-get install build-essential$ wget http://www.cmake.org/files/v3.11/cmake-3.11.3.tar.gz$ t ...

  7. 【2.0】SpringBoot多环境yml文件配置

    一.使用Spring Boot Profiles 1. 使用yml文件 首先,我们先创建一个名为 application.yml的属性文件,如下: server: port: 8080 my: nam ...

  8. js 数组的拷贝

    在js中,数组Array是引用类型,直接将数组赋值给一个变量名,二者所指向的地址是一样的. 所以直接复制数组会产生意想不到的结构. 要想解决拷贝一个数组但是对副本的修改不影响原来的数组,有以下方式: ...

  9. lambda Helper

    /// <summary> /// 操作表达式共通类,条件并且,或者操作等 /// </summary> public static class PredicateBuilde ...

  10. Rancher2.0中邮件通知的设置

    1-邮件通知的设置-中国电信189邮箱 2-2-邮件通知的设置-腾讯免费企业邮箱 **说明:网易163邮箱.QQ邮箱没有设置成功,可能是因为邮箱设置得太安全的缘故.   参考链接: 中国电信189邮箱 ...