zoukankan      html  css  js  c++  java
  • mysql主从复制学习笔记

    一、musql主从复制原理

            MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制;

    二、环境准备

    1、主从mysql版本要一致;实验使用mysql-5.7.25;
    2、主从设备时间一定要同步,关闭selinux,iptables要么关闭要么放开3306端口;
    3、主数据库:192.168.0.83
    从数据库:192.168.0.91
    4、系统版本:CentOS7.6

    三、实验过程

    1、master主库配置

      1.1、配置my.cnf开启二进制日志,设置server-id;

    [mysqld]
    log-bin=mysql-bin  #开启二进制日志
    server-id=1  #设置server-id
    basedir=/usr/local/mysql-5.7.25/
    datadir=/usr/local/mysql-5.7.25/data/

      1.2、重启mysql服务,创建用于同步的用户账号

        /etc/init.d/mysql.server restart    重启mysql服务使其my.cnf生效;

        创建用户同步数据的账号,并授权;

    create user 'syn'@'192.168.0.91' identified by '123.com';  #创建用户
    grant replication slave on *.* to 'syn'@'192.168.0.91';    #分配权限
    flush privileges;  #刷新权限

       1.3、查看master状态,记录二进制文件名和位置;

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |     767  |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+

    2、slave从库配置

      2.1、配置my.cnf,设置server-id;

    [mysqld]
    server-id=2   #该id号可以自定义,但是必须唯一;
    basedir=/usr/local/mysql-5.7.25/
    datadir=/usr/local/mysql-5.7.25/data/

      2.2、重启mysql,执行同步SQL语句;

        /etc/init.d/mysql.server restart    重启mysql服务使其my.cnf生效;

        执行同步sql语句:

    change master to master_host='192.168.0.183',master_user='syn',master_password='123.com',master_log_file='mysql-bin.000001',master_log_pos=767;

      2.3、启动slave同步进程

    mysql > start slave;

      2.4、查看slave状态

    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.0.183
                      Master_User: syn
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 3185
                   Relay_Log_File: node1-relay-bin.000003
                    Relay_Log_Pos: 2738
            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: 3185
                  Relay_Log_Space: 2945
                  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: 1
                      Master_UUID: 13e78600-7bc1-11eb-b961-000c291cbfa8
                 Master_Info_File: /usr/local/mysql-5.7.25/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.01 sec)
    当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了;

    3、验证

      3.1、在主库创建库和表并插入数据;

    mysql > create database test;
    mysql > use test;
    mysql > INSERT INTO `search_controller` (`s_Controller_id`, `LightPole_id`, `Controller_id`, `Read_time`, `Concentrator_name`, `Concentrator_address`, `Electric_quantity`, `Electric_voltage`, `Electric_current`, `Power`, `Power_factor`, `OneSwitch_status`, `TwoSwitch_status`, `Fault_status`, `LightOn_duration`, `brightness`) VALUES (1,1,2,3,"d","e","f","g","h","i","j","k","l","m","n","o");

      3.2、查看从库是否同步

    mysql> use test;
    Database changed
    mysql> show tables;
    +-------------------+
    | Tables_in_test    |
    +-------------------+
    | search_controller |
    +-------------------+
    1 row in set (0.00 sec)
    
    mysql> select * from search_controller;
    +-----------------+--------------+---------------+-----------+-------------------+----------------------+-------------------+------------------+------------------+-------+--------------+------------------+------------------+--------------+------------------+------------+
    | s_Controller_id | LightPole_id | Controller_id | Read_time | Concentrator_name | Concentrator_address | Electric_quantity | Electric_voltage | Electric_current | Power | Power_factor | OneSwitch_status | TwoSwitch_status | Fault_status | LightOn_duration | brightness |
    +-----------------+--------------+---------------+-----------+-------------------+----------------------+-------------------+------------------+------------------+-------+--------------+------------------+------------------+--------------+------------------+------------+
    |               1 |            1 |             2 | 3         | d                 | e                    | f                 | g                | h                | i     | j            | k         | l                | m            | n                | o          |
    |               2 |            1 |             2 | 3         | d                 | e                    | f                 | g                | h                | i     | j            | k         | l                | m            | n                | o          |
    +-----------------+--------------+---------------+-----------+-------------------+----------------------+-------------------+------------------+------------------+-------+--------------+------------------+------------------+--------------+------------------+------------+
    2 rows in set (0.00 sec)

    四、一主多从 

    1、原理图

      一主多从基本原理跟一主一从的原理是一样的;只是又多了一个slave;

    2、使用场景

        场景一
      如果在架构设计之初就是一主多从的架构,就不涉及数据迁移的问题,没什么好说的,具体配置也不做赘述;
        场景二
            如果在架构设计之初是一主一从的架构,那么在后期业务量变大,一主一从的负载均衡和高可用性不能满足现在的要求的时候,就需要扩容,具体操作如下:
        1、首先要挑一天业务量最小的时间段对master做一次全量备份;
        2、将全量备份恢复到新加的一台slave设备中;
        3、对新的slave做主从同步的配置;
        4、测试一主多从;

    五、其他

            master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在mysql配置文件的[mysqld]可添加修改如下选项:

     # 不同步哪些数据库

    binlog-ignore-db = mysql
    binlog-ignore-db = test
    binlog-ignore-db = information_schema

    # 只同步哪些数据库,除此之外,其他不同步
    binlog-do-db = game

    ##########mysql安装脚本############

    #!/bin/bash

    mypid=`pgrep mysql`
    myuser=`cat /etc/passwd |awk -F":" '{print $1}'|grep -w mysql`
    #判断mysql是否安装
    if [[ -n $mypid ]];then
    echo -e "33[31m mysql 已经存在 33[0m"
    exit
    else

    if [ ! -d /usr/local/mysql-5.7.25 ];then
    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    tar xvf mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
    mv /usr/local/mysql-5.7.25-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.25
    else
    echo -e "33[31m mysql目录已经存在 33[0m"
    exit
    fi

    #添加环境变量
    echo "export MYSQL_HOME=/usr/local/mysql-5.7.25
    export PATH=$PATH:$MYSQL_HOME/bin" > /etc/profile.d/mysql.sh
    source /etc/profile.d/mysql.sh
    echo -e "33[31m 环境变量添加完成 33[0m"
    #创建mysql用户
    if [[ -n $myuser ]];then
    echo -e "33[31m mysql用户已经存在 33[0m"
    else
    useradd -s /sbin/nologin mysql
    echo -e "33[31m mysql用户创建完成 33[0m"
    fi
    #创建mysql目录
    chown mysql:mysql -R /usr/local/mysql-5.7.25
    mkdir /usr/local/mysql-5.7.25/data
    chown mysql:mysql /usr/local/mysql-5.7.25/data
    echo -e "33[31m mysql目录创建完成 33[0m"
    #mysql初始化
    mysqld --initialize --user=mysql --basedir=/usr/local/mysql-5.7.25
    echo -e "33[31m mysql初始化完成 33[0m"
    #创建mysql配置文件
    echo "[mysqld]
    basedir=/usr/local/mysql-5.7.25/
    datadir=/usr/local/mysql-5.7.25/data/" > /etc/my.cnf
    echo -e "33[31m my.cnf文件创建完成 33[0m"
    #创建mysql服务
    cp /usr/local/mysql-5.7.25/support-files/mysql.server /etc/init.d/
    ## sed -i 's/--datadir="$datadir"/--user=root --datadir="$datadir"/g' /etc/init.d/mysql.server
    #启动mysql服务
    /etc/init.d/mysql.server start
    fi

  • 相关阅读:
    一 : Nacos简介
    性能指标:性能监控指标有哪些?
    性能测试的分类
    VLP16线用户手册.md
    LibLas学习笔记
    从深度图中提取物体边界
    从点云数据生成深度图像
    微创社2期:从0到1,技术图书创作3步走(张慧敏、高飞、张杰、王凤辉)
    中国.NET:各地微软技术俱乐部汇总(更新中...)
    编译lua-5.3.5时出错解决方法
  • 原文地址:https://www.cnblogs.com/zhangzhide/p/14479470.html
Copyright © 2011-2022 走看看