資料庫讀寫分離提高性能詳解,原理是什麼

2021-02-15 PHP開源社區

一部分程式設計師雖然知道處理大數據量時,資料庫要做讀寫分離,但是為什麼讀寫分離可以提高性能呢,原理是什麼?

一 什麼是讀寫分離

MySQL Proxy最強大的一項功能是實現「讀寫分離(Read/Write Splitting)」。基本的原理是讓主資料庫處理事務性查詢,而從資料庫處理SELECT查詢。資料庫複製被用來把事務性查詢導致的變更同步到集群中 的從資料庫。 當然,主伺服器也可以提供查詢服務。使用讀寫分離最大的作用無非是環境伺服器壓力。可以看下這張圖:

二 讀寫分離的好處

1.增加冗餘

2.增加了機器的處理能力

3.對於讀操作為主的應用,使用讀寫分離是最好的場景,因為可以確保寫的伺服器壓力更小,而讀又可以接受點時間上的延遲。

三 讀寫分離提高性能之原因


1.物理伺服器增加,負荷增加
2.主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用
3.從庫可配置myisam引擎,提升查詢性能以及節約系統開銷
4.從庫同步主庫的數據和主庫直接寫還是有區別的,通過主庫發送來的binlog恢復數據,但是,最重要區別在於主庫向從庫發送binlog是異步的,從庫恢復數據也是異步的
5.讀寫分離適用與讀遠大於寫的場景,如果只有一臺伺服器,當select很多時,update和delete會被這些select訪問中的數據堵塞,等待select結束,並發性能不高。 對於寫和讀比例相近的應用,應該部署雙主相互複製

6.可以在從庫啟動是增加一些參數來提高其讀的性能,例如--skip-innodb、--skip-bdb、--low-priority-updates以及--delay-key-write=ALL。當然這些設置也是需要根據具體業務需求來定得,不一定能用上

7.分攤讀取。假如我們有1主3從,不考慮上述1中提到的從庫單方面設置,假設現在1 分鐘內有10條寫入,150條讀取。那麼,1主3從相當於共計40條寫入,而讀取總數沒變,因此平均下來每臺伺服器承擔了10條寫入和50條讀取(主庫不 承擔讀取操作)。因此,雖然寫入沒變,但是讀取大大分攤了,提高了系統性能。另外,當讀取被分攤後,又間接提高了寫入的性能。所以,總體性能提高了,說白 了就是拿機器和帶寬換性能。MySQL官方文檔中有相關演算公式:官方文檔 見6.9FAQ之「MySQL複製能夠何時和多大程度提高系統性能」

8.MySQL複製另外一大功能是增加冗餘,提高可用性,當一臺資料庫伺服器宕機後能通過調整另外一臺從庫來以最快的速度恢復服務,因此不能光看性能,也就是說1主1從也是可以的。

四 讀寫分離示意圖

五 讀寫分離模擬

實驗環境簡介

serv01:代理伺服器 192.168.1.11 serv01.host.com

serv08:主伺服器(主要寫數據,可讀可寫) 192.168.1.18 serv08.host.com

serv09:從伺服器(主要讀數據) 192.168.1.19 serv09.host.com

作業系統版本

RHEL Server6.1 64位系統

使用到的軟體包版本

mysql-5.5.29-linux2.6-x86_64.tar.gz

 mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit.tar.gz

第一步,搭建MySQL伺服器,清空日誌。注意:代理伺服器中不需要裝MySQL

第二步,拷貝mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit.tar.gz文件,解壓文件

[root@larrywen 1005]# scp /opt/soft/ule-mysql/mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit.tar.gz 192.168.1.11:/opt [root@serv01 opt]# tar -xvf mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit.tar.gz -C /usr/local/ [root@serv01 opt]# cd /usr/local/ [root@serv01 local]# mv mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit/ mysql-proxy [root@serv01 local]# ll mysql-proxy/ total 24 drwxr-xr-x. 2 7157 wheel 4096 Aug 17 2011 bin drwxr-xr-x. 2 7157 wheel 4096 Aug 17 2011 include drwxr-xr-x. 4 7157 wheel 4096 Aug 17 2011 lib drwxr-xr-x. 2 7157 wheel 4096 Aug 17 2011 libexec drwxr-xr-x. 3 7157 wheel 4096 Aug 17 2011 licenses drwxr-xr-x. 3 7157 wheel 4096 Aug 17 2011 share --可以查看幫助 [root@serv01 bin]# ./mysql-proxy --help-all 

第三步,serv08主伺服器創建用戶,serv09從伺服器創建用戶,注意用戶名和密碼一致

serv08 mysql> grant all on *.* to 'larry'@'192.168.1.%' identified by 'larry'; Query OK, 0 rows affected (0.00 sec) serv09 mysql> grant all on *.* to 'larry'@'192.168.1.%' identified by 'larry'; Query OK, 0 rows affected (0.00 sec) 

第四步,serv09從伺服器更改設置,開啟slave,查看slave狀態。創建測試資料庫,插入測試數據

serv09 mysql> change master to master_host='192.168.1.18', master_user='larry', master_password='larry', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=107; 
Query OK, 0 rows affected (0.01 sec) 
mysql> start slave; 
Query OK, 0 rows affected (0.00 sec) 
mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.18 Master_User: larry Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: serv09-relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000001  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: 107 Relay_Log_Space: 410 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: 2 1 row in set (0.00 sec) ERROR: No query specified mysql> select user,password,host from mysql.user; +-+---+--+ | user | password | host | +-+---+--+ | root | | localhost | | root | | serv08.host.com | | root | | 127.0.0.1 | | root | | ::1 | | | | localhost | | | | serv08.host.com | | rep | *0CDC8D34246E22649D647DB04E7CCCACAB4368B6 | 192.168.1.% | +-+---+--+ 7 rows in set (0.00 sec) 
mysql> create database larrydb; 
Query OK, 1 row affected (0.00 sec) 
mysql> use larrydb; Database changed 
mysql> create table user(id int, name varchar(30)); 
Query OK, 0 rows affected (0.01 sec) 
mysql> insert into user values(1,'larrywen'); 
Query OK, 1 row affected (0.01 sec) 
mysql> insert into user values(2,'wentasy'); 
Query OK, 1 row affected (0.00 sec) 
mysql> select * from user; +-++ | id | name | +-++ | 1 | larrywen | | 2 | wentasy | +-++ 2 rows in set (0.00 sec) serv09 mysql> select * from larrydb.user; +-++ | id | name | +-++ | 1 | larrywen | | 2 | wentasy | +-++ 2 rows in set (0.00 sec) 

第五步,為了查看現象,serv09從伺服器關閉slave

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

第六步,serv 01查看是否有MySQL用戶,修改rw-splitting.lua文件,修改如下幾個參數

[root@serv01 mysql-proxy]# id mysql uid=500(mysql) gid=500(mysql) groups=500(mysql) [root@serv01 mysql-proxy]# vim rw-splitting.lua 
[root@serv01 mysql-proxy]# cat rw-splitting.lua | grep -e min_idle_connections -e max_idle_connections -e is_debug min_idle_connections = 1,--最小空閒連接數,為了測試,這裡設置為1 max_idle_connections = 1,--最大空閒連接數,為了測試,這裡設置為1 
is_debug = true--是否打開Debug調試,為了查看調試信息,這裡設置為true 

第七步,啟動mysql-proxy

[root@serv01 mysql-proxy]# /etc/init.d/mysql-proxy start Starting mysql-proxy: --先確定是否可以連接 
[root@serv01 ~]# mysql -ularry -plarry -h 192.168.1.18 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.5.29-log Source distribution Copyright (c) 2000, 2012, 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. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
mysql> exit Bye 
[root@serv01 ~]# mysql -ularry -plarry -h 192.168.1.19 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.5.29-log Source distribution Copyright (c) 2000, 2012, 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. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
mysql> exit Bye 

第八步,查看現象

[root@serv01 ~]# /etc/init.d/mysql-proxy start Starting mysql-proxy: 
[root@serv01 ~]# mysql -ularry -plarry -h 192.168.1.11 [connect_server] 192.168.1.11:51054 [1].connected_clients = 0 [1].pool.cur_idle = 0 [1].pool.max_idle = 1 [1].pool.min_idle = 1 [1].type = 1 [1].state = 0 [1] idle-conns below min-idle Welcome to the MySQL monitor. Commands end with ; or \g. [read_query] 192.168.1.11:51054 current backend = 0 client default db = client username = larry query = select @@version_comment limit 1 sending to backend : 192.168.1.19:3306 is_slave : false server default db: server username : larry in_trans : false in_calc_found : false COM_QUERY : true Your MySQL connection id is 10 Server version: 5.5.29-log Source distribution Copyright (c) 2000, 2012, 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. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
mysql> 
mysql> use larrydb; [read_query] 192.168.1.11:51054 current backend = 0 client default db = client username = larry query = SELECT DATABASE()  sending to backend : 192.168.1.19:3306 is_slave : false server default db: server username : larry in_trans : false in_calc_found : false COM_QUERY : true [read_query] 192.168.1.11:51054 current backend = 0 client default db = client username = larry sending to backend : 192.168.1.19:3306 is_slave : false server default db: server username : larry in_trans : false in_calc_found : false COM_QUERY : false Database changed 
mysql> select * from user; 
[read_query] 192.168.1.11:51054 current backend = 0 client default db = larrydb client username = larry query = select * from user sending to backend : 192.168.1.19:3306 is_slave : false server default db: larrydb server username : larry in_trans : false in_calc_found : false COM_QUERY : true
 +-++ 
| id | name | +-++ 
| 1 | larrywen | 
| 2 | wentasy | 
+-++ 
2 rows in set (0.00 sec) 
mysql> insert into user values(3,'jsutdb'); 
[read_query] 192.168.1.11:51644 current backend = 0 client default db = larrydb client username = larry query = insert into user values(3,'jsutdb')  sending to backend : 192.168.1.19:3306 is_slave : false server default db: larrydb server username : larry in_trans : false in_calc_found : false COM_QUERY : true 
Query OK, 1 row affected (0.00 sec) serv08 
mysql> select * from user;
 +-++ | id | name | 
+-++ | 1 | larrywen | 
| 2 | wentasy | +-++ 
2 rows in set (0.00 sec) serv09 
mysql> select * from larrydb.user; 
+-++ | id | name | 
+-++ | 1 | larrywen | 
| 2 | wentasy | 
| 3 | jsutdb |
 +-++ 
3 rows in set (0.00 sec) 

第九步,以上的測試雖有效果,但不是預期。排查原因,重新配置。發現proxy-read-only-backend-addresses和proxy-backend-addresses參數配置出錯,proxy-read-only-backend-addresses應該配置成從伺服器的IP位址,proxy-backend-addresses應該配置成主伺服器的IP位址。

[root@serv01 ~]# vim /etc/init.d/mysql-proxy 
[root@serv01 ~]# cat /etc/init.d/mysql-proxy #!/bin/sh # # mysql-proxy This script starts and stops the mysql-proxy daemon # # chkconfig: - 78 30 # processname: mysql-proxy # description: mysql-proxy is a proxy daemon to mysql # Source function library. . /etc/rc.d/init.d/functions #PROXY_PATH=/usr/local/bin PROXY_PATH=/usr/local/mysql-proxy/bin prog="mysql-proxy" # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 # Set default mysql-proxy configuration. #PROXY_OPTIONS="--daemon" PROXY_OPTIONS="--proxy-read-only-backend-addresses=192.168.1.19:3306 --proxy-backend-addresses=192.168.1.18:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" #PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid PROXY_PID=/var/run/mysql-proxy.pid # Source mysql-proxy configuration. if [ -f /etc/sysconfig/mysql-proxy ]; then . /etc/sysconfig/mysql-proxy fi PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH # By default it's all good RETVAL=0 # See how we were called. case "$1" in start) # Start daemon. echo -n $"Starting $prog: "  $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=mysql --log-level=debug --log-file=/var/log/mysql-proxy.log --proxy-address=192.168.1.11:3306 RETVAL=$? echo if [ $RETVAL = 0 ]; then touch /var/lock/subsys/mysql-proxy fi ;; stop) # Stop daemons. echo -n $"Stopping $prog: " killproc $prog RETVAL=$? echo if [ $RETVAL = 0 ]; then rm -f /var/lock/subsys/mysql-proxy rm -f $PROXY_PID fi ;; restart) $0 stop sleep 3 $0 start ;; condrestart) [ -e /var/lock/subsys/mysql-proxy ] && $0 restart ;; status) status mysql-proxy RETVAL=$? ;; *) echo "Usage: $0 {start|stop|restart|status|condrestart}" RETVAL=1 ;; esac exit $RETVAL 

第十步,測試。插入數據,可以發現連接的是主伺服器,查詢的時候也是主伺服器。說明主伺服器和從伺服器均有讀的的功能。

[root@serv01 ~]# mysql -ularry -plarry -h 192.168.1.11 [connect_server] 192.168.1.11:57891 [1].connected_clients = 0 [1].pool.cur_idle = 0 [1].pool.max_idle = 1 [1].pool.min_idle = 1 [1].type = 1 [1].state = 1 [1] idle-conns below min-idle [read_query] 192.168.1.11:57891 current backend = 0 client default db = client username = larry query = select @@version_comment limit 1  sending to backend : 192.168.1.18:3306 is_slave : false server default db: server username : larry in_trans : false in_calc_found : false COM_QUERY : true 
mysql> insert into user values(5,'test'); 
Query OK,
1 row affected (0.01 sec) 
[read_query] 192.168.1.11:57893 current backend = 0 client default db = larrydb client username = larry query = insert into user values(5,'test')  sending to backend : 192.168.1.18:3306 is_slave : false server default db: larrydb server username : larry in_trans : false in_calc_found : false COM_QUERY : true 
mysql> select * from user; 
+-++ | id | name | 
+-++ | 1 | larrywen | 
| 2 | wentasy | 
| 5 | test | +-++ 
3 rows in set (0.00 sec) 
[read_query] 192.168.1.11:57893 current backend = 0 client default db = larrydb client username = larry query = select * from user  sending to backend : 192.168.1.18:3306 is_slave : false server default db: larrydb server username : larry in_trans : false in_calc_found : false COM_QUERY : true serv08主伺服器查看數據,可以查詢到,說明主伺服器可以寫 mysql> select * from larrydb.user; 
+-++ | id | name | 
+-++ | 1 | larrywen |
 | 2 | wentasy |
 | 5 | test | +-++ 
3 rows in set (0.00 sec) 
serv09從伺服器查詢數據,發現不可查詢到,說明從伺服器只讀
 mysql> 
mysql> select * from larrydb.user; 
+-++ | id | name |
 +-++ | 1 | larrywen | 
| 2 | wentasy | 
| 3 | jsutdb |
 | 4 | db | +-++ 
4 rows in set (0.00 sec) 

第十一步,開啟slave。發現數據同步成功。

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from larrydb.user;
+-++
| id   | name     |
+-++
|    1 | larrywen |
|    2 | wentasy  |
|    3 | jsutdb   |
|    4 | db       |
|    5 | test     |
+-++
5 rows in set (0.00 sec)

對於有些新手可能難懂!但是思路還是要弄懂的!以上內容希望幫助到大家,有需要的可以添加下方二維碼進群交流學習新技術。

文來源:https://blog.csdn.net/samjustin1/article/details/52640125

好文連接:

優化MYSQL查詢步驟,提高你的20%的工作效率

PHP使用swoole改造laravel應用

如果你想和PHP大神交流,添加微信,拉你入群

如果你想獲得學習資料,添加微信,送你資源

相關焦點

  • 想用資料庫「讀寫分離」 請先明白「讀寫分離」解決什麼問題
    這其實是一個非常大的誤區,我們要用「讀寫分離」,首先應該明白「讀寫分離」是用來解決什麼樣的問題的,而不是僅僅會用這個技術。什麼是讀寫分離?大多數網際網路業務,往往讀多寫少,這時候,資料庫的讀會首先稱為資料庫的瓶頸,這時,如果我們希望能夠線性的提升資料庫的讀性能,消除讀寫鎖衝突從而提升資料庫的寫性能,那麼就可以使用「分組架構」(讀寫分離架構)。用一句話概括,讀寫分離是用來解決資料庫的讀性能瓶頸的。
  • 終於學會了 MySQL 主從配置和讀寫分離
    MySQL 讀寫分離的?主從模式主從配置一般都是和讀寫分離相結合,主伺服器負責寫數據,從伺服器負責讀數據,並保證主伺服器的數據及時同步到從伺服器。主從模式又分為一主一從、一主多從和多主多從,越往後部署越複雜,同時,系統穩定性更高。主從模式可以更好的分擔資料庫壓力,將插入更新操作和查詢操作分開,提高系統整體性能。本文的目的就是介紹一下簡單的一主一從架構的配置和原理。
  • 什麼是雲資料庫?雲資料庫機型版本和產品架構介紹
    老劉博客之前有文《雲資料庫有什麼用?UCloud海外MySQL雲資料庫促銷最低5折》介紹了近期UCloud的雲資料庫促銷活動內容,今天老劉博客這裡依UCloud優刻得雲資料庫UDB MySQL為例,和朋友們分享什麼是雲資料庫以及雲資料庫機型版本和產品架構是什麼樣的。
  • 緩存與資料庫的數據一致性的解決方案
    ,總有一次會達到資料庫性能瓶頸,訪問讀寫速度緩慢。考慮用Redis來緩存資料庫數據,減輕資料庫的壓力,提高訪問請求響應速度。一個消費者A搶購成功,這時應該刪除緩存,更新商品數量,在更新商品數量之前,又有一個消費者B來查看該商品數量,由於緩存清空,到資料庫查詢,該消費者查看到的是商品數量為100,並更新緩存為100,其實商品數量已經被消費者B搶購成功之後,資料庫中商品數量更新為99了,緩存與資料庫數據不一致方案一:讀寫分離
  • Python開發之:Django基於Docker實現Mysql資料庫讀寫分離、集群、主從同步詳解 | 原力計劃
    讀寫分離,基本的原理是讓主資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。
  • 程式設計師基礎知識,資料庫的主從分離,了解這些就夠了
    今天,我們來聊一聊資料庫的一些事情。我們常常使用分布式,也就是多機方案來解決上述問題,最簡單的方法,我們可以使用一臺備機,將主資料庫的數據同步過去,這個時候,所有的業務系統仍然讀寫主資料庫,從資料庫只做冷備處理。
  • 作為資料庫核心成員,如何讓淘寶不卡頓?
    阿里妹導讀:TDDL(Tabao Distributed Data Layer)是淘寶開源的一個用於訪問資料庫的中間件,集成了分庫分表,主備,讀寫分離,權重調配,動態資料庫配置等功能。提煉核心:提高資料庫操作速度。同時能應對未來規模變化。三 我能做什麼?為實現以上兩大目標,我能做什麼?
  • 詳解NoSQL資料庫分布式算法的特點
    這麼講使得NoSQL聽起來像是一個大筐,什麼都能塞進去。儘管NoSQL運動並沒有給分布式數據處理帶來根本性的技術變革,但是依然引發了鋪天蓋地的關於各種協議和算法的研究以及實踐。正是通過這些嘗試逐漸總結出了一些行之有效的資料庫構建方法。在這篇文章裡,我將針對NoSQL資料庫的分布式特點進行一些系統化的描述。
  • SQL vs NoSQL:資料庫並發寫入性能比拼
    NoSQL吸取了教訓,比如有些NoSQL採用了eventually consistency的概念,在沒有Update操作一段時間後,資料庫將最終是consistency的,顯然這樣的資料庫將能更好的支持高並發讀寫。
  • 作為一個Java 程式設計師 你應該會什麼
    SpringMVC框架Spring與各種框架集成原理Spring JDBC操作原理基於Spring JDBC手寫ORM框架MyBatis源碼分析MyBatis3簡介MyBatis3 SqlMap那些事兒資料庫連接池到底是什麼MyBatis3 SessionFactory實現原理MyBatis3 配置文件詳解MyBatis3 事務管理與集成淺談HibernateMyBatis3
  • 從上世紀80年代到今天,達夢資料庫技術架構演進與應用全記錄
    目前致力於達夢資料庫核心技術研究及達夢資料庫的推廣工作。  摘要:傳統關係資料庫經過幾十年的發展,架構是否已經到了演進盡頭?MPP、讀寫分離、共享存儲、分庫分表……琳琅滿目的架構從何處來向何處去?未來關係資料庫架構可能會如何發展?本主題以達夢資料庫架構演進與創新為例,向大家分享我們的看法。  達夢資料庫架構演進
  • 索引為什麼能提高查詢性能....
    > 前言昨天,有個女孩子問我提高資料庫查詢性能有什麼立竿見影的好方法
  • 索引為什麼能提高查詢性能
    前言昨天,有個女孩子問我提高資料庫查詢性能有什麼立竿見影的好方法?這簡直是一道送分題,我自豪且略帶鄙夷的說,當然是加「索引」了。她又不緊不慢的問,索引為什麼就能提高查詢性能。這還用問,索引就像一本書的目錄,用目錄查當然很快。她失望地搖了搖頭,你說的只是一個類比,可為什麼通過目錄就能提高查詢速度呢。唉,對啊,通過書目可以快速查詢,這只是一個現象,真正原因到底是什麼呢。
  • 雲時代的分布式資料庫:阿里分布式資料庫服務DRDS
    為了支撐更大的訪問量和數據量,我們必然需要分布式資料庫系統,然而分布式系統又必然會面對強一致性所帶來的延遲提高的問題,因為網絡通信本身比單機內通信代價高很多,這種通信的代價就會直接增加系統單次提交的延遲。延遲提高會導致資料庫鎖持有時間變長,使得高衝突條件下分布式事務的性能不升反降(這個具體可以了解一下Amdahl定律),甚至性能距離單機資料庫都還有明顯的差距。
  • 資料庫事務處理原理與實例剖析
    【IT168專稿】本文根據【2016 第七屆中國資料庫技術大會】現場演講嘉賓葉濤老師分享內容整理而成。熟悉關係型資料庫內核的原理和技術,並有較豐富的實踐經驗。喜歡琢磨資料庫內核的基本原理和算法,並樂於討論和分享。  正文  我今天的演講叫資料庫事務處理的原理和實例剖析。共分為三部分:事務處理的原理,PostgreSQL的事務處理機制剖析,和一個簡單的總結和展望。
  • 萬裡資料庫的極致性能是怎樣煉成的?
    「極致穩定、極致性能、極致易用」的產品理念,以及資料庫性能優化經驗和成功案例。旗艦產品GreatDB Cluster是萬裡資料庫自主研發的一款分布式關係型資料庫,主要面向大數據量高並發場景下的結構化數據存儲和事務處理,採用shared-nothing架構,降低了競爭資源的等待時間,從而大大提高性能。它具備並行計算、動態擴展、故障恢復、分布式事務等技術特性,能夠基於數據分布式部署制定分布式執行計劃,通過分布式並行實現高性能。
  • Redis專題:萬字長文詳解持久化原理
    Redis是一個內存資料庫,所有的數據將保存在內存中,這與傳統的MySQL、Oracle、SqlServer等關係型資料庫直接把數據保存到硬碟相比,Redis的讀寫效率非常高。但是保存在內存中也有一個很大的缺陷,一旦斷電或者宕機,內存資料庫中的內容將會全部丟失。為了彌補這一缺陷,Redis提供了把內存數據持久化到硬碟文件,以及通過備份文件來恢復數據的功能,即Redis持久化機制。
  • 圖資料庫的類別有哪些?數易軒解讀:圖資料庫分類與原理
    圖資料庫作為新興NoSQL資料庫的代表,可以分為四種類型。圖資料庫應用廣泛,無論是網際網路行業還是傳統的金融、地產、醫療等行業,都可以通過圖資料庫的應用進一步提升企業效率。數易軒致力於圖資料庫技術服務,為您介紹圖資料庫的四個分類。
  • 各類磁碟陣列全面詳解
    這種數據上的並行操作可以充分利用總線的帶寬,顯著提高磁碟整體存取性能。 應用場景: 1、 對數據完整性要求不高的場景,如:日誌存儲,個人娛樂 2、 要求讀寫效率高,安全性能要求不高,如圖像工作站 架構圖:
  • 十年資料庫專家,帶來的Mycat中間件實戰筆記,漲薪8K很容易!
    在如今的大數據時代,分布式架構已經成為企業級數據應用的標配,傳統的關係型資料庫產品已經面臨一個真正的拐點:一方面, 關係型資料庫自身難以實現分布式,這大大限制了其數據存儲能力及整體的性能表現;另一方面, 商業化的傳統資料庫產品的成本和性價比在分布式架構崛起的狀況下毫無優勢可言。