日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文通過Docker快速搭建MySQL主從數據庫,并用spring boot測試讀寫分離的實現,這是一個實驗環境,便于開發人員開發業務功能代碼。

一、用docker進行msyql主從環境搭建

在搭建環境之前保證已安裝docker,本文不進行docker安裝的介紹。

1、安裝master結點

執行下面安裝

docker run --name mysql-master --privileged=true -v /home/yaokangjun/Apps/docker/master-data:/var/lib/mysql -p 23306:3306 -e MYSQL_ROOT_PASSword=root -d xiaochunping/mysql-master

命令介紹

--name指定運行之后的容器的名稱為mysql-master;
--privileged指定了當前容器是否真正的具有root權限,所謂的root權限是指具有宿主機的root權限,而不僅僅只是在容器內部有root權限;
-v指定了容器中指定目錄掛載到宿主機上的某個目錄,這樣做的目的在于防止容器中配置的數據丟失,因為docker容器在重啟之后是不會保留前一次在其內部運行的相關數據的,把例子的目錄改成你自己的:/home/yaokangjun/apps/docker/master-data;
-p表示宿主機上的某個端口映射到docker容器內的某個端口,這里也就是將宿主機的3306端口映射到容器內部的3306端口;
-e表示指定當前容器運行的環境變量,該變量一般在容器內部程序的配置文件中使用,而在外部運行容器指定該參數。這里的MYSQL_ROOT_PASSWORD表示容器內部的MySQL的啟動密碼;
-d參數指定了當前容器是在后臺運行。

安裝完成后,執行:

docker ps

可以看到:

-bash-4.2$ sudo docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                            NAMES
da8ccfefbce6        xiaochunping/mysql-slave       "docker-entrypoint.s…"   4 hours ago         Up 4 hours          0.0.0.0:23307->3306/tcp                          mysql-slave
c3b94d07a86a        xiaochunping/mysql-master      "docker-entrypoint.s…"   4 hours ago         Up 4 hours          0.0.0.0:23306->3306/tcp                          mysql-master

如下圖

搭建mysql主從并用springboot讀寫分離-含源碼

 

通過容器名稱mysql-master方式進入容器

docker exec -it mysql-master /bin/bash

進入容器后登錄mysql:

mysql -uroot -proot

我們要為從服務器創建一個可以用來master服務器同步數據的賬戶,也就是創建一個專門用來復制binlog的賬號,并且賦予該賬號復制權限,其命令如下:

grant replication slave on *.* to 'test'@'%' identified by '123456';
flush privileges;

這里的grant replication slave是一個命令格式,表示賦予后面的賬戶以復制的權限,這樣slave節點就能夠獲取到master節點對數據的更新。上述命令中創建的賬戶的用戶名為test,密碼為123456。接著我們需要查看master節點的binlog狀態:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      589 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

 

搭建mysql主從并用springboot讀寫分離-含源碼

 

上面的File和Position很重要,等一下在從數據庫會用到。

 

2、安裝slave結點

slave的過程和master相似。

執行下面安裝:

docker run --name mysql-slave --privileged=true -v /home/yaokangjun/apps/docker/slave-data:/var/lib/mysql -p 23307:3306 --link mysql-master:master -e MYSQL_ROOT_PASSWORD=root -d xiaochunping/mysql-slave
從容器啟動與主容器啟動參數主要有一下兩點:
• 所映射的宿主機的端口號不能與master容器相同,因為其已經被master容器占用;
• 必須加上--link參數,其后指定了當前容器所要連接的容器,mysql-master表示所要連接的容器的名稱,master表示為該容器起的一個別名,通俗來講,就是slave容器通過這兩個名稱都可以訪問到master容器。這么做的原因在于,如果master與slave不在同一個docker network中,那么這兩個容器相互之間是沒法訪問的。注意這一點非常重要,之前本人按照網上的搭建方式搭建主從服務器一直無法成功,主要就是因為他們一直沒有提到要設置這個參數。

進入容器并登錄mysql:

docker exec -it mysql-slave /bin/bash
mysql -uroot -proot

連接上MySQL服務器之后,我們就需要切換當前服務的狀態,使其能夠連接上master服務器,并且復制其數據:

change master to master_host='master', master_user='test', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=589, master_connect_retry=30;

注意:如果出現如下錯誤:

mysql> change master to master_host='master', master_user='test', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=589, master_connect_retry=30;
ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.

