什么是读写分离?为什么要用读写分离?
读写分离顾名思义就是读和写分开不同的数据库,分别有主库master和从库slave,master进行写操作,slave进行读操作;使用读写分离提高系统读写数据的性能,缓解数据库的压力,增加了机器的处理能力。
读写分离主从同步的数据库架构有很多种,比如一主一从,一主多从,环形...
该种一主一从,架构简便,和一主多从差不多,我以这个架构为例。
一般中小型互联网公司常用该种架构,一主二从已经是够用的了
这种架构呢,主从从方式,其中中间一台也就是热备作用不提供任何操作,一点master宕机立刻将该slave升为master
这种是环形架构,比较少用而且复杂,当然每个master都会衍生出多台slave,京东使用过
主从同步原理
主从同步原理:主数据库进行写数据时,同时会有bin-log也就是二进制文件进行记录,每次的修改更新记录的sql都会记录在此,说到这题外说点,该日志可以进行数据恢复,也就是删库也不用跑路啦,可以把该日志导出生成sql然后执行即可。主从同步也就是利用该原理,从库开启一个线程IO进行复制该主库的bin-log文件,然后再开启一个sql执行线程来执行该日志sql,这样就达到了主从同步的效果了。
从该图来看,主从的bin-log日志读写同步是异步的,如果在这环节上出现问题,也就是master数据已经写入到数据库,在日志发送中突然中断出现问题了,那么执行从库就失去了同步的效果了,可以采用方法有半同步,也就是master进行写数据的时候,等bin-log发送到从库成功后再进行实物提交,一旦发送失败则进行回滚,当然这种性能会比前面异步的低,这种方式在一主多从中,其中有一台从库是成功接收到主库的bin-log就算是成功,主库不再回滚
下面开始玩玩,以一主一从为例
准备了两台linux机
master:192.168.27.130
slave:192.168.27.129
linux下mysql的安装可以参考该篇文章
1.修改主数据库配置
打开/etc/my.cnf修改为如下内容
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#主从复制配置
innodb_flush_log_at_trx_commit=1
sync_binlog=1
#需要备份的数据库
binlog-do-db=test
#不需要备份的数据库
binlog-ignore-db=mysql
#启动二进制文件
log-bin=mysql-bin
log-slave-updates=1 #这个参数一定要加上,否则不会给更新的记录些到二进制文件 里
#服务器ID
server-id=1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-grant-tables
注意:配置文件最下方这里的skip-grant-tables得加上,不然可能会报这么个错:
Access denied for user 'root'@'localhost' (using password:YES)
service mysqld restart
mysql -u root -p 123进入数据库
创建数据库test
执行show master status显示master的信息。
说明:这里的master status 的信息在slave从库配置的时候需要用到,每次的修改position都会改变
3.修改slave从库配置
添加如下信息:
user=root
server-id=3
log-slave-updates=1
注意:一定要添加log-slave-updates=1,否则数据无法同步
4.重启从数据库
service mysqld restart
mysql -u root -p 123进入数据库
输入如下信息:
change master to master_host='192.168.27.130'
-> master_user='root'//主库用户名
-> master_password='123'//主库密码
-> master_port=3306//端口
-> master_log_file='mysql-bin.000001'//主库show master status里的日志名
-> master_log_pos=154//主库show master status里的日志位置,该位置每次修改主库都会变化
-> master_connect_retry=10
注意:master_log_pos=154//主库show master status里的日志位置,该位置每次修改主库都会变化
启动slave从库
start slave;
显示同步信息状态:
show slave status \G;
说明:当标红两处为YES是才算主从同步成功
如果配置失败可查看以下位置,查看错误原因:
5.测试
主库创建表user;这时候查看从库表信息,发现已经同步到
至此也就算是主从同步成功了!