读写分离,实际就是将一台服务器分成两台以上的服务器,从而减轻对服务器的压力,一般情况下,1台写入服务器+N台读服务器。
那么想做到这样的读写分离,mysql提供了一种关系,主从(master-slave),也就是在master写入,同时会同步到slave,读操作都在slave上。
下面就说一下如何配置主从(1master+1slave)。首先建议使用的是两台全新的mysql,因为一旦master服务器某些操作,slave报错,就无法继续往下执行,也就是slave会宕机。
当然也可以配置跳过指定错误和忽略错误类型,这个我写在最后。
go
-
主服务器(master)
设置一个账号让slave服务器登陆的账号
找到my.cnf文件(windows下是my.ini)# 账号随便设置 create user slave_user; # ip,密码设置成自己需要的 GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'192.168.%' IDENTIFIED BY 'slave_pass';
打开它并找到[mysqld],在下方添加配置find / -name my.*
保存退出,到mysql里输入server-id=1 // 保证唯一 log-bin=master-bin log-bin-index=master-bin.index
MariaDB [(none)]> SHOW MASTER STATUS;
可以看到出现这个,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
开始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=2433;
slave数据库重启,需要再执行start slavestart 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同步不了,报错都会在此体现
报错大致是因为,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;