• MySQL主从复制(读写分离)


    主从复制/读写分离

    假设有4台数据库服务器需要做集群,我们可以将其中1台做主服务器,然后剩下的3台做从服务器,从服务器负责从主服务器复制数据,所以叫做主从复制。在业务层面,如果有读取操作,我们可以从3台从服务器中读取,如果是更新操作,我们指定操作主服务器,那么对于主服务器的更改就会复制到3台从服务器上,保证了读取的可靠性,这就是读写分离。

    实现原理

    1、主服务器凡运行语句,都产生一个二进制日志 bin-log
    2、从服务器不断读取主服务器的bin-log
    3、从主服务读取到的bin-log,转换为自身可执行的relay-log
    4:执行relay-log

    环境

    2台MySQL服务器做主从复制,都是5.5.49-log版本的,都是通过二进制编译安装过的。

    实现步骤

    配置主服务器

    打开主服务器的my.cnf文件,进行配置,注意,带#号的不用添加,主要配置不带#号的,只有三行。由于我的MySQL是编译安装的,my.cnf中会有以下配置,只要做修改就行了。这里我将服务器id改为了159,由于我的ip地址最后3位为159,所以进行如下配置。关于binlog_format为什么设置成mixed,我将在最后面讲解。

    # Replication Master Server (default)
    # binary logging is required for replication
    log-bin=mysql-bin
    
    # binary logging format - mixed recommended
    binlog_format=mixed
    
    # required unique id between 1 and 2^32 - 1
    # defaults to 1 if master-host is not set
    # but will not function as a master if omitted
    server-id       = 159

    配置好后,重启mysqld服务,然后连接上mysql,使用下面的命令:

    show master status;

    可以看到master服务器就配置好了,待会这里的File和Position都会用到的,先别急,看看从服务器如何配置。

    mysql> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000010 |     2196 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    

    配置从服务器

    打开从服务器的my.cnf文件,进行如下配置。

    server-id       = 128
    relay-log=mysql-relay
    read-only=1

    重启mysqld服务。

    主服务器创建授权账号(进行复制的账号)

    如果不创建账号的话,随便来个从服务器都可以复制主服务器的数据,那安全性得多差。所以MySQL强制需要在主服务器上创建复制账号。使用如下命令创建一个名为repl,密码也为repl,且Host为任意主机,对所有的库和表都有权限。

    grant replication slave,replication client on *.* to repl@'%' identified by 'repl';

    从服务器指定需要复制的主服务器

    使用如下命令即可让从服务器连接上主服务器

    change master to 
    master_host = '123.206.176.159', #master服务器主机
    master_user = 'repl', #复制的账号
    master_password = 'repl', #复制账号的密码
    master_log_file = 'mysql-bin.000010',#复制的文件,这里填写将要复制主服务器的binlog文件,可以在主服务器上使用show master status来进行查看
    master_log_pos = 2196;#指定需要复制主服务器binlog二进制文件的位置

    启动从服务器

    slave start;

    查看从服务器的状态

    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 123.206.176.159
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000010
              Read_Master_Log_Pos: 2196
                   Relay_Log_File: mysql-relay.000002
                    Relay_Log_Pos: 431
            Relay_Master_Log_File: mysql-bin.000010
                 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: 2196
                  Relay_Log_Space: 583
                  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: 159

    测试

    在主服务器上创建一个数据库a

    create database a charset utf8;

    在从服务器中查询数据库a是否存在

    show databases;

    常用语句

    show master status ; 查看master的状态, 尤其是当前的日志及位置
    show slave stattus; 查看slave的状态.
    reset slave ;  重置slave状态.
    start slave ; 启动slave 状态(开始监听msater的变化)
    stop slave; 暂停slave状态;

    主服务器的日志格式用哪种好?

    有 statement,row, mixed3种,其中mixed是指前2种的混合.

    以insert into xxtable values (x,y,z)为例,
    影响: 1行,且为新增1行, 对于其他行没有影响.
    这个情况,用row格式,直接复制磁盘上1行的新增变化.

    以update xxtable set age=21 where name=’sss’;
    这个情况,一般也只是影响1行. 用row也比较合适.

    以过年发红包,全公司的人,都涨薪100元.
    update xxtable set salary=salary+100;
    这个语句带来的影响,是针对每一行的, 因此磁盘上很多row都发生了变化.
    此处,适合就statment格式的日志.

    2种日志,各有各的高效的地方,mysql提供了mixed类型.
    可以根据语句的不同,而自动选择适合的日志格式.

  • 相关阅读:
    Can you answer these queries?(HDU4027+势能线段树)
    Tunnel Warfare(HDU1540+线段树+区间合并)
    Computer(HDU2196+树形dp+树的直径)
    Anniversary party(树上dp+HDU1520)
    2018 Multi-University Training Contest 1-1002 -Balanced Sequence(括号匹配+贪心)
    暑假集训——cf热身赛部分题有感加其题解
    Educational Codeforces Round 47 (Rated for Div. 2) 题解
    计蒜客 Goldbach Miller_Rabin判别法(大素数判别法)
    多种方法过Codeforces Round #270的A题(奇偶法、打表法和Miller_Rabin(这个方法才是重点))
    Codeforces Round #494 (Div. 3)
  • 原文地址:https://www.cnblogs.com/cnsec/p/13406993.html
Copyright © 2020-2023  润新知