recherche
Maisonbase de donnéestutoriel mysql怎样解决MySQL数据库主从复制延迟的问题

怎样解决MySQL数据库主从复制延迟的问题

Jun 07, 2016 pm 03:07 PM
mysql复制延迟comment数据库解决问题

像 Facebook 、 开心001 、 人人网 、 优酷 、 豆瓣 、 淘宝 等高流量、高并发的网站,单点数据库很难支撑得住,WEB2.0类型的网站中使用MySQL的居多,要么用MySQL自带的 MySQL NDB Cluster (MySQL5.0及以上版本支持MySQL NDB Cluster功能),或者用MySQL自带

Facebook开心001人人网优酷豆瓣淘宝等高流量、高并发的网站,单点数据库很难支撑得住,WEB2.0类型的网站中使用MySQL的居多,要么用MySQL自带的MySQL NDB Cluster(MySQL5.0及以上版本支持MySQL NDB Cluster功能),或者用MySQL自带的分区功能(MySQL5.1及以上版本支持分区功能),我所知道的使用这两种方案的很少,一般使用主从复制,再加上MySQL Proxy实现负载均衡、读写分离等功能,在使用主从复制的基础上,再使用垂直切分及水平切分;或者不使用主从复制,完全使用垂直切分加上水平切分再加上类似Memcached的系统也可以解决问题。

1.优酷的经验
数据库采用水平扩展,主从复制,随着从数据库的增多,复制延迟越来越厉害,最终无法忍受。
最终还是采用数据库的sharding,把一组用户相关的表和数据放到一组数据库上。
使用SSD来优化mysql的I/O,性能提升明显,每块16G,6块SSD做RAID。
数据库的类型选用MYISAM
数据库的拆分策略,先纵向按照业务或者模块拆分。对于一些特别大的表,再采用垂直拆分
根据用户进行分片,尽可能不要跨篇查询。如果确实要跨片查询,可以考虑搜索的方案,先索引再搜索。
分布式的数据库方案太复杂,否掉。

优酷使用的是数据库分片技术,而抛弃了由于数据量的越来越多导致复制延迟的问题。按照user_id进行分片,这样必须有一个全局的表来管理用户与shard的关系,根据user_id可以得到share_id,然后根据share_id去指定的分片查询指定的数据。

假如此表的表名为sharding_manager,如果网站的用户数太多,比如千万级的或甚至更大比如亿级的用户,此时此表也许也会成为一个瓶颈,因为查询会非常频繁,所有的动态请求都要读此表,这时可以用其它的解决方案,比如用Memcached、Tokyo Cabinet、Berkeley DB或其它的性能更高的方案来解决。

具体怎么定位到哪台db服务器,定位到哪个数据库,定位到哪个shard(就是userN,msgN,videoN),优酷网的架构文档中说得不是很仔细,这里只能猜测一下了。

根据优酷的架构图,一共有2台db服务器,每台db服务器有2个数据库,每个数据库有3个shard,这样一共是2 * 2 * 3 = 12个shard。

user_id一般是自增型字段,用户注册的时候可以自动生成,然后看有几台db服务器,假如有m台db服务器,则用 user_id % m便可以分配一台db服务器(例如0对应100,1对应101,以此类推,字段mysql_server_ip的值确定),假设每台服务器有n个数据库,则用user_id % n可以定位到哪个数据库(字段database_name的值确定),假设每个数据库有i个shard,则用user_id % i可以定位到哪个shard(字段shard_id的值确定),这样就可以进行具体的数据库操作了。

user_id share_id mysql_server_ip database_name
101      2           192.168.1.100   shard_db1
105      0           192.168.1.100   shard_db2
108      0           192.168.1.101   shard_db3(或shard_db1)
110      1           192.168.1.101   shard_db4(或shard_db2)

如上述user_id为101的用户,连接数据库服务器192.168.1.100,使用其中的数据库为shard_db1,使用其中的表系列为user2,msg2,video2

如果上述的m,n,i发生变化,比如网站的用户不断增长,需要增加db服务器,此时则需要进行数据库迁移,关于迁移,参见这儿

因为表位于不同的数据库中,所以不同的数据库中表名可以相同
server1(192.168.1.100)
shard_db1
user0
msg0
video0
user1
msg1
video1
...
userN
msgN
videoN
shard_db2
user0
msg0
video0
user1
msg1
video1
...
userN
msgN
videoN

因为表位于不同的数据库服务器中,所以不同的数据库服务器中的数据库名可以相同
server2(192.168.1.101)
shard_db3
(这里也可以用shard_db1)
user0
msg0
video0
user1
msg1
video1
...
userN
msgN
videoN
shard_db4(这里也可以用shard_db2)
user0
msg0
video0
user1
msg1
video1
...
userN
msgN
videoN

2.豆瓣的经验
由于从主库到辅库的复制需要时间
更新主库后,下一个请求往往就是要读数据(更新数据后刷新页面)
从辅库读会导致cache里存放的是旧数据(不知道这个cache具体指的是什么,如果是Memcached的话,如果更新的数据的量很大,难道把所有更新过的数据都保存在Memcached里面吗?)
解决方法:更新数据库后,在预期可能会马上用到的情况下,主动刷新缓存
不完美,but it works

豆瓣后来改为双MySQL Master+Slave说是能解决Replication Delay的问题,不知道是怎么解决的,具体不太清楚。

3.Facebook的经验

下面一段内容引用自www.dbanotes.net
大量的 MySQL + Memcached 服务器,布署简示:
California (主 Write/Read)............. Virginia (Read Only)
主数据中心在 California ,远程中心在 Virginia 。这两个中心网络延迟就有 70ms,MySQL 数据复制延迟有的时候会达到 20ms. 如果要让只读的信息从 Virginia 端发起,Memcached 的 Cache 数据一致性就是个问题。

1 用户发起更新操作,更名 "Jason" 到 "Monkey" ;
2 主数据库写入 "Monkey",删除主端 Memcached 中的名字值,但Virginia 端 Memcached 不删;(这地方在 SQL 解析上作了一点手脚,把更新的操作"示意"给远程);
3 在 Virginia 有人查看该用户 Profile ;
4 在 Memcached 中找到键值,返回值 "Jason";
5 复制追上更新 Slave 数据库用户名字为 "Monkey",删除 Virginia Memcached 中的键值;
6 在 Virginia 有人查看该用户 Profile ;
7 Memcache 中没找到键值,所以从 Slave 中读取,然后得到正确的 "Monkey" 。
Via

从上面3可以看出,也仍然存在数据延迟的问题。同时master中数据库更新的时候不更新slave中的memcached,只是给slave发个通知,说数据已经改变了。

那是不是可以这样,当主服务器有数据更新时,立即更新从服务器中的Memcached中的数据,这样即使有延迟,但延迟的时间应该更短了,基本上可以忽略不计了。

4.Netlog的经验

对于比较重要且必须实时的数据,比如用户刚换密码(密码写入 Master),然后用新密码登录(从 Slaves 读取密码),会造成密码不一致,导致用户短时间内登录出错。所以在这种需要读取实时数据的时候最好从 Master 直接读取,避免 Slaves 数据滞后现象发生。还好,需要读取实时数据的时候不多,比如用户更改了邮件地址,就没必要马上读取,所以这种 Master-Slaves 架构在多数情况下还是有效的。Via这篇文章


Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Ajouter des utilisateurs à MySQL: le tutoriel completAjouter des utilisateurs à MySQL: le tutoriel completMay 12, 2025 am 12:14 AM

La maîtrise de la méthode d'ajout d'utilisateurs de MySQL est cruciale pour les administrateurs et les développeurs de la base de données car il garantit le contrôle de sécurité et d'accès de la base de données. 1) Créez un nouvel utilisateur à l'aide de la commande CreateUser, 2) Attribuer des autorisations via la commande Grant, 3) Utilisez FlushPrivileges pour vous assurer que les autorisations prennent effet, 4) Audit régulièrement et nettoyez les comptes d'utilisateurs pour maintenir les performances et la sécurité.

Master Types de données de chaîne MySQL: Varchar vs texte vs charMaster Types de données de chaîne MySQL: Varchar vs texte vs charMay 12, 2025 am 12:12 AM

ChooseCharForfixed-LengthData, Varcharforvariable-LengthData, andTextForLargetExtFields.1) ChariseFicientForConsistent-LengthDatalikEcodes.2)

MySQL: Types de données de chaîne et indexation: meilleures pratiquesMySQL: Types de données de chaîne et indexation: meilleures pratiquesMay 12, 2025 am 12:11 AM

Les meilleures pratiques pour gérer les types de données de chaîne et les index dans MySQL incluent: 1) la sélection du type de chaîne approprié, tel que le char pour la longueur fixe, le varchar pour la longueur variable et le texte pour un grand texte; 2) Soyez prudent dans l'indexation, évitez de sur-indexer et créez des index pour les requêtes communes; 3) Utilisez des index de préfixe et des index de texte complet pour optimiser les recherches de chaînes longues; 4) Surveiller et optimiser régulièrement les index pour maintenir les index petits et efficaces. Grâce à ces méthodes, nous pouvons équilibrer les performances de lecture et d'écriture et d'améliorer l'efficacité de la base de données.

Mysql: comment ajouter un utilisateur à distanceMysql: comment ajouter un utilisateur à distanceMay 12, 2025 am 12:10 AM

Toaddausererremotelytomysql, suivi de l'essence: 1) ConnectTomysqlasroot, 2) CreateEnewUserwithRemoteAccess, 3) GRANTNECESSARYPRIVILEGES et 4) Flushprivileges.BecautiousOfSecurityRisksBylimitingpasw

Le guide ultime des types de données de chaîne MySQL: stockage de données efficaceLe guide ultime des types de données de chaîne MySQL: stockage de données efficaceMay 12, 2025 am 12:05 AM

Tostorestringsefficantlyinmysql, choosetherighdatatypebaseneyourneds: 1) usECHarforfixed-LengthStringSlikeCountryCodes.2) useVarcharforvariable-LengthStringSlikenames.3) usteTextforlong-fortextContente.4)

MySQL Blob vs texte: Choisir le bon type de données pour les grands objetsMySQL Blob vs texte: Choisir le bon type de données pour les grands objetsMay 11, 2025 am 12:13 AM

Lors de la sélection des types de données BLOB et de texte de MySQL, BLOB convient au stockage des données binaires, et le texte convient au stockage des données de texte. 1) BLOB convient aux données binaires telles que les images et l'audio, 2) le texte convient aux données de texte telles que des articles et des commentaires. Lors du choix, les propriétés des données et l'optimisation des performances doivent être prises en compte.

MySQL: Dois-je utiliser l'utilisateur racine pour mon produit?MySQL: Dois-je utiliser l'utilisateur racine pour mon produit?May 11, 2025 am 12:11 AM

Non, vous ne faites pas partie de surrootuserinmysqlforyourproduct.instead, CreateSpecificusersrswithLimimitedPrivileGtoenHancesECurecUrit andPerformance: 1) CreateEnewUserwithastrongPassword, 2) GrantonlyNeceSaryPermiseSmissionStothisser, 3) régulièrement

Types de données de chaîne MySQL expliqués: Choisir le bon type pour vos donnéesTypes de données de chaîne MySQL expliqués: Choisir le bon type pour vos donnéesMay 11, 2025 am 12:10 AM

MysqlstringDatatypessHouldBechosen BasedAdatacharActeristicsandUsecases: 1) USECHARFORFIXED-LETHSTRINGSLIKECOUNTRYCODES.2)

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

<🎜>: Bubble Gum Simulator Infinity - Comment obtenir et utiliser les clés royales
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
Nordhold: Système de fusion, expliqué
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Comment déverrouiller le grappin
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Version Mac de WebStorm

Version Mac de WebStorm

Outils de développement JavaScript utiles

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

mPDF

mPDF

mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) ​​et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PhpStorm version Mac

PhpStorm version Mac

Le dernier (2018.2.1) outil de développement intégré PHP professionnel