zoukankan      html  css  js  c++  java
  • MySQL主从同步配置

    一. 理论部分

    MySQL主从同步

    主从同步使得数据可以从一个数据库服务器复制到其他的服务器上。在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。

    因为复制是异步进行的,所以从服务器不需要一直连着主服务器,而是断断续续连接主服务器。

    通过配置文件,可以实现所有数据库,指定数据库 ,指定数据库的表,进行复制。

    主从同步的好处

    • 通过增加从服务器来提高数据库的性能。主库执行写入和更新,从库执行读取,动态增加从服务器,提高数据库系统性能
    • 提高数据的安全性。使用从服务器,备份数据库,而不破坏服务器上的数据
    • 在主库生成数据,在从库分析数据,提高主库的性能

    数据库复制

    MySQL是异步复制,MySQL cluster是同步复制。有很多主从同步,但是核心的方法有两种:

    • Statement Based Replication(SBR) 基于SQL语句的复制
    • Row Based Replication(RBR) 基于行复制的

    也可以使用Mixed Bases Replication(MBR) 混合复制

    在MySQL5.6,默认使用SBR。而MySQL5.6.5及以后的版本,基于global transaction identifiters(GIDS)来进行事务复制。通过设置服务器的系统变量binog_format来指定要使用的格式

    各机制的优缺

    SBR 当使用二进制日志来实现主从复制时,主服务器把SQL语句写入到日志中,然后从服务器执行日志

    优势:

    ​ 日志文件小

    ​ 记录所有语句,可以用于审计

    劣势:

    ​ 使用一些函数的语句则不能进行复制

    ​ 在日志中出现警告信息则不能复制

    RBR 主服务器把表的行变化作为事件写入二进制中,主服务器把代表行变化的事件复制到从服务器中

    优势:

    ​ 所有数据变化都被复制,这是最安全的复制

    ​ 更少的行级锁表

    劣势:

    ​ 日志很大

    ​ 不能通过日志来审计执行的SQL语句,不过可以使用mysqlbinlog

    主从同步机制

    ​ MySQL服务器之间的主从同步是基于二进制的日志机制。主服务器使用日志变化来记录数据库变化记录,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。

    ​ 主服务器和从服务器都必须配置一个唯一的ID号。另外从服务器需要通过change master to的语句来配置它要连接的主服务器和ip地址,日志文件名和该日志的位置(这些信息,均存放在主服务器的数据库里)

    主从配置过程

    主服务器操作:

    • 修改配置文件,开启日志机制,配置独立的ID号
    • 创建用于复制的账号,并授权给从服务器地址
    • show master status查看当前主机的日志信息和存放位置

    从服务器操作:

    • 修改配置文件,开启日志机制,配置独立的ID号
    • change master to语句,配置主服务器信息
    • start slave开启从服务器
    • show slave status查看从服务器状态

    二. 实践部分

    MySQL的主从同步配置方式,可以配置为:

    • 一主一从
    • 一主多从

    下面的过程是配置一主一从的配置,一主多从的配置,只是修改从服务器的配置文件,其他过程和从服务器配置一样。

    1. 两台虚拟机上部署MySQL

    在node19 和node20上,分别创建和执行一下shell脚本

    #!/bin/bash
    if [ "$#" != "2" ];then
        echo "scripts usage:$0 [hostname] [db_password]" && exit 0
    fi
    HOSTNAME=$1
    PASSWORD=$2
    # centos6
    #yum -y install mysql mysql-server mysql-devel mysql-libs
    # centos7
    yum -y install mariadb mariadb-server maridb-clients mariadb-devel mariadb-libs
    if [ "$?" == "0" ];then
        #service mariadbd start 2>/dev/null && echo "start mysqld ok"
        systemctl start mariadb  2>/dev/null && echo "start mysqld ok"
    else
        echo "yum mysql fail" && exit 0
    fi
    
    mysql <<EOF
    delete from mysql.user where user = " " and host = "localhost";
    delete from mysql.user where user = " " and host = "127.0.0.1";
    delete from mysql.user where user = " " and host = "${HOSTNAME}";
    delete from mysql.user where user = "root" and host = "${HOSTNAME}";
    delete from mysql.user where user = "root" and host = "::1";
    grant all privileges on *.* to 'root'@'localhost' identified by '${PASSWORD}';
    grant all privileges on *.* to 'root'@'127.0.0.1' identified by '${PASSWORD}';
    flush privileges;
    EOF
    systemctl enable mariadb

    执行上述代码之后,两个节点上,均部署了MySQL(mariadb)服务

    主服务器配置

    在node19上,修改配置文件/etc/my.cnf,在[mysqld]的配置模块下,添加

    log-bin=mysql-bin
    server-id=1

    执行systemctl restart mariadb重启MySQL服务器

    mysql -uroot -p登陆数据库系统,执行一下语句

    # 创建用于复制数据库的账号并授权
    grant replication slave on *.* to 'repl'@'192.168.10.%' identifiedby 'liwanliang';
    # 刷新数据库并设置只读
    flush tables with read lock;
    # 查看主服务器的状态,获取日志信息
    show master status;
    从服务器配置

    在node20上,修改配置文件/etc/my.cnf,在[mysqld]的配置模块下,添加

    log-bin=mysql-bin
    server-id=2

    执行systemctl restart mairadb重启服务器

    mysql -uroot -p登陆数据库胸痛,执行以下语句

    # 配置主服务器
    change master to
    master_host='192.168.10.19',
    master_user='repl',
    master_password='liwanliang',
    master_log_file='mysql-bin.000001',
    master_log_pos=552;
    # 启动从服务器
    start slave
    # 查看状态
    show slave statusG;

    以上述操作过程,配置多个从服务器亦可实现

    2. 使用从库进行数据库备份

    在主库node19上创建数据库create database liwl_01;

    在从库node20/node21上查看数据库show databases

    暂停node20上的数据库复制,进行数据备份:mysqladmin -uroot -p stop-slave,或仅暂停SQL进程(此过程仅暂停SQL执行,而不暂停日志的复制),执行命令:mysql -uroot -p -e 'stop slave sql_thread';

    在主库node19上创建数据库liwl_02,create databases liwl_02;

    查看从库node21进行了复制,而node20上没有复制

    在node20上重启复制进程:mysqladmin -uroot -p start-slave,查看到数据库已经同步过来

    3. 有关数据库的备份

    直接复制文件

    为了保证数据的文件的完整性,在执行备份之前,应该关闭从服务器:

    mysqladmin -uroot -p shutdown

    拷贝数据库文件,然后启动MySQL服务

    通过mysqldump复制

    4. 主从复制可能存在的问题

    主库宕机之后,数据可能丢失

    ​ 半同步复制,解决s数据丢失问题

    从库只有一个SQL线程,主库写压力大时,复制可能存在延时

    ​ 并行复制,解决从库复制延迟问题





  • 相关阅读:
    142. 环形链表 II
    59. 螺旋矩阵 II
    996. 正方形数组的数目
    1323. 6 和 9 组成的最大数字
    面试题 17.14. 最小K个数
    389. 找不同
    1103. 分糖果 II
    背景透明度
    css3-新属性-用户界面
    响应式布局-基础结构
  • 原文地址:https://www.cnblogs.com/liwanliangblog/p/10633273.html
Copyright © 2011-2022 走看看