欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報邀請碼778899分享:java MySQL 讀寫分離

柚子快報邀請碼778899分享:java MySQL 讀寫分離

http://yzkb.51969.com/

優(yōu)質(zhì)博文:IT-BLOG-CN

一、背景

隨著機票業(yè)務不斷增長,訂單庫的讀性能遇到了挑戰(zhàn),因此對訂單庫進行讀寫分離操作。主要目的是提高數(shù)據(jù)庫的并發(fā)性能和可擴展性。當系統(tǒng)的所有寫操作效率尚可,讀數(shù)據(jù)請求效率較低時,比如之前訂單表存放了幾千萬條數(shù)據(jù),且查詢訂單信息需要關(guān)聯(lián)十幾個字表,每個字表的數(shù)據(jù)超億條。查詢超過設置的慢SQL查詢時間3s。以下是一些具體原因和好處:讀寫分離的功能基于主從復制。 1、性能提升: 【1】讀寫負載分擔:通過將讀操作和寫操作分離,可以將寫操作集中在主庫Master上,而將讀操作分散到多個從庫Slave上。這可以顯著減少主庫的負載,提高整體系統(tǒng)的響應速度。 【2】并發(fā)處理能力:讀寫分離可以利用多個從庫來處理并發(fā)讀請求,從而提高系統(tǒng)的并發(fā)處理能力。

2、可擴展性: 【1】橫向擴展:通過增加從庫的數(shù)量,可以輕松地擴展系統(tǒng)的讀處理能力,而不需要對主庫進行復雜的擴展。 【2】負載均衡:可以使用負載均衡技術(shù)將讀請求分發(fā)到不同的從庫上,從而實現(xiàn)更好的資源利用和性能優(yōu)化。

3、數(shù)據(jù)安全性和容錯性: 【1】數(shù)據(jù)備份:從庫可以用作數(shù)據(jù)備份的一部分,提供數(shù)據(jù)冗余和容錯能力。如果主庫發(fā)生故障,從庫可以迅速接管讀操作,甚至在必要時提升為新的主庫。 【2】災難恢復:在災難恢復場景中,從庫可以作為主庫的備份,確保數(shù)據(jù)的安全性和可恢復性。

4、緩存和索引優(yōu)化: 從庫可以針對特定的讀操作進行優(yōu)化,如創(chuàng)建特定的索引或緩存策略,而不影響主庫的寫操作性能。

擴展:慢查詢超時時間配置:在MySQL的配置文件(通常是my.cnf或my.ini)中設置long_query_time。在[mysqld]部分添加或修改以下行:

[mysqld]

slow_query_log = 1

slow_query_log_file = /path/to/your/slow_query.log

long_query_time = 2

二、主從讀寫分離

主從復制完成后,我們還需要實現(xiàn)讀寫分離,master負責寫入數(shù)據(jù),兩臺slave負責讀取數(shù)據(jù)。我們項目因為數(shù)據(jù)太大,所以使用Sharding-JDBC進行了分表分庫。這里就說下通過Sharding-JDBC怎么實現(xiàn)數(shù)據(jù)讀寫分離的。

【1】引入依賴: 項目中引入Sharding-JDBC的依賴。

org.apache.shardingsphere

shardingsphere-jdbc-core

5.x.x

