主頁 > 資料庫 > MySQL 日志之 binlog 格式 → 關于 MySQL 默認隔離級別的探討

MySQL 日志之 binlog 格式 → 關于 MySQL 默認隔離級別的探討

2020-10-22 13:10:32 資料庫

開心一刻

產品還沒測驗直接投入生產時,這尼瑪...

背景問題

  在講 binlog 之前,我們先來回顧下主流關系型資料庫的默認隔離級別,是默認隔離級別,不是事務有哪幾種隔離級別,別會錯題意了

  1、Oracle、SQL Server 的默認隔離級別是什么,MySQL 的呢 ?

  2、為什么 MySQL 的默認隔離級別是 RR ?

    這個問題其實不太嚴謹,我們知道 MySQL 5.5 才將 InnoDB 代替 MyISAM 成為 MySQL 默認的存盤引擎,而事務才有隔離級別一說,MyISAM 本就不支持事務,那么這個問題在 MySQL 5.5 之前根本就不成立,

    嚴謹點來說,應該是:為什么 MySQL 5.5 及之后版本的事務默認隔離級別是 RR,或者是:為什么 InnoDB 的事務默認隔離級別是 RR

  對于問題1,我相信大家都能回答的上來,Oracle,SqlServer 的默認隔離級別是 讀已提交(Read Commited,簡稱 RC) ,而 MySQL 的默認隔離級別是 可重復讀(Repeatable Read,簡稱 RR)  

  但是對于問題2,相信有很多小伙伴就會支支吾吾了:呃...,這個...,昂昂昂昂昂,太久了我記憶都不太好了...

  調皮的小伙伴可能就開始岔開話題了:你講 binlog 就講 binlog 啦,扯什么默認隔離級別,難道 MySQL 的默認隔離級別還與 binlog 有關 ?

  想知道呀? 那得加錢

  具體它倆是不是有關,樓主也不知道,我們一起往下看

binlog 格式

  binlog 全稱:binary log,即二進制日志,有時候也稱歸檔日志,記錄了對 MySQL 資料庫執行了更改的所有操作,包括表結構變更(CREATE、ALTER、DROP TABLE…)、表資料修改(INSERT、UPDATE、DELETE...),但不包括 SELECT 和 SHOW 這類操作,因為這類操作對資料本身并沒有修改;若更改操作并未導致資料庫變化,那么該操作也會寫入 binlog,例如

create table tbl_t1(name varchar(32));
insert into tbl_t1 values('zhangsan');
update tbl_t1 set name = 'lisi' where name = '123';
show master status\G;
show binlog events in 'mysql-bin.000002'\G;

  此時的:update tbl_t1 set name = 'lisi' where name = '123'; 并未引起資料庫的變化,但還是被記錄到了 binlog 中

  binlog 的格式有三種:STATEMENT、ROW、MIXED,一開始只有 STATEMENT,后面慢慢衍生出了 ROW、MIXED

  MySQL 5.1.5 之前 binlog 的格式只有 STATEMENT,5.1.5 開始支持 ROW 格式的 binlog,從 5.1.8 版本開始,MySQL 開始支持 MIXED 格式的 binlog

  MySQL 5.7.7 之前,binlog 的默認格式都是 STATEMENT,在 5.7.7 及更高版本中,binlog_format 的默認值才是 ROW

  三種格式的 binlog 各長什么樣,它們有什么區別,各有什么優劣,我們往下看

  STATEMENT

    從 MySQL 第一個版本,到目前最新的 8.0.x,STATEMENT 一直堅挺在 binlog 的格式中,只是從 5.7.7 開始,它退居幕后,頭把交椅給了 ROW

    binglog 與我們開發中的代碼日志是不一樣的,它包含兩類檔案

      索引檔案:檔案名.index,記錄了哪些日志檔案正在被使用,內容如下

        

      日志檔案:檔案名.00000*

        

        記錄了對 MySQL 資料庫執行了更改的所有操作

    因為 binlog 的日志檔案是二進制檔案,不能用文本編輯器直接打開,需要用特定的工具來打開,MySQL 提供了 mysqlbinlog 來幫助我們查看日志檔案內容

    mysqlbinlog 可選引數很多, mysqlbinlog.exe --help 

mysqlbinlog.exe Ver 3.3 for Win64 at x86
Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Dumps a MySQL binary log in a format usable for viewing or for piping to
the mysql command line client.

Usage: mysqlbinlog.exe [options] log-files
  -?, --help          Display this help and exit.
  --base64-output[=name]
                      Determine when the output statements should be
                      base64-encoded BINLOG statements: 'never' disables it and
                      works only for binlogs without row-based events;
                      'decode-rows' decodes row events into commented SQL
                      statements if the --verbose option is also given; 'auto'
                      prints base64 only when necessary (i.e., for row-based
                      events and format description events); 'always' prints
                      base64 whenever possible. 'always' is deprecated, will be
                      removed in a future version, and should not be used in a
                      production system.  --base64-output with no 'name'
                      argument is equivalent to --base64-output=always and is
                      also deprecated.  If no --base64-output[=name] option is
                      given at all, the default is 'auto'.
  --character-sets-dir=name
                      Directory for character set files.
  -d, --database=name List entries for just this database (local log only).
  --debug-check       Check memory and open file usage at exit .
  --debug-info        Print some debug info at exit.
  -D, --disable-log-bin
                      Disable binary log. This is useful, if you enabled
                      --to-last-log and are sending the output to the same
                      MySQL server. This way you could avoid an endless loop.
                      You would also like to use it when restoring after a
                      crash to avoid duplication of the statements you already
                      have. NOTE: you will need a SUPER privilege to use this
                      option.
  -F, --force-if-open Force if binlog was not closed properly.
                      (Defaults to on; use --skip-force-if-open to disable.)
  -f, --force-read    Force reading unknown binlog events.
  -H, --hexdump       Augment output with hexadecimal and ASCII event dump.
  -h, --host=name     Get the binlog from server.
  -l, --local-load=name
                      Prepare local temporary files for LOAD DATA INFILE in the
                      specified directory.
  -o, --offset=#      Skip the first N entries.
  -p, --password[=name]
                      Password to connect to remote server.
  -P, --port=#        Port number to use for connection or 0 for default to, in
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
                      /etc/services, built-in default (3306).
  --protocol=name     The protocol to use for connection (tcp, socket, pipe,
                      memory).
  -R, --read-from-remote-server
                      Read binary logs from a MySQL server.
  -r, --result-file=name
                      Direct output to a given file.
  --server-id=#       Extract only binlog entries created by the server having
                      the given id.
  --set-charset=name  Add 'SET NAMES character_set' to the output.
  --shared-memory-base-name=name
                      Base name of shared memory.
  -s, --short-form    Just show regular queries: no extra info and no row-based
                      events. This is for testing only, and should not be used
                      in production systems. If you want to suppress
                      base64-output, consider using --base64-output=never
                      instead.
  -S, --socket=name   The socket file to use for connection.
  --start-datetime=name
                      Start reading the binlog at first event having a datetime
                      equal or posterior to the argument; the argument must be
                      a date and time in the local time zone, in any format
                      accepted by the MySQL server for DATETIME and TIMESTAMP
                      types, for example: 2004-12-25 11:25:56 (you should
                      probably use quotes for your shell to set it properly).
  -j, --start-position=#
                      Start reading the binlog at position N. Applies to the
                      first binlog passed on the command line.
  --stop-datetime=name
                      Stop reading the binlog at first event having a datetime
                      equal or posterior to the argument; the argument must be
                      a date and time in the local time zone, in any format
                      accepted by the MySQL server for DATETIME and TIMESTAMP
                      types, for example: 2004-12-25 11:25:56 (you should
                      probably use quotes for your shell to set it properly).
  --stop-position=#   Stop reading the binlog at position N. Applies to the
                      last binlog passed on the command line.
  -t, --to-last-log   Requires -R. Will not stop at the end of the requested
                      binlog but rather continue printing until the end of the
                      last binlog of the MySQL server. If you send the output
                      to the same MySQL server, that may lead to an endless
                      loop.
  -u, --user=name     Connect to the remote server as username.
  -v, --verbose       Reconstruct SQL statements out of row events. -v -v adds
                      comments on column data types.
  -V, --version       Print version and exit.
  --open-files-limit=#
                      Used to reserve file descriptors for use by this program.

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
base64-output                     (No default value)
character-sets-dir                (No default value)
database                          (No default value)
debug-check                       FALSE
debug-info                        FALSE
disable-log-bin                   FALSE
force-if-open                     TRUE
force-read                        FALSE
hexdump                           FALSE
host                              (No default value)
local-load                        (No default value)
offset                            0
port                              3307
read-from-remote-server           FALSE
server-id                         0
set-charset                       (No default value)
shared-memory-base-name           (No default value)
short-form                        FALSE
socket                            E:/soft/mysql5.5.8/tmp/mysql.sock
start-datetime                    (No default value)
start-position                    4
stop-datetime                     (No default value)
stop-position                     18446744073709551615
to-last-log                       FALSE
user                              (No default value)
open-files-limit                  18432
View Code

    這些引數不做細講,有興趣的可自行去查閱,我們重點來關注日志檔案的內容,執行 mysqlbinlog.exe ../data/mysql-bin.000004 

    可以看到,對資料庫執行了更改的操作

insert tbl_t1 values ('aaa'),('bbb');
update tbl_t1 set name = 'a1' where name = 'aaa';
delete from tbl_t1 where name = 'bbb';

    都是以明文形式的 SQL 記錄在日志檔案中,至于優缺點,我們看完另外兩種格式之后再來比較

  ROW

    MySQL 5.7.7 及之后版本,binlog 的默認格式是 ROW,我們基于 5.7.30 版本,來看下 ROW 格式 binlog 內容是怎樣的

    先產生資料庫更改操作

    更改操作有

create table tbl_row(
    name varchar(32),
    age int
);
insert into tbl_row values('qq',23),('ww',24);
update tbl_row set age = 18 where name = 'aa';
update tbl_row set age = 18 where name = 'qq';
delete from tbl_row where name = 'aa';
delete from tbl_row where name = 'ww';

    master 當前正在寫入的 binlog 檔案: mysql-bin.000002 , position  從  2885  到  3929 

    接下來我們看下日志檔案中是怎么記錄的,執行 mysqlbinlog.exe --start-position=2885 --stop-position=3929 ../data/mysql-bin.000002  

    可以看到,表結構變更操作以明文形式的 SQL 記錄在日志檔案中(與 STATEMENT 一樣),但表資料變更的操作卻是以一坨一坨的密文形式記錄在日志檔案中,不便于我們閱讀

    慶幸的是,mysqlbinlog 提供引數 -v 或 -vv 來解密查看,執行 mysqlbinlog.exe --base64-output=decode-rows -v --start-position=2885 --stop-position=3929 ../data/mysql-bin.000002  

    INSERT 沒什么好注意的,每一列都插入對應的值

insert into tbl_row values('qq',23),('ww',24);

對應

### INSERT INTO `my_project`.`tbl_row`
### SET
###   @1='qq'
###   @2=23
### INSERT INTO `my_project`.`tbl_row`
### SET
###   @1='ww'
###   @2=24
View Code

    UPDATE 就有需要注意的了,雖然我們修改列只有一列,條件列也只有一列,但是日志中記錄的卻是:修改列是全部列,條件列也是全部列,并且列值是具體的值,而沒有 NOW()、UUID() 這樣的函式

update tbl_row set age = 18 where name = 'qq';

對應

### UPDATE `my_project`.`tbl_row`
### WHERE
###   @1='qq'
###   @2=23
### SET
###   @1='qq'
###   @2=18
View Code

      表沒有明確的指定主鍵,滿足更新條件的記錄也只有一條,大家可以去試試:明確指定主鍵且滿足更新條件的記錄有多條的情況,看看 binlog 日志是怎么記錄的

    DELETE 與 UPDATE 一樣,雖說條件列只有一個,但日志中記錄的確實全部列

delete from tbl_row where name = 'ww';

對應

### DELETE FROM `my_project`.`tbl_row`
### WHERE
###   @1='ww'
###   @2=24
View Code

     相較 STATEMENT,顯得更復雜,內容會多很多, 具體 ROW 有什么優點,我們往下看

  MIXED

    字面意思:混合,那它混合誰? 還能混合誰?只能混合 STATEMENT 和 ROW

    大多數情況下,是以 STATEMENT 格式記錄 binlog 日志(因為 MySQL 默認隔離級別是 RR,而又很少有人去修改默認隔離級別),當隔離級別為 RC 模式的時候,則修改為 ROW 模式記錄

    有些特殊場景,也是以 ROW 格式來記錄的,就不區分 RR 和 RC 了(摘自:關于binary log那些事——認真碼了好長一篇)

    

    當然還有一個  NOW() ,說白了就是,只有具體的值才最可靠,其他依賴于背景關系、環境的函式、系統變數都不可靠,因為它們會因背景關系、環境而變化

    這個就不去展示具體的日志內容了,有興趣的小伙伴自行去跑結果

  優缺點總結

    三種格式都已介紹完畢,相比之下,相信大家對它們各自的特點、優缺點已經有一定的了解了

    基于 binlog 的用途之一:主從復制(三個用途:主從復制、資料恢復、審計), 樓主給大家總結下它們的優缺點

    

    MIXED 的愿景是好的:結合 STATEMENT 和 ROW 兩者的優點,產生一個完美的格式,但事與愿違,它還是會有一些問題

    相比于準確性而言,性能優先級會低一些(隨著技術的發展,硬體性能已不再是不可接受的瓶頸),所以推薦使用 ROW 格式

MySQL 的 binlog 與其默認隔離級別 RR 的關系

  從上面 binlog 格式的內容來看,似乎與默認隔離級別 RR 沒有半毛錢關系,先莫急,慢慢往下看

  RC,STATEMENT 下,各版 MySQL 執行表資料修改操作

    表引擎是 InnoDB,隔離級別是 RC,binlog_format=STATEMENT的統一前提下,我們分別看下 MySQl5.0.96、MySQL5.1.30、MySQL5.5.8、MySQL5.7.30 執行表資料更改操作的情況

    MySQl5.0.96 可以正常執行

    MySQL5.1.30 執行報錯,提示

ERROR 1598 (HY000): Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'

    MySQL5.5.8、MySQL5.7.30 執行報錯,都提示

ERROR 1665 (HY000): Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.

    也就是說,MySQL5.1.30及之后,RC 隔離級別的 InnoDB 對 binlog_format 是有限制的,不能是 STATEMENT,否則表資料無法進行修改

    MySQL 4.x 系列,由于官方不提供下載了,沒法做測驗,有 4.x 版本(或者5.1.21之前的5.1.x版本)的可以私信下我哦,不勝感激!

  不同 session 的操作記錄在 binlog 中的記錄順序

    我們用兩個 session 來執行更新操作,看下不同 session 的操作記錄在 binlog 中的記錄順序有什么決定 

    可以看到 update tbl_rr_test set age = 20 where id = 1; 先執行,后 commit, update tbl_rr_test set age = 21 where id = 2; 后執行,先 commit,日志中記錄的是:先commit的記錄在前面,后commit的記錄在后面,與執行時間點無關;就單個 session 來說,好理解,執行順序就是記錄順序;多個 session 之間的話,先 commit 的先記錄

    主庫對資料庫的更改是按執行時間的先后順序進行的,而 binlog 卻是按 commit 的先后順序記錄的,理論上來說就會出現 MySQL Bug23051 中的示例問題

  默認隔離級別 RR 與 binlog 的關系 

    我們來看看 MySQL Bug23051,里面有說到,MySQL 5.1 的早期版本,隔離級別是 RC、binlog 格式是STATEMENT時,InnoDB 的主從復制是有 bug 的(5.1.21 中修復),而 5.0.x 是沒問題的,我們在 5.0.96 上跑下 Bug23051 中的例子

    可以看到,5.0.96 下的 InnoDB,在 RC 級別,binlog_format=STATEMENT 時, UPDATE t1 SET a=11 where b=2; 的事務未提交,則 UPDATE t1 SET b=2 where b=1; 的事務會被阻塞,那么從庫復制的時候,資料是沒問題的

    所以,綜合前面的來看,從 MySQL5.0 開始,InnoDB 在 RC 級別,binlog_format=STATEMENT 時 主從復制是沒有 bug 的(5.0沒問題,5.1.21之前的5.1.x有問題,但官方不提供下載了,5.1.21及之后的版本不支持 RC 隔離級別下設定 binlog 為 STATEMENT)

    那么 binlog 與 默認級別 RR 的關系就清楚了,就是煙哥在【原創】互聯網專案中mysql應該選什么事務隔離級別中說的這段話:

那Mysql在5.0這個版本以前,binlog只支持STATEMENT這種格式!而這種格式在讀已提交(Read Commited)這個隔離級別下主從復制是有bug的,因此Mysql將可重復讀(Repeatable Read)作為默認的隔離級別!

    也就是說,在 MySQL5.0之前,將 RR 作為默認隔離級別,是為了規避大部分主從復制的bug(具體什么bug,可詳看 Bug23051 中的案例,或者【原創】互聯網專案中mysql應該選什么事務隔離級別中的案例),然后一直被沿用了下來而已;為什么不是規避全部的主從復制 bug,因為在 RR 隔離級別、binlog_format=STATEMENT 下,使用系統函式(NOW()、UUID()等)時,還是會導致主從資料不一致

總結

  1、binlog 三個格式

    目前主流的 MySQL,binlog 格式有 3 種:STATEMENT、ROW、MIXED,從資料準確性考慮,推薦使用 ROW 格式

  2、binlog 默認格式

    MySQL 5.1.5 之前只支持 STATEMENT 格式的 binlog,5.1.5 開始支持 binlog_format=ROW,MySQL 5.7.7 之前,binlog 的默認格式都是 STATEMENT,在 5.7.7 及更高版本中,binlog_format的默認值才是 ROW

  3、主從復制 bug(InnoDB 引擎)

    MySQL 5.1.30及之后,InnoDB 下,開啟 RC 隔離級別的話是不能啟用 binlog_format=STATEMENT的

    RC、RR 隔離級別,binlog_format=MIXED,主從復制仍會有資料不一致的問題(受系統函式影響)

    RR 隔離級別,binlog_format=STATEMENT,主從復制仍會有資料不一致的問題(受系統函式影響)

    binlog_format=ROW,不管是 RC 隔離級別,還是 RR 隔離級別,主從復制仍不會有資料不一致的問題

  4、MySQL 為什么默認隔離級別是 RR

    為了規避 MySQL5.0 以前版本的主從復制問題,然后一直被沿用了下來而已

  5、引擎選擇問題

    MySQL 5.6 及之后,InnoDB 做了大量的優化,性能并不比MyISAM低,說沒特別的理由,基本可以放棄 MyISAM 了

參考

  【原創】互聯網專案中mysql應該選什么事務隔離級別

  【原創】研發應該懂的binlog知識(上)

  關于binary log那些事——認真碼了好長一篇

  mysql查看binlog日志

  MySQL · 特性分析 · InnoDB對binlog_format的限制

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/185484.html

標籤:MySQL

上一篇:[MySQL] group by 分組并進行組內排序取得最新一條

下一篇:[MySQL] group by 分組并進行組內排序取得最新一條

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more