北京那治疗白癜风 https://wapjbk.39.net/yiyuanzaixian/bjzkbdfyy/1、MySQL主从复制
但我们仔细观察我们会发现,当我们的项目都是用的单体数据库时,那么就可能会存在如下问题:
读和写所有压力都由一台数据库承担,压力大
数据库服务器磁盘损坏则数据丢失,单点故障
为了解决上述提到的两个问题,我们可以准备两(多)台MySQL,一台主(Master)服务器,一台从(Slave)服务器,主库的数据变更(写、更新、删除这些操作),需要同步到从库中(主从复制)。而用户在访问我们项目时,如果是写操作(insert、update、delete),则直接操作主库;如果是读操作(select),则直接操作从库,这种结构就是读写分离啦。
在这种读写分离的结构中,从库是可以有多个的
1.1、介绍
MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制,然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。
二进制日志:
二进制日志(BINLOG)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制,就是通过该binlog实现的。默认MySQL是未开启该日志的。
MySQL复制过程分成三步:
MySQLmaster将数据变更写入二进制日志(binarylog)
slave将master的binarylog拷贝到它的中继日志(relaylog)
slave重做中继日志中的事件,将数据变更反映它自己的数据
1.2、主从库搭建
在环境搭建之前,我们需要准备好两台服务器,如果生活富裕使用的是两台云服务器的时候记得要开放安全组,即防火墙;如果是比狗子我生活好点但也是用的虚拟机的话,记得别分这么多内存启动蓝屏了(别问怎么知道的)
这里就不给大家展示数据库的安装和防火墙的操作了,这个我感觉网上好多资源都能够满足遇到的问题,在搭建主从库的时候有在网上见到过说MySQL版本要一致的,我也没太留意直接就在之前的MySQL上操作了,大家可以自己去验证一下。
1.2.1、主库配置
服务器:...(别试了黑不了的,这是虚拟机的ip)
1、修改Mysql数据库的配置文件vim/etc/my.cnf
在打开的文件中加入下面两行,其中的server-id不一定是,确保唯一即可log-bin=mysql-bin#[必须]启用二进制日志server-id=#[必须]服务器唯一ID
2、重启Mysql服务
这里有三个方法都能重启MySQL,最简单的无疑就是一关一开:
netstopmysql;netstartmysql;systemctlrestartmysqldservicemysqldrestart
3、创建数据同步的用户并授权
登录进去MySQL之后才能够执行下面的命令,因为这是SQL命令,Linux不认识这玩意是啥。
GRANTREPLICATIONSLAVEON*.*to用户名
开放的地址identifiedby密码;eg:GRANTREPLICATIONSLAVEON*.*tomasterDb%identifiedbyMaster;记得刷一下权限FLUSHPRIVILEGES;
4、查看master同步状态
这个时候还不用退出MySQL,因为下面的命令还是SQL命令,执行下面的SQL,可以拿到我们后面需要的两个重要参数。
showmasterstatus;
执行完这一句SQL之后,==不要再操作主库!不要再操作主库!不要再操作主库!==重要的事情说三遍,因为再操作主库之后可能会导致红框中的两个属性值会发生变化,后面如果发生了错误可能就和这里有那么两毛钱关系了。
1.2.2、从库配置
服务器:...(别试了黑不了的,这也是虚拟机的ip)
1、修改Mysql数据库的配置文件vim/etc/my.cnf
这里要注意server-id和主库以及其他从库都不能相同,否则后面将会配置不成功。
2、重启Mysql服务
这里有三个方法都能重启MySQL,最简单的无疑就是一关一开:
netstopmysql;netstartmysql;systemctlrestartmysqldservicemysqldrestart
3、设置主库地址及同步位置
登录进去MySQL之后才能够执行下面的命令,因为这是SQL命令
设置主库地址和同步位置changemastertomaster_host=...,master_user=masterDb,master_password=Master
,master_log_file=mysql-bin.,master_log_pos=;记得记得开启从库配置startslave;
参数说明:
master_host:主库的IP地址
master_user:访问主库进行主从复制的用户名(上面在主库创建的)
master_password:访问主库进行主从复制的用户名对应的密码
master_log_file:从哪个日志文件开始同步(即1.2.1中第4步获取的File)
master_log_pos:从指定日志文件的哪个位置开始同步(即1.2.1中第4步获取的Position)
4、查看从数据库的状态
这个时候还不用退出MySQL,因为下面的命令还是SQL命令,执行下面的SQL,可以看到从库的状态信息。通过状态信息中的Slave_IO_running和Slave_SQL_running可以看出主从同步是否就绪,如果这两个参数全为Yes,表示主从同步已经配置完成。
showslavestatus\G;
1.3、坑位介绍
1.3.1、UUID报错
这可能是由于linux是复制出来的,MySQL中还有一个server_uuid是一样的,我们也需要修改。vim/var/lib/mysql/auto.cnf
1.3.2、server_id报错
这应该就是各位大牛设置server_id的时候不小心设置相同的id了,修改过来就行,步骤在上面的配置中。
1.3.3、同步异常解决
这是狗子在操作过程中搞出来的一个错误……
出错的原因是在主库中删除了用户信息,但是在从库中同步的时候失败导致同步停止,下面记录自己的操作(是在进入MySQL的操作且是从库)。
MASTER_LOG_POS
STOPSLAVE;SETGLOBALSQL_SLAVE_SKIP_COUNTER=1;STARTSLAVE;SHOWSLAVESTATUS\G;
在数据库中操作时,一定要注意当前所在的数据库是哪个,作为一个良好的实践:在SQL语句前加USEdbname。
操作不规范,亲人两行泪……
2、项目中实现
2.1、ShardingJDBC
Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离。
Sharding-JDBC具有以下几个特点:
适用于任何基于JDBC的ORM框架,如:JPA,Hibernate,Mybatis,SpringJDBCTemplate或直接使用JDBC。
支持任何第三方的数据库连接池,如:DBCP,C3P0,BoneCP,Druid,HikariCP等。
支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。
下面我们将用ShardingJDBC在项目中实现MySQL的读写分离。
2.2、依赖导入
在pom.xml文件中导入ShardingJDBC的依赖坐标
!--sharding-jdbc--dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdsharding-jdbc-spring-boot-starter/artifactIdversion4.0.0-RC1/version/dependency
2.3、配置文件
在application.yml中增加数据源的配置
spring:shardingsphere
atasource:names:master,slave#主数据源master:type: