Here is the Scheduler interface: https://github.com/apache/cassandra/blob/cassandra-3.11/conf/cassandra.yaml#L978

Seems like it could be used for this case.

It is removed in 4.x with thrift, not sure why: https://github.com/apache/cassandra/commit/4881d9c308ccd6b5ca70925bf6ebedb70e7705fc

Thanks,
Jay

On 2/22/17 3:39 PM, Eric Stevens wrote:
We’ve actually had several customers where we’ve done the opposite -
split large clusters apart to separate uses cases

We do something similar but for a single application.  We're
functionally sharding data to different clusters from a single
application.  We can have different server classes for different types
of workloads, we can grow and size clusters accordingly, and we also do
things like time sharding so that we can let at-rest data go to cheaper
storage options.

I agree with the general sentiment here that (at least as it stands
today) a monolithic cluster for many applications does not compete to
per-application clusters unless cost is no issue.  At our scale, the
terabytes of C* data we take in per day means that even very small cost
savings really add up at scale.  And even where cost is no issue, the
additional isolation and workload tailoring is still highly valuable.

On Wed, Feb 22, 2017 at 12:01 PM Edward Capriolo <edlinuxg...@gmail.com
<mailto:edlinuxg...@gmail.com>> wrote:



    On Wed, Feb 22, 2017 at 1:20 PM, Abhishek Verma <ve...@uber.com
    <mailto:ve...@uber.com>> wrote:

        We have lots of dedicated Cassandra clusters for large use
        cases, but we have a long tail of (~100) of internal customers
        who want to store < 200GB of data with < 5k qps and non-critical
        data. It does not make sense to create a 3 node dedicated
        cluster for each of these small use cases. So we have a shared
        cluster into which we onboard these users.

        But once in a while, one of the customers will run a ingest job
        from HDFS which will pound the shared cluster and break our SLA
        for the cluster for all the other customers. Currently, I don't
        see anyway to signal back pressure to the ingestion jobs or
        throttle their requests. Another example is one customer doing a
        large number of range queries which has the same effect.

        A simple way to avoid this is to throttle the read or write
        requests based on some quota limits for each keyspace or user.

        Please see replies inlined:

        On Mon, Feb 20, 2017 at 11:46 PM, vincent gromakowski
        <vincent.gromakow...@gmail.com
        <mailto:vincent.gromakow...@gmail.com>> wrote:

            Aren't you using mesos Cassandra framework to manage your
            multiple clusters ? (Seen a presentation in cass summit)

        Yes we are
        using https://github.com/mesosphere/dcos-cassandra-service and
        contribute heavily to it. I am aware of the presentation
        (https://www.youtube.com/watch?v=4Ap-1VT2ChU) at the Cassandra
        summit as I was the one who gave it :)
        This has helped us automate the creation and management of these
        clusters.

            What's wrong with your current mesos approach ?

        Hardware efficiency: Spinning up dedicated clusters for each use
        case wastes a lot of hardware resources. One of the approaches
        we have taken is spinning up multiple Cassandra nodes belonging
        to different clusters on the same physical machine. However, we
        still have overhead of managing these separate multi-tenant
        clusters.

            I am also thinking it's better to split a large cluster into
            smallers except if you also manage client layer that query
            cass and you can put some backpressure or rate limit in it.

        We have an internal storage API layer that some of the clients
        use, but there are many customers who use the vanilla DataStax
        Java or Python driver. Implementing throttling in each of those
        clients does not seem like a viable approach.

            Le 21 févr. 2017 2:46 AM, "Edward Capriolo"
            <edlinuxg...@gmail.com <mailto:edlinuxg...@gmail.com>> a écrit :

                Older versions had a request scheduler api.

        I am not aware of the history behind it. Can you please point me
        to the JIRA tickets and/or why it was removed?

                On Monday, February 20, 2017, Ben Slater
                <ben.sla...@instaclustr.com> wrote:

                    We’ve actually had several customers where we’ve
                    done the opposite - split large clusters apart to
                    separate uses cases. We found that this allowed us
                    to better align hardware with use case requirements
                    (for example using AWS c3.2xlarge for very hot data
                    at low latency, m4.xlarge for more general purpose
                    data) we can also tune JVM settings, etc to meet
                    those uses cases.

        There have been several instances where we have moved customers
        out of the shared cluster to their own dedicated clusters
        because they outgrew our limitations. But I don't think it makes
        sense to move all the small use cases into their separate clusters.

                    On Mon, 20 Feb 2017 at 22:21 Oleksandr Shulgin
                    <oleksandr.shul...@zalando.de> wrote:

                        On Sat, Feb 18, 2017 at 3:12 AM, Abhishek Verma
                        <ve...@uber.com> wrote:

                            Cassandra is being used on a large scale at
                            Uber. We usually create dedicated clusters
                            for each of our internal use cases, however
                            that is difficult to scale and manage.

                            We are investigating the approach of using a
                            single shared cluster with 100s of nodes and
                            handle 10s to 100s of different use cases
                            for different products in the same cluster.
                            We can define different keyspaces for each
                            of them, but that does not help in case of
                            noisy neighbors.

                            Does anybody in the community have similar
                            large shared clusters and/or face noisy
                            neighbor issues?


                        Hi,

                        We've never tried this approach and given my
                        limited experience I would find this a terrible
                        idea from the perspective of maintenance
                        (remember the old saying about basket and eggs?)

        What if you have a limited number of baskets and several eggs
        which are not critical if they break rarely.


                        What potential benefits do you see?

        The main benefit of sharing a single cluster among several small
        use cases is increasing the hardware efficiency and decreasing
        the management overhead of a large number of clusters.

        Thanks everyone for your replies and questions.

        -Abhishek.


    I agree with these assertions. On one hand I think about a "managed
    service" like say Amazon DynamoDB. They likely start with
    very/very/very large footprints. IE they commission huge clusters of
    the fastest SSD hardware. Next every application/user has a quota.
    They always can control the basic load because they control the quota.

    Control on the hardware level makes sense, but then your unit of
    management is "a cluster" . Users do not have a unified API anymore,
    they have switch statements, this data in cluster x, this data
    cluster y. You still end up in cases where degenerate usage patterns
    affect others.

    With Cassandra it would be nice if these controls were build into
    the API. This could also help you build your own charge back model
    in the enterprise. Sure as someone pointed out rejecting reads
    stinks for that user. But then again someone has to decide who and
    how pays for the hardware.

    For example, imagine a company with 19 business units all using the
    same Cassandra cluster. One business unit might account for 90% of
    the storage, but 1% of the requests. Another business unit might be
    95% of the requests, but 1% the data. How do you come up with a
    billing model? For the customer with 95% of the requests their
    "cost" on the systems is young generation GC, network.

    Datastax enterprise had/has a concept of  "the analytic dc". The
    concept is "real time goes here" and "analytic goes there" with the
    right resource controls you could get much more fine grained then
    that. It will never be perfect there will always be that random
    abuser with the "aggregate allow filtering query" but there are ways
    to move in a more managed direction.

Reply via email to