暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql主从复制

左羊公社 2019-12-21
166

好在,别人如何分析我,跟我本身是一点关系也没有的。(by 三毛)

主从复制的常见用途

1.数据备份

对备份来说,复制是一项很有意义的技术补充,但复制既不是备份也不能取代备份

2.负载均衡(读写分离)

通过MySQL主从复制,可以把写操作放在主库(master),读取操作放在多个从库(slave),能够很好的将负载分离到不同的MySQL服务器上,从而减轻单一数据库的操作压力

3.高可用性和故障切换

复制能够帮助应用程序避免MySQL单点失败,当主库(master)发生故障后,可以立马切换到从库(slave),降低服务器数据风险。

4.MySQL升级测试

使用一个更高版本的MySQL作为备库,保证在升级全部实例前,查询能够在备库预期执行

主从复制的原理


复制
面试题:
1 主从复制是如何工作的?
2 简单介绍下主从复制的基本原理?

复制

Plus版


1.主库将数据更改记录到二进制日志(Binary Log)

2.从库将主库上的日志复制到自己的中继日志(Relay Log)中

3.从库读取中继日志中的事件,将其重放到从库数据之上


大众版

主库(master)记录下自己的操作日志,授权从库可以读取操作日志,从库(slave)会开启两个线程。

  • IO线程 负责连接主库(master) 连接成功后,睡眠并等待主库(master)产生新的事件,有新的就保存到自己的中继日志中,中继日志通常位于操作系统的缓存中,所以开销很小。

  • sql进程 负责执行中继日志中的sql操作,这样从库(slave)的内容就和主库(master)的一致了

执行步骤

             

第一步

主库记录二进制日志,在每次更新事件(update、insert、delete)事务提交前,主库会将数据更新的事件写入二进制日志中(Binary Log)

第二步

从库会启动一个工作线程(I/O线程),I/O线程会跟主库建立一个客户端连接,然后主库会启动一个特殊的二进制转储(binlog dump)线程,这个线程会读取主库中的二进制日志中的事件并将其读到的binlog的内容发到从库

第三步

从库的SQL线程执行最后一步,该线程从中继日志中读取更新事件并在从库执行,从而实现从库的数据更新


配置主从复制(以Centos 7 为例)

首先

停止对主库(master)数据库的操作,把主库(master)中的数据库全部导入到从库(slave),使两边数据库完全一致。

小提示 主从配置需要注意的点
1 主从服务器操作系统版本和位数一致
2 主库和从库的版本保持一致(注:从库的版本可以高于主库,但一定不能低于主库)
3 主库和从库的数据要一致
4 主库开启二进制日志,主库和从库的server_id在局域网内必须各自唯一

复制

主库(master)配置

1.创建复制账号

MySQL会给一些特殊权限到复制线程,从库的I/O线程会创建一个连接到主库的TCP/IP连接,这就需要主库上创建一个复制用户,并赋予其合适的权限,语句如下

mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repl@'%' IDENTIFIED BY '123456';
复制

2.修改主库的配置文件

修改master的配置文件,使用二进制日志,指定server-id,重启服务。

cd etc/
复制

复制
vi my.cnf

复制

复制

添加如下配置

log_bin=mysql-bin [*]启用二进制日志
server_id=10 [*]服务器唯一ID

复制

配置完成后需要重启mysqlserver才能生效。

systemctl restart mysqld
复制

3.检查二进制日志文件名

mysql> show master status;

复制
    
复制
      
复制

从库(slave)配置


1.修改配置文件my.cnf

vi etc/my.cnf
复制

添加如下配置

log_bin=mysql-bin
server_id=2
relay_log=/var/lib/mysql/mysql-relay-bin
log_slave_updates=1
read_only=1

复制

2.将从库(slave)指向主库(master)

CHANGE MASTER TO MASTER_HOST='你主库的IP地址',MASTER_USER='你创建的复制用户名',MASTER_PASSWORD='密码',MASTER_LOG_FILE='你的二进制日志文件名',MASTER_LOG_POS=主库查到的Position;
复制

   

3.启动slave

mysql>start slave;
复制

4.查看slave状态

mysql> mysql slave status\G

复制

复制

结果中有两个重要数据项:

Slave_IO_Running: Yes IO线程状态,必须YES
Slave_SQL_Running: Yes SQL线程状态,必须YES

复制

测试


我搭建了两套CentOS7环境,给大家演示一下.



更多精彩内容

请关注左羊公社

猛戳左边二维码

了解更多哦




文章转载自左羊公社,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论