áááºááá·áºáá¬áá¬á
áá¬ážááŒáá·áºáááᯠhigh-load ááá±á¬áá»ááºáá»á¬ážááᯠáá±á¬áºáá±á¬ááºáá¬ááœáẠá¡áá°ážáá»ááºážáááºááŸá¯ááŸáá·áº á¡áá°ážáááááá¬áá»á¬ážá¡áá¯á¶ážááŒá¯ááŸá¯ ááá¯á¡ááºáá±á¬áºáááºáž PHP ááœáẠá¡ááá®áá±ážááŸááºážáá»á¬ážááŸáá·áºáááºáááºáá¬áá±á¬á¡áá«ááœááºá á¥ááá¬á¡á¬ážááŒáá·áº áááºááœá¶á·ááŒáá¯ážááá¯ážáááºááẠááá¯á¡ááºááá·áºá¡ááŒá±á¡áá±ááŸá¬ ááá¯ááá¯ááá¯ážááœá¬ážáá¬ááá¯ááºáááºá
á¡áá«áááááá°áá²áá±á¬ááºážááẠsymfony 2.3 framework ááá¯á¡ááŒá±áá¶áá¬ážáá±á¬ PHP á¡ááá®áá±ážááŸááºážáá áºáá¯ááŒá áºááŒá®ážá á¡ááºááááºáá¯ááºááá·áºáá¯ááºáááºážá¡á á®á¡á ááºáá»á¬ážááœááºáá¯á¶ážáááá«áááºáá«á á¡áá±á¬áºáá±áž á á¶áááºááŸááºáá¬ážáá±á¬ ááá¯ááŸá±á¬ááºááŸá¯á¡ááŒááºá á€ááá±á¬áá»ááºááᯠá¡ááŒáá·áºá¡á á¡áá¯á¶ážááŒá¯áá²á·áááºá "á¡áá¬áá¬ááᯠááááºážáááºážááŒááºáž" áá°áá«á memcached ááœááº- áá±áá¬áá±á·á áºááŸáá·áº API áá¬áá¬áá»á¬ážááá¯á· áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá¯á¶á·ááŒááºááŸá¯áá»á¬ážá á¡áá»áá¯ážáá»áá¯ážáá±á¬ á¡áá¶áá»á¬ážá áá¯ááºáá¯ááºáá±á¬ááºááŸá¯ááᯠáááºáá°ááŒá¯ááŒááºážá¡ááœáẠáá±á¬á·áááºááŸá¯áá»á¬ážááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬ážá ááá¯ááá¯á·áá±á¬á¡ááŒá±á¡áá±ááœááºá memcached ááẠá¡ááºááá®áá±ážááŸááºážááááºáááºááŸá¯á¡ááœáẠá¡áááºá¡áá¹ááá¬ááºááŒá áºá á±áá«áááºá ááá¯á·á¡ááŒááºá áááºááŸáºáá¯á¶ážááŸá¯á¶ážááŸá¯ááẠááá¯ážááœá¬ážáá±á¬á¡áá»áá¯ážáááºáá»á¬ážááᯠááŒá áºáá±á«áºá á±áááº- DBMS ááẠáá»á¯ááºááá¯ážáá»á¬ážááŒá¬ážááœáẠáá±á«ááºááŒá¬ážáá¬áááºá API áááºáá±á¬ááºááŸá¯áá»á¬ážááẠáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá¬ážááŒá áºáááºá ááẠá¡ááŒá±á¡áá±áááºááŒáááºá á±ááẠáááá áºáááºááŸáá·áºáá»á®ááŒá¬ááá¯ááºááŒá®áž á€áá¬áá¡ááœááºáž áááºáá±á¬ááºááŸá¯ááẠá¡ááœááºááŸá±ážááœá±ážáá±ááẠááá¯á·ááá¯áẠáá¯á¶ážáááááá¯ááºáá«á
áá¶á·ááá¯ážáá±ážááẠááá¯á¡ááºáá«áááºá á¡á¬ážá áá¯ááºáá¯ááºááŸá¯á¡áááºážáááºááŒáá·áº á¡ááá®áá±ážááŸááºážááᯠáá±ááŒááºáá®á¡ááá¯ááºáž á¡ááá¯ááºážá¡áá¬áá»ááá¯ááºááŸá¯, i.e. á¡áááºážá¡ááŒá áºáá¯ááºááá¯á· á¡áááºážáááºáá±á¬ááŒá±á¬ááºážáá²ááŸá¯ááŸáá·áº áá¯ááºáá±á¬ááºááá¯ááºá áœááºáž á¡ááŒáá·áºá¡á á¯á¶ááᯠááááºážááááºážáá¬ážáááºá áááºááŸáºááẠáá»ááŸá¯á¶ážááŸá¯áá»á¬ážááᯠáá¶ááá¯ááºáááºááŸáá á±áá¯á¶áá¬áá áááºážá០áá±áá¬áá¯á¶ážááŸá¯á¶ážááŸá¯ááᯠáá»áŸá±á¬á·áá»áááºáááºáž ááŒáá¯ážá á¬ážáá«á
Memcached ááá¯ááºááá¯ááºá áá¬ááŒá áºáá±áá¬áá²á
áá±áá¯áá»á¡á¬ážááŒáá·áºá PHP á¡ááœáẠmemcached extension ááẠááŒáá·áºáá±áá¬ážáá±á¬ data ááŸáá·áº session storage ááᯠbox á០áá¶á·ááá¯ážáá±ážáááºá áá áºááááºáááºážáá±á¬á·ááᯠáááºááŒááºážá¡ááœáẠááá¹ááá¬ážááẠááá·áºá¡á¬áž áá¬áá¬áá»á¬ážá áœá¬ááœáẠáá±áá¬áá»á¬ážááᯠá¡áá®á¡áá»áŸ áá¬ážááŸáááá¯ááºá á±áá¬á á¡á¯ááºá á¯á០áá®ážááŒá¬ážáá¬áá¬áá áºáá¯áá¶ááá¯á· áá®ážááŒá¬ážáá±á¬á·áá áºáá¯á á®ááᯠáá®ážááŒá¬ážá á®ááááºá á¬áá±ážáᬠáááºáááºáá¬ážáá±á¬ áá»ááºááœááºááŸá¯áááááá¬áá»á¬ážááẠáááºááŸáºáááºáá±á¬ááºááŸá¯ááᯠááŒáá·áºáá¬ážá áœá¬áááŸáááá¯ááºááŒá±á¬ááºáž áá±áá»á¬á á±ááẠ(ááá¯á·áá±á¬áº áá¶ááá±á¬ááºážáááºááŸá¬á áá±áá¬áááŸááá«á).
á
ááºááŸááºááá¯ááŸá±á¬ááºááŸá¯ááŸáá·áºá¡áá° á¡áá¬áá»á¬ážááẠá¡áááºážáááºááá¯áá±á¬ááºážáááº- ááẠconfigure áá¯ááºááá¯ááºáá«áááºá memcached.sess_number_of_replicas
áá±áá¬áá»á¬ážááᯠáá¬áá¬áá»á¬ážá
áœá¬ááœáẠáá
áºááŒáá¯ááºááẠááááºážáááºážáááºááŒá
áºááŒá®ážá memcached á¥ááá¬áá
áºáá¯á áá»áá¯á·ááœááºážáá»ááºáá
áºáá¯ááŒá±á¬áá·áº áá±áá¬ááᯠá¡ááŒá¬ážáá°áá»á¬ážáá¶á០ááœáŸá²ááŒá±á¬ááºážáá±ážáááºááŒá
áºáááºá ááá¯á·áá±á¬áºá áá¬áá¬ááẠáá±áá¬ááá«áá² á¡áœááºááá¯ááºážá០ááŒááºáááºáá¬áá«á (áá¯á¶ááŸááºá¡ááá¯ááºáž ááŒááºáááºá
áááºááŒá®ážáá±á¬ááºááœááº) á¡áá»áá¯á·áá±á¬á·áá»á¬ážááᯠáááºážáááá±á¬á¡á ááŒááºáááºááŒáá·áºáá±áááºááŒá
áºáááºá ááááºáá±á¬á· áá«á ááá¯ááá¯áá¬áá«á session data áá¯á¶ážááŸá¯á¶ážááŸá¯ááœá²áá»á±á¬áºáá«á á¡ááŒá¬ážáá¯á¶á
á¶áá°ááá¯á· "ááœá¬áž" ááẠáááºážáááºážáááŸááá±á¬ááŒá±á¬áá·áºááŒá
áºáááºá
á á¶áá»áááºáá® á á¬ááŒáá·áºááá¯ááºáááááá¬áá»á¬ážááᯠá¡áááá¡á¬ážááŒáá·áº áááºááœááºáá«áááºá á¡áá»á¬ážááá¯áẠá áá±ážáá»á²á·ááŒááºáž- áááºážááá¯á·ááẠááá·áºá¡á¬áž áááºááŸáºá¡á¬áž á¡ááœááºááŒá®ážáá¬ážáá±á¬ á¡ááœááºá¡á á¬ážáá»á¬ážá¡áá ááá¯ážááŒáŸáá·áºááá¯ááºááŒá®áž ááá°áá®áá±á¬ áá¬áá¬áá»á¬ážáá±á«áºááœáẠáááºáá¶áá¬ážááá·áº áá¯ááºáá»á¬ážá០áááºáá±á¬ááºááœáá·áºááᯠáá±ážá áœááºážááá¯ááºáááºááŒá áºáááºá ááá¯á·áá±á¬áºá áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá ááááºážáááºážáá¬ážáá±á¬áá±áá¬ááá¬áááẠáá»á¬ážá áœá¬áá áºáá«ááá¯ááºáááºááá»á±á¬áºááœááºáá«á ááŸáá·áºáá áºáᯠááá¯á·ááá¯áẠááŸá áºáᯠnode áá»á¬ážáá áœááºážáá±á¬ááºáááºááẠáá¯á¶áá±á¬ááºáá«áááºá ááá¯á·ááŒá±á¬áá·áºá á¡áá¯ááºáá¯ááºááá·áºá¡ááŒá±á¡áá±ááœáẠá¡áááºážáá¯á¶áž cache instance áá áºáá¯ááᯠááááºážááááºážáá¬ážá ááºááœáẠáá áºáá¯áááºážáá±á¬ á¡áá¯á¶ážáááºáá±á¬ á á¶áááááá¬áá»á¬ážááẠmemcached áááŸáááá¯ááºááŸá¯ááᯠáá±áá»á¬á á±ááẠááŒá áºááá¯ááºáááºá ááá¯á·áá±á¬áºáááºáž á€á¡ááœáá·áºá¡áá±ážááá¯ááẠá¡ááœáá·áºáá±á¬ááºážáá°ááẠáááŒá áºááá¯ááºáá²á·áá±... á€ááœáẠááá±á¬áá»ááºááœáẠá¡áá¯á¶ážááŒá¯áá²á·áá±á¬ áá°áá±á¬ááºá ááŸá±ážááááºáááᯠááŒááºáááºá¡ááŸááºáááá»áá¯ážáááºáááºá ááá¯á·ááŒá±á¬áá·áº áááºážá¡ááºááá®áá±ážááŸááºážááᯠáá¬áá¬áá±á«ááºážáááºááŒáá·áº áá¯ááºáá±á¬ááºááẠáááŒá áºááá¯ááºáá±á¬ááŒá±á¬áá·áº ááŒá áºáááºá á ááºááŸááºáá±áᬠáá¯á¶ážááŸá¯á¶ážááŸá¯ááá¯áááºáž ááá±á·áá«ááŸáá·áº- áá¯á¶ážá áœá²áá°áá»á¬ážá ááŒá®ážáá¬ážáá±á¬ á¡áá±á¬áá·áºá០ááœááºááŒááºážá០áá±á¬ááºáááºá áá»ááºáá¯á¶ážáá»á¬áž ááŸá¯ááºáááºážááœá¬ážáá«áááºá
á¡áá±á¬ááºážáá¯á¶ážááá±á¬á· ááá¯á¡ááºáááºá memcached ááŸáá·áº áá¯á¶á
á¶áá°áá»á¬ážááᯠáá»á±á¬áºááŒááºááŒááºážááœáẠááŸááºáááºážáá»á¬ážá á¡áá¯áá°ááŸá¯ á¡ááŸá¬ážáá
áºáᯠááá¯á·ááá¯áẠá¡ááŸá¬ážáá
áºáá¯á¡ááœááºá á€áá»á°áá¬ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠáá»áœááºá¯ááºááá¯á·ááᯠáá°áá®áá±ážáá²á·áááºá
mcroouter
áááºážááẠáááºážáááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážááẠFacebook á០áááºáá®ážáá¬ážáá±á¬ memcached router ááŒá
áºáááºá áááºážááẠááœáá·áºááŒá¯áá±á¬ memcached á
á¬áá¬ážáááá¯ááá¯áá±á¬ááᯠáá¶á·ááá¯ážáá±ážáááºá á¡ááá¯ááºážá¡áᬠmemcached ááá·áºááœááºážááŸá¯áá»á¬áž áá°ážááœááºáá±á¬á¡áá»áá¯ážá¡á
á¬ážááá¯á·á mcroouter áá¡áá±ážá
áááºáá±á¬áºááŒáá»ááºááᯠááœááºááœá±á·ááá¯ááºáááºá
- ááŸááºáááºážáá¯á¶áá°ááœá¬áž;
- á¡ááŸá¬ážá¡ááœááºážáá áºáá¯ááŒá áºáá±á«áºáá«á á¡ááœá²á·á¡ááœááºážááŸá á¡ááŒá¬ážáá¬áá¬áá»á¬ážááá¯á· ááŒááºáááºáá±ážááá¯á·áá«á
á¡áá¯ááºááœá¬ážáá«á
mcroouter ááœá²á·á ááºážááŸá¯
áá« config ááᯠááá¯ááºááá¯ááºááœá¬ážááá¯ááºáááº
{
"pools": {
"pool00": {
"servers": [
"mc-0.mc:11211",
"mc-1.mc:11211",
"mc-2.mc:11211"
},
"pool01": {
"servers": [
"mc-1.mc:11211",
"mc-2.mc:11211",
"mc-0.mc:11211"
},
"pool02": {
"servers": [
"mc-2.mc:11211",
"mc-0.mc:11211",
"mc-1.mc:11211"
},
"route": {
"type": "OperationSelectorRoute",
"default_policy": "AllMajorityRoute|Pool|pool00",
"operation_policies": {
"get": {
"type": "RandomRoute",
"children": [
"MissFailoverRoute|Pool|pool02",
"MissFailoverRoute|Pool|pool00",
"MissFailoverRoute|Pool|pool01"
]
}
}
}
}
áá±áááºáá¯á¶ážááẠáá¬ááŒá±á¬áá·áºáá²á áá¬áá¬áá»á¬áž á¡áááºááŒá±á¬áá·áº áááºáá«áááºáá« ááŒá áºáá±ááááºážá áááºááá¯á¡áá¯ááºáá¯ááºáááºááá¯áᬠá¡ááŒá±ááŸá¬ááŒáá·áºáá¡á±á¬ááºá
- á€ááœá²á·á
ááºážáá¯á¶ááœááºá mcrouter ááẠáá±á¬ááºážááá¯áá»ááºá¡áááá·áºááᯠá¡ááŒá±áá¶á áá±á¬ááºážááá¯áá»ááºáá±ážááá¯á·ááá·áºáááºážááŒá±á¬ááºážááᯠááœá±ážáá»ááºáááºá áá±á¬ááºáá±ážá áá°á·ááᯠáá®ááá¯ááŒá±á¬ááŒáááºá
OperationSelectorRoute
. - áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠááá¯ááºááœááºáá°áá¶ááœá¬ážáá«á
RandomRoute
áááºážááẠarray á¡áá¬ááá¹áá¯áá»á¬ážá¡ááŒá¬áž áá±áá°ážááẠááá¯á·ááá¯áẠáááºážááŒá±á¬ááºážááᯠáá»áááºážááœá±ážáá»ááºáááºáchildren
. ဠarray á ááŒááºá ááºáá áºáá¯á á®ááẠááá¯ááºááœááºáá°á¡ááŒá ẠááŒá±á¬ááºážáá²áá«áááºáMissFailoverRoute
áá±áá¬ááŒáá·áº áá¯á¶á·ááŒááºááŸá¯ááááŸáááá»ááºážá áááºážááẠáááá¯ááºážááá·áºáᶠááŒááºáá±ážááá·áº á¡á á¯á¡áá±ážááŸá áá¬áá¬áá áºáá¯á á®ááᯠááŒááºáááºážááœá¬ážáááºááŒá áºáááºá - áá®ážááá·áºáá¯á¶ážáááº
MissFailoverRoute
áá¬áᬠáá¯á¶ážáá¯áá±á«ááºážá á¯áá¬á ááá¯á·áá±á¬áẠáá±á¬ááºážááá¯áá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááẠááá memcached á á¶ááá°áá¬ááá¯á· áŠážá áœá¬áá±á¬ááºááŸááá¬áááºááŒá áºááŒá®áž áá»ááºá¡áá¬áá»á¬ážááŸá¬ áá±áá¬áááŸáááá·áºá¡áá« áá»ááºááŸááá±á¬ á¡ááŒá±áá¶áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáááºáá¶áááŸááááºááŒá áºáááºá ááá¯ááá¯á·áá±á¬ áá»ááºážáááºááŸá¯áá»áá¯áž ááŒá áºáá±á«áºáá¬áááºááŒá áºáááºá á á¬áááºážáá²ááŸá ááááá¯á¶áž áá¬áá¬áá±á«áºááœáẠá¡ááœááºá¡áá»áœá¶ áááºáááºááŒááºážáááá¯á·ááŒá±á¬áá·áº ááá°áá®áá±á¬ sequences áá»á¬ážáá«ááŸááá±á¬ áá±á«ááºážáá°ážáááºáá¯á¶ážáá¯ááᯠáá¯ááºáá¯ááºááŒá®áž áááºážááá¯á·ááᯠáá»áááºážááœá±ážáá»ááºááẠáá¯á¶ážááŒááºáá²á·áááºá - á¡ááŒá¬ážáá±á¬ááºážááá¯ááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠ(áááºážááẠááŸááºáááºážáá
áºáá¯ááŒá
áºáááº) ááá¯á¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºáá±áá«áááºá
AllMajorityRoute
. á€ááá¯ááºááœááºáá°ááẠáá±áá°ážáááºá¡ááœááºážááŸá áá¬áá¬áá»á¬ážá¡á¬ážáá¯á¶ážááá¯á· áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá±ážááá¯á·ááŒá®áž áááºážááá¯á·áá²á០á¡áááºážáá¯á¶áž N/2+1 áá¶á០áá¯á¶á·ááŒááºááŸá¯áá»á¬ážááᯠá á±á¬áá·áºááá¯ááºážáá±áá«áááºá á¡áá¯á¶ážááŒá¯ááŒááºážááŸAllSyncRoute
á€áááºážáááºážááẠá¡ááŒá¯ááá±á¬áá±á¬ááºáá±á¬ áá¯á¶á·ááŒááºááŸá¯ááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº á á¬áá±ážááŒááºážáá¯ááºáááºážáá»á¬ážááᯠá áœáá·áºááœáŸááºáá²á·ááááºá вÑÐµÑ á¡á¯ááºá á¯á¡ááœááºážááŸááá¬áá¬áá»á¬áž - ááá¯ááºáá«ááááºážáááºááŒááºáá¬áááá·áºáááºáSERVER_ERROR
. mcrouter ááẠáááŸáááá¯ááºáá±á¬ áááºááŸáºáá»á¬ážááá¯á· áá±áá¬ááᯠáá±á«ááºážááá·áºáá±á¬áºáááºážá PHP áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºááá¯áááºá error áá áºáá¯ááŒááºáá±á«áºáá¬áááá·áºáááºá ááŸáá·áºááááá±ážáá»ááºáá¯ááºááŒááºáááá·áºáááºáAllMajorityRoute
áááºážáá»ááºááœááºážááŒá®áž á¡áááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ ááŒá¿áá¬áá»á¬ážáááŸááá² áá°áá áºáá áºáááºá¡áá áááºáá±á¬ááºááŸá¯á០áááºááŸá¬ážááá¯ááºáááºááŒá áºáááºá
á¡ááááá±á«á·áá±á á€á¡á á®á¡á á¥áºááẠáááºááŸáºááœáẠá¡ááŸááºáááẠáá±áá¬áááŸááá«áá ááá¯á·áá±á¬áẠáá¯á¶ážá áœá²áá° N á០áá±á¬ááºážááá¯áá»ááºááá¯ááºážá¡ááœáẠmemcached ááá¯á· á¡ááŸááºáááẠáá¯ááºáá±á¬ááºáááá·áºáááº- á¡á¬ážáá¯á¶áž áá±áá°ážáááºááŸááá¬áá¬áá»á¬ážá á¥ááá¬á¡á¬ážááŒáá·áºá áá±áá°ážáááºáá»á¬ážááŸá áá¬áá¬á¡áá±á¡ááœááºááᯠááŸá áºáá¯ááá¯á· áá»áŸá±á¬á·áá»ááá¯ááºáááº- ááá¯ááŸá±á¬ááºááŸá¯áá¯á¶ááŒááºá áááºáá»áááŸá¯ááᯠá áœáá·áºáááºááŒááºážáПááŒááºááŸá¯ááºážááŒáá·áºááŒá®áž áá±á¬ááºážááá¯áá»ááºáá»á¬ážá០áá»á±á¬ááºáá¯á¶ážáá±áá±á¬áá±á¬á·áá»á¬ážá¡áá áááºáááºážáááºá
NB: mcroouter áááºáá°ááŒááºážá¡ááœáẠá¡áá¯á¶ážáááºáá±á¬ááá·áºááºáá»á¬ážááá¯áááºáž áááºááŸá¬ááœá±ááá¯ááºáá«áááºá
mcroouter áááºáá±á¬ááºááŒááºážááŸáá·áºáááºáááºááŒááºážá
áá»áœááºá¯ááºááá¯á·áá¡ááá®áá±ážááŸááºáž (ááŸáá·áº memcached ááá¯ááºááá¯ááº) Kubernetes ááœááºá¡áá¯ááºáá¯ááºááẠ- ááá¯á·ááŒá±á¬áá·áºá mcrouter áááºáááºážááá¯áá±áá¬ááœááºáááºááŸááááºá ááá¯á· ááœááºááááºáá¬áááºáááºááŒááºážá áá«ááá¯á·áá¯á¶ážáááºá
NB: áá±á¬ááºážáá«ážááœáẠáá±ážáá¬ážááá·áº á
á¬áááºážáá»á¬ážááᯠááá¯ááŸá±á¬ááºáááºážááœáẠáá¯ááºáá±áá¬ážáááºá
configVersion: 1
project: mcrouter
deploy:
namespace: '[[ env ]]'
helmRelease: '[[ project ]]-[[ env ]]'
---
image: mcrouter
from: ubuntu:16.04
mount:
- from: tmp_dir
to: /var/lib/apt/lists
- from: build_dir
to: /var/cache/apt
ansible:
beforeInstall:
- name: Install prerequisites
apt:
name: [ 'apt-transport-https', 'tzdata', 'locales' ]
update_cache: yes
- name: Add mcrouter APT key
apt_key:
url: https://facebook.github.io/mcrouter/debrepo/xenial/PUBLIC.KEY
- name: Add mcrouter Repo
apt_repository:
repo: deb https://facebook.github.io/mcrouter/debrepo/xenial xenial contrib
filename: mcrouter
update_cache: yes
- name: Set timezone
timezone:
name: "Europe/Moscow"
- name: Ensure a locale exists
locale_gen:
name: en_US.UTF-8
state: present
install:
- name: Install mcrouter
apt:
name: [ 'mcrouter' ]
... áá¯á¶ááŒááºážáá¯ááºáá«á áá²á·á ááºááá¬áž. á áááºáááºá á¬ážá áá¬áá±á¬ááºážáá¬á áá¯á¶áá°á¡áá±á¡ááœááºáá±á«áºáá°áááºááŒá®áž config generator áá áºáá¯áá²ááŸááá«áááºá (áááºáá°áááᯠááá¯á áá±á«á·áá«ážááŒá®áž á¡á¶áááºááœááºáá»ááŸááá±á¬ ááœá±ážáá»ááºááŸá¯ááŸááá«á comment ááœáẠáá»áŸáá±áá«):
{{- $count := (pluck .Values.global.env .Values.memcached.replicas | first | default .Values.memcached.replicas._default | int) -}}
{{- $pools := dict -}}
{{- $servers := list -}}
{{- /* ÐапПлМÑеЌ ЌаÑÑОв ЎвÑÐŒÑ ÐºÐŸÐ¿ÐžÑЌО ÑеÑвеÑПв: "0 1 2 0 1 2" */ -}}
{{- range until 2 -}}
{{- range $i, $_ := until $count -}}
{{- $servers = append $servers (printf "mc-%d.mc:11211" $i) -}}
{{- end -}}
{{- end -}}
{{- /* СЌеÑаÑÑÑ Ð¿ÐŸ ЌаÑÑОвÑ, пПлÑÑаеЌ N ÑÑезПв: "[0 1 2] [1 2 0] [2 0 1]" */ -}}
{{- range $i, $_ := until $count -}}
{{- $pool := dict "servers" (slice $servers $i (add $i $count)) -}}
{{- $_ := set $pools (printf "MissFailoverRoute|Pool|pool%02d" $i) $pool -}}
{{- end -}}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mcrouter
data:
config.json: |
{
"pools": {{- $pools | toJson | replace "MissFailoverRoute|Pool|" "" -}},
"route": {
"type": "OperationSelectorRoute",
"default_policy": "AllMajorityRoute|Pool|pool00",
"operation_policies": {
"get": {
"type": "RandomRoute",
"children": {{- keys $pools | toJson }}
}
}
}
}
áá»áœááºá¯ááºááá¯á·ááẠáááºážááᯠá ááºážáááºáááºáááºážáá»ááºááœáẠááŒáá·áºáá»ááºááŒá®áž á á áºáá±ážáá«-
# php -a
Interactive mode enabled
php > # ÐÑПвеÑÑеЌ запОÑÑ Ðž ÑÑеМОе
php > $m = new Memcached();
php > $m->addServer('mcrouter', 11211);
php > var_dump($m->set('test', 'value'));
bool(true)
php > var_dump($m->get('test'));
string(5) "value"
php > # РабПÑаеÑ! ТеÑÑОÑÑеЌ ÑабПÑÑ ÑеÑÑОй:
php > ini_set('session.save_handler', 'memcached');
php > ini_set('session.save_path', 'mcrouter:11211');
php > var_dump(session_start());
PHP Warning: Uncaught Error: Failed to create session ID: memcached (path: mcrouter:11211) in php shell code:1
Stack trace:
#0 php shell code(1): session_start()
#1 {main}
thrown in php shell code on line 1
php > # Ðе завПЎОÑÑÑ⊠ÐПпÑПбÑеЌ заЎаÑÑ session_id:
php > session_id("zzz");
php > var_dump(session_start());
PHP Warning: session_start(): Cannot send session cookie - headers already sent by (output started at php shell code:1) in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Unable to clear session lock record in php shell code on line 1
PHP Warning: session_start(): Failed to read session data: memcached (path: mcrouter:11211) in php shell code on line 1
bool(false)
php >
á¡ááŸá¬ážáá
á¬áá¬ážááá¯ááŸá¬ááœá±ááŒááºážááẠáááºááá·áºááááºáá»áŸááá±ážáá²á·áá²á áá±ážááŒááºážááŸá¯á¡ááœáẠâ
NBâ memcached ááŸá ASCII áááá¯ááá¯áá±á¬ááẠbinary áá áºáá¯ááẠááŸá±ážááœá±ážááŒá®áž áá áºááááºáááºážáá±á¬á·ááᯠáááºááŒááºážá á á¶áááºážáááºážáá»á¬ážááẠbinary áááá¯ááá¯áá±á¬ááŸáá·áºáᬠá¡áá¯ááºáá¯ááºáá«áááºá áá«áá±ááá·áº áá«á áá®ážááŒá¬ážááá á¹á áá áºáá¯á¡ááœáẠááŒá¿áá¬áááŒá áºá á±áá«áá°ážá
ááŸáá·áºááœááºá á¡áááºáá²ááŸá¬ ááŸááá«áááº- áááºáá¯ááºáááŸá¬á ASCII protocol ááá¯ááŒá±á¬ááºážááŒá®áž á¡áá¬á¡á¬ážáá¯á¶áž á¡áááºááŒá±ááœá¬ážááŸá¬áá«...á ááá¯á·áá±á¬áº á€ááá
á¹á
ááœáẠá¡ááŒá±ááŸá¬ááœá±ááá·áº á¡áá±á·á¡áááŸááááºá
áá¯ááºáá²á·á ááŸááºáááºáá±á¬ ááœá±ážáá»ááºááŸá¯á¡áááºááŸá¬ ááŒá
áºáá«áááºá memcached.sess_binary_protocol
. áááºážááᯠááááºáá¬ážááááºá ááá¯á·áá±á¬áẠáááºááŸááºáá»á¬áž á
áááºá¡áá¯ááºáá¯ááºáá«áááºá áá»ááºáá¬á¡á¬ážáá¯á¶ážá PHP áá²á· pod áá²ááᯠmcouter áá«áá²á· container ááá¯ááá·áºááá¯á·áá«áá²á
áá±á¬ááºáá»ááº
ááá¯á·ááŒá±á¬áá·áºá á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááá¯ááºáá¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠááŒá¿áá¬ááá¯ááŒá±ááŸááºážááá¯ááºáá²á·áááº- memcached á¡ááŸá¬ážáá¶ááá¯ááºáááºááŸáááŸá¯ááŒá¿áá¬ááᯠááŒá±ááŸááºážááŒá®ážááŒá áºááŒá®áž cache ááá¯ááŸá±á¬ááºááŸá¯ááá¯á¶ááŒááºá áááºáá»áááŸá¯ááᯠááá¯ážááŒáá·áºáá¬á á±áááºá á¡ááºááá®áá±ážááŸááºážá¡ááœáẠáááá¬áááºááŸá¬ážáá±á¬ á¡á¬ážáá¬áá»ááºáá»á¬ážá¡ááŒááºá áááºážááẠááááºáá±á¬ááºážáá±á«áºááœáẠá¡áá¯ááºáá¯ááºááá·áºá¡áá« áá±á·áá»áá·áºáááºáá±áá¬áá±ážáááº- á¡á áááºá¡ááá¯ááºážá¡á¬ážáá¯á¶ážááœáẠá¡áááºáá¬ážááŸááá±á¬á¡áá« á á®áá¶ááá·áºááœá²áá°áááááẠá¡ááœááºááá¯ážááŸááºážáá«áááºá áá¯ááºáá²á·á áá®áááºážáááºážááŸá¬áááºáž á¡á¬ážáááºážáá»ááºááœá±ááŸááá«áááºá áááºážááẠ"Crutch" áá²á·ááá¯á·ááŒá áºááá¯ááºáá±á¬áºáááºážá áááºážááẠááœá±áá¯ááºáááºáá¬áá«á ááŒá¿áá¬ááᯠááŒáŸá¯ááºááŸá¶ááŒá®áž á¡áá áºáá»á¬ážááᯠáááŒá áºáá±á«áºá á±áá« - á¡áááºááŒá±á¬áá·áºáááºážá
PS
áá»áœááºá¯ááºááá¯á·áááá±á¬á·ááºááœááºáááºážáááºáá«
- "dapp áá²á· áá±á·áá»áá·áºáá«" (á¥ááá¬á¡ááŒá
Ạsymfony-demo ááá¯áá¯á¶ážá):
á¡ááá¯ááºáž 1 (ááá¯ážááŸááºážáá±á¬ application áá»á¬ážáááºáá±á¬ááºááŒááºáž) Оá¡ááá¯ááºáž 2 (Helm ááᯠá¡áá¯á¶ážááŒá¯á Docker áá¯á¶áá»á¬ážááᯠKubernetes ááá¯á· ááŒáá·áºáá»ááºááŒááºáž) ; - «
Kubernetes ááŸáá·áº ááááŸáá±á HTTP áá¬áá¬ááẠá ááááºáá°áá»áá¯ážáá»á¬ážááᯠáá»ááºááŸá¬áá¬ááá±ážáá¯á¶ "á
source: www.habr.com