【2】配置數(shù)據(jù)源: 需要配置多個數(shù)據(jù)源,通常包括一個主庫Master``和一個或多個從庫Slave。以下是一個簡單的Spring Boot`配置示例:

import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;

import javax.sql.DataSource;

import java.io.File;

@Configuration

public class DataSourceConfig {

@Bean

public DataSource dataSource() throws Exception {

File yamlFile = new File("path/to/sharding-jdbc-config.yaml");

return YamlShardingSphereDataSourceFactory.createDataSource(yamlFile);

}

}

【3】配置YAML文件: 在sharding-jdbc-config.yaml文件中,配置讀寫分離的相關(guān)信息。以下是一個示例配置:

dataSources:

master:

type: com.zaxxer.hikari.HikariDataSource

driverClassName: com.mysql.cj.jdbc.Driver

jdbcUrl: jdbc:mysql://localhost:3306/master_db

username: root

password: root

slave0:

type: com.zaxxer.hikari.HikariDataSource

driverClassName: com.mysql.cj.jdbc.Driver

jdbcUrl: jdbc:mysql://localhost:3306/slave_db0

username: root

password: root

slave1:

type: com.zaxxer.hikari.HikariDataSource

driverClassName: com.mysql.cj.jdbc.Driver

jdbcUrl: jdbc:mysql://localhost:3306/slave_db1

username: root

password: root

rules: # 用于定義數(shù)據(jù)分片、讀寫分離等規(guī)則。在這個例子中,我們定義了一個讀寫分離的規(guī)則。

- !READWRITE_SPLITTING # 是一個 YAML 類型標簽,用于指示接下來的配置是一個讀寫分離規(guī)則。

dataSources: # 是一個鍵,表示接下來要定義的是數(shù)據(jù)源的配置。在這個例子中,我們定義了一個名為 pr_ds 的邏輯數(shù)據(jù)源。

pr_ds: # pr_ds 是邏輯數(shù)據(jù)源的名稱。你可以在應用程序中使用這個名稱來引用這個讀寫分離的數(shù)據(jù)源。

writeDataSourceName: master # 指定了用于寫操作的主數(shù)據(jù)源。在這個例子中,主數(shù)據(jù)源的名稱是 master。所有的寫操作(例如 INSERT、UPDATE、DELETE)都會路由到這個數(shù)據(jù)源。

readDataSourceNames: # 是一個列表,指定了用于讀操作的從數(shù)據(jù)源。在這個例子中,有兩個從數(shù)據(jù)源,分別是 slave0 和 slave1。所有的讀操作(例如 SELECT)會根據(jù)負載均衡策略路由到這些從數(shù)據(jù)源。

- slave0

- slave1

loadBalancerName: round_robin # loadBalancerName 指定了用于讀操作的負載均衡策略。在這個例子中,負載均衡策略的名稱是 round_robin,表示輪詢策略。輪詢策略會將讀操作均勻地分布到多個從數(shù)據(jù)源上

loadBalancers:

round_robin:

type: ROUND_ROBIN

【4】使用Sharding-JDBC數(shù)據(jù)源: 使用配置好的Sharding-JDBC數(shù)據(jù)源。以下是一個簡單的示例:

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

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Service;

@Service

public class MyService {

@Autowired

private JdbcTemplate jdbcTemplate;

public void performDatabaseOperations() {

// 寫操作會路由到主庫

jdbcTemplate.update("INSERT INTO my_table (name) VALUES (?)", "John Doe");

// 讀操作會路由到從庫

String name = jdbcTemplate.queryForObject("SELECT name FROM my_table WHERE id = ?", new Object[]{1}, String.class);

System.out.println("Name: " + name);

}

}

思考一:MySQL中的數(shù)據(jù)延遲同步的問題怎么解決? 我們主從使用的硬件配置都是一樣的,MySQL使用的也是5.7版本,支持writeSet并行復制,但很多時間可能是網(wǎng)絡延遲,就需要確保足夠的寬帶,以便數(shù)據(jù)傳輸,選擇地理位置較近的服務器等等。重點是我們對數(shù)據(jù)實時性要求高的系統(tǒng),會將主庫寫入的數(shù)據(jù)存入Redis緩存中,并給一個過期時間,過期時間的設計與主從復制延遲的時間成正比。

思考二:同一線程且同一數(shù)據(jù)庫連接內(nèi),如果讀寫操作在一起,為了保證數(shù)據(jù)一致性,均從主庫讀取。

三、讀非關(guān)系型數(shù)據(jù)庫-技術(shù)選型

同步模式

適合查詢數(shù)據(jù)的一致性和實時性高的系統(tǒng)。但業(yè)務代碼侵入比較強,增大寫操作的耗時,影響系統(tǒng)的寫操作的QPS。

異步模式

寫入數(shù)據(jù)后,通過kafka異步建立查詢數(shù)據(jù),不影響業(yè)務流程,但需要考慮數(shù)據(jù)一致性問題。

binlog模式

這種方案也是我們使用的一套方案,還是借助自主研發(fā)的DRC服務,監(jiān)聽寫數(shù)據(jù)庫日志的方式建立查詢數(shù)據(jù),不影響主流程,代碼無侵入。但需要注意數(shù)據(jù)一致性問題。

四、項目中的難點

消息冪等怎么保證?

消息冪等性在業(yè)務層保證一致,使用updateOrInsert方法,存在即更新,不存在則插入。那么在MongDB中也是一樣的,使用條件更新Upsert,通過使用upsert選項,可以確保插入或更新操作是冪等的。如果文檔不存在則插入,如果存在則更新。

db.collection.updateOne(

{ _id: documentId },

{ $set: { fieldName: newValue } },

{ upsert: true }

);

消費時序性怎么保證?

因為使用的是Kafka進行消息訂閱消費,根據(jù)訂單號進行分區(qū)消費,同一個訂單分配至同一個分區(qū),同一個分區(qū)是順序消費的,從而保證消息的時序性。

消息一致性怎么保證?

搭建的數(shù)據(jù)同步系統(tǒng)DRC可以定時校驗數(shù)據(jù)的一致性

查詢數(shù)據(jù)存儲為什么選 MongDB?

為了解決表數(shù)據(jù)量大查詢緩慢的問題,不推薦選用關(guān)系型數(shù)據(jù)庫了,內(nèi)存數(shù)據(jù)庫雖然性能非常高,比如Redis,但是不適合海量數(shù)據(jù),太費錢了。所以重點考慮如下三種大數(shù)據(jù)存儲模型:MongoDB/HBase/Elasticsearch

MongoDB:文檔型數(shù)據(jù)庫NoSQL,基于文檔的存儲,使用JSON(BSON)格式,豐富的查詢語言,支持復雜的查詢和聚合操作,水平擴展Sharding,最終一致性,支持多種一致性級別的配置。

柚子快報邀請碼778899分享:java MySQL 讀寫分離

http://yzkb.51969.com/

推薦鏈接

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19540928.html

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