基于mysql的主从复制+半同步复制

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

 一、mysql复制的原理

  mysq复制的工作机制其实就是三个进程彼此间的工作,但前提是要开启主服务器的二进制日志,因为主服务器的修改操作都被记录在了二进制日志中。

 主服务器的进程
  dump thread:主要用来响应从服务器的IO thread,向从服务器发送二进制日志的语句的线程。
从服务器的进程
  IO thread:是从服务器请求主服务器的二进制语句的线程,并把内容存放在relaylog中
  SQL thread:从relaylog中读取数据并运行在自己服务器上的线程。
  为了提高服务器的性能,mysql的复制是异步的,但这也就使mysql的复制具有滞后
 
二、mysql复制模型
 mysql的复制架构
      mysql的服务器可以一主多从,但是一台从服务器默认只能有一个主服务器。
 mysql的主从模型
   主从模型具体如下图所所示

   在主从模型中,所有的写操作都只能在主服务器上完成,并记录到自己的二进制日志中。然后从服务器的IOthread线程发起复制
请求,主服务器的dumpthread响应IOthread并读取自己二进制文件中的sql语句发送给从服务器,iothread把主服务器发送来的内容
写到自己的relaylog中,然后有sql thread从relaylog中读取数据并运行在自己的服务器上。在这里需要说明的是,在从服务器上
只能进行读操作。在主从模型中通过serverid来进行标识,以避免重复操作
 

  在主从服务架构中需要注意到的问题如下
   1、从服务器在复制时,要指定事件位置,也就是从那个点开始复制。
   2、如果主服务器已经运行一段时间后,从服务器才开始复制,这时最好对主服务器进行备份并指定备份的时间点,以方便从服务器的复制。
   3、主从的server id不能一样
  实验步骤
    1、创建逻辑卷,存放数据
 
 
 
  1. #fdisk /dev/sda 
  2. #partprobe /dev/sda 
  3. #pvcreate /dev/sda5 
  4. #vgcreate myvg /dev/sda5  
  5. #lvcreate -n mylv -L 10G myvg 
  6. #mke2fs -j /dev/myvg/mylv       
    2.创建共享目录并开机自动挂载逻辑卷
 
 
 
  1. #mkdir /mydata                   //创建共享目录  
  2. #vim /etc/fstab                  //开机自动挂载      
  3.  /dev/myvg/mydata        /mydata      ext3    defaults        0 0  
    3、创建用户
  
 
 
  1. #groupadd -g 306 -r mysql 
  2. #useradd -g mysql -r -u 306 mysql 
  3. #chown mysql:mysql /mydata       //修改共享目录的属主属组为mysql 
4、安装并初始化mysql
 
 
 
  1. #tar xf mysql-5.5.20-linux2.6-i686 -C /usr/local 
  2. # cd  /usr/local #ln -sv mysql-5.5.20-linux2.6-i686  mysql //创建连接  
  3. #chown -R mysql:mysql . 
  4. #cp support-files/my-large.cnf  /etc/my.cnf  //配置文件 
  5. #vim /etc/my.cnf  
  6.     在[mysqld]处 添加datadir=/mydata    //添加数据存放位置
  7. #scripts/mysql_install_db --user=mysql --datadir=/mydata //初始化Mysql 
  8. #chown -R root . 
  9. #cp support-files/mysql.server  /etc/rc.d/init.d/mysqld //提供mysql脚本 
  10. #servie mysqld start 
  11. #/usr/local/mysql/bin/mysql        //启动并测试mysql是否可用 
  12. #service mysqld stop                     //必须关闭,否则在节点2上无法启动 
  13. #scp /etc/my.cnf mynode2:/etc           //把mysql的配置文件复制到node2上 
  14. #scp /etc/rc.d/init.d/mysqld mynode2:/etc/rc.d/init.d/mysqld  //复制服务脚本 
以上在主从服务器上做相同操作
5.配置主从服务器
     主服务器配置如下
    
 
 
  1. #vim /etc/my.cnf 
  2.          binlog_format=mixed       //启用二进制日志 
  3.          server-id       = 1       //设置server-id 
  4.         创建具有复制权限的用户 
  5. mysql>grant replication slave,replication client on *.* to repluser@'172.16.26.%' identified by'1234'; 
  6. mysql>flush privileges; 
   在启用从服务器之前,需要使用如下命令记录一下主服务器当前的时间点
 
 
 
  1. mysql>show master status 
  从服务器配置如下
 
 
 
  1. #vim /etc/my.cnf 
  2.        #log-bin=mysql-bin              //禁用二进制日志 
  3.         relay-log=mysql-relay           //启用中继日志 
  4. server-id  =12                    //设置server id 
  5. #service mysqld restart               //重启mysql使配置生效 
  查看日志的启动情况, 如下图所示 
 
 
  1. mysql>show global variables like "%log%"; 

查看配置的server_id,如下所示
 
 
 
  1. mysql>show global variables like "%server_id%"; 

   启动从服务,并指定主服务器参数  不能写在配置文件中,多个参数之间使用逗号隔开。
 
 
  1. #service mysqld restart 
  2. mysql>change master to 
  3.             MASTER_HOST = '172.16.200.1'              //主服务的ip地址 
  4.             MASTER_USER = 'repluser'             //主服务器的建立的用户 
  5.             MASTER_PASSWORD = '123'         //主服务器的用户密码 
  6.             MASTER_LOG_FILE = 'mysql-bin.000001'   //主服务器的日志文件 
  7.             MASTER_LOG_POS = 352    //日志文件的位置 
  8.             MASTER_PORT = 3306             //主服务器所在的端口 
设置好参数后,查看自己服务器的/mydata/data下产生的文件,如下图所示

 在从服务器上使用show slave status\G;查看服务是否启动复制功能
 
 
  
  1. mysql>start slave  //启动slave的复制功能 

验证主从服务的效果,
  在主服务器上进行如下操作,然后可以在从服务上进行查看。
 
 
  1. mysql>create databases testdb; 
  2. mysql>create  table tb1; 
因为只能在从服务器上进行读操作,所以要阻止用户对从服务器进行写操作具体使用如下
 
 
  1. mysql>show global variables like 'read_only'  //查看只读状态 
  2. mysql>set global read_only=1;                //设置为只能只读 
  假设从服务器崩溃,而主服器已经运行了很长时间,这就需要对主服务器进行备份。这里使用逻辑卷进行备份。
 
 
  1. mysql>flush tables with read lock;           //施加锁 
  2. #lvcreate -L 50M -s -p r -n mysqldata-snap /dev/myvg/mylv  创建快照卷 
  3. mysql>show master status //记录二进制日志文件的位置 
  4. mysql>unlock tables        //释放锁 
  5. mount /dev/myvg/mysqldata-snap /mnt   挂载快照卷 
  6. cd /mnt  
  7.  find . | cpio -o -H newc --quiet | gzip > /root/alldatabase.gz  //打包压缩 
  8. #umount /mnt                 //卸载 
  9. #lvremove mysqldata-snap     //删除快照卷 
  10. #scp alldatabse.gz node2:/mydata
在从服务器上恢复数据,在进行数据恢复之前,删除/mydata下的从服务器的所有文件,并停止mysql服务
 
 
  1. #cd /mydata 
  2. #gzip -d alldatabases.gz  
  3. #cpio -id < alldatabases  
然后就可以启动从服务器,进行上述的测试了。
mysql半同步复制
  在一主多从的场景中,主服务器会一同步的方式,只等待一台从服务器复制完成并返回成功信息后才停止等待过程,但是在超时后会自动降级为异步模式。
 在主从复制的基础上,只需执行如下操作即可。
 
 
  1. # On Master   
  2.     mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';   
  3.     mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;   
  4.     mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;   
  5.      
  6.  # On Slave   
  7.     mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';   
  8.     mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;   
  9.     mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; 
如果需要开机时,自动能够实现半同步则需要在Master和Slave的my.cnf中编辑:
 
 
  
  1. # On Master   
  2.     [mysqld]   
  3.       rpl_semi_sync_master_enabled=1   
  4.       rpl_semi_sync_master_timeout=1000 # 1 second   
  5. # On Slave   
  6.     [mysqld]   
  7.         rpl_semi_sync_slave_enabled=1   
 查看从服务器上的semi_sync是否开启:
 
 
  1. mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; 

 

查看主服务器上的semi_sync是否开启,注意clients 变为1 ,证明主从半同步复制连接成功:
 
 
  1. mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; 

 

本文转自  沐木小布丁  51CTO博客,原文链接:http://blog.51cto.com/sxhxt/957712

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
MySQL主从复制
MySQL主从复制
35 0
|
1月前
|
关系型数据库 MySQL Java
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
39 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL中主从复制的原理和配置命令
要原因包括提高性能、实现高可用性、数据备份和灾难恢复。了解两大线程( I/O 和 SQL)I/O线程:目的:I/O线程主要负责与MySQL服务器之外的其他MySQL服务器进行通信,以便复制(replication)数据。 功能: 当一个MySQL服务器作为主服务器(master)时,I/O线程会将变更日志(binary log)中的事件传输给从服务器(slave)。从服务器上的I/O线程负责接收主服务器的二进制日志,并将这些事件写入本地的中继日志(relay log)。 配置: 在MySQL配置文件中,你可以通过配置参数如和来启用二进制日志和指定服务器ID。log-bin server
MySQL中主从复制的原理和配置命令
|
1月前
|
负载均衡 容灾 关系型数据库
mysql主从复制
mysql主从复制
39 1
|
2月前
|
SQL 存储 运维
MySQL高可用性:主从复制和集群
MySQL高可用性:主从复制和集群
50 0
|
2天前
|
运维 负载均衡 关系型数据库
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
|
9天前
|
设计模式 容灾 关系型数据库
MySQL 主从复制架构
MySQL 主从复制架构
|
14天前
|
关系型数据库 MySQL Linux
【mysql】MySql主从复制,从原理到实践!
【mysql】MySql主从复制,从原理到实践!
30 0
|
16天前
|
SQL 关系型数据库 MySQL
Mysql主从复制
Mysql主从复制
|
1月前
|
SQL 关系型数据库 MySQL
mysql主从复制
mysql主从复制