// Start architecture func Start(a *archV0r1) { var r string if archaius.Conf.Population < 1 { log.Fatal("architecture: can't create less than 1 microservice") } else { log.Printf("architecture: scaling to %v%%", archaius.Conf.Population) } asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone for _, s := range a.Services { log.Printf("Starting: %v\n", s) r = asgard.Create(s.Name, s.Gopackage, s.Regions*archaius.Conf.Regions, s.Count*archaius.Conf.Population/100, s.Dependencies...) } asgard.Run(r, a.Victim) // run the last service in the list, and point chaos monkey at the victim }
// Start lamp to netflixoss step by step migration func Start() { regions := archaius.Conf.Regions if archaius.Conf.Population < 1 { log.Fatal("migration: can't create less than 1 microservice") } else { log.Printf("migration: scaling to %v%%", archaius.Conf.Population) } // Build the configuration step by step // start mysql data store layer, which connects to itself mysqlcount := 2 sname := "rds-mysql" // start memcached layer, only one per region mname := "memcache" mcount := 1 if archaius.Conf.StopStep >= 3 { // start evcache layer, one per zone mname = "evcache" mcount = 3 } // priam managed Cassandra cluster, turtle because it's used to configure other clusters priamCassandracount := 12 * archaius.Conf.Population / 100 cname := "cassTurtle" // staash data access layer connects to mysql master and slave, and evcache staashcount := 6 * archaius.Conf.Population / 100 tname := "turtle" // php business logic, we can create a network of simple services from the karyon package phpcount := 9 * archaius.Conf.Population / 100 pname := "php" // some node microservice logic, we can create a network of simple services from the karyon package nodecount := 9 * archaius.Conf.Population / 100 nname := "node" // zuul api proxies and insert between elb and php zuulcount := 9 * archaius.Conf.Population / 100 zuname := "wwwproxy" // AWS elastic load balancer elbname := "www-elb" // DNS endpoint dns := "www" switch archaius.Conf.StopStep { case 0: // basic LAMP asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone asgard.Create(sname, asgard.StorePkg, regions, mysqlcount, sname) asgard.Create(pname, asgard.MonolithPkg, regions, phpcount, sname) asgard.Create(elbname, asgard.ElbPkg, regions, 0, pname) case 1: // basic LAMP with memcache asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone asgard.Create(sname, asgard.StorePkg, regions, mysqlcount, sname) asgard.Create(mname, asgard.StorePkg, regions, mcount) asgard.Create(pname, asgard.MonolithPkg, regions, phpcount, sname, mname) asgard.Create(elbname, asgard.ElbPkg, regions, 0, pname) case 2: // LAMP with zuul and memcache asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone asgard.Create(sname, asgard.StorePkg, regions, mysqlcount, sname) asgard.Create(mname, asgard.StorePkg, regions, mcount) asgard.Create(pname, asgard.MonolithPkg, regions, phpcount, sname, mname) asgard.Create(zuname, asgard.ZuulPkg, regions, zuulcount, pname) asgard.Create(elbname, asgard.ElbPkg, regions, 0, zuname) case 3: // LAMP with zuul and staash and evcache asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone asgard.Create(sname, asgard.StorePkg, regions, mysqlcount, sname) asgard.Create(mname, asgard.StorePkg, regions, mcount) asgard.Create(tname, asgard.StaashPkg, regions, staashcount, sname, mname) asgard.Create(pname, asgard.KaryonPkg, regions, phpcount, tname) asgard.Create(zuname, asgard.ZuulPkg, regions, zuulcount, pname) asgard.Create(elbname, asgard.ElbPkg, regions, 0, zuname) case 4: // added node microservice asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone asgard.Create(sname, asgard.StorePkg, regions, mysqlcount, sname) asgard.Create(mname, asgard.StorePkg, regions, mcount) asgard.Create(tname, asgard.StaashPkg, regions, staashcount, sname, mname, cname) asgard.Create(pname, asgard.KaryonPkg, regions, phpcount, tname) asgard.Create(nname, asgard.KaryonPkg, regions, nodecount, tname) asgard.Create(zuname, asgard.ZuulPkg, regions, zuulcount, pname, nname) asgard.Create(elbname, asgard.ElbPkg, regions, 0, zuname) case 5: // added cassandra alongside mysql asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone asgard.Create(cname, asgard.PriamCassandraPkg, regions, priamCassandracount, cname) asgard.Create(sname, asgard.StorePkg, regions, mysqlcount, sname) asgard.Create(mname, asgard.StorePkg, regions, mcount) asgard.Create(tname, asgard.StaashPkg, regions, staashcount, sname, mname, cname) asgard.Create(pname, asgard.KaryonPkg, regions, phpcount, tname) asgard.Create(nname, asgard.KaryonPkg, regions, nodecount, tname) asgard.Create(zuname, asgard.ZuulPkg, regions, zuulcount, pname, nname) asgard.Create(elbname, asgard.ElbPkg, regions, 0, zuname) case 6: // removed mysql so that multi-region will work properly asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone asgard.Create(cname, asgard.PriamCassandraPkg, regions, priamCassandracount, cname) asgard.Create(mname, asgard.StorePkg, regions, mcount) asgard.Create(tname, asgard.StaashPkg, regions, staashcount, mname, cname) asgard.Create(pname, asgard.KaryonPkg, regions, phpcount, tname) asgard.Create(nname, asgard.KaryonPkg, regions, nodecount, tname) asgard.Create(zuname, asgard.ZuulPkg, regions, zuulcount, pname, nname) asgard.Create(elbname, asgard.ElbPkg, regions, 0, zuname) case 7: // set two regions with disconnected priamCassandra regions = 2 archaius.Conf.Regions = regions asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone asgard.Create(cname, asgard.PriamCassandraPkg, regions, priamCassandracount, cname) asgard.Create(mname, asgard.StorePkg, regions, mcount) asgard.Create(tname, asgard.StaashPkg, regions, staashcount, mname, cname) asgard.Create(pname, asgard.KaryonPkg, regions, phpcount, tname) asgard.Create(nname, asgard.KaryonPkg, regions, nodecount, tname) asgard.Create(zuname, asgard.ZuulPkg, regions, zuulcount, pname, nname) asgard.Create(elbname, asgard.ElbPkg, regions, 0, zuname) case 8: // set two regions with connected priamCassandra regions = 2 archaius.Conf.Regions = regions asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone asgard.Create(cname, asgard.PriamCassandraPkg, regions, priamCassandracount, "eureka", cname) asgard.Create(mname, asgard.StorePkg, regions, mcount) asgard.Create(tname, asgard.StaashPkg, regions, staashcount, mname, cname) asgard.Create(pname, asgard.KaryonPkg, regions, phpcount, tname) asgard.Create(nname, asgard.KaryonPkg, regions, nodecount, tname) asgard.Create(zuname, asgard.ZuulPkg, regions, zuulcount, pname, nname) asgard.Create(elbname, asgard.ElbPkg, regions, 0, zuname) case 9: // set three regions with disconnected priamCassandra regions = 3 archaius.Conf.Regions = regions asgard.CreateChannels() asgard.CreateEureka() // service registries for each zone asgard.Create(cname, asgard.PriamCassandraPkg, regions, priamCassandracount, "eureka", cname) asgard.Create(mname, asgard.StorePkg, regions, mcount) asgard.Create(tname, asgard.StaashPkg, regions, staashcount, mname, cname) asgard.Create(pname, asgard.KaryonPkg, regions, phpcount, tname) asgard.Create(nname, asgard.KaryonPkg, regions, nodecount, tname) asgard.Create(zuname, asgard.ZuulPkg, regions, zuulcount, pname, nname) asgard.Create(elbname, asgard.ElbPkg, regions, 0, zuname) } dnsname := asgard.Create(dns, asgard.DenominatorPkg, 0, 0, elbname) asgard.Run(dnsname, "") }