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文件中的配置內容,我們打開文件來看,文件內容如下(我已修改):

    • 注意,[mysqld]或[mysqld_safe]下配置了socket路徑時,會以此為准,而本地登陸mysql的時候,如果不用 -S指定mysql.sock文件位置,會報錯,不能找到/tmp/mysql.sock。所以我們只在[client]里面配置。

       原來的內容地址就是啟動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,回車后粘貼之前初始密碼。
    • ALTER USER 'root'@'localhost' IDENTIFIED BY 'ibethfy;
    • flush privileges
    • 執行完成后,我又想使用navicat登陸,那好,試試唄,navicat連接直接報找不到服務,2003 cannot。。。。。,行嘛,排除原因,總結如下:

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

        • mysql -uroot -pibethfy
        • 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
        • 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 mysql restart;也可用mysqladmin -uroot -pibethfy shutdown;mysqld_safe --user=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 status\G;查看從服務狀態,如果內容中有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;
      • 如果得到以下信息,則提示主從復制配置成功。
      • 如果啟動slave報錯,什么文件未刪除之類的,可以執行reset 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:\Users\c17763\.m2\repository\mysql\mysql-connector-java\8.0.13\mysql-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:\test\SharingJDBCDemo\src\main\java">
                <property name="enableSubPackages" value="true"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
    
            <!--mapper.xml文件路徑-->
            <sqlMapGenerator targetPackage="\resources\mapper"
                             targetProject="E:\test\SharingJDBCDemo\src\main">
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
    
            <!--mapper接口類生成的路徑-->
            <javaClientGenerator targetPackage="com.example.demo.mapper"
                                 targetProject="E:\test\SharingJDBCDemo\src\main\java" 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的分庫分表!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM