MySQL主从复制认识

时间:2022-03-31 00:12:53

  • MySQL主从复制作用
    1)、什么是MySQL主从复制
    MySQL主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个MySQL数据库从节点。MySQL默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库。
    2)、MySQL主从复制作用
    一、数据热备
    作为备数据库,当主数据库服务器发生故障后,可切换到从数据库继续工作,避免数据丢失。
    二、读写分离
    可支持MySQL数据库服务器支持更大的并发。数据读写操作可分配在不同的服务器间进行。如操作报表中尤其重要,由于部分报表SQL语句非常的慢,会导致锁表,影响前台服务。使用主从复制,前台使用master,负责写,报表使用slave,负责读,那么报表SQL将不会造成前台锁表,保证了前台正常运行。
    三、架构扩展
    随着业务量越来越大,I/O访问频率过高,单机可能无法满足。此时做多库的存储,如一主多从方式,以降低磁盘I/O访问,提高单个机器的I/O性能。
  • MySQL主从复制原理
    MySQL数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master节点,数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。
    MySQL主从复制认识
    总结如下:
    1)、master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master上创建授权的用户,开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
    2)、slave开启两个线程:IO线程和SQL线程。IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。
    3)、Mysql主从复制至少需要两个Mysql服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个MySQL服务。
    4)、Mysql主从复制最好确保master和slave服务器上的Mysql版本相同。
  • MySQL主从形式
    常见的主从形式:
    一主一从
    MySQL主从复制认识
    一主两从、一主多从
    MySQL主从复制认识
    联级复制
    MySQL主从复制认识
  • MySQL主从复制操作
    OS:CentOS7
    主从形式:一主一从
    实现MySQL主从复制需要进行的配置:
    主服务器
    开启二进制日志
    配置唯一的server-id
    获得master二进制日志文件名及位置
    创建一个用于slave和master通信的用户账号
    从服务器
    配置唯一的server-id
    使用master分配的用户账号读取master二进制日志
    启用slave服务
    具体操作:
    主服务器操作
    1)、修改主数据库服务器配置文件my.cnf
    server_id = 1                #唯一标识,主库从库不能重复
    log_bin = mysql-bin          #开启日志
    binlog_format=MIXED         #日志记录的格式
    max_binlog_size = 512M     #单个日志文件最大
    expire_logs_day = 3          #日志有效期(天)
    binlog_do_db = test1,test2     #日志记录那些数据库
    binlog_ignore_db = mysql,performance_schema,information_schema   #日志记录忽略那些数据库

    2)、创建用于同步账户

    mysql> CREATE USER ‘user‘@‘10.10.10.11‘ IDENTIFIED BY ‘passwd‘;    #创建用户
    mysql> GRANT REPLICATION SLAVE ON *.* TO ‘user‘@‘10.10.10.11‘;    #分配权限,只能10.10.10.11从服务器连接
    mysql>flush privileges;

    3)、查看master状态
    show master status命令记录二进制文件名(mysql-bin.000003)和position位置(77)。

    mysql > SHOW MASTER STATUS;
     ------------------ ---------- -------------- ------------------ 
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
     ------------------ ---------- -------------- ------------------ 
    | mysql-bin.000003 | 77       | test         | manual,mysql     |
     ------------------ ---------- -------------- ------------------ 

    从服务器操作
    1)、修改从数据库服务器配置文件my.cnf

    server_id = 2
    log_bin = mysql-bin     #开启日志
    binlog_format=MIXED     #日志记录的格式
    max_binlog_size = 512M     #单个日志文件最大
    expire_logs_day = 3   #日志有效期(天)
    replicate_do_db = test1,test2     #slave上配置,指定slave要复制哪个库
    replicate-ignore-db=mysql,performance_schema,information_schema     #slave上配置,指定slave要忽略哪些库
    relay_log_recovery = 1     #从库建议开启,有利于数据一致性
    log_slave_updates = 1      #如果从库还会用做主库,建议开启

    2)、设置同步信息
    先停止同步

    mysql>stop slave;

    设置同步信息

    mysql> CHANGE MASTER TO
    ->     MASTER_HOST=‘10.10.10.10‘,
    ->     MASTER_USER=‘user‘,
    ->     MASTER_PASSWORD=‘passwd‘,
    ->     MASTER_LOG_FILE=‘mysql-bin.000003‘,
    ->     MASTER_LOG_POS=77;

    其中master_log_file 和 master_log_pos为上面主库show master status命令记录的信息。
    3)、启动slave 同步进程

    mysql>start slave;

    4)、slave状态查看
    show slave statusG 命令查看,主要查看这几项:

    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Master_Log_File: mysql-bin.000003
    Relay_Master_Log_File: mysql-bin.000003
    Read_Master_Log_Pos: 2720
    Exec_master_log_pos: 2720

    Slave_IO_Running和Slave_SQL_Running都为YES,表示主从同步设置成功了。
    验证操作,如在master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据,即可验证主从复制功能是否有效,还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可完成MySQL主从复制功能的验证了。