Springboot + Mysql8 读写分离实战

2019-07-01T02:05:52.681626Z 0 [Warning] [MY-011070] [Server] ‘Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it’ is deprecated and will be removed in a future release.

2019-07-01T02:05:52.681694Z 0 [System] [MY-013169] [Server] /app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.16) initializing of server in progress as process 1479

2019-07-01T02:05:52.681726Z 0 [ERROR] [MY-010338] [Server] Can’t find error-message file ‘/app/mysql/share/errmsg.sys’. Check error-message file location and ‘lc-messages-dir’ configuration directive.

2019-07-01T02:05:55.713747Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: xa6(H>rK/r<E

2019-07-01T02:05:57.303240Z 0 [System] [MY-013170] [Server] /app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.16) initializing of server has completed

注意,此时mysql会生成一个默认的临时密码,如上图所示,需要先保存下来然后修改

  • 建立mysql服务并增加执行权限

cp mysql-8.0.16-linux-glibc2.12-x86_64/support-files/mysql.server /etc/init.d/mysqld

  • 修改mysql配置文件 vi /etc/my.cnf 增加如下配置

[mysqld]

port=3306

basedir=/app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64

datadir=/app/mysql/data

socket=/tmp/mysql.sock

symbolic-links=0

[mysqld_safe]

log-error=/app/mysql/data/log/error.log

pid-file=/app/mysql/data/mysql.pid

user=mysql

tmpdir=/tmp

character_set_server=utf8

default-storage-engine=INNODB

init_connect=‘SET NAMES utf8’

!includedir /etc/my.cnf.d

如果报日志权限相关错误,请先建立对应日志文件,并给mysql用户授权

chown -R mysql:mysql /app/mysql/data/log/error.log

  • 启动mysql服务

service mysqld start

  • 建立mysql客户端软连接

ln -s /app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysql /usr/local/bin/mysql

  • 登录mysql修改密码

mysql -uroot -p密码 ## 登录

ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘000000’;

  • 设置远程登录

use mysql;

update user set host=‘%’ where user=‘root’ limit 1;

flush privileges;

配置mysql主从同步(binlog)


复制原理

  • Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件,这些记录叫做二进制日志事件(binary log events)

  • Slave通过I/O线程读取Master中的binary log events并写入到它的中继日志(relay log)

  • Slave重做中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的数据(数据重放)

复制要求

  • 主从服务器操作系统版本和位数一致

  • Master和Slave数据库的版本要一致

  • Master和Slave数据库中的数据要一致

  • Master开启二进制日志,Master和Slave的server_id在局域网内必须唯一

配置步骤

主数据库(192.168.249.131)
  • 创建同步用户并授权

CREATE USER ‘slave’@‘192.168.249.129’ IDENTIFIED WITH ‘mysql_native_password’ BY ‘000000’;

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘slave’@‘192.168.249.129’;

FLUSH PRIVILEGES;

注意这里创建用户时需要选用mysql_native_password加密方式插件,否则默认会使用caching_sha2_password加密方式,这样在同步的时候需要使用SSL的身份进行验证,为了方便简单,我们直接采用mysql_native_password方式

  • 修改配置/etc/my.cnf,新增如下配置,开启binlog,并重启mysql服务

[mysqld]

开启二进制日志功能

log-bin=mysql-bin

设置server_id,,注意在网段内要唯一

server-id=131

#(可选配置)要同步的数据库名,要同步多个数据库,就多加几个replicate-db-db=数据库名

binlog-do-db=mydb

#(可选配置)要忽略的数据库

binlog-ignore-db=mysql

  • 查看主服务器状态

show master status

在这里插入图片描述

注意看里面的参数,特别前面两个File和Position,在从服务器(Slave)配置主从关系会有用到的。

从数据库(192.168.249.129)
  • 修改/etc/my.cnf,新增如下配置,并重启服务

[mysqld]

server-id=129

log-bin=mysql-bin

replicate-do-db=mydb

replicate-ignore-db=mysql

  • 在slave中设置master信息,指定同步位置

stop slave;

change master to master_host=‘192.168.249.131’,master_user=‘slave’,master_password=‘000000’,master_log_file=‘mysql-bin.000001’,master_log_pos=155;

start slave;

参数说明:

master_host=‘192.168.249.131’ ## Master的IP地址

master_user=‘slave’ ## 用于同步数据的用户(在Master中授权的用户)

master_password=‘000000’ ## 同步数据用户的密码

master_port=3306 ## Master数据库服务的端口

masterlogfile=‘mysql-bin.000001’ ##指定Slave从哪个日志文件开始读复制数据(Master上执行命令的结果的File字段)

masterlogpos=155 ## 从哪个POSITION号开始读(Master上执行命令的结果的Position字段)

masterconnectretry=30 ##当重新建立主从连接时,如果连接建立失败,间隔多久后重试。单位为秒,默认设置为60秒,同步延迟调优参数。

  • 查看从服务器状态

show slave status\G;

在这里插入图片描述

至此数据库层面主从配置完成。

SpringBoot中配置主从读写分离


在主从模式下请遵守如下规则:

主数据库 只执行 INSERT,UPDATE,DELETE 操作

从数据库 只执行SELECT操作

我们这里使用开源项目[dynamic-datasource-spring-boot-starter](https://gitee.com/baomidou/dynamic-datasource-spring-boot-starter/wikis/)作为读写分离的工具包

使用方法

  1. 在mydb主数据库中建立一个简单数据表user,建好后从数据库会自动同步

DROP TABLE IF EXISTS user;

CREATE TABLE user (

id int(11) NOT NULL AUTO_INCREMENT,

account varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

name varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

position varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

  1. 引入相关依赖

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-web

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.0.1

com.baomidou

dynamic-datasource-spring-boot-starter

2.5.5

mysql

mysql-connector-java

8.0.15

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-test

test

  1. 配置数据源

spring:

datasource:

dynamic:

primary: master #设置默认的数据源或者数据源组,默认值即为master

strict: false #设置严格模式,默认false不启动. 启动后再为匹配到指定数据源时候回抛出异常,不启动会使用默认数据源.

datasource:

master:

type: com.zaxxer.hikari.HikariDataSource

url: jdbc:mysql://192.168.249.131:3306/mydb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false

username: root

password: ‘000000’

driver-class-name: com.mysql.cj.jdbc.Driver

slave_1:

type: com.zaxxer.hikari.HikariDataSource

url: jdbc:mysql://192.168.249.129:3306/mydb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false

username: root

password: ‘000000’

driver-class-name: com.mysql.cj.jdbc.Driver

  1. 在启动类入口加入mybatis扫描包

@SpringBootApplication@MapperScan(“com.jianzh5.dynamic.mapper”)

public class DynamicDatsourceBootstrap {

public static void main(String[] args) {

SpringApplication.run(DynamicDatsourceBootstrap.class, args);

}

}

  1. 建立实体类User

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-EgaSII8i-1713399556211)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值