Mysql主从复制

一. mysql的主从原理

mysql主从架构是当前比较成熟的高可用架构,配置也比较简单。
实现原理是:mysql主服务器将自己的操作记录例如增删改查等写入到binlog文件中去,而mysql从服务器,则开启两个线程 
Slave_IO_Running和Slave_SQL_Running,IO线程是负责读取master的日志文件并写入到slave中的relay-log文件中,而sql线程则负责解析relay-log日志文件,将日志文件解析成
mysql从服务器可以执行的sql语句,写入到mysql从的库中,从而完成mysql的主从复制

二. mysql的基础知识

a. mysql中最常见的存储引擎为MyISAM和Innodb,其中innodb是支持事务,MyISAM不支持事务,支持事务是支持回归 
b. myISAM中的每个库的每张表都会有3个文件.frm .myd .myi,其中frm文件为存放元数据信息,myd为存放数据,myi为存放索引的文件
c. innodb中如果是独享表空间的话,每个表一个ibd文件,而共享表空间的话,则所有表共同用ibdata文件
d. mysql主从复制中,在slave端存放的master.info文件是存放了该slave的master的相关信息,比如master机的IP,用户名,密码等信息而mysql-relay-bin文件是slave的IO线程从
master的binlog中读取到的信息,读取后在由slave的sql线程去解析此日志,并在slave端执行语句,完成主从复制,而relay-log.info文件和master.info文件的功能类似,此文件存放了
slave通过IO线程写入到slave的relay-log的相关信息
e. 在my.cnf配置文件中,有很多中括号,这里的每个中括号定义了针对每个组件使用的参数,例如mysqld组则是定义了mysql的启动参数,而mysqldump则是定义了在使用mysqldmp命令时要 
用到的参数等等
f. mysql是一个模块化的组织结构,每个功能都是由相对应的功能模块来完成的,这里面有个query cache模块,就是完成了查询的缓存功能,当客户端提交了query请求后,如果服务器端在内
存中有此query的缓存结果则直接返回给客户端,如果没有缓存,则去执行此query  还有一个模块就是存储引擎模块,比如MyISAM和innodb在mysql中都是以模块的形式存在的,这个是mysql
独有的功能

三. mysql主从的实现

在主上的my.cnf文件中配置:

  [mysqld]
  log-bin=mysql-bin
  server-id=1
在主上执行命令:
  grant replication slave  on [i].[/i] to 'sync'@'192.168.0.2' identified by '123456';
  flush privileges;
  show master status;  记录此命令打印出来的两个值
  mysqldump -u root -p master> master.sql  #备份master数据库,此命令在shell中执行
在从上的my.cnf文件中配置:
  [mysqld]
  server-id=2
在从上执行命令:
  此处的master_log_file和master_log_pos两个值就是show master status中打印出来的两个值
  stop slave;
  change master to master_host='192.168.0.1',master_user='sync',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=23;    
  create database master;
  mysql -u root -p master < master.sql #在从上导入master数据库,此命令在shell中执行
  start slave;

四. mysql主从的验证

在从上执行命令:
  show slave status;  #如果显示 Slave_IO_Running和Slave_SQL_Running都是YES状态的话,则表明线程正常

五. MySQL主从同步实例 (这里的命令执行的位置不在标明)

背景: 两台MySQL配置了主从同步,由于MySQL从机的硬盘报警,现需要将MySQL从机迁移到一台新服务器上,两个MySQL都是5.1.37版本 
迁移步骤:
[list=1]
[*]由于两台MySQL都是线上服务器,而且都已经在运行且实时同步,所以在迁移的过程中,既要不影响使用,又要保证数据的完整性[/*]
[*]在从机上操作(出故障的机器):[/*]
[/list]  stop slave;
  show slave status;   #记录此处打印出的binlog的文件名和position两个值
  scp -r /var/lib/mysql/db_monitor_service root@1.2.3.4:/usr/local/src
  scp  /etc/my.cnf root@1.2.3.4:/usr/local/src
[list=1]
[*]在需要重新部署从库的机器上操作:[/*]
[/list]  编译安装mysql5.1.37,且完成初始化和目录权限配置
  在编译的时候,有一个地方需要注意,使用如下编译参数:
  ./configure --prefix=/usr/local/mysql5-3309 --enable-thread-safe-client --with-plugins=max-no-ndb --enable-assembler --with-tcp-port=3309 --
  with-unix-socket-path=/usr/local/mysql5-3309/var/mysql.sock   
  在make的时候会有一个报错,解决这个错误需要修改Makefile文件,将文件的最后几行中的do_abi_check:后面的语句一直到done都全部删除,但do_abi_check:需要保留,保存后执行
  make和make install安装
  rm -f /etc/mysql/my.cnf  #如果有就删掉,删之前确认此机器上没有别的mysql实例(unbutu)
  rm -f /etc/my.cnf  #如果有就删掉,删之前确认此机器上没有别的mysql实例(unbuntu) 
初始化:
/usr/local/mysql5-3309/bin/mysql_install_db --basedir=/usr/local/mysql5-3309 --datadir=/usr/local/mysql5-3309/var --user=mysql
  mkdir /data1/var_3309/
  chown -R mysql:mysql /data1/var_3309/
启动MySQL:
 /usr/local/mysql5-3309/bin/mysqld_safe --defaults-file=/usr/local/mysql5-3309/etc/my.cnf
停止MySQL:
 /usr/local/mysql5-3309/bin/mysqladmin -u root -p shutdown
  mv /usr/local/src/db_monitor_service /var/lib/mysql/
  mv /usr/local/src/my.cnf /etc/my.cnf
  change master to master_host='192.168.0.1',master_user='sync',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=23;  
  start slave;
  show slave status;  #验证可用性和数据的完整性
通过select语句查看最新数据是否和主库完成了同步

0 个评论

要回复文章请先登录注册