226
Evolving architecture - further Adding the Michelin stars Leo Lapworth @ YAPC::EU 2008 http://leo.cuckoo.org / (See seperate evolving architecture presentation for first part)

Evolving Architecture - Further

Embed Size (px)

DESCRIPTION

More tools and their evolution - how they make your life easier - from server configuration to job queuing systems, cloud computing and autoinstalls

Citation preview

Page 1: Evolving Architecture - Further

Evolving architecture - further

Adding the Michelin stars

Leo Lapworth @ YAPC::EU 2008http://leo.cuckoo.org/

(See seperate evolving architecture presentation for first part)

Page 2: Evolving Architecture - Further

Evolving architecture - further

Adding the Michelin stars

Leo Lapworth @ YAPC::EU 2008http://leo.cuckoo.org/

(See seperate evolving architecture presentation for first part)

Page 3: Evolving Architecture - Further

Covering

Page 4: Evolving Architecture - Further

Covering

Server configuration

Page 5: Evolving Architecture - Further

Covering

Server configurationTesting

Page 6: Evolving Architecture - Further

Covering

Server configurationTestingPerformance

Page 7: Evolving Architecture - Further

Covering

Server configurationTestingPerformanceWeb Frameworks

Page 8: Evolving Architecture - Further

Covering

Server configurationTestingPerformanceWeb FrameworksServer maintenance

Page 9: Evolving Architecture - Further

Covering

Server configurationTestingPerformanceWeb FrameworksServer maintenanceObject relational mapping

Page 10: Evolving Architecture - Further

Covering

Server configurationTestingPerformanceWeb FrameworksServer maintenanceObject relational mappingCloud Computing

Page 11: Evolving Architecture - Further

Covering

Server configurationTestingPerformanceWeb FrameworksServer maintenanceObject relational mappingCloud Computing

Page 12: Evolving Architecture - Further
Page 13: Evolving Architecture - Further

Kid splashing in puddle(representing the non-

depth nature of this talk)

Page 14: Evolving Architecture - Further

Deep sea glass squid(representing depth)Kid splashing in puddle

(representing the non-depth nature of this talk)

Page 15: Evolving Architecture - Further

Deep sea glass squid(representing depth)Kid splashing in puddle

(representing the non-depth nature of this talk)

Page 16: Evolving Architecture - Further

How to use this talk

Page 17: Evolving Architecture - Further

How to use this talk

How this could work

for me?

Page 18: Evolving Architecture - Further

Play!

How to use this talk

How this could work

for me?

Page 19: Evolving Architecture - Further

Original content

Page 20: Evolving Architecture - Further

Original content

0%

Page 21: Evolving Architecture - Further

Original content

0%It's about putting the pieces together

Page 22: Evolving Architecture - Further

Managing many servers

Page 23: Evolving Architecture - Further

Automatic server setup

Page 24: Evolving Architecture - Further

Automatic server setup

Look at Puppet

Page 25: Evolving Architecture - Further

Puppet & Puppetmaster

Page 26: Evolving Architecture - Further

Puppet & Puppetmaster

Elmo(database)

Page 27: Evolving Architecture - Further

Puppet & Puppetmaster

Bert(app server)

Elmo(database)

Page 28: Evolving Architecture - Further

Puppet & Puppetmaster

Bert(app server)

Ernie(image server)

Elmo(database)

Page 29: Evolving Architecture - Further

Puppet & Puppetmaster

Page 30: Evolving Architecture - Further

Puppet & Puppetmaster

Elmo(database)

Page 31: Evolving Architecture - Further

Puppet & Puppetmaster

Elmo(database)

Bert(app server)

Page 32: Evolving Architecture - Further

Puppet & Puppetmaster

Elmo(database)

Bert(app server)

Ernie(image server)

Page 33: Evolving Architecture - Further

Puppet & Puppetmaster

Kermit(Puppetmaster)

Elmo(database)

Bert(app server)