執行如下:STOP SLAVE

mysql> STOP SLAVE

再執行一次,切換當前服務的狀態,使其能夠連接上master服務器的操作。

然后再開啟主從復制:

start slave;

查看從服務器的連接狀態:

mysql> show slave statusG;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 589
               Relay_Log_File: da8ccfefbce6-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 589
              Relay_Log_Space: 534
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: ea851c98-5553-11eb-a496-0242ac110003
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

主要看如下2個指標為true,即沒有問題:

搭建mysql主從并用springboot讀寫分離-含源碼

 

3、測試主從

在主mysql上執行如下語句:

create database test;
create table tt(id int, name varchar(255));
create table ss(id int, name varchar(255));
insert into tt(id, name) value (1, 'Free');
insert into ss(id, name) value (1, 'KaKa');

從服務mysql上查看:

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| ss             |
| t_user         |
| tt             |
+----------------+
3 rows in set (0.00 sec)

mysql> select * from ss;
+------+------+
| id   | name |
+------+------+
|    1 | KaKa |

成功。

二、springboot實現讀寫分離

本文的讀寫分離用dynamic-datasource-spring-boot-starter的插件來完成的,具體的介紹可以看:

https://github.com/baomidou/dynamic-datasource-spring-boot-starter

dynamic-datasource-spring-boot-starter 是一個基于springboot的快速集成多數據源的啟動器。

特性:

  1. 支持 數據源分組 ,適用于多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
  2. 支持數據庫敏感配置信息 加密 ENC()。
  3. 支持每個數據庫獨立初始化表結構schema和數據庫database。
  4. 支持 自定義注解 ,需要繼承DS(3.2.0+)。
  5. 提供對Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
  6. 簡化Druid和HikariCp配置,提供 全局參數配置 。配置一次,全局通用。
  7. 提供 自定義數據源來源 方案。
  8. 提供項目啟動后 動態增加移除數據源 方案。
  9. 提供Mybatis環境下的 純讀寫分離 方案。
  10. 提供使用 spel動態參數 解析數據源方案。內置spel,session,header,支持自定義。
  11. 支持 多層數據源嵌套切換 。(ServiceA >>> ServiceB >>> ServiceC)。
  12. 提供對shiro,sharding-jdbc,quartz等第三方庫集成的方案,注意事項和示例。
  13. 提供 基于seata的分布式事務方案。 附:不支持原生spring事務。
  14. 提供 本地多數據源事務方案。 附:不支持原生spring事務。

使用方法:

1、引入dynamic-datasource-spring-boot-starter。

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>${version}</version>
</dependency>

2、配置數據源。

# 服務端口
server.port=8099
# 服務名
spring.application.name=more-datasourse
# 環境設置:dev、test、prod
spring.profiles.active=dev
# mysql數據庫連接
spring.datasource.dynamic.primary=mysql
spring.datasource.dynamic.datasource.mysql.username=root
spring.datasource.dynamic.datasource.mysql.password=root
spring.datasource.dynamic.datasource.mysql.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.mysql.url=jdbc:mysql://192.168.197.24:23306/test?useSSL=false&serverTimezone=UTC

spring.datasource.dynamic.datasource.slave_1.username=root
spring.datasource.dynamic.datasource.slave_1.password=root
spring.datasource.dynamic.datasource.slave_1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.slave_1.url=jdbc:mysql://192.168.197.24:23307/test?useSSL=false&serverTimezone=UTC


spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5

#mybatis日志
mybatis-plus.configuration.log-impl=org.Apache.ibatis.logging.stdout.StdOutImpl
#返回json的全局時間格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
#spring.jackson.time-zone=GMT+8

3、使用 @DS 切換數據源。

搭建mysql主從并用springboot讀寫分離-含源碼

 


import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.test.moredatasourse.Service.TtService;
import com.test.moredatasourse.bean.Tt;
import com.test.moredatasourse.mapper.SsMapper;
import com.test.moredatasourse.mapper.TtMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import JAVA.util.List;

@Service
@DS("slave_1")
public class TtServiceImpl extends ServiceImpl<TtMapper, Tt> implements TtService {

    @Autowired
    private TtMapper ttMapper;

    @Override
    public List<Tt> info() {
        List<Tt> tts = ttMapper.selectList(null);
        return tts;

    }
}

分享到:
標簽:主從 mysql
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定