[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

@Data

public class User {

private int id;

private String account;

private String name;

private String position;

}

6.建立mapper接口文件,新增两个方法addUser(User user),getById(int id)

public interface UserDao {

@Insert(“INSERT INTO user(account, name, position) VALUES(#{account}, #{name}, #{position})”)

@Options(useGeneratedKeys = true,keyProperty = “id”)

int addUser(User user);

@Select(“SELECT * FROM user WHERE id = #{id}”)

User getById(int id);

}

  1. 建立Service相关实现

public interface UserService {

int addUser(User user);

User getById(int id);

}

@Service

public class UserServiceImpl implements UserService {

@Resource

private UserDao userDao;

@Override

public int addUser(User user) {

return userDao.addUser(user);

}

@DS(“slave”)

@Override

public User getById(int id) {

return userDao.getById(id);

}

}

由于在数据源中配置了primary: master,默认操作都会从主库执行,使用注解@DS切换数据源,此注解也可直接用于类文件上,同时存在方法注解优先于类上注解。

  1. 编写单元测试进行测试

public class UserServiceTest extends DynamicDatsourceBootstrapTests {

@Autowired

private UserService userService;

@Test

public void testAddUser(){

User user = new User();

user.setName(“李四”);

user.setAccount(“sili”);

user.setPosition(“JAVA开发工程师”);

int i = userService.addUser(user);

System.out.println(user);

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

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

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

由于篇幅原因,就不多做展示了

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

图片转存中…(img-ZW2Exksc-1712185156121)]

[外链图片转存中…(img-XCZyyjWk-1712185156122)]

[外链图片转存中…(img-JtcPJIhP-1712185156122)]

[外链图片转存中…(img-BFevZdNt-1712185156123)]

由于篇幅原因,就不多做展示了

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

Logo

更多推荐