linux复盘:mysql主从

为何要作主从复制?

我想这是要在实施之前要想清楚的问题。是为了实现读写分离,减轻主库负载或数据分析? 为了数据安全,作备份恢复?主从切换作高可用?
大部分场景下,以上三个问号一主一从都可以解决,并且任何生产环境都建议你至少要有一个从库,假如你的读操做压力特别大,甚至要作一主多从,还能够不一样的slave扮演不一样的角色,例如使用不一样的索引,或者不一样的存储引擎,或使用一个小内存server作slave只用于备份。(固然slave太多也会对master的负载和网络带宽形成压力,此时能够考虑级联复制,即 A->B->C )php

还有须要考虑的是,一主一从,一旦作了主从切换,不经过其它HA手段干预的话,业务访问的仍是原IP,并且原主库很容易就做废了。因而 主-主 复制就产生了,凭借各自不一样的 server-id ,能够避免 “A的变化同步到B,B应用变化又同步到A” 这样循环复制的问题。但建议是,主主复制,其中一个主库强制设置为只读,主从切换后架构依然是可用的。mysql

复制过程是slave主动向master拉取,而不是master去推的,因此理想状况下作搭建主从时不须要master作出任何改变甚至停服,slave失败也不影响主库。web

MySQL主从又叫作Replication、AB复制。sql

简单讲就是A和B两台机器作主从后,在A上写数据,另一台B也会跟着写数据,二者数据实时同步。MySQL主从是基于binlog的,主上须开启binlog才能进行主从。数据库

为何要作主从复制?
我想这是要在实施之前要想清楚的问题。是为了实现读写分离,减轻主库负载或数据分析? 为了数据安全,作备份恢复?主从切换作高可用?
大部分场景下,以上三个问号一主一从都可以解决,并且任何生产环境都建议你至少要有一个从库,假如你的读操做压力特别大,甚至要作一主多从,还能够不一样的slave扮演不一样的角色,例如使用不一样的索引,或者不一样的存储引擎,或使用一个小内存server作slave只用于备份。(固然slave太多也会对master的负载和网络带宽形成压力,此时能够考虑级联复制,即 A->B->C )vim

还有须要考虑的是,一主一从,一旦作了主从切换,不经过其它HA手段干预的话,业务访问的仍是原IP,并且原主库很容易就做废了。因而 主-主 复制就产生了,凭借各自不一样的 server-id ,能够避免 “A的变化同步到B,B应用变化又同步到A” 这样循环复制的问题。但建议是,主主复制,其中一个主库强制设置为只读,主从切换后架构依然是可用的。安全

复制过程是slave主动向master拉取,而不是master去推的,因此理想状况下作搭建主从时不须要master作出任何改变甚至停服,slave失败也不影响主库。网络

使用场景:架构

数据备份,主写数据,从上存数据备份ide

web客户端在从上读数据,不能在从上写,分担主库读的压力

  1. 主将更改操做记录到binlog中
  2. 从将主的binlog事件(SQL语句)同步到本机并记录在relaylog中
  3. 从根据relaylog里面的SQL语句按顺序执行

说明: 该过程有三个线程,主上有一个log dump线程,用来和从的i/o线程传递binlog;从上有两个线程,其中i/o线程用来同步主的binlog并生成relaylog,另一个SQL线程用来把relaylog里面的SQL语句落地。

配置主master:

vim /etc/my.cnf  #增长以下内容
erver-id=131  #数字本身定义,和奇偶有关系后面双主也要注意这里
log_bin=quyifan1  #指定log前缀

/etc/init.d/mysqld restart
ls -lt /data/mysql/  #查看mysql库文件,多了两个quyifan1为前缀的文件,此文件很是重要必须生产

mysqldump -uroot zrlog > /tmp/zrlog.sql #准备一个数据库
mysql -uroot -e "create database quyifan" #建立一个库
mysql -uroot quyifan < /tmp/zrlog.sql #把准备的数据恢复到这个新库中

grant replication slave on *.* to 'repl'@192.168.153.132 identified by 'password'; 
#建立一个用来同步的用户,关键所在

flush tables with read lock; #锁定数据包,暂时没法写入保持现有状态用于同步
show master status; #记录两个关键数据file和position,为后面backup作准备

配置从backup:

vim /etc/my.cnf
server-id=132  #这里和主划分开,数字奇偶性

/etc/init.d/mysqld restart
scp 192.168.153.131:/tmp/*.sql /tmp/ 
#把主上数据同步到从上超级重要,数据不一致会很是麻烦(ps这里不是太理解为什么不仅是传输上面备份的数据库就能够呢)

create database quyifan; #从上也建立相同的库
mysql -uroot quyifan < /tmp/zrlog.sql #把准备好的数据恢复备份到库中

☆☆☆☆☆☆☆☆☆☆☆
stop slave; #中止复制
change master to master_host='主IP', master_user='repl', master_password='123456', master_log_file='主file内容', master_log_pos=Position的数字;
#这条重点,用到了主上建立的那个用户和主上最后获得的数据
start slave; #恢复复制

show slave status\G #检查以下部分肯定主从搭建完成
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 econds_Behind_Master: 0  #为主从延迟的时间
 Last_IO_Errno: 0
 Last_IO_Error:
 Last_SQL_Errno: 0
 Last_SQL_Error:

都成功了,别急啊兄弟,回主上把锁定的包恢复锁定!!!
unlock tables;
好了主从到这里下面的更精彩
相关文章
相关标签/搜索