4. Agenda
‣ What is Staging?
‣ Reasons for Staging
2
Live on Stage - Dominik Jungowski
5. Agenda
‣ What is Staging?
‣ Reasons for Staging
‣ Implementation
2
Live on Stage - Dominik Jungowski
6. Agenda
‣ What is Staging?
‣ Reasons for Staging
‣ Implementation
‣ Adding a staging layer
2
Live on Stage - Dominik Jungowski
7. Agenda
‣ What is Staging?
‣ Reasons for Staging
‣ Implementation
‣ Adding a staging layer
‣ Problems and Solutions
2
Live on Stage - Dominik Jungowski
9. About me
‣ 25 years old
3
Live on Stage - Dominik Jungowski
10. About me
‣ 25 years old
‣ Employed at CHIP Xonio Online GmbH
3
Live on Stage - Dominik Jungowski
11. About me
‣ 25 years old
‣ Employed at CHIP Xonio Online GmbH
➡ www.chip.de
3
Live on Stage - Dominik Jungowski
12. About me
‣ 25 years old
‣ Employed at CHIP Xonio Online GmbH
➡ www.chip.de
➡ download.chip.eu
3
Live on Stage - Dominik Jungowski
13. About me
‣ 25 years old
‣ Employed at CHIP Xonio Online GmbH
➡ www.chip.de
➡ download.chip.eu
‣ ScrumMaster and Developer at price
comparison
3
Live on Stage - Dominik Jungowski
14. About me
‣ 25 years old
‣ Employed at CHIP Xonio Online GmbH
➡ www.chip.de
➡ download.chip.eu
‣ ScrumMaster and Developer at price
comparison
‣ Part - time studies in Psychology at distance
university FernUni Hagen
3
Live on Stage - Dominik Jungowski
34. Reasons for Staging
‣ Security
➡ no sensitive data on live system
8
Live on Stage - Dominik Jungowski
35. Reasons for Staging
‣ Security
➡ no sensitive data on live system
➡ only the essential data is synced
8
Live on Stage - Dominik Jungowski
36. Reasons for Staging
‣ Security
➡ no sensitive data on live system
➡ only the essential data is synced
‣ Quality
8
Live on Stage - Dominik Jungowski
37. Reasons for Staging
‣ Security
➡ no sensitive data on live system
➡ only the essential data is synced
‣ Quality
➡ no changes directly on live system
8
Live on Stage - Dominik Jungowski
38. Reasons for Staging
‣ Security
➡ no sensitive data on live system
➡ only the essential data is synced
‣ Quality
➡ no changes directly on live system
➡ more time to prevent corruption/errors on live
system (user errors, broken imports, etc.)
8
Live on Stage - Dominik Jungowski
40. Reasons for Staging
‣ Performance
➡ Normalized data on staging database
9
Live on Stage - Dominik Jungowski
41. Reasons for Staging
‣ Performance
➡ Normalized data on staging database
➡ Performance optimized / flat data on live database
9
Live on Stage - Dominik Jungowski
42. Reasons for Staging
‣ Performance
➡ Normalized data on staging database
➡ Performance optimized / flat data on live database
➡ no constraints on live system possible
9
Live on Stage - Dominik Jungowski
46. Implementation
‣ Data is synced
➡ some kind of status flag in staging db is needed
11
Live on Stage - Dominik Jungowski
47. Implementation
‣ Data is synced
➡ some kind of status flag in staging db is needed
‣ Status needed for
11
Live on Stage - Dominik Jungowski
48. Implementation
‣ Data is synced
➡ some kind of status flag in staging db is needed
‣ Status needed for
➡ Changed data
11
Live on Stage - Dominik Jungowski
49. Implementation
‣ Data is synced
➡ some kind of status flag in staging db is needed
‣ Status needed for
➡ Changed data
➡ Unchanged data
11
Live on Stage - Dominik Jungowski
50. Implementation
‣ Data is synced
➡ some kind of status flag in staging db is needed
‣ Status needed for
➡ Changed data
➡ Unchanged data
➡ Deleted data on staging, but not on live system
11
Live on Stage - Dominik Jungowski
51. Implementation
‣ Data is synced
➡ some kind of status flag in staging db is needed
‣ Status needed for
➡ Changed data
➡ Unchanged data
➡ Deleted data on staging, but not on live system
‣ Maybe useful
11
Live on Stage - Dominik Jungowski
52. Implementation
‣ Data is synced
➡ some kind of status flag in staging db is needed
‣ Status needed for
➡ Changed data
➡ Unchanged data
➡ Deleted data on staging, but not on live system
‣ Maybe useful
➡ Deleted on live system
11
Live on Stage - Dominik Jungowski
54. Implementation
The Status - Cycle
Import
12
Live on Stage - Dominik Jungowski
55. Implementation
The Status - Cycle
Import
12
Live on Stage - Dominik Jungowski
56. Implementation
The Status - Cycle
ne
w or
ch
an
ge
dd
ata
Import
12
Live on Stage - Dominik Jungowski
57. Implementation
The Status - Cycle
Changed
[1]
ne
w or
ch
an
ge
dd
ata
Import
12
Live on Stage - Dominik Jungowski
58. Implementation
The Status - Cycle
Changed
[1]
ne
w or
ch
an
ge
dd
ata
Import
12
Live on Stage - Dominik Jungowski
59. Implementation
The Status - Cycle
Changed
[1]
ne
w or
ch
an
ge
dd
ata
Sync
Import
12
Live on Stage - Dominik Jungowski
60. Implementation
The Status - Cycle
Changed
[1]
ne
w or
ch
an
ge
dd
ata
Sync
Import
No
change
[0]
12
Live on Stage - Dominik Jungowski
61. Implementation
The Status - Cycle
Changed
[1]
ne
w or
ch
an
ge
dd
ata
Sync
Import
No
change
[0]
12
Live on Stage - Dominik Jungowski
62. Implementation
The Status - Cycle
Changed
[1]
ne
w or
ch
an
ge
dd
ata
Sync
Import
rem
ov
ed
da
ta
No
change
[0]
12
Live on Stage - Dominik Jungowski
63. Implementation
The Status - Cycle
Changed
[1]
ne
w or
ch
an
ge
dd
ata
Sync
Import
rem
ov
ed
da
ta
No Changed
change Deleted
[0] [3]
12
Live on Stage - Dominik Jungowski
64. Implementation
The Status - Cycle
Changed
[1]
ne
w or
ch
an
ge
dd
ata
Sync
Import
rem
ov
ed
da
ta
No Changed
change Deleted
[0] [3]
12
Live on Stage - Dominik Jungowski
65. Implementation
The Status - Cycle
Changed
[1]
ne
w or
ch
an
ge
dd
ata
Sync
Import
rem
ov
ed
da
ta
No Changed
change Deleted
[0] [3]
12
Live on Stage - Dominik Jungowski
66. Implementation
The Status - Cycle
Changed
[1]
ne
w or
ch
an
ge
dd
ata
Sync
Sync
Import
rem
ov
ed
da
ta
No Changed
change Deleted
[0] [3]
12
Live on Stage - Dominik Jungowski
67. Implementation
The Status - Cycle
Changed Deleted
[1] [2]
ne
w or
ch
an
ge
dd
ata
Sync
Sync
Import
rem
ov
ed
da
ta
No Changed
change Deleted
[0] [3]
12
Live on Stage - Dominik Jungowski
68. Implementation
The Status - Cycle
Changed Deleted
[1] [2]
ne
w or
ch
an
ge
dd
ata
Sync
Sync
Import
rem
ov
ed
da
ta
No Changed
change Deleted
[0] [3]
12
Live on Stage - Dominik Jungowski
85. Implementation
Using the binary flags in PHP
class phpDay_Sync
{
/**
* Status for changed data
* Binary: 0001
*/
const STATUS_CHANGED = 1;
/**
* Status for removed data
* Binary: 0010
*/
const STATUS_DELETED = 2;
...
}
15
Live on Stage - Dominik Jungowski
87. Implementation
Using the binary flags in PHP
// Speaker status has changed
16
Live on Stage - Dominik Jungowski
88. Implementation
Using the binary flags in PHP
// Speaker status has changed
$speaker[‘status‘] = phpDay_Sync::STATUS_CHANGED;
16
Live on Stage - Dominik Jungowski
89. Implementation
Using the binary flags in PHP
// Speaker status has changed
$speaker[‘status‘] = phpDay_Sync::STATUS_CHANGED;
// Speaker has been synced to live system
16
Live on Stage - Dominik Jungowski
90. Implementation
Using the binary flags in PHP
// Speaker status has changed
$speaker[‘status‘] = phpDay_Sync::STATUS_CHANGED;
// Speaker has been synced to live system
$speaker[‘status‘] =
16
Live on Stage - Dominik Jungowski
91. Implementation
Using the binary flags in PHP
// Speaker status has changed
$speaker[‘status‘] = phpDay_Sync::STATUS_CHANGED;
// Speaker has been synced to live system
$speaker[‘status‘] =
(phpDay_Sync::STATUS_CHANGED &
phpDay_Sync::STATUS_DELETED);
16
Live on Stage - Dominik Jungowski
92. Implementation
Using the binary flags in PHP
// Speaker status has changed
$speaker[‘status‘] = phpDay_Sync::STATUS_CHANGED;
// Speaker has been synced to live system
$speaker[‘status‘] =
(phpDay_Sync::STATUS_CHANGED &
phpDay_Sync::STATUS_DELETED);
//... or easier :-)
16
Live on Stage - Dominik Jungowski
93. Implementation
Using the binary flags in PHP
// Speaker status has changed
$speaker[‘status‘] = phpDay_Sync::STATUS_CHANGED;
// Speaker has been synced to live system
$speaker[‘status‘] =
(phpDay_Sync::STATUS_CHANGED &
phpDay_Sync::STATUS_DELETED);
//... or easier :-)
$speaker[‘status‘] = 0;
16
Live on Stage - Dominik Jungowski
95. Implementation
Using the binary flags in PHP
// Speaker didn‘t show up in import file
17
Live on Stage - Dominik Jungowski
96. Implementation
Using the binary flags in PHP
// Speaker didn‘t show up in import file
// 0001 | 0010 = 0011
17
Live on Stage - Dominik Jungowski
97. Implementation
Using the binary flags in PHP
// Speaker didn‘t show up in import file
// 0001 | 0010 = 0011
$speaker[‘status‘] =
17
Live on Stage - Dominik Jungowski
98. Implementation
Using the binary flags in PHP
// Speaker didn‘t show up in import file
// 0001 | 0010 = 0011
$speaker[‘status‘] =
(phpDay_Sync::STATUS_CHANGED |
phpDay_Sync::STATUS_DELETED);
17
Live on Stage - Dominik Jungowski
99. Implementation
Using the binary flags in PHP
// Speaker didn‘t show up in import file
// 0001 | 0010 = 0011
$speaker[‘status‘] =
(phpDay_Sync::STATUS_CHANGED |
phpDay_Sync::STATUS_DELETED);
// Speaker has been deleted on live system
17
Live on Stage - Dominik Jungowski
100. Implementation
Using the binary flags in PHP
// Speaker didn‘t show up in import file
// 0001 | 0010 = 0011
$speaker[‘status‘] =
(phpDay_Sync::STATUS_CHANGED |
phpDay_Sync::STATUS_DELETED);
// Speaker has been deleted on live system
$speaker[‘status‘] = phpDay_Sync::STATUS_DELETED;
17
Live on Stage - Dominik Jungowski
107. Implementation
... in PHP
24
Live on Stage - Dominik Jungowski
108. Implementation
... in PHP
// We‘ve synced the deleted speaker, status 3 => status 2
24
Live on Stage - Dominik Jungowski
109. Implementation
... in PHP
// We‘ve synced the deleted speaker, status 3 => status 2
// 0011 & 0010 = 0010
24
Live on Stage - Dominik Jungowski
110. Implementation
... in PHP
// We‘ve synced the deleted speaker, status 3 => status 2
// 0011 & 0010 = 0010
$speaker[‘status‘] =
24
Live on Stage - Dominik Jungowski
111. Implementation
... in PHP
// We‘ve synced the deleted speaker, status 3 => status 2
// 0011 & 0010 = 0010
$speaker[‘status‘] =
($speaker[‘status‘] & phpDay_Sync::STATUS_DELETED);
24
Live on Stage - Dominik Jungowski
112. Implementation
... in PHP
// We‘ve synced the deleted speaker, status 3 => status 2
// 0011 & 0010 = 0010
$speaker[‘status‘] =
($speaker[‘status‘] & phpDay_Sync::STATUS_DELETED);
// or if you know you will never use more than those 4 status flags:
24
Live on Stage - Dominik Jungowski
113. Implementation
... in PHP
// We‘ve synced the deleted speaker, status 3 => status 2
// 0011 & 0010 = 0010
$speaker[‘status‘] =
($speaker[‘status‘] & phpDay_Sync::STATUS_DELETED);
// or if you know you will never use more than those 4 status flags:
$speaker[‘status‘] = phpDay_Sync::STATUS_CHANGEDELETED;
24
Live on Stage - Dominik Jungowski
114. Implementation
... in MySQL
25
Live on Stage - Dominik Jungowski
115. Implementation
... in MySQL
// We‘ve synced the deleted speaker, status 3 => status 2
// 0011 & 0010 = 0010
$sql =
‘UPDATE speaker SET status = status & ‘ .
phpDay_Sync::STATUS_DELETED;
25
Live on Stage - Dominik Jungowski
116. Implementation
... in MySQL
// We‘ve synced the deleted speaker, status 3 => status 2
// 0011 & 0010 = 0010
$sql =
‘UPDATE speaker SET status = status & ‘ .
phpDay_Sync::STATUS_DELETED;
‣ But: Rather slow in MySQL
25
Live on Stage - Dominik Jungowski
117. Implementation
... in MySQL
// We‘ve synced the deleted speaker, status 3 => status 2
// 0011 & 0010 = 0010
$sql =
‘UPDATE speaker SET status = status & ‘ .
phpDay_Sync::STATUS_DELETED;
‣ But: Rather slow in MySQL
// We‘ve synced the deleted speaker, status 3 => status 2
// 0011 & 0010 = 0010
$status = $speaker->getStatus();
$sql =
‘UPDATE speaker SET status = ‘ . ($status &
phpDay_Sync::STATUS_DELETED);
25
Live on Stage - Dominik Jungowski
118. Adding a staging
layer
Things to consider
Live on Stage - Dominik Jungowski
120. Adding a staging layer
‣ Distribution of cronjobs: 1 server ➝ 2 servers
27
Live on Stage - Dominik Jungowski
121. Adding a staging layer
‣ Distribution of cronjobs: 1 server ➝ 2 servers
➡ Data you need on live system
27
Live on Stage - Dominik Jungowski
122. Adding a staging layer
‣ Distribution of cronjobs: 1 server ➝ 2 servers
➡ Data you need on live system
➡ Data you need on staging system
27
Live on Stage - Dominik Jungowski
123. Adding a staging layer
‣ Distribution of cronjobs: 1 server ➝ 2 servers
➡ Data you need on live system
➡ Data you need on staging system
➡ Data you need on both systems
27
Live on Stage - Dominik Jungowski
124. Adding a staging layer
‣ Distribution of cronjobs: 1 server ➝ 2 servers
➡ Data you need on live system
➡ Data you need on staging system
➡ Data you need on both systems
‣ Write down all the cronjobs
27
Live on Stage - Dominik Jungowski
125. Adding a staging layer
‣ Distribution of cronjobs: 1 server ➝ 2 servers
➡ Data you need on live system
➡ Data you need on staging system
➡ Data you need on both systems
‣ Write down all the cronjobs
‣ Decide where you need them
27
Live on Stage - Dominik Jungowski
126. Adding a staging layer
‣ Switching live system
28
Live on Stage - Dominik Jungowski
127. Adding a staging layer
‣ Switching live system
Database
server
28
Live on Stage - Dominik Jungowski
128. Adding a staging layer
‣ Switching live system
Old database
Database
server
28
Live on Stage - Dominik Jungowski
129. Adding a staging layer
‣ Switching live system
Old database
Database
server
New (synced)
database
28
Live on Stage - Dominik Jungowski
130. Adding a staging layer
‣ Switching live system
Old database
Database
Website server
New (synced)
database
28
Live on Stage - Dominik Jungowski
131. Adding a staging layer
‣ Switching live system
Old database
Database
Website server
New (synced)
database
28
Live on Stage - Dominik Jungowski
132. Adding a staging layer
‣ Switching live system
Old database
Database
Website server
New (synced)
database
28
Live on Stage - Dominik Jungowski
133. Adding a staging layer
‣ Switching live system
Old database
Database
Website server
New (synced)
database
28
Live on Stage - Dominik Jungowski
136. Problems & Solutions
‣ Problem: Data integrity
Status
flag
30
Live on Stage - Dominik Jungowski
137. Problems & Solutions
‣ Problem: Data integrity
Read for
Sync
Status
flag
30
Live on Stage - Dominik Jungowski
138. Problems & Solutions
‣ Problem: Data integrity
Read for
Sync
Status
flag
30
Live on Stage - Dominik Jungowski
139. Problems & Solutions
‣ Problem: Data integrity
Read for
Sync
St
at
us
:1
Status
flag
30
Live on Stage - Dominik Jungowski
140. Problems & Solutions
‣ Problem: Data integrity
Read for User
Sync
St
at
us
:1
Status
flag
30
Live on Stage - Dominik Jungowski
141. Problems & Solutions
‣ Problem: Data integrity
Read for User
Sync
St
at
us
:1
Status
flag
30
Live on Stage - Dominik Jungowski
142. Problems & Solutions
‣ Problem: Data integrity
Read for User
Sync
Status: 1
St
at
us
:1
Status
flag
30
Live on Stage - Dominik Jungowski
143. Problems & Solutions
‣ Problem: Data integrity
Read for Sync
User
Sync finished
Status: 1
St
at
us
:1
Status
flag
30
Live on Stage - Dominik Jungowski
144. Problems & Solutions
‣ Problem: Data integrity
Read for Sync
User
Sync finished
Status: 1
St
at
us
:1
Status
flag
30
Live on Stage - Dominik Jungowski
145. Problems & Solutions
‣ Problem: Data integrity
Read for Sync
User
Sync finished
0
Status: 1
St
s:
at
u
at
us
St
:1
Status
flag
30
Live on Stage - Dominik Jungowski
148. Problems & Solutions
‣ Solution: Table locking
mysql> LOCK TABLES speaker WRITE;
31
Live on Stage - Dominik Jungowski
149. Problems & Solutions
‣ Solution: Table locking
mysql> LOCK TABLES speaker WRITE;
‣ Problem: Whole table is locked for reading and
writing
31
Live on Stage - Dominik Jungowski
150. Problems & Solutions
‣ Solution: Table locking
mysql> LOCK TABLES speaker WRITE;
‣ Problem: Whole table is locked for reading and
writing
mysql> SELECT * FROM speaker WHERE status = 1 FOR UPDATE;
31
Live on Stage - Dominik Jungowski
151. Problems & Solutions
‣ Solution: Table locking
mysql> LOCK TABLES speaker WRITE;
‣ Problem: Whole table is locked for reading and
writing
mysql> SELECT * FROM speaker WHERE status = 1 FOR UPDATE;
‣ Only locks the selected rows
31
Live on Stage - Dominik Jungowski
152. Problems & Solutions
‣ Solution: Table locking
mysql> LOCK TABLES speaker WRITE;
‣ Problem: Whole table is locked for reading and
writing
mysql> SELECT * FROM speaker WHERE status = 1 FOR UPDATE;
‣ Only locks the selected rows
‣ Reading other data from table is still possible
31
Live on Stage - Dominik Jungowski
153. Contact me
‣ Weblog: www.phpdevblog.net
‣ Twitter: www.twitter.com/djungowski
‣ Xing: http://www.xing.com/profile/
Dominik_Jungowski
32
Live on Stage - Dominik Jungowski
154. Questions?
33
Live on Stage - Dominik Jungowski
155. Thank you!
34
Live on Stage - Dominik Jungowski