MySQL replication学习笔记

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:
replication主从,主主都是以前做的,但忘的很快,今天复习一下,顺便做点笔记了,visio也有段时间没有用了,大致画了了一个原理图:
 
1,主服务器记录二进制日志。
2,从服务器把主服务器的二进制日志拷贝到自已的中继日志中。(详细过程:首先它先启动一个名称为I/O线程的工作线程,这个I/O线程开启一个普通的客户端连接,然后启动一个特殊的二进制日志转储进程,这个转储进程从主服务器的二进制日志中中读取事件。它不会对事件进行轮询。如果它跟上了主服务器,就会进入休眠状态,并等待有新事件发生时主服务器发出的信号。I/O线程把事件写入从服务器的中继日志中。)
3,从服务器重放中继日志中的事件,把更改应用到自已的数据上。(SQL线程读取了中继日志,并且重放其中的事件,然后更新从服务器的数据,由于这个线程能跟上I/O线程一,中继日志通常位于操作系统缓存中,所以中继日志的开销很低。)
 
主服务器中的复制线程:
mysql> show processlist\G;
*************************** 1. row ***************************
     Id: 2
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: show processlist
*************************** 2. row ***************************
     Id: 3
   User: chlotte
   Host: 192.168.0.178:36643
     db: NULL
Command: Binlog Dump
   Time: 57
  State: Has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL
2 rows in set (0.00 sec)
ERROR: 
No query specified
mysql>
 
从服务器上的I/O线程与SQL线程:
mysql> show processlist\G;
*************************** 1. row ***************************
     Id: 3
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: show processlist
*************************** 2. row ***************************
     Id: 4
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 71
  State: Waiting for master to send event
   Info: NULL
*************************** 3. row ***************************
     Id: 5
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 48
  State: Has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL
3 rows in set (0.00 sec)
ERROR: 
No query specified
 
 
与复制相关的参数列表:
Sync_binlog=1
mysql 在每次提交事务的时候把二进制日志的内容同步到磁盘上,所以即使服务器崩溃也会把事件写入日志中。
Skip_slave_start
会阻止从服务器在崩溃后自动启动,它可以给你机会修复服务器。
Mysql-bin.index
记录了磁盘上的二进制日志文件,这里的 index 并不是指表的索引,而是指这个文件中每一行包含了二进制日志文件的文件名。
Mysql-relay-bin.index
中继日志的索引文件,其作用和二进制日志文件的索引文件相同。
Master.info
记录了复制用户的密码,它是纯文本格式的(每行一个值),随 mysql 版本变化而变化,应该对该文件的访问进行限制。
Relay-log.info
记录了当前二进制日志和中继日志的坐标,删除它的后果是服务器在重启之后就会忘记复制的位置,并可能重复复制。
Expire_logs_days
定义了 mysql 清除过期日志的时间。
Log_slave_updates
可以把一台从服务器变成主服务器,它指导 mysql 把自已执行的事件写入二进制日志中,然后自已的从服务器可就可以执行这些事件。

 
复制的过滤主要有2种方式:
1,在主服务器在把事件从进二制日志中过滤掉,相关的参数是:binlog_do_db和binlog_ignore_db。
2,在从服务器上把事件从中继日志中过滤掉,相关的参数是replicate_*。
 
 
复制只能扩展读取,不能扩展写入,对数据进行分区可以进行扩展写入。
 
 
复制常见的问题:
一,从服务器到底落后于主服务器多少?用Maatkit工具里面的mk-heartbeat脚本。
二,如何确定主从服务器的数据是否一致?用Maatkit工具里面的mk-table-checksum脚本。
 
 
复制的优化:

 

mysql复制环境中,8个参数可以让我们控制,需要复制或需要忽略不进行复制的DBtable分别为:

下面二项需要在Master上设置:

Binlog_Do_DB:设定哪些数据库需要记录Binlog

Binlog_Ignore_DB:设定哪里数据库不需要记录Binlog

 

优点是Master端的Binlog记录所带来的Io量减少,网络IO减少,还会让slave端的IO线程,SQL线程减少,从而大幅提高复制性能,

缺点是mysql判断是否需要复制某个事件不是根据产生该事件的查询所在的DB,而是根据执行查询时刻所在的默认数据库(也就是登录时指定的库名或运行"use database"中指定的DB,只有当前默认DB和配置中所设定的DB完全吻合时IO线程才会将该事件读取给slaveIO线程.所以,如果在默认DB和设定须要复制的DB不一样的情况下改变了须要复制的DB中某个Table中的数据,该事件是不会被复制到Slave中去的,这样就会造成Slave端的数据和Master的数据不一致.同样,在默认的数据库下更改了不须要复制的数据库中的数据,则会被复制到slave,slave端并没有该数据库时,则会造成复制出错而停止.

 

 

 

下面六项需要在slave上设置:

Replicate_Do_DB:设定需要复制的数据库,多个DB用逗号分隔

Replicate_Ignore_DB:设定可以忽略的数据库.

Replicate_Do_Table:设定需要复制的Table

Replicate_Ignore_Table:设定可以忽略的Table

Replicate_Wild_Do_Table:功能同Replicate_Do_Table,但可以带通配符来进行设置。

Replicate_Wild_Ignore_Table:功能同Replicate_Do_Table,功能同Replicate_Ignore_Table,可以带通配符。

 

优点是在slave端设置复制过滤机制,可以保证不会出现因为默认的数据库问题而造成SlaveMaster数据不一致或复制出错的问题.

缺点是性能方面比在Master端差一些.原因在于:不管是否须要复制,事件都会被IO线程读取到Slave,这样不仅增加了网络IO,也给Slave端的IO线程增加了Relay Log的写入量.

 
 
 
 
 
 
主从复制的配置实例:
主服务器:192.168.0.176
从服务器:192.168.0.178
 
1,分别在主从服务器上执行下面的授权语句:
mysql> grant replication slave,replication client on *.* to  chlotte@'192.168.0.%' identified by 'chlotte';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
2,查看主服务器上的binlog位置:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 |      195 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
 
3,在从服务器上执行chang master语句:
[root@localhost ~]# mysql -uroot -pourgame;
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.42-community MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> change master to master_host='192.168.0.176',
    -> master_user='chlotte',
    -> master_password='chlotte',
    -> master_log_file='mysql-bin.000009',
    -> master_log_pos=0;
Query OK, 0 rows affected (0.04 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.0.176
                  Master_User: chlotte
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 4
               Relay_Log_File: localhost-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 4
              Relay_Log_Space: 106
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
1 row in set (0.00 sec)
ERROR: 
No query specified

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.176
                  Master_User: chlotte
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 338
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 483
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 338
              Relay_Log_Space: 642
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
1 row in set (0.00 sec)
ERROR: 
No query specified









本文转自 trt2008 51CTO博客,原文链接:http://blog.51cto.com/chlotte/370543,如需转载请自行联系原作者
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
150 6
|
3月前
|
SQL 关系型数据库 MySQL
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
95 3
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
|
3月前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
81 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
3月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
76 1
|
7月前
|
SQL Oracle 关系型数据库
MySQL学习笔记
MySQL学习笔记
44 0
|
5月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
67 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
5月前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
211 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
5月前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
47 6
|
5月前
|
SQL 关系型数据库 MySQL
MySQL学习笔记
这篇文章是一份关于MySQL数据库操作的学习笔记,涵盖了数据库的终端操作、数据类型、建表约束、事务处理以及SQL的连接查询等基础知识点。
|
5月前
|
存储 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
90 4