• mysql 之主从复制 主从集群配置


    数据库复制replication的实现原理 

      • 主服务器有语句的操作,对磁盘也有影响 

     

      • 从服务器要么跟着语句走 要么跟着磁盘变化走 

     

    所以:

     

    1.主服务器

    建立2进制日志,每产生语句或磁盘变化,写进日志binlog。

     

      

     2.从服务器

    读取主服务器binlog 形成relaylog(中继日志) 经语法分析变成从服务器的数据。

     

    3.授权

    由于数据都很私密,所以主服务器要授权复制账号 replication。

    从服务器利用复制账号来坚挺主服务器的日志。

     

     

     

    操作

     1. 首先编辑主服务器mysql的配置文件 my.cnf   (apt-get 安装位置 /etc/mysql/mysql.conf.d/ mysqld.cnf)

        

    # The following can be used as easy to replay backup logs or for replication.
    # note: if you are setting up a replication slave, see README.Debian about
    #       other settings you may need to change.
    server-id                    = 147      指定server_id
    log_bin                       = /var/log/mysql/mysql-bin.log 指定bin-log文件位置
    expire_logs_days        = 10 设置过期时间
    max_binlog_size         = 100M  设置文件大小上限
    
    #statement row mixed
    binlog-format=mixed      设置匹配模式 此处选择mixed模式
      • binlog-format   日志格式用哪种好?
        •  有statement ,row ,mixed (前两种的混合)    
        •     以 insert into tx (value1,value2) 为例,影响一行且为新增一行,不影响其他行,这种情况用row比较好 会直接复制磁盘上一行的变化
        •     以 update  tx set name=value1 为例,影响一行且为更新一行,不影响其他行,这种情况用row比较好 会直接复制磁盘上一行的变化
        •     以 update  tx set count=count+1 为例,对于磁盘上很多行都发生了变化 ,影响多行,语句却简单,此处适合statement的日志
        •     以上两种格式各有优势,mysql 提供了mixed 模式来帮我们分析

      2.   编辑从服务器的my.cnf

    [mysqld]
    port = 3306
    
    
    server-id=69               指定server-id
    
    relay-log=mysql-relay      指定relay-log

     

       3.重启各自的mysql

    sudo /etc/init.d/mysql restart

      4.主服务器master设置复制授权账号

    grant replication client,replication slave on *.* 
    to 'rep1'@'192.168.%.%'//授权给192.168打头的
    identified by 'rep1';//密码
      •     查看主服务器的状态
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |      154 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    
      •        position 的含义:
      •       复制的日志文件的开始位置
      •       binery log 在/var/lib/mysql下

       5.从服务器 给你一个账号去连你的master

    change master to
    master_host='192.168.5.199',//主服务器地址
    master_user='rep1',//授权用户名
    master_password='rep1',//授权账号
    master_log_file='mysql-bin.000001', //bin-log文件
    master_log_pos=154;    //同步的位置

        6.重置从服务器 并启动slave

    mysql>reset slave 
      •     启动slave
    mysql>start slave
      •     查看slave状态
    mysql> show slave statusG;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.1.147
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000008
              Read_Master_Log_Pos: 154
                   Relay_Log_File: mysql-relay.000002
                    Relay_Log_Pos: 320
            Relay_Master_Log_File: mysql-bin.000008
                 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: 154
                  Relay_Log_Space: 523
                  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: 147
                      Master_UUID: dad611d4-3625-11e8-a11f-080027c354d3
                 Master_Info_File: D:wamp64inmysqlmysql5.7.14datamaster.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)

     测试

     1.先查看主服务器,从数据库信息

    mysql> show databases;     ----->master
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | twusa              |
    +--------------------+
    5 rows in set (0.01 sec)

    mysql> show databases;      ----->slave

    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | blog         | 
    | ecshop        |
    | mysql         |
    | performance_schema |
    | shop          |
    | sys          |
    | test          |
    +--------------------+
    8 rows in set (0.02 sec)

     

    2.主服务器创建新的数据库test_master 并查看bin-log大小

    -rw-r----- 1 mysql mysql 322 4月 9 16:47 mysql-bin.000009

    mysql> create database test_123;
    Query OK, 1 row affected (0.01 sec)

    -rw-r----- 1 mysql mysql 493 4月 9 16:52 mysql-bin.000009

    这个时候回过头来看从库

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | blog               |
    | ecshop             |
    | mysql              |
    | performance_schema |
    | shop               |
    | sys                |
    | test               |
    | test123            |--------->发现多了这一条
    | twusa              |
    +--------------------+
    10 rows in set (0.00 sec)

    至此主从复制完成,撒花 ~

    遇到的问题

     1.启动slave 一直显示正在connecting 

      •     解决:先试试远程登陆主库,如果登陆不上,有可能是防火墙的原因,关闭防火墙即可,远程登陆成功即可。

     2.Got fatal error 1236 from master when reading data from binary log: 'unknown error reading log event on the master; the first event '' at 4, the last event read from '/opt/3306/mysql-bin.000008' at 154, the last byte read from '/var/log/mysql-bin.000008' at 155.'

      •     解决: 
          • 主库:
            •   flush logs;
            •   show master status;
            •   记下File, Position。
          • 从库
            •   stop slave;
            •    CHANGE MASTER TO MASTER_LOG_FILE...............再来一遍
            •       start slave;        

     备注

      1.查看bin-log

      

    sudo mysqlbinlog mysql-bin.000009 > masterbin000009.log

     

     

     

  • 相关阅读:
    进击的实时数仓:Flink 在 OPPO 实时计算平台的研发与应用实践
    vue中将时间戳转换为YYYY-MM-dd hh:mm格式时间的组件
    vue 将时间戳转换成日期格式 (一)
    element-ui DatePicker 日期选择器 让结束日期大于开始日期
    css 边框上如何写入文字?
    2019最新Web前端经典面试试题(含答案)
    Nginx 安装及配置
    前端基础面试题(JS部分)
    const与指针
    linux配置-------redhat虚拟机的中文输入法配置
  • 原文地址:https://www.cnblogs.com/zhoupufelix/p/7790210.html
Copyright © 2020-2023  润新知