• 十七、Mysql的主从(二)--主从复制部署


    一、全年无故障率(非计划内故障停机)

     
    99.9%                 ----> 0.001*365*24*60=525.6  min
    99.99%                ----> 0.0001*365*24*60=52.56 min
    99.999%               ----> 0.0001*365*24*60=5.256 min

    二、主从介绍

    随着访问量的不断增加,单台MySQL数据库服务器压力不断增加,需要对MYSQL进行优化和架构改 造,MYQSL优化如果不能明显改善压力情况,可以使用高可用、主从复制、读写分离来、拆分库、拆分 表来进行优化。 MYSQL主从复制集群在中小企业、大型企业中被广泛使用,MYSQL主从复制的目的是实现数据库冗余 备份,将Master数据库数据定时同步至Slave库中,一旦Master数据库宕机,可以将WEB应用数据库配 置快速切换至Slave数据库,确保WEB应用较高的可用性。

    主要作用:实现备份; 实现故障转移; 实现读写分离。

    实现的方式:

    1、基于二进制日志复制的
    2、主库的修改操作会记录二进制日志
    3、从库会请求新的二进制日志并回放,最终达到主从数据同步
    4、主从复制核心功能:
    辅助备份,处理物理损坏                   
    扩展新型的架构:高可用,高性能,分布式架构等

    三、 主从复制前提(搭建主从的过程)

    1、两台以上mysql实例 ,server_id,server_uuid不同
    2、主库开启二进制日志
    3、专用的复制用户
    4、保证主从开启之前的某个时间点,从库数据是和主库一致。
    5、告知从库,复制user,passwd,IP port,以及复制起点(change master to)
    6、线程(三个):Dump thread  IO thread  SQL thread 开启(start slave)

    四、主从复制搭建(Classic replication)

    1、实验环境

    IP:192.168.32.201  多实例3307、3308
    
    3307为master
    3308为slave
    
    mysql多实例部署省略请参照《Mysql的多实例部署》
    
    系统:CentOS Linux release 7.6.1810 (Core)
    mysql:mysql-5.7.20-linux-glibc2.12-x86_64

    2、启动多实例3307、3308

    [root@vm01 ~]# systemctl start mysqld3307
    [root@vm01 ~]# systemctl start mysqld3308
    [root@vm01 ~]# ss -antlp|grep 330
    LISTEN     0      80          :::3307             :::*                   users:(("mysqld",pid=7201,fd=31))
    LISTEN     0      80          :::3308             :::*                   users:(("mysqld",pid=13480,fd=31))

    3、修改my.cnf ,开启二进制日志功能和server_id(3307和3308)

    主库开启server_id和log_bin日志
    [root@vm01 ~]# cat /data/3307/my.cnf [mysqld] basedir=/app/mysql datadir=/data/3307/data socket=/data/3307/mysql.sock log_error=/data/3307/mysql.log port=3307 server_id=3307 log_bin=/data/3307/mysql-bin [mysql] socket=/data/3307/mysql.sock
    从库开启server_id和relay_lob [root@vm01
    ~]# cat /data/3308/my.cnf [mysqld] basedir=/app/mysql datadir=/data/3308/data socket=/data/3308/mysql.sock log_error=/data/3308/mysql.log port=3308 server_id=3308
    relay_log=/data/3308/relay-log
    log_bin=/data/3308/mysql-bin [mysql] socket=/data/3308/mysql.sock [root@vm01 ~]#systemctl restart mysql3307 [root@vm01 ~]#systemctl restart mysql3308 [root@vm01 ~]# mysql -S /data/3307/mysql.sock -p -e "select @@server_id;" Enter password: +-------------+ | @@server_id | +-------------+ | 3307 | +-------------+ [root@vm01 ~]# mysql -S /data/3308/mysql.sock -p -e "select @@server_id;" Enter password: +-------------+ | @@server_id | +-------------+ | 3308 | +-------------+ [root@vm01 ~]# [root@vm01 ~]# mysql -S /data/3307/mysql.sock -p -e "select @@log_bin;" Enter password: +-----------+ | @@log_bin | +-----------+ | 1 | +-----------+ [root@vm01 ~]# mysql -S /data/3308/mysql.sock -p -e "select @@log_bin;" Enter password: +-----------+ | @@log_bin | +-----------+ | 1 | +-----------+

    4、主库3307中创建复制用户

    [root@vm01 ~]# mysql -S /data/3307/mysql.sock -p
    [(none)]>grant replication slave on *.* to repl@'192.168.32.%' identified by '123';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    [(none)]>select user,host from mysql.user;
    +---------------+-----------+
    | user          | host      |
    +---------------+-----------+
    | repl          | 10.0.0.%  |
    | mysql.session | localhost |
    | mysql.sys     | localhost |
    | root          | localhost |
    +---------------+-----------+
    4 rows in set (0.00 sec)

    5、备份主库

    mysqldump -S /data/3307/mysql.sock -A -E --master-data=2 --single-transaction  -R --triggers >/backup/full3307.sql
    #二进制日志开始的点
    [root@vm01 ~]# vim /backup/full3307.sql 
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=444;

    6、恢复从库

     
    [root@vm01 ~]# mysql -S /data/3308/mysql.sock -p
    [(none)]>set sql_log_bin=0;
    [(none)]>source /backup/full3307.sql;
    [(none)]>set sql_log_bin=1;

    7、告知从库关键复制信息

    [root@vm01 ~]# mysql -S /data/3308/mysql.sock -p
    [none]>help change master to
    
    [none]>CHANGE MASTER TO
      MASTER_HOST='192.168.32.201',
      MASTER_USER='repl',
      MASTER_PASSWORD='123',
      MASTER_PORT=3307,
      MASTER_LOG_FILE='mysql-bin.000001',
      MASTER_LOG_POS=444,
      MASTER_CONNECT_RETRY=10;

    8、在从库3308上开启主从专用线程

    [root@vm01 ~]# mysql -S /data/3308/mysql.sock -p
    [(none)]>start slave;
    Query OK, 0 rows affected (0.00 sec)

    9、在从库3308上检查复制状态

     [root@vm01 ~]# mysql -S /data/3308/mysql.sock -p
     [(none)]>show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.32.201
                      Master_User: repl
                      Master_Port: 3307
                    Connect_Retry: 10
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 738
                   Relay_Log_File: vm01-relay-bin.000002
                    Relay_Log_Pos: 614
            Relay_Master_Log_File: mysql-bin.000001
                 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: 738
                  Relay_Log_Space: 820
                  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: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 3307
                      Master_UUID: 11269f05-3166-11eb-9c7d-000c29d16f12
                 Master_Info_File: /data/3308/data/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
               Retrieved_Gtid_Set: 
                Executed_Gtid_Set: 
                    Auto_Position: 0
             Replicate_Rewrite_DB: 
                     Channel_Name: 
               Master_TLS_Version: 
    1 row in set (0.00 sec)
    
    #其中 Slave_IO_Running: Yes
    #     Slave_SQL_Running: Yes表明主从建立完成

    10、测试主从

    1)查看主从库的数据是否一致
    3307主库
    [root@vm01 ~]# mysql -S /data/3307/mysql.sock -p
    Enter password: 
    [(none)]>show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.00 sec)
    
    3308从库
    [root@vm01 ~]# mysql -S /data/3308/mysql.sock -p
    Enter password: 
    [(none)]>show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.00 sec)
    
    2)3307主库创建数据库ywx
    [root@vm01 ~]# mysql -S /data/3307/mysql.sock -p
    Enter password: 
    [(none)]>create database ywx charset=utf8;
    Query OK, 1 row affected (0.00 sec)
    
    [(none)]>show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | ywx                |
    +--------------------+
    5 rows in set (0.00 sec)
    
    3)查看3308从库是否同步
    [root@vm01 ~]# mysql -S /data/3308/mysql.sock -p
    Enter password: 
    [(none)]>show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | ywx                |
    +--------------------+
    5 rows in set (0.00 sec)
    
    #3308从库也有ywx数据库,主从复制部署成功!!!
  • 相关阅读:
    XML 文档的结构
    java 事件机制
    Spring 中的 Resource和ResourceLoader
    Spring PropertyPlaceholderConfigurer
    生产者——消费者模型的java代码实现
    encodeURI() 函数概述
    ECMAScript 6
    node
    AJAX常见面试题
    AJAX(Asynchronous JavaScript and XML)
  • 原文地址:https://www.cnblogs.com/yaokaka/p/14070305.html
Copyright © 2020-2023  润新知