Ernie(image server)

Page 34: Evolving Architecture - Further

Puppet & Puppetmaster

Kermit(Puppetmaster)

Elmo(database)

Bert(app server)

Ernie(image server)

Yes, I know Kermit was Muppetsand below were Sesame Street

Page 35: Evolving Architecture - Further

What to manage?

Page 36: Evolving Architecture - Further

What to manage?

Packages (installing/removing/configuring)

Page 37: Evolving Architecture - Further

What to manage?

Packages (installing/removing/configuring)

Services (running/restarting)

Page 38: Evolving Architecture - Further

What to manage?

Packages (installing/removing/configuring)

Services (running/restarting)

Users (adding/setting passwords)

Page 39: Evolving Architecture - Further

What to manage?

Packages (installing/removing/configuring)

Services (running/restarting)

Users (adding/setting passwords)

Cron (installing)

Page 40: Evolving Architecture - Further

What to manage?

Packages (installing/removing/configuring)

Services (running/restarting)

Users (adding/setting passwords)

Cron (installing)

Files and directories (installing/removing/checking)

Page 41: Evolving Architecture - Further

Manage packages

Page 42: Evolving Architecture - Further

Manage packages

# Editors

package { emacs: ensure => latest }

package { vim: ensure => latest }

package { nano: ensure => absent }

Page 43: Evolving Architecture - Further

Services

Page 44: Evolving Architecture - Further

Servicesclass base_ssh { package { "openssh-client": ensure => installed } package { "openssh-server": ensure => installed }

user { sshd: home => "/var/run/sshd", shell => "/usr/sbin/nologin", allowdupe => false, }

service { ssh: ensure => running, pattern => "sshd", require => Package["openssh-server"], }}

Page 45: Evolving Architecture - Further

Manage users

Page 46: Evolving Architecture - Further

Manage users user { leouser: user => 'leo', fullname => 'Leo', path => $path, password => '$1$qW*&^%&^%$^&%$.' }

Page 47: Evolving Architecture - Further

Manage users user { leouser: user => 'leo', fullname => 'Leo', path => $path, password => '$1$qW*&^%&^%$^&%$.' } # Setup ssh keys as well file { "$path/$user/.ssh/authorized_keys": owner => "$user", group => "$user", mode => 600, source => [ "$fileserver/default/$path/$user/ssh/authorized_keys" ], }

Page 48: Evolving Architecture - Further

Cron

Page 49: Evolving Architecture - Further

Croncron {

script_name:

command => "/usr/local/bin/script.pl foo",

user => "web",

hour => '4',

minute => '30',

ensure => "present";

}

Page 50: Evolving Architecture - Further

Node setup

Page 51: Evolving Architecture - Further

Node setup

node ernie {

include base_ssh

include base_users

include cron::database

}

Page 52: Evolving Architecture - Further

Installing on client

Page 53: Evolving Architecture - Further

Installing on client

apt-get install puppet

puppetd --server=puppet.domain.com

Page 54: Evolving Architecture - Further

Monitoring (simply)

Page 55: Evolving Architecture - Further

Monitoring (simply)

Page 56: Evolving Architecture - Further

Monitoring (simply)

Page 57: Evolving Architecture - Further

Monitoring (simply)With (m)any servers you need

- Monitoring

- Alerts

Page 58: Evolving Architecture - Further

Munin

Page 59: Evolving Architecture - Further

Munin

Install (with puppet!):

Page 60: Evolving Architecture - Further

Munin

Install (with puppet!):

Server:

Page 61: Evolving Architecture - Further

Munin

Install (with puppet!):

Server:

package { "munin": ensure => latest }

Page 62: Evolving Architecture - Further

Munin

Install (with puppet!):

Server:

package { "munin": ensure => latest }

Client:

Page 63: Evolving Architecture - Further

Munin

Install (with puppet!):

Server:

package { "munin": ensure => latest }

Client:

package { "munin-node": ensure => latest }

Page 64: Evolving Architecture - Further

Quick overview (Munin)

Page 65: Evolving Architecture - Further

Quick overview (Munin)Server config:

[cuckoo;braga] address 62.222.3.44

And you get:

Page 66: Evolving Architecture - Further

Quick overview (Munin)Server config:

[cuckoo;braga] address 62.222.3.44

And you get:

Page 67: Evolving Architecture - Further

What's happening?

Page 68: Evolving Architecture - Further

What's happening?

Page 69: Evolving Architecture - Further

Also emails alerts:

cuckoo :: Braga :: WARNINGs:

packets is 0.00 (outside range [:1]),

CRITICALs:

sshd is 0.00 (outside range [1:]),

Page 70: Evolving Architecture - Further

Custom plugins

Page 71: Evolving Architecture - Further

Custom pluginsconfigure my_app

Page 72: Evolving Architecture - Further

Custom pluginsconfigure my_appgraph_title My App

Page 73: Evolving Architecture - Further

Custom pluginsconfigure my_appgraph_title My Appgraph_vlabel requests

Page 74: Evolving Architecture - Further

Custom pluginsconfigure my_appgraph_title My Appgraph_vlabel requestsgraph_category Apps

Page 75: Evolving Architecture - Further

Custom pluginsconfigure my_appgraph_title My Appgraph_vlabel requestsgraph_category Appsgraph_info Requests to my app

Page 76: Evolving Architecture - Further

Custom pluginsconfigure my_appgraph_title My Appgraph_vlabel requestsgraph_category Appsgraph_info Requests to my apprequests.label Requests

Page 77: Evolving Architecture - Further

Custom pluginsconfigure my_appgraph_title My Appgraph_vlabel requestsgraph_category Appsgraph_info Requests to my apprequests.label Requestsrequests.type COUNTER

Page 78: Evolving Architecture - Further

Custom pluginsconfigure my_appgraph_title My Appgraph_vlabel requestsgraph_category Appsgraph_info Requests to my apprequests.label Requestsrequests.type COUNTER

fetch my_app

Page 79: Evolving Architecture - Further

Custom pluginsconfigure my_appgraph_title My Appgraph_vlabel requestsgraph_category Appsgraph_info Requests to my apprequests.label Requestsrequests.type COUNTER

fetch my_apprequests.value 450424

Page 80: Evolving Architecture - Further

Virtual Machines

Page 81: Evolving Architecture - Further

Virtual MachinesPhysical server

Page 82: Evolving Architecture - Further

Virtual MachinesPhysical server

Virtual machine

Page 83: Evolving Architecture - Further

Virtual MachinesPhysical server

Virtual machine

Virtual machine

Page 84: Evolving Architecture - Further

Virtual MachinesPhysical server

Virtual machine

Virtual machine

Virtual machine

Page 85: Evolving Architecture - Further

Virtual Machines

Xen - dom0 (Linux, NetBSD, Solaris - controller)

Physical serverVirtual machine

Virtual machine

Virtual machine

Page 86: Evolving Architecture - Further

Virtual Machines

Xen - dom0 (Linux, NetBSD, Solaris - controller)

VM - domU (*nix, even some Windoz) guest OS

Physical serverVirtual machine

Virtual machine

Virtual machine

Page 87: Evolving Architecture - Further

Virtual Machines

Xen - dom0 (Linux, NetBSD, Solaris - controller)

VM - domU (*nix, even some Windoz) guest OS

+ Puppet = configured VMs quickly

Physical serverVirtual machine

Virtual machine

Virtual machine

Page 88: Evolving Architecture - Further

Virtual Machines

Xen - dom0 (Linux, NetBSD, Solaris - controller)

VM - domU (*nix, even some Windoz) guest OS

+ Puppet = configured VMs quickly

Physical serverVirtual machine

Virtual machine

Virtual machine

Page 89: Evolving Architecture - Further

Testing & VMs

Page 90: Evolving Architecture - Further

Testing & VMs

Why use mock objects / databases when you can start a whole new machine in < 10 mins?

Page 91: Evolving Architecture - Further

Testing & VMs

Why use mock objects / databases when you can start a whole new machine in < 10 mins?

TDD - Test Driven Development

Page 92: Evolving Architecture - Further

Testing & VMs

Why use mock objects / databases when you can start a whole new machine in < 10 mins?

TDD - Test Driven Development

TDD - Test Driven Deployment

Page 93: Evolving Architecture - Further

Testing & VMs

Why use mock objects / databases when you can start a whole new machine in < 10 mins?

TDD - Test Driven Development

TDD - Test Driven Deployment

Start with monitoring, your VM is installed when your monitoring reports OKs...

Page 94: Evolving Architecture - Further

Profiling

Page 95: Evolving Architecture - Further

Profiling

Quote from someone talking at a Google Code Jam "Why don't people spend more time profiling so they can make their code faster?"

Page 96: Evolving Architecture - Further

Profiling

Quote from someone talking at a Google Code Jam "Why don't people spend more time profiling so they can make their code faster?"

Response: "Developer time is expensive... computing power is not."

Page 97: Evolving Architecture - Further

Profiling

Quote from someone talking at a Google Code Jam "Why don't people spend more time profiling so they can make their code faster?"

Response: "Developer time is expensive... computing power is not."

However if you do need find bottle necks Devel::NYTProf looks fantastic for Perl profiling.

Page 98: Evolving Architecture - Further

Profiling

Quote from someone talking at a Google Code Jam "Why don't people spend more time profiling so they can make their code faster?"

Response: "Developer time is expensive... computing power is not."

However if you do need find bottle necks Devel::NYTProf looks fantastic for Perl profiling.

Or use more computers...

Page 99: Evolving Architecture - Further

Problem with more computers

Page 100: Evolving Architecture - Further

Problem with more computers

More hardware... to go wrong!

Page 101: Evolving Architecture - Further
Page 102: Evolving Architecture - Further

Cloud Computing

Page 103: Evolving Architecture - Further

Cloud storage

Page 104: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

Page 105: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new(

Page 106: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id,

Page 107: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key,

Page 108: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key,

retry => 1,

Page 109: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key,

retry => 1, }

Page 110: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key,

retry => 1, });

Page 111: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key,

retry => 1, });$bucket = $s3->bucket('$name_backup_important_stuff');

Page 112: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key,

retry => 1, });$bucket = $s3->bucket('$name_backup_important_stuff');

# store a file in the bucket (any size - handled well)

Page 113: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key,

retry => 1, });$bucket = $s3->bucket('$name_backup_important_stuff');

# store a file in the bucket (any size - handled well)$bucket->add_key_filename( '1.JPG', 'DSC06256.JPG');

Page 114: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key,

retry => 1, });$bucket = $s3->bucket('$name_backup_important_stuff');

# store a file in the bucket (any size - handled well)$bucket->add_key_filename( '1.JPG', 'DSC06256.JPG');

# get the file back

Page 115: Evolving Architecture - Further

Cloud storageuse Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key,

retry => 1, });$bucket = $s3->bucket('$name_backup_important_stuff');

# store a file in the bucket (any size - handled well)$bucket->add_key_filename( '1.JPG', 'DSC06256.JPG');

# get the file back$bucket->get_key_filename( '1.JPG', 'GET', 'backup.jpg' );

Page 116: Evolving Architecture - Further

Cloud storage

Page 117: Evolving Architecture - Further

Cloud storage

• No worrying about dead disks

Page 118: Evolving Architecture - Further

Cloud storage

• No worrying about dead disks

• No worrying about RAID configuration

Page 119: Evolving Architecture - Further

Cloud storage

• No worrying about dead disks

• No worrying about RAID configuration

• No worrying about backups

Page 120: Evolving Architecture - Further

Cloud storage

• No worrying about dead disks

• No worrying about RAID configuration

• No worrying about backups

Page 121: Evolving Architecture - Further

Cloud storage

• No worrying about dead disks

• No worrying about RAID configuration

• No worrying about backups

• Cost of storing 1/2 TB =~ £38 =~ €48 per month (transfer in/out is on top of that)

Page 122: Evolving Architecture - Further

Cloud storage

• No worrying about dead disks

• No worrying about RAID configuration

• No worrying about backups

• Cost of storing 1/2 TB =~ £38 =~ €48 per month (transfer in/out is on top of that)

• Issue: Trusting someone else with your data

Page 123: Evolving Architecture - Further

Cloud computing

Page 124: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

Page 125: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new(

Page 126: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id,

Page 127: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id, SecretAccessKey => $aws_secret_access_key,

Page 128: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id, SecretAccessKey => $aws_secret_access_key,);

Page 129: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id, SecretAccessKey => $aws_secret_access_key,);

# developer-tools/Debian-Etch_Catalyst_DBIC_TT.manifest.xml

Page 130: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id, SecretAccessKey => $aws_secret_access_key,);

# developer-tools/Debian-Etch_Catalyst_DBIC_TT.manifest.xml my $ami = 'ami-bdbe5ad4'; # Your AMI here

Page 131: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id, SecretAccessKey => $aws_secret_access_key,);

# developer-tools/Debian-Etch_Catalyst_DBIC_TT.manifest.xml my $ami = 'ami-bdbe5ad4'; # Your AMI here

my $instance = $ec2->run_instances(

Page 132: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id, SecretAccessKey => $aws_secret_access_key,);

# developer-tools/Debian-Etch_Catalyst_DBIC_TT.manifest.xml my $ami = 'ami-bdbe5ad4'; # Your AMI here

my $instance = $ec2->run_instances( ImageId => $ami,

Page 133: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id, SecretAccessKey => $aws_secret_access_key,);

# developer-tools/Debian-Etch_Catalyst_DBIC_TT.manifest.xml my $ami = 'ami-bdbe5ad4'; # Your AMI here

my $instance = $ec2->run_instances( ImageId => $ami, MinCount => 1,

Page 134: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id, SecretAccessKey => $aws_secret_access_key,);

# developer-tools/Debian-Etch_Catalyst_DBIC_TT.manifest.xml my $ami = 'ami-bdbe5ad4'; # Your AMI here

my $instance = $ec2->run_instances( ImageId => $ami, MinCount => 1, MaxCount => 1,

Page 135: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id, SecretAccessKey => $aws_secret_access_key,);

# developer-tools/Debian-Etch_Catalyst_DBIC_TT.manifest.xml my $ami = 'ami-bdbe5ad4'; # Your AMI here

my $instance = $ec2->run_instances( ImageId => $ami, MinCount => 1, MaxCount => 1, SecurityGroup => $secure_group_name,

Page 136: Evolving Architecture - Further

Cloud computinguse Net::Amazon::EC2;

my $ec2 = Net::Amazon::EC2->new( AWSAccessKeyId => $aws_access_key_id, SecretAccessKey => $aws_secret_access_key,);

# developer-tools/Debian-Etch_Catalyst_DBIC_TT.manifest.xml my $ami = 'ami-bdbe5ad4'; # Your AMI here

my $instance = $ec2->run_instances( ImageId => $ami, MinCount => 1, MaxCount => 1, SecurityGroup => $secure_group_name,);

Page 137: Evolving Architecture - Further

Cloud computing + Puppet

Page 138: Evolving Architecture - Further

Cloud computing + Puppet

Upload your Xen instance (your own AMI)

Page 139: Evolving Architecture - Further

Cloud computing + Puppet

Upload your Xen instance (your own AMI)

Can now start and manage as many or as few servers as we want.

Page 140: Evolving Architecture - Further

EC2 issues

Page 141: Evolving Architecture - Further

EC2 issuesWhen an instance goes down all local data is lost

Page 142: Evolving Architecture - Further

EC2 issuesWhen an instance goes down all local data is lost

S3 is only permanent storage (at the moment)

Page 143: Evolving Architecture - Further

EC2 issuesWhen an instance goes down all local data is lost

S3 is only permanent storage (at the moment)

Gandi - beta

Page 144: Evolving Architecture - Further

EC2 issuesWhen an instance goes down all local data is lost

S3 is only permanent storage (at the moment)

Gandi - beta

See Léon's talk after the break for more

Page 145: Evolving Architecture - Further

Job queuing

Page 146: Evolving Architecture - Further

Job queuing

Running jobs across many machines

Page 147: Evolving Architecture - Further

Job queuing

Running jobs across many machines

- Resizing images

Page 148: Evolving Architecture - Further

Job queuing

Running jobs across many machines

- Resizing images

- Running calculations

Page 149: Evolving Architecture - Further

Job queuing

Running jobs across many machines

- Resizing images

- Running calculations

- Anything that doesn't have to be realtime

Page 150: Evolving Architecture - Further

Jobs to do

Page 151: Evolving Architecture - Further

Jobs to do

Image resizing

Page 152: Evolving Architecture - Further

Jobs to do

2/4

1/3

9/3

CalculationsImage resizing

Page 153: Evolving Architecture - Further

Jobs to do

2/4

1/3

9/3

CalculationsImage resizing File conversions

Page 154: Evolving Architecture - Further

Put jobs into queue

Page 155: Evolving Architecture - Further

Put jobs into queue

my $job = TheSchwartz::Job->new(

funcname => $funcname,

arg => $arg,

uniqkey => $uniqkey,

);

$the_schwartz->insert($job);

Page 156: Evolving Architecture - Further

Jobs go into the queue

Page 157: Evolving Architecture - Further

Jobs go into the queue

Page 158: Evolving Architecture - Further

Jobs go into the queue

Page 159: Evolving Architecture - Further

Jobs go into the queue

1/3

Page 160: Evolving Architecture - Further

Jobs go into the queue

1/3

9/3

Page 161: Evolving Architecture - Further

Jobs go into the queue

1/3

9/3

Page 162: Evolving Architecture - Further

Jobs go into the queue

1/3

9/3

Page 163: Evolving Architecture - Further

Jobs go into the queue

1/3

9/3

Page 164: Evolving Architecture - Further

Jobs go into the queue

1/3

9/3

Page 165: Evolving Architecture - Further

Jobs go into the queue

1/3

9/3

2/4

Page 166: Evolving Architecture - Further

And on each worker

Page 167: Evolving Architecture - Further

And on each worker

$the_schwartz->can_do($funcname_1);

$the_schwartz->can_do($funcname_2);

$the_schwartz->work_until_done;

Page 168: Evolving Architecture - Further

Each computer does tasks

Worker 1 Worker 2 Worker 3

Page 169: Evolving Architecture - Further

Each computer does tasks

Worker 1 Worker 2 Worker 3

Page 170: Evolving Architecture - Further

Each computer does tasks

Worker 1 Worker 2 Worker 3

Page 171: Evolving Architecture - Further

Each computer does tasks

1/3

Worker 1 Worker 2 Worker 3

Page 172: Evolving Architecture - Further

Each computer does tasks

1/39/3

Worker 1 Worker 2 Worker 3

Page 173: Evolving Architecture - Further

Each computer does tasks

1/39/3

Worker 1 Worker 2 Worker 3

Page 174: Evolving Architecture - Further

Each computer does tasks

1/39/3

Worker 1 Worker 2 Worker 3

Page 175: Evolving Architecture - Further

Each computer does tasks

1/39/3

Worker 1 Worker 2 Worker 3

Page 176: Evolving Architecture - Further

Each computer does tasks

1/39/3

Worker 1 Worker 2 Worker 3

Page 177: Evolving Architecture - Further

Each computer does tasks

1/39/3

2/4

Worker 1 Worker 2 Worker 3

Page 178: Evolving Architecture - Further

Tools to make development easier

Page 179: Evolving Architecture - Further

DBIx::Class (ORM)

Page 180: Evolving Architecture - Further

DBIx::Class (ORM)ORM = Object Relational Mapper

Page 181: Evolving Architecture - Further

DBIx::Class (ORM)ORM = Object Relational Mapper

= AKA Database tables to objects

Page 182: Evolving Architecture - Further

DBIx::Class (ORM)ORM = Object Relational Mapper

= AKA Database tables to objects

Old:

Page 183: Evolving Architecture - Further

DBIx::Class (ORM)ORM = Object Relational Mapper

= AKA Database tables to objects

Old:

my $sth = $dbh->prepare("select * from $table where id = ?");

Page 184: Evolving Architecture - Further

DBIx::Class (ORM)ORM = Object Relational Mapper

= AKA Database tables to objects

Old:

my $sth = $dbh->prepare("select * from $table where id = ?");

$sth->execute($id);

Page 185: Evolving Architecture - Further

DBIx::Class (ORM)ORM = Object Relational Mapper

= AKA Database tables to objects

Old:

my $sth = $dbh->prepare("select * from $table where id = ?");

$sth->execute($id);

my $result = $sth->fetchrow_hashref();

Page 186: Evolving Architecture - Further

DBIx::Class (ORM)ORM = Object Relational Mapper

= AKA Database tables to objects

Old:

my $sth = $dbh->prepare("select * from $table where id = ?");

$sth->execute($id);

my $result = $sth->fetchrow_hashref();

my $update = $dbh->prepare("update $table set FIELD = ? where id = ?");

Page 187: Evolving Architecture - Further

DBIx::Class (ORM)ORM = Object Relational Mapper

= AKA Database tables to objects

Old:

my $sth = $dbh->prepare("select * from $table where id = ?");

$sth->execute($id);

my $result = $sth->fetchrow_hashref();

my $update = $dbh->prepare("update $table set FIELD = ? where id = ?");

$update->execute('new value',$result->{id});

Page 188: Evolving Architecture - Further

DBIx::Class (ORM)

Page 189: Evolving Architecture - Further

DBIx::Class (ORM)

vs

Page 190: Evolving Architecture - Further

DBIx::Class (ORM)

vs

my $result =

Page 191: Evolving Architecture - Further

DBIx::Class (ORM)

vs

my $result =

$schema->resultset($table)->find($id);

Page 192: Evolving Architecture - Further

DBIx::Class (ORM)

vs

my $result =

$schema->resultset($table)->find($id);

$result->field('new value');

Page 193: Evolving Architecture - Further

DBIx::Class (ORM)

vs

my $result =

$schema->resultset($table)->find($id);

$result->field('new value');

$result->update;

Page 194: Evolving Architecture - Further

The 'F' word - Frameworks

Page 195: Evolving Architecture - Further

The 'F' word - Frameworks

Do not keep reinventing the wheel

Page 196: Evolving Architecture - Further

The 'F' word - Frameworks

Web development - use tools so you do not re-implement the the basics each time (Catalyst, JIFTY, one of the many others)

Do not keep reinventing the wheel

Page 197: Evolving Architecture - Further

The 'F' word - Frameworks

Web development - use tools so you do not re-implement the the basics each time (Catalyst, JIFTY, one of the many others)

Do not keep reinventing the wheel

Page 198: Evolving Architecture - Further

The 'F' word - Frameworks

Web development - use tools so you do not re-implement the the basics each time (Catalyst, JIFTY, one of the many others)

Any development - see above

Do not keep reinventing the wheel

Page 199: Evolving Architecture - Further

The 'F' word - Frameworks

Web development - use tools so you do not re-implement the the basics each time (Catalyst, JIFTY, one of the many others)

Any development - see above

Do not keep reinventing the wheel

Page 200: Evolving Architecture - Further

Catalyst

Page 201: Evolving Architecture - Further

Catalyst

Is an MVC:

Page 202: Evolving Architecture - Further

Catalyst

Is an MVC:

Model - objects representing data/logic

Page 203: Evolving Architecture - Further

Catalyst

Is an MVC:

Model - objects representing data/logic

View - templates

Page 204: Evolving Architecture - Further

Catalyst

Is an MVC:

Model - objects representing data/logic

View - templates

Controller - decisions of what to do based on input (can alter model and choose views)

Page 205: Evolving Architecture - Further

Catalyst::Plugin::SimpleAuth

Page 206: Evolving Architecture - Further

Catalyst::Plugin::SimpleAuth

__PACKAGE__->config(

simpleauth => { class => 'Users' },

Page 207: Evolving Architecture - Further

Catalyst::Plugin::SimpleAuth

__PACKAGE__->config(

simpleauth => { class => 'Users' },

);

Page 208: Evolving Architecture - Further

Catalyst::Plugin::SimpleAuth

__PACKAGE__->config(

simpleauth => { class => 'Users' },

);

sub auto : Private {

if(!$c->user && $c->action ne 'login') {

$c->res->redirect( $c->uri_for('/login') );

}

Page 209: Evolving Architecture - Further

Catalyst::Plugin::SimpleAuth

__PACKAGE__->config(

simpleauth => { class => 'Users' },

);

sub auto : Private {

if(!$c->user && $c->action ne 'login') {

$c->res->redirect( $c->uri_for('/login') );

}

}

Page 210: Evolving Architecture - Further

Catalyst::Plugin::*

Page 211: Evolving Architecture - Further

Catalyst::Plugin::*

Session

Page 212: Evolving Architecture - Further

Catalyst::Plugin::*

Session

Authentication

Page 213: Evolving Architecture - Further

Catalyst::Plugin::*

Session

Authentication

FormValidator

Page 214: Evolving Architecture - Further

Catalyst::Plugin::*

Session

Authentication

FormValidator

FillInForm

Page 215: Evolving Architecture - Further

Catalyst::Plugin::*

Session

Authentication

FormValidator

FillInForm

Page 216: Evolving Architecture - Further

Catalyst::Plugin::*

Session

Authentication

FormValidator

FillInForm

and {flash} - a read once stash!

Page 217: Evolving Architecture - Further

Catalyst::Plugin::*

Session

Authentication

FormValidator

FillInForm

and {flash} - a read once stash!

and - well lots more

Page 218: Evolving Architecture - Further

Catalyst::Plugin::*

Session

Authentication

FormValidator

FillInForm

and {flash} - a read once stash!

and - well lots more

Page 219: Evolving Architecture - Further

Exciting times

Page 220: Evolving Architecture - Further

Exciting times

We have all these tools to play with

Page 221: Evolving Architecture - Further

Exciting times

We have all these tools to play with

It takes time (to learn and setup)

Page 222: Evolving Architecture - Further

Exciting times

We have all these tools to play with

It takes time (to learn and setup)

but

Page 223: Evolving Architecture - Further

Exciting times

We have all these tools to play with

It takes time (to learn and setup)

but

Makes developing so much more fun

Page 224: Evolving Architecture - Further

We covered...

Page 225: Evolving Architecture - Further

Server configuration

- kitchens!

Load balancing http

- perlbal

Testing

- Test More

Performance

- mod_gzip

- gzip

- headers

- Devel::NYTProf

Image/application serving

- MogileFS

- mod_perl

Caching

- Memcache

Server maintanence

- puppet

- munin

Object relational mapping

- DBIx::Class

Cloud Computing

- EC2

- S3

We covered...

Page 226: Evolving Architecture - Further

QUESTIONS?

Slides: http://leo.cuckoo.org/projects/ea/