代码改变世界

MongoDB 7.0 动态 WiredTiger tickets

2023-12-16 13:46  abce  阅读(116)  评论(0编辑  收藏  举报

在WiredTiger存储引擎中,WiredTiger tickets提供了并发控制机制。这些tickets分为读tickets和写tickets。
当多个操作,比如读和写尝试并发访问数据库,WiredTiger使用tickets来确保这些操作不会冲突,从而保证数据的完整性和性能。
WiredTiger中的"tickets"实际上是一种资源管理机制,用于限制同时进行的并发读写操作的数量。每当一个读操作或写操作开始时,它需要从相应的票池中获取一个票,操作完成后,票会被返回到池中。如果所有的票都被使用了,新的操作就必须等待,直到有票可用。

 

在MongoDB 7.0之前的版本中,wiredTigerConcurrentReadTransactions、wiredTigerConcurrentWriteTransactions变量控制并发读/写事务进入WiredTiger存储引擎的数量,在MongoDB 7.0中,默认是128个tickets。

db.runCommand({ getParameter: 1, wiredTigerConcurrentReadTransactions: 1 });
{
	"wiredTigerConcurrentReadTransactions" : 128,
[...]}

db.runCommand({ getParameter: 1, wiredTigerConcurrentWriteTransactions: 1 });
{
	"wiredTigerConcurrentWriteTransactions" : 128,
[...]}

 

MongoDB 7.0中,这两个变量变成动态的了。

db.runCommand({ getParameter: 1, wiredTigerConcurrentReadTransactions: 1 });
{
  wiredTigerConcurrentReadTransactions: 0,
[...]}

db.runCommand({ getParameter: 1, wiredTigerConcurrentWriteTransactions: 1 });
{
  wiredTigerConcurrentWriteTransactions: 0,
[...]}

 

db.serverStatus().wiredTiger.concurrentTransactions.read.totalTickets
12

db.serverStatus().wiredTiger.concurrentTransactions.write.totalTickets
12


MongoDB 7.0采用了全新的算法来动态管理tickets。此外,在MongoDB 7.0之前,wiredTigerConcurrentReadTransactions、wiredTigerConcurrentWriteTransactions变量只是适用于WiredTiger存储引擎;自7.0开始,还适用于In-Memory存储引擎。

值得一提的是,有了这一新变化后,应全面检查 WiredTiger 指标,而不是将其作为一个单独的部分,否则可能会得出错误的结论。