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

MySQL主从工作原理及完整示例

运维部落 2016-09-15
214

一、背景

在如今的互联网时代,高并发、大数据都已经成为其中最热的之一。mysql不可能像redis一样单台机器每秒最多能处理10W次读写,也达不到elasticsearch一样存储上亿几十亿数据做过滤或者简单的聚合能在50-100ms以内成功响应。但是据我所知在中国一些互联网排名前十的公司的产品、订单这种关键数据还是存储在mysql中,更不要说mysql在一些更小的公司的应用,mysql重要性不言而喻。从这一讲会开始我的mysql文章之路。
现在经常有个词能听到”读写分离”,是的读写分离可以降低单点机器的并发访问压力。从而实现主机器专门用于写入,另外的一个从节点或者多个从节点来实现读。

复制实现原理图:


分为同步复制和异步复制,实际复制架构中大部分为异步复制。 复制的基本过程如下:
  • (1)、Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

  • (2)、Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;

  • (3)、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;

  • (4)、Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。

    其实稍微了解mysql底层一点的都知道,mysql的更新记录都可以配置保存在binlog文件中,这个文件用处很大,有一个比较大的应用就是有些公司开发监听binlog变化的插件,再结合消息中间件来实现数据变更实时通知订阅方。当然这次我们要讲的还是slave机器怎么样实现对于master机器的主从。

二、主从复制的配置

实现环境说明:

  • 安装两个虚拟机 master:192.168.30.128 slave:192.168.30.131

  • 分别在两台机器上面安装mysql,具体的流程可以参照我之前写的http://www.jianshu.com/p/674f56b2fe56

当你上面两步都做完了以后我想你已经都把mysql 服务给起来了吧,接下来我们需要配置mysql的binlog信息。

配置

1、找到my.cnf文件。按我之前介绍的文章安装的话是在/etc/my.cnf下面,具体是在原来的文件里面新加三个参数:

server-id=128     #设置服务器唯一的id,默认是1,我们设置ip最后一段,slave设置131
log-bin=mysql-bin   # 启用二进制日志
binlog-ignore-db = mysql,information_schema  #忽略写入binlog的库,因为这些都不是我们关心的自己创建的业务库

具体的修改如下:


完成以后重启service mysqld start master上面的mysql服务

2、master机器binlog配置好了以后还需要给slave机器授权IO读取它啊,登录mysql -u root -proot以后执行命令如下:

GRANT REPLICATION SLAVE ON . to 'sync'@'192.168.30.131' identified by 'root';  //新建一个sync用户密码为root给slave机器使用。后面salve机器配置会使用到

具体的修改如下:


同时也可以通过show master status 命令查看binlog信息:

mysql> show master status;
+------------------+----------+--------------+--------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         |
+------------------+----------+--------------+--------------------------+
| mysql-bin.000001 |      259 |              | mysql,information_schema |
+------------------+----------+--------------+--------------------------+

看情况binlog文件名称+position数据,因为这给后面在salve机器上配置连接master机器有用到。

三、配置slvae机器,直接上命令吧

change master to
master_host='192.168.30.128', //master的ip
master_user='sync',             //master授予的用户名称
master_password='root',     //密码
master_log_file='mysql-bin.000001', //master的binlog名称
master_log_pos=259;//位置

别忘记了重启slave机器,再用mysql> show slave status \G查看执行结果:


四、测试最后的复制结果

1、master机器:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| master_slave       |
| mysql              |
| storm_test         |
| test               |
| test12             |
+--------------------+
6 rows in set (0.00 sec)
2、slave机器:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| master_slave       |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)
3、在master机器上新建test_copy数据库
mysql> create database test_copy;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| master_slave       |
| mysql              |
| storm_test         |
| test               |
| test12             |
| test_copy          |  //新建数据库
+--------------------+
7 rows in set (0.01 sec)
4、查看salve机器结果:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| master_slave       |
| mysql              |
| test               |
| test_copy          | //复制成功
+--------------------+
5 rows in set (0.00 sec)

是的这样的话主从复制已经实现了.


号外号外:

现在我们公众号推出参与奖和互动奖,凡是通过微信与我们参与讨论互动最多的朋友,将获得我们送出的神秘礼物,还有机会获得Ansible中文官网马上将出版的新书哦! 我们将不定期的推出奖励计划 ! 奖励多多,小伙伴们,一起来吧!


以上是今天为大家带来的内容,如果有任何问题,大家也可以添加以下QQ群参与问题的讨论。
  • Ansible中文权威群:372011984(已满)
  • AWK&SED企业实战: 260039357
  • docker企业架构实践:491533668
  • Jumpserver交流群 :399218702
  • Ansible中文权威-2号群:486022616

关于我们:


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

评论