This is a guest post by Douglas Wilson, EMEA Field Application Engineer at Raima, based on insights from biulding their Raima Database Manager.
Scalability is the ability to maintain performance as demands on the system increase, by adding further resources. Normally those resources will be in the form of hardware. Since processor speeds are no longer increasing much, scaling up the hardware normally means adding extra processors or cores, and more memory.
However, scalability requires software that can utilize the extra hardware effectively. The software must be designed to allow parallel processing. In the context of a database engine this means that the server component must be multi-threaded, to allow the operating system to schedule parallel tasks on all the cores that are available. Not only that, but the database engine must provide an efficient way to break its workload into as many parallel tasks as there are cores. So, for example, if the database server always uses only four threads then it will make very little difference whether this server runs on a four-core machine or an eight-core machine.
Splitting up the workload of a database engine to take full advantage of the available hardware is non-trivial, and not all data management systems do this well. There are limits to the scalability of a monolithic server. Not just the database engine, but also data and other system resources need to be split up to avoid interdependencies. The whole system needs to have a distributed design.
For example, most databases store indexes in B-Tree structures. B-Trees allow indexed values to be located quickly, and they also allow relatively efficient insertion and deletion, but for this they need to be “balanced”, i.e. the tree structure must have the same depth across all its branches. The need to keep the tree balanced means that a single insertion or deletion may trigger changes that ripple all the way to the root of the tree. This makes it difficult to share the management of a B-Tree between multiple threads, and therefore between multiple cores. The threads may frequently compete for access to the root of the tree, which becomes a bottleneck.
Scalability is all about minimizing the number of such shared resources, so that different threads can run on different cores without ever having to wait for each other to release shared resources. Without this independence, adding extra cores will not greatly improve performance.
An example of this concept can be shown through experience in our own database management system, RDM. RDM has intelligent support for distributed databases and allows the application to distribute data across the available hardware and minimize contention between different threads and processes. Since this objective cannot usually be achieved without knowledge of the data structure and use cases, the database engine must allow the application writer to specify which data will be handled by which server. RDM’s server process (called the Transactional File Server, or TFS) is a relatively lightweight process and multiple instances of the TFS can run on multi-core systems; each assigned to different databases, and completely independent of each other. The client is able to connect to all of these and retrieve data from them as if it was just reading one database. RDM therefore provides building blocks that allow the creation of a truly scalable application.
In situations where simultaneous read and write access to the same data is required, support for Multi Version Concurrency Control (MVCC) allows this simultaneous access without blocking the threads or processes involved. MVCC allows a reader to view a snapshot of the data before the writer’s changes, allowing the read and write operations to continue in parallel.
Replication may also be used as a way to improve scalability, by providing multiple read-only replicas of a master database. This may enable processes running on remote processors to read a local copy of the database. It may also help by reducing the number of processes trying to access the master database.
To summarize, the following features of a database management system allow a highly scalable, distributed data architecture: