當前位置:
首頁 > 知識 > Mysql8.0主從搭建,shardingsphere+springboot+mybatis讀寫分離

Mysql8.0主從搭建,shardingsphere+springboot+mybatis讀寫分離

1、安裝mysql8.0

首先需要在192.167.3.171上安裝JDK。

下載mysql安裝包,https://dev.mysql.com/downloads/,找到以下頁面下載。

下載後放到linux系統中

官網說需要先查看本機是否已安裝mysql,刪除mysql這裡不介紹。

yum install libaio yum install openssl,安裝mysql所需的軟體包:libaiohe openssl。

tar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz,解壓。

mv mysql-8.0.13-linux-glibc2.12-x86_64 /usr/local/mysql,將解壓文件移動到local下。

groupadd mysql

useradd -r -g mysql -s /bin/false mysql

cd /usr/local/mysql

mkdir mysql-files

chown mysql:mysql mysql-files

chmod 750 mysql-files

bin/mysqld --initialize --user=mysql,初始化資料庫,注意此處隨機生成的密碼,第一次登陸mysql的時候要使用。

bin/mysql_ssl_rsa_setup,安裝ssl。

cp support-files/mysql.server /etc/init.d/mysql.server 將服務文件複製到開機啟動目錄,實現服務開機自啟動。

bin/mysqld_safe --user=mysql & 開啟服務,&是後台運行的意思,執行命令之後,終端會卡在一個位置,再按一下Enter即可。

如果上面命令報錯,什麼log,pid文件未找到之類的,就需要執行下面方法。由於mysql服務啟動時,會去讀取/etc/my.cnf文件中的配置內容,我們打開文件來看,文件內容如下(我已修改):

原來的內容地址就是啟動mysql服務時報錯的路徑,我們可以知道,文件不存在問題導致啟動失敗。這時,就需要新建文件,並設置文件許可權了。我這裡修改了紅框內的路徑,具體命令如下:

cd /usr/local/mysql/mysql-files

mkdir log ; mkdir pid

touch log/mysql.log ; touch pid/mysql.pid

cd /usr/local/mysql

chown -R mysql:mysql mysql-files

chmod -R 750 mysql-files

然後再次執行:bin/mysqld_safe --user=mysql &

bin/mysql -uroot -p 登陸mysql,回車後粘貼之前初始密碼。

如果登陸時報錯,錯誤如下圖,然後,去查看/tmp下面的文件,發現確實沒有mysql.sock文件,本地用戶登錄時使用socket登陸,所以需要這樣一個文件,那好,就找一個唄,執行 find / -name mysql.sock,找到在/var/lib/mysql下面有一個文件,然後,我嘗試cp到tmp下,發現失敗,那行,我ln一個唄,ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock,然後再嘗試登陸,有一台機器就可以了,另一台始終不行。那行,我指定行了吧,用以下命令登陸:mysql -uroot -p -S /var/lib/mysql/mysql.sock,試了下可以,那就這樣吧!

ALTER USER "root"@"localhost" IDENTIFIED BY "ibethfy;

flush privileges

執行完成後,我又想使用navicat登陸,那好,試試唄,navicat連接直接報找不到服務,2003 cannot。。。。。,行嘛,排除原因,總結如下:

1、建立供外部連接的mysql用戶。

mysql -uroot -pibethfy -s /var/lib/mysql/mysql.sock

create user "ibethfy"@"%" identified by "ibethfy";

grant all on *.* to "ibethfy"@"%"; 注意,mysql8的grant語句和之前版本有差別。

flush privileges;

2、防火牆關了,我用的centos。

firewall-cmd --state 查看防火牆狀態,發現時running;

systemctl stop firewalld.service 關閉防火牆

firewall-cmd --state 再次查看,發現not running;

然後再用navicat連接,好嘛,又報錯,caching-sha2-password,看來一下,應該是mysql的加密策略變了,navicat版本沒跟上唄,那行,執行下面命令,然後再連接,沒問題了!

mysql -uroot -pibethfy -s /var/lib/mysql/mysql.sock

alter user "ibethfy"@"%" identified by "ibethfy" password expire never;

alter user "ibethfy"@"%" identified with mysql_native_password by "ibethfy";

flush privileges;

ps -ef |grep mysql,可以看到mysql服務有兩個,mysqld_safe和mysqld。說明啟動成功了。

大家在linux裝mysql8.0的時候,如果按照步驟來,還出現問題,就分析一下,主要導致的一些原因就是許可權問題和文件問題,依次解決一下再試試。

2、mysql主從安裝

分別按以上方發安裝兩個mysql服務,分別為192.167.3.171(主),192.167.3.172(從)。

配置主服務

my.conf 文件修改。添加log-bin與server-id,具體配置如下:

重啟mysql,service restart mysql;如果沒有找到服務,直接用ps -ef|grep mysql,找到對應進程,kill -9強行終止後,使用mysqld_safe --user=mysql & 重啟。

登陸mysql,賦予外部連接的ibethfy用戶許可權並刷新。grant replication slave on *.* to "ibethfy"@"%"; flush privileges;

查看主服務信息,從服務配置時需要用到,show master status;

修改從mysql服務配置

修改my.cnf,vi /etc/my.cnf

配置從服務,先登陸後,執行 CHANGE MASTER TO MASTER_HOST="192.167.3.171", MASTER_USER="ibethfy", MASTER_PASSWORD=ibethfy",MASTER_LOG_FILE="binlog.000010", MASTER_LOG_POS=1179;

start slave;

show slave statusG;查看從服務狀態,如果內容中有Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the –replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it);錯誤,需要執行下面語句:

show variables like "server_id";可以看見server_id=1,這裡與主服務id相同,則執行,set global server_id=2;與my.cnf內容相同即可。

重新啟動start slave;

如果得到以下信息,則提示主從複製配置成功。

現在可以測試了,在主服務建一個database,從服務可以看見,代表配置成功。

3、springboot+mybatis+shardingsphere搭建主從分離

使用idea創建springboot工程

pom.xml依賴jar配置,具體配置如下

複製代碼

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.1.2.RELEASE</version>

<relativePath/> <!-- lookup parent from repository -->

</parent>

<groupId>com.example</groupId>

<artifactId>demo</artifactId>

<version>0.0.1-SNAPSHOT</version>

<name>SharingJDBCDemo</name>

<description>Demo project for Spring Boot</description>

<properties>

<java.version>1.8</java.version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!-- mybatis 依賴jar包-->

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>2.0.0</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

<!--shardingsphere的springboot依賴jar-->

<dependency>

<groupId>io.shardingsphere</groupId>

<artifactId>sharding-jdbc-spring-boot-starter</artifactId>

<version>3.0.0</version>

</dependency>

<!--mybatis的自動生成器配置-->

<dependency>

<groupId>org.mybatis.generator</groupId>

<artifactId>mybatis-generator-core</artifactId>

<version>1.3.5</version>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

<plugin>

<groupId>org.mybatis.generator</groupId>

<artifactId>mybatis-generator-maven-plugin</artifactId>

<version>1.3.5</version>

<configuration>

<!--配置文件的位置-->

<configurationFile>src/main/resources/generateMybatis.xml

</configurationFile>

<overwrite>true</overwrite>

<verbose>true</verbose>

</configuration>

</plugin>

</plugins>

</build>

</project>

複製代碼

application.yml配置,具體如下

複製代碼

server:

port: 8888

spring:

application:

name: SharingJdbc

mybatis:

type-aliases-package: com.example.demo.entity

mapper-locations: classpath:mapper/*.xml

sharding:

jdbc:

datasource:

names: master1,slave1

master1:

type: com.zaxxer.hikari.HikariDataSource

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

jdbc-url: jdbc:mysql://192.167.3.171:3306/ibethfy?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true

username: ibethfy

password: ibethfy

maxPoolSize: 20

slave1:

type: com.zaxxer.hikari.HikariDataSource

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

jdbc-url: jdbc:mysql://192.167.3.172:3306/ibethfy?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true

username: ibethfy

password: ibethfy

maxPoolSize: 20

config:

masterslave:

load-balance-algorithm-type: round_robin

name: db_m1_s1

master-data-source-name: master1

slave-data-source-names: slave1

sharding:

props:

sql:

show: true

複製代碼

mybatis自動生成器配置

複製代碼

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE generatorConfiguration

PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

<!--配置連接器jar地址-->

<classPathEntry

location="C:Usersc17763.m2
epositorymysqlmysql-connector-java8.0.13mysql-connector-java-8.0.13.jar"/>

<context id="my" targetRuntime="MyBatis3" defaultModelType="flat">

<commentGenerator>

<property name="suppressDate" value="false"/>

<property name="suppressAllComments" value="true"/>

</commentGenerator>

<!--連接驅動配置-->

<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"

connectionURL="jdbc:mysql://192.167.3.171:3306/ibethfy?useUnicode=true" userId="ibethfy"

password="ibethfy"/>

<!--生成的entity實體類路徑-->

<javaModelGenerator targetPackage="com.example.demo.entity"

targetProject="E: estSharingJDBCDemosrcmainjava">

<property name="enableSubPackages" value="true"/>

<property name="trimStrings" value="true"/>

</javaModelGenerator>

<!--mapper.xml文件路徑-->

<sqlMapGenerator targetPackage="
esourcesmapper"

targetProject="E: estSharingJDBCDemosrcmain">

<property name="enableSubPackages" value="true"/>

</sqlMapGenerator>

<!--mapper介面類生成的路徑-->

<javaClientGenerator targetPackage="com.example.demo.mapper"

targetProject="E: estSharingJDBCDemosrcmainjava" type="XMLMAPPER">

<property name="enableSubPackages" value="true"/>

</javaClientGenerator>

<!--<table tableName="T_FEE_AGTBILL" domainObjectName="FeeAgentBill"

enableCountByExample="false" enableUpdateByExample="false"

enableDeleteByExample="false" enableSelectByExample="false"

selectByExampleQueryId="false"/>-->

<!--需要生成的table,tableName是表名,domainObjectName是生成的實體類名-->

<table tableName="people" domainObjectName="People"

enableCountByExample="false" enableUpdateByExample="false"

enableDeleteByExample="false" enableSelectByExample="false"

selectByExampleQueryId="false">

</table>

</context>

</generatorConfiguration>

複製代碼

項目demo結構圖,比較簡單,只實現功能

自動生成器執行方法,打開maven project,點擊運行,具體參考下圖

SharingJdbcDemoApplication,配置mapper掃描路徑,也可直接在mapper類上增加@Mapper.

複製代碼

package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@MapperScan("com.example.demo.mapper")

public class SharingJdbcDemoApplication {

public static void main(String[] args) {

SpringApplication.run(SharingJdbcDemoApplication.class, args);

}

}

複製代碼

DemoController類

複製代碼

package com.example.demo;

import com.example.demo.entity.People;

import com.example.demo.mapper.PeopleMapper;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController

public class DemoController {

@Autowired

PeopleMapper peopleMapper;

@RequestMapping("/{id}")

public People getPeople(@PathVariable(value = "id") int id)

{

return peopleMapper.selectByPrimaryKey(id);

}

@RequestMapping("/insert/{name}")

public void insert(@PathVariable(value = "name") String name)

{

People p = new People();

p.setName(name);

peopleMapper.insert(p);

}

}

複製代碼

啟動工程後,即可測試讀寫分離。關於如何查看讀寫分離效果,可以開啟mysql的查詢日誌,開啟方法如下

登陸mysql,執行語句查詢日誌記錄開啟情況:show variables like "%general%";

+------------------+------------------------------+

| Variable_name | Value |

+------------------+------------------------------+

| general_log | OFF |

| general_log_file | /var/lib/mysql/localhost.log |

+------------------+------------------------------+

set global general_log = "ON";開啟日誌記錄,可以在/var/lib/mysql中查看日誌。

測試:訪問http://localhost:8888/1,查詢數據,在日誌中,可以看到,172從服務日誌記錄查詢語句,171沒有日誌。

測試:訪問http://localhost:8888/insert/ibethfy,插入語句,可以看到171主服務有日誌,172從服務沒有日誌。

注意:io.shardingsphere用3.0.0版本即可,3.1.0引入maven會報關聯錯誤。

之前想使用mycat實現讀寫分離等,結果發現mycat只支持mysql5版本,其餘版本未在其支持列表,並且mycat很久沒更新啦!我自己試了很久都沒搭建好mycat的環境,哎!

好啦,基本的都搞完了,之後實施shardingsphere的分庫分表!

Mysql8.0主從搭建,shardingsphere+springboot+mybatis讀寫分離

打開今日頭條,查看更多圖片
喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

sprintboot+mybatis踩坑:查詢不到數據list「null」——支持駝峰配置
創業過程中技術真的那麼重要嗎?

TAG:程序員小新人學習 |