Slide 1

Slide 1 text

System Operations for Startup - Second Part Gea-Suan Lin, KKBOX Inc. 2012-07-23 12年7月23日星期⼀一

Slide 2

Slide 2 text

Then we talk about software part 12年7月23日星期⼀一

Slide 3

Slide 3 text

• Programming • Web Server • Database • Cache 12年7月23日星期⼀一

Slide 4

Slide 4 text

Programming 12年7月23日星期⼀一

Slide 5

Slide 5 text

There are two things important 12年7月23日星期⼀一

Slide 6

Slide 6 text

First, 12年7月23日星期⼀一

Slide 7

Slide 7 text

Don’t fight with framework 12年7月23日星期⼀一

Slide 8

Slide 8 text

Think about why framework design it this way 12年7月23日星期⼀一

Slide 9

Slide 9 text

Second, 12年7月23日星期⼀一

Slide 10

Slide 10 text

Internet is dirty People are evil 12年7月23日星期⼀一

Slide 11

Slide 11 text

Input data are dirty 12年7月23日星期⼀一

Slide 12

Slide 12 text

Use whitelist to filter 12年7月23日星期⼀一

Slide 13

Slide 13 text

UTF-8 validation 12年7月23日星期⼀一

Slide 14

Slide 14 text

Uploaded data validation 12年7月23日星期⼀一

Slide 15

Slide 15 text

Format validation (Regular expression ?) 12年7月23日星期⼀一

Slide 16

Slide 16 text

Escape when necessary 12年7月23日星期⼀一

Slide 17

Slide 17 text

Don’t write plain SQL 12年7月23日星期⼀一

Slide 18

Slide 18 text

SELECT * FROM user WHERE username = “${username}”; 12年7月23日星期⼀一

Slide 19

Slide 19 text

Boom ! 12年7月23日星期⼀一

Slide 20

Slide 20 text

Escape when necessary 12年7月23日星期⼀一

Slide 21

Slide 21 text

XSS issue 12年7月23日星期⼀一

Slide 22

Slide 22 text

Remember, 12年7月23日星期⼀一

Slide 23

Slide 23 text

幹壞事是進步最大的 原動力 12年7月23日星期⼀一

Slide 24

Slide 24 text

People always try to hack your site 12年7月23日星期⼀一

Slide 25

Slide 25 text

Web Server 12年7月23日星期⼀一

Slide 26

Slide 26 text

• Apache • Lighttpd • nginx 12年7月23日星期⼀一

Slide 27

Slide 27 text

Apache 12年7月23日星期⼀一

Slide 28

Slide 28 text

Don’t use prefork MPM 12年7月23日星期⼀一

Slide 29

Slide 29 text

Thread MPM is fine 12年7月23日星期⼀一

Slide 30

Slide 30 text

Reasonable speed 12年7月23日星期⼀一

Slide 31

Slide 31 text

And everybody loves .htaccess 12年7月23日星期⼀一

Slide 32

Slide 32 text

Lighttpd 12年7月23日星期⼀一

Slide 33

Slide 33 text

No feature update for a long time 12年7月23日星期⼀一

Slide 34

Slide 34 text

Forget it 12年7月23日星期⼀一

Slide 35

Slide 35 text

nginx 12年7月23日星期⼀一

Slide 36

Slide 36 text

Extreme fast for static files (assets) 12年7月23日星期⼀一

Slide 37

Slide 37 text

Really fast 12年7月23日星期⼀一

Slide 38

Slide 38 text

Conclusion 12年7月23日星期⼀一

Slide 39

Slide 39 text

Split static files (assets) into another domain 12年7月23日星期⼀一

Slide 40

Slide 40 text

Use nginx to serve your static files (assets) 12年7月23日星期⼀一

Slide 41

Slide 41 text

Profiling your bottleneck 12年7月23日星期⼀一

Slide 42

Slide 42 text

If web server is bottleneck, use nginx 12年7月23日星期⼀一

Slide 43

Slide 43 text

Otherwise, use Apache 12年7月23日星期⼀一

Slide 44

Slide 44 text

Database 12年7月23日星期⼀一

Slide 45

Slide 45 text

• MySQL • NoSQL 12年7月23日星期⼀一

Slide 46

Slide 46 text

MySQL 12年7月23日星期⼀一

Slide 47

Slide 47 text

We won’t introduce MySQL 12年7月23日星期⼀一

Slide 48

Slide 48 text

Just remind serveral things important 12年7月23日星期⼀一

Slide 49

Slide 49 text

Use InnoDB 12年7月23日星期⼀一

Slide 50

Slide 50 text

Always InnoDB 12年7月23日星期⼀一

Slide 51

Slide 51 text

Yes, InnoDB 12年7月23日星期⼀一

Slide 52

Slide 52 text

And, 12年7月23日星期⼀一

Slide 53

Slide 53 text

Don’t use MyISAM 12年7月23日星期⼀一

Slide 54

Slide 54 text

You won’t like table lock 12年7月23日星期⼀一

Slide 55

Slide 55 text

You won’t like to repair tables 12年7月23日星期⼀一

Slide 56

Slide 56 text

Percona modified version is great 12年7月23日星期⼀一

Slide 57

Slide 57 text

Why InnoDB ? 12年7月23日星期⼀一

Slide 58

Slide 58 text

Transaction ACID 12年7月23日星期⼀一

Slide 59

Slide 59 text

Writes won’t block reads 12年7月23日星期⼀一

Slide 60

Slide 60 text

Fast recovery after server crash 12年7月23日星期⼀一

Slide 61

Slide 61 text

Consistent backup without downtime 12年7月23日星期⼀一

Slide 62

Slide 62 text

Compression 12年7月23日星期⼀一

Slide 63

Slide 63 text

It’s possible smaller than MyISAM tables 12年7月23日星期⼀一

Slide 64

Slide 64 text

High availability solutions requirement 12年7月23日星期⼀一

Slide 65

Slide 65 text

DRBD + Heartbeat 12年7月23日星期⼀一

Slide 66

Slide 66 text

Mature technology 12年7月23日星期⼀一

Slide 67

Slide 67 text

Quite stable 12年7月23日星期⼀一

Slide 68

Slide 68 text

Active-Standby Lower utilization rate 12年7月23日星期⼀一

Slide 69

Slide 69 text

Master-Master based on async replication 12年7月23日星期⼀一

Slide 70

Slide 70 text

Active-Active Higher utilization rate 12年7月23日星期⼀一

Slide 71

Slide 71 text

But notice data consistency issue 12年7月23日星期⼀一

Slide 72

Slide 72 text

Galera Cluster 12年7月23日星期⼀一

Slide 73

Slide 73 text

Young project 12年7月23日星期⼀一

Slide 74

Slide 74 text

Active-Active Higher utilization rate 12年7月23日星期⼀一

Slide 75

Slide 75 text

Sync replication without data consistent issue 12年7月23日星期⼀一

Slide 76

Slide 76 text

Conclusion 12年7月23日星期⼀一

Slide 77

Slide 77 text

MySQL works 12年7月23日星期⼀一

Slide 78

Slide 78 text

And there are lots of minefields 12年7月23日星期⼀一

Slide 79

Slide 79 text

But those minefields can be workaround 12年7月23日星期⼀一

Slide 80

Slide 80 text

RAM is cheap 12年7月23日星期⼀一

Slide 81

Slide 81 text

16GB RAM is quite large 12年7月23日星期⼀一

Slide 82

Slide 82 text

64GB RAM is quite large 12年7月23日星期⼀一

Slide 83

Slide 83 text

288GB RAM is quite large 12年7月23日星期⼀一

Slide 84

Slide 84 text

512GB RAM is quite large 12年7月23日星期⼀一

Slide 85

Slide 85 text

Data larger than 512GB ? 12年7月23日星期⼀一

Slide 86

Slide 86 text

... 12年7月23日星期⼀一

Slide 87

Slide 87 text

We can discuss privately ? 12年7月23日星期⼀一

Slide 88

Slide 88 text

NoSQL 12年7月23日星期⼀一

Slide 89

Slide 89 text

General concept 12年7月23日星期⼀一

Slide 90

Slide 90 text

NoSQL Need is (usually) Performance Need 12年7月23日星期⼀一

Slide 91

Slide 91 text

What kind of programming language will perform better ? 12年7月23日星期⼀一

Slide 92

Slide 92 text

C 12年7月23日星期⼀一

Slide 93

Slide 93 text

“Portable Assembly” 12年7月23日星期⼀一

Slide 94

Slide 94 text

Choose C-based written NoSQL first 12年7月23日星期⼀一

Slide 95

Slide 95 text

Another concept 12年7月23日星期⼀一

Slide 96

Slide 96 text

Story begin when data growing out of memory... 12年7月23日星期⼀一

Slide 97

Slide 97 text

Many stories about data out of memory 12年7月23日星期⼀一

Slide 98

Slide 98 text

Of course not happy stories 12年7月23日星期⼀一

Slide 99

Slide 99 text

So, list some good NoSQL 12年7月23日星期⼀一

Slide 100

Slide 100 text

Redis 12年7月23日星期⼀一

Slide 101

Slide 101 text

Key-Value Store 12年7月23日星期⼀一

Slide 102

Slide 102 text

Focus on key-value store 12年7月23日星期⼀一

Slide 103

Slide 103 text

Not claiming scalability 12年7月23日星期⼀一

Slide 104

Slide 104 text

Because they know hot data needs to fit memory 12年7月23日星期⼀一

Slide 105

Slide 105 text

Other NoSQL ? 12年7月23日星期⼀一

Slide 106

Slide 106 text

Sorry, no idea... 12年7月23日星期⼀一

Slide 107

Slide 107 text

There are so many PR-oriented NoSQL software 12年7月23日星期⼀一

Slide 108

Slide 108 text

Remember, 12年7月23日星期⼀一

Slide 109

Slide 109 text

Story begin when data growing out of memory... 12年7月23日星期⼀一

Slide 110

Slide 110 text

Cache 12年7月23日星期⼀一

Slide 111

Slide 111 text

Important note 12年7月23日星期⼀一

Slide 112

Slide 112 text

Cache only when you need to 12年7月23日星期⼀一

Slide 113

Slide 113 text

Because invalidation is not easy 12年7月23日星期⼀一

Slide 114

Slide 114 text

So, 12年7月23日星期⼀一

Slide 115

Slide 115 text

Always profiling 12年7月23日星期⼀一

Slide 116

Slide 116 text

• Frontend Cache • Backend Cache 12年7月23日星期⼀一

Slide 117

Slide 117 text

Frontend Cache 12年7月23日星期⼀一

Slide 118

Slide 118 text

HTTP Header 12年7月23日星期⼀一

Slide 119

Slide 119 text

Cache-Control 12年7月23日星期⼀一

Slide 120

Slide 120 text

Avoid ETags 12年7月23日星期⼀一

Slide 121

Slide 121 text

CDN 12年7月23日星期⼀一

Slide 122

Slide 122 text

Don’t use CDN before you do profile 12年7月23日星期⼀一

Slide 123

Slide 123 text

YSlow 12年7月23日星期⼀一

Slide 124

Slide 124 text

Google PageSpeed 12年7月23日星期⼀一

Slide 125

Slide 125 text

Backend Cache 12年7月23日星期⼀一

Slide 126

Slide 126 text

Memcached 12年7月23日星期⼀一

Slide 127

Slide 127 text

Remember Memcached is just a cache server 12年7月23日星期⼀一

Slide 128

Slide 128 text

Memcached may crash 12年7月23日星期⼀一

Slide 129

Slide 129 text

Use it as cache server 12年7月23日星期⼀一

Slide 130

Slide 130 text

Because it’s cache layer 12年7月23日星期⼀一

Slide 131

Slide 131 text

Cache Layer ! 12年7月23日星期⼀一

Slide 132

Slide 132 text

Your site should be able to work without cache 12年7月23日星期⼀一

Slide 133

Slide 133 text

Database Cache 12年7月23日星期⼀一

Slide 134

Slide 134 text

MySQL Query Cache 12年7月23日星期⼀一

Slide 135

Slide 135 text

Trun off it 12年7月23日星期⼀一

Slide 136

Slide 136 text

Because it’s not efficient on multi-CPU environment 12年7月23日星期⼀一

Slide 137

Slide 137 text

Instead, 12年7月23日星期⼀一

Slide 138

Slide 138 text

Use index correctly 12年7月23日星期⼀一

Slide 139

Slide 139 text

Make sure all time-sensitive queries use correct index 12年7月23日星期⼀一

Slide 140

Slide 140 text

Index optimization is engine dependent 12年7月23日星期⼀一

Slide 141

Slide 141 text

Understand B+tree will help you 12年7月23日星期⼀一

Slide 142

Slide 142 text

Remember one thing: 12年7月23日星期⼀一

Slide 143

Slide 143 text

MySQL is stupid 12年7月23日星期⼀一

Slide 144

Slide 144 text

If you cannot find an efficient way to query, 12年7月23日星期⼀一

Slide 145

Slide 145 text

Then MySQL can’t either 12年7月23日星期⼀一

Slide 146

Slide 146 text

Conclusion 12年7月23日星期⼀一

Slide 147

Slide 147 text

Profiling first, then decide what to cache 12年7月23日星期⼀一

Slide 148

Slide 148 text

Remember, 12年7月23日星期⼀一

Slide 149

Slide 149 text

Premature optimization is the root of all evil 12年7月23日星期⼀一

Slide 150

Slide 150 text

Summarize 12年7月23日星期⼀一

Slide 151

Slide 151 text

Find out problem Analyze problem Then solve problem 12年7月23日星期⼀一

Slide 152

Slide 152 text

Thanks ! 12年7月23日星期⼀一

Slide 153

Slide 153 text

Any questions ? 12年7月23日星期⼀一