Springboot+Mysql 8 읽 기와 쓰기 분리 기능 구현
13463 단어 springboot읽 기와 쓰기 분리mysql
다음은 최신 버 전의 Mysql 데이터베이스(8.0.16)를 사용 하여 SpringBoot 와 결합 하여 이 완전한 절 차 를 실현 합 니 다.
설치 설정 mysql
https://dev.mysql.com/downloads/mysql/페이지 에서 my sql 설치 패 키 지 를 다운로드 합 니 다.제 가 다운로드 한 것 은
mysql8.0.16 Linux-Generic.
입 니 다.가상 컴퓨터 두 대 를 준비 하여 my sql 을 설치 하고 다운로드 한 파일
mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz
을 서버/app/my sql 에 업로드 합 니 다.192.168.249.131 CENTOS 7 주
CENTOS 7 에서
방화벽 상 태 를 살 펴 보고 시동 을 걸 려 면 방화벽 을 닫 아야 합 니 다.
service firewalld status ##
service firewalld stop ##
xz tar
xz -d mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz
압축 해제 패키지
tar -xvf mysql-8.0.16-linux-gl-ibc2.12-x86_64.tar
데 이 터 를 저장 하기 위해/app/mysql 에 data 폴 더 를 만 듭 니 다.my sql 사용자 그룹 과 my sql 사용 자 를 만 듭 니 다.
groupadd mysql ##
useradd -g mysql -d /app/mysql mysql ## mysql
groupdel mysql ## ( )
userdel mysql ## ( )
my sql 데이터베이스 초기 화
./mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysqld --user=mysql --basedir=/app/mysql --datadir=/app/mysql/data --initialize
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
이 때 my sql 은 기본 임시 암 호 를 생 성 합 니 다.위 와 같이 저장 한 다음 수정 해 야 합 니 다.my sql 서 비 스 를 만 들 고 실행 권한 을 증가 합 니 다.
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
로그 권한 에 대한 오류 가 발생 하면 해당 로그 파일 을 만 들 고 my sql 사용자 에 게 권한 을 부여 하 십시오.
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 -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;
my sql 마스터 동기 화 설정(binlog)복제 원리
주 데이터베이스(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 의 신분 을 사용 하여 검증 해 야 합 니 다.간단 하고 편리 하도록 저 희 는 my sql 을 직접 사용 합 니 다.native_암호 방식설정 수정
/etc/my.cnf
,다음 설정 을 추가 하여 binlog 를 열 고 my sql 서 비 스 를 다시 시작 합 니 다.[mysqld]\#바 이 너 리 로그 기능
log-bin=mysql-bin #
설정 serverid,네트워크 내 에서 유일 하 게 server-id=131\#(설정 가능)동기 화 할 데이터베이스 이름 을 주의 하 십시오.여러 데이터 베 이 스 를 동기 화 하려 면 replicate-db-db=데이터베이스 이름binlog-do-db=mydb #(
을 추가 하여 무시 할 데이터베이스binlog-ignore-db=mysql
를 추가 하 십시오.홈 서버 상태 보기
show master status
file
안에 있 는 인 자 를 주의 하 세 요.특히 앞의 두 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='my sql-bin.00001'\#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/를 읽 기와 쓰기 분리 도구 패키지 로 사용 합 니 다.
사용 방법
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;
관련 의존 도입
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
데이터 원본 설정
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
시작 클래스 입구 에 my batis 스 캔 패 키 지 를 추가 합 니 다.
@SpringBootApplication@MapperScan("com.jianzh5.dynamic.mapper")
public class DynamicDatsourceBootstrap {
public static void main(String[] args) {
SpringApplication.run(DynamicDatsourceBootstrap.class, args);
}
}
실체 클래스 사용자 만 들 기
@Data
public class User {
private int id;
private String account;
private String name;
private String position;
}
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);
}
서비스 계층 구축 관련 실현
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 를 사용 하여 데이터 원본 을 전환 합 니 다.이 주 해 는 클래스 파일 에 직접 사용 할 수 있 으 며,동시에 존재 하 는 방법 주 해 는 클래스 주해 보다 우선 합 니 다.유닛 테스트 작성 테스트 진행
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);
}
@Test
public void testGetById(){
int id = 4;
User user = userService.getById(id);
Assert.assertEquals("sanzhang",user.getAccount());
}
}
실행 로 그 를 살 펴 보면 읽 기와 쓰기 데이터 베 이 스 는@DS 주석 에 따라 전환 되 며,이로써 Springboot 통합 데이터 베 이 스 는 읽 기와 쓰기 에서 분 리 됩 니 다.총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 Springboot+Mysql 8 읽 기와 쓰기 분리 기능 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.