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

 一、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%'; 

 

你可能感兴趣的:(Mysql服务器,主从复制,半同步复制)