天天看点

mysql 主从配置,实现读写分离

读写分离,实际就是将一台服务器分成两台以上的服务器,从而减轻对服务器的压力,一般情况下,1台写入服务器+N台读服务器。

那么想做到这样的读写分离,mysql提供了一种关系,主从(master-slave),也就是在master写入,同时会同步到slave,读操作都在slave上。

下面就说一下如何配置主从(1master+1slave)。首先建议使用的是两台全新的mysql,因为一旦master服务器某些操作,slave报错,就无法继续往下执行,也就是slave会宕机。

当然也可以配置跳过指定错误和忽略错误类型,这个我写在最后。

go

  • 主服务器(master)

    设置一个账号让slave服务器登陆的账号

    # 账号随便设置
    create user slave_user;
    
    # ip,密码设置成自己需要的
    GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'192.168.%' IDENTIFIED BY 'slave_pass';
               
    找到my.cnf文件(windows下是my.ini)
    find / -name my.*
               
    打开它并找到[mysqld],在下方添加配置
    server-id=1   // 保证唯一
     log-bin=master-bin
     log-bin-index=master-bin.index
               
    保存退出,到mysql里输入
    MariaDB [(none)]> SHOW MASTER STATUS;
               
    mysql 主从配置,实现读写分离

    可以看到出现这个,File是代表master的二进制log,Position可以理解为log行数,这两个参数后面都会用到。

    重启master数据库

    systemctl restart mariadb.service
               
  • 从服务器(slave)

    一样的,找到my.cnf,找到[mysqld]

    server-id=2   // 保证唯一
    relay-log-index=slave-relay-bin.index
    relay-log=slave-relay-bin
               

    配置完成,现在进入slave服务器的数据库,连接master

    master_log_file和master_log_pos对应master的File和Position

    change master to master_host='master_ip',
    master_port=3306,
    master_user='slave_user',
    master_password='slave_pass', 
    master_log_file='master-bin.000001', 
    master_log_pos=2433;
               
    开始slave服务器
    start slave
               
    slave数据库重启,需要再执行start slave
  • mysql-proxy

    这两篇文章写的很清楚,我就不搬了

    https://www.cnblogs.com/jwentest/p/8552075.html

    https://www.cnblogs.com/lin3615/p/5684891.html

    proxy有个问题要注意,主库宕机,从库也会宕机,现在有很多代替proxy的工具,有空我会研究研究搞出来带大家入门

至此,我们主从已经配置好了,我们到master中新建一张表,再到slave看到已经做了同样的操作。

如果没有的兄嘚,可以到slave上敲入

show slave status\G;
           

如果slave同步不了,报错都会在此体现

mysql 主从配置,实现读写分离

报错大致是因为,master的操作,在slave上执行不了,如果想跳过此sql操作,是要停止当前slave

stop slave
           

并且再执行

change master to master_host='master_ip',
master_port=3306,
master_user='slave_user',
master_password='slave_pass', 
master_log_file='master-bin.000001', 
master_log_pos=当前master的position;

# 开启
start slave
           

主从报错不同步解决方法

1.修改mysql的配置文件,通过slave_skip_errors参数来跳所有错误或指定类型的错误

vim /etc/my.cnf

[mysqld]
#slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误
#slave-skip-errors=all #跳过所有错误
           

1.跳过指定数量的事务:

MariaDB [(none)]>slave stop;
MariaDB [(none)]>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;        #跳过一个事务,往往这一个就是卡在错误的位置
MariaDB [(none)]>slave start;
           

如果想看到事务执行内容

mysql提供了一个方法

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
           

手下你要开启log_bin功能

在my.cnf中添加

[mysqld]
 log_bin = mysql_bin 
           

保存重启mysql之后可以通过show variables like '%bin%'查看bin_log是否开启

查看例子

MariaDB [(none)]>SHOW BINLOG EVENTS in 'mysql-bin.000001' limit 3,5;
MariaDB [(none)]>SHOW BINLOG EVENTS in 'mysql-bin.000001' from 8080;
           

继续阅读