We have duplication of code in: Cinder, Nova and in future as well in Neutron.
They all use Scheduler to chose where resource could be obtained. Current algorithm is next:
All resources reports they status to DB Scheduler on each request Fetch All DB records => make decision where to obtain resource => send request
In big deployments we have a lot of recourse that are attacking DB, and scheduler that is fetching big amounts of date from DB => produce bottleneck (that cannot be fixed by adding more DB servers).
Another problem that we have is that cross-project scheduling is impossible. E.g. If you would like to schedule instance on host that has enough disk space. (Nova & Cinder scheduler data)
But fortunately there is the another approach, that doesn't requires too much changes in current arch to cover both things.
Intro: Actually almost almost everything is already done:
Schedulers are separated services, only thing that produce problem is that they are heavy bind to data from DB of project, and that they use DB of project.
To resolve this we can make next steps: 1) Each resource sends updates to scheduler (instead project DB) 2) Scheduler that took this update, sends it to common key-value in memory storage (between all scheduler service). => and using smart algorithm all schedulers updates their state of all resources. 3) Add name space for updates that are sends to scheduler (e.g. cinder/nova/...) 4) Cleanup: All calls to db.api: compute_node and volume_node methods now should work through rpc API of scheduler (and in future should be removed and API of Nova,CInder should directly call Scheduler service)
5) Split new Scheduler from Nova to separated project (now it is simple, cause new repo doesn't change anything) 6) Cinder resources should send updates to new project (Gantt) 7) Copy cinder filters to Gantt 8) Remove old Cinder scheduler and use Gantt
blueprint in Nova: https://blueprints.launchpad.net/nova/+spec/no-db-scheduler