ααΆααααααΎααααααααααααΆαααααα»αααααααα
αααα»αααΆααΆααΆαα½ααααααΌαα±ααααΆααα·ααΈααΆααααααα·ααα αα·αααΆαααααΎααααΆααα§ααααααα·ααα ααα»αααααα
ααααα·ααΆαα’αααΈαααααα·ααΈαα
αααα»α PHP ααααΆαααΆαα’αΆα
ααΆααααααααααααααααα’αααααααΌαα’αα·ααααα§ααΆα αααα
ααΈααα»ααααα±ααΆααααααΊααΆαααααα·ααΈ PHP ααα’ααααΎ symfony 2.3 framework ααααα·αααααΌαααΆααα½ααααα αΌααα αααα»ααααααΆαα’αΆααΈαααααααΎααααΈααααΎαα αα α»ααααααααΆαααα ααααααααΈααΎααΆααααα»ααααααααααααΆα αααααααααααΆαααααΎααααΆαααααααα ααααααααΆα "αααααΆαα»αα’αααΈααααααααΆα" αα αααα»α memcachedα ααΆαααααΎααααα ααΉαααααΎαα ααΆααααΌαααααΆααα·αααααα αα·ααααΆαααΈααα API ααααααααα α αΆαααααααααΆααααααΎααααΆαααααααΆαααααα·ααααα·ααΌα αα·αα αααΎααααα αααα»αααααΆαααΆααααααα ααΆαααααααα memcached ααααΆαααΆαααααααααΆαααααααααα·ααααα·ααΆααααααααα·ααΈα ααΎαααΈααααααααΆαααΆαααααααααΆαααααααΆααααΆαα±ααααΆααααα·ααΆαααααααααα: DBMS α αΆααααααΎααααα»ααα αααΆα ααααΆαααα API α αΆααααααΎαα αΆαααΆααααααΎααα αααααααΆαααααΆαααΆαα’αΆα α αααΆααααααΆαααα·αααΆααΈ α αΎααααα»αα’αα‘α»ααααααα ααααΆααααααΉαααΊααααΆαααααΆαα α¬αα·αα’αΆα ααααΎααΆαααΆαααααα»αα
ααΎαααααΌαααΆααααααααΌα αααααααΆααααα»αααΆαααααΎααΆαααααααΆαααααααααααα·ααΈαααααΆαααΆααα·αααααααΉαααααααα·α αα½α , i.e. ααΆαα½αααΉαααΆαααααΆααααααΌααα·α αα½α αααα»αα ααααααΌαααααα αα·ααα»αααΆαααααααααααΌαααΆααααααΆαα»αα ααααΎα±ααααααΆαααααααΆαααα·αααααΉααααααααΉαααΆααααΆαααααα»ααααααα ααα»αααααααααΆααααααΆααΆαααΆαααααααααΆαααΆααααααα·ααααααααΈααΆαααααα
ααΎααΆαα’αααΈαα»αααΆαα½α memcached αααα½αααΆ?
ααΆααΌαα ααααααααααα memcached αααααΆαα PHP ααΆαααααα·ααααααα ααα αΆα αα·αααΆααααα»αααααα ααααΈαααα’ααα ααααααΆααααααΆααααΆα hashing key ααΆααααΆααα’αα»ααααΆαα±ααα’αααααΆαααα·ααααααααααΎαααααΆαα ααΎ servers ααΆα αααΎα αααααααΆααααα‘ααααΈααααΆααΌα key ααΆααααΆααααΈαα½αααα ααΆαα server ααΆααααΆαααα½αααΈαααα»α α αΎαα§ααααααααΆααααααααααΆααααααΆαα½αααΆααΆααΌαααΆαα’αΆα ααααΆααααααααααααΆααααααααΆαααααααΆαα (ααα»ααααααΆα’αα»αα ααααΆαβαα·αααααα).
α’αααΈαααΆαααΆααααααΎαααΆααα»αααααα·α
ααΆαα½αααΉαααΆααααα»αααααα α’αααα’αΆα
ααααααα
ααΆααααααααααΆαα memcached.sess_number_of_replicas
ααΆαααααααα·ααααααααΉαααααΌαααΆααααααΆαα»ααα
ααΎαααΆαααΈαααααΆα
αααΎααααα»αααααααα½α α αΎααααα»αααααΈααΆαααΆααααΆαααααα§ααΆα ααααα½α memcached αα·ααααααααΉαααααΌαααΆααααααααΈα’ααααααα ααααααΆαααΆααααα ααααα·αααΎαααΆαααΈαααααααααααα’ααΈαααΊαα·ααα·ααααααααΆααα·αααααα (ααΆααααααΆααΎαα‘αΎααααααΆααααΈααΆαα
αΆααααααΎαα‘αΎααα·α) αααα½αα
ααα½αααΉαααααΌαααΆαα
ααα
αΆαα‘αΎααα·αααΆαααΆααααα
α·αααααααααΆα ααΆααα·ααααααΉαααΆαααα ααΆαααΆααααααα·ααααααααααα
αΆααααΆααααΈαα·αααΆααα·ααΈ "αα
" αα
ααααααα
αααααααααααααααα»αααααΈααααΆαα
α§ααααααααααΆααααααααααΆαααΆααααααααααΆα αααα ααααα ααΆαααααΎααΆαααααααΆαα αα½αααα’αα»ααααΆαα±ααα’ααααααααΎαααααΆαααααααΆαααααααα ααα α·ααΆ αα·ααααααααΆαα αΌαααααΎααΆααΈααΌαααααααα αααα ααΎαααΆαααΈαααααααααα ααααααΆαααΆααααα αα αααα»αααααΆαααΆαααααααΎα ααα·ααΆααααα·αααααααααααΆααααααΆαα»ααα·αααΎαααΈααΈα αααΆααα αααΎααα α αΎαααααΎαααΆαααααααΆαααα½α α¬ααΈαααΊαααααααααΆααα αΎαα ααΌα ααααα αΎα α§ααααααααααααΆααααααΆααααααααααααα½ααααα’αΆα ααΆααΆααΆαααΌαααΆαα’αΆα ααααΆααα memcached ααααααααααααααΆααΆαααΌαααααΆαααααααΆαααααΆαα αα ααΆαααα½ααα αααα»αααααααααααΆαααΆαα αααααΆαααΆαααΆααααα ααΆαα·αα’αΆα ααΆαααααααααααααΈα±ααΆααααααΆααα... αα ααΈαααααΆααΆααααααααααΉαα‘αΎααα·αααΌαααααα»αα»ααΆαααααααααααααααααΆαααααΎαα αααα»ααααααα αααααΆααΌαα ααα»αααααΆαα·αα’αΆα α±αααααααα·ααΈααααΎααΆαααΆαα½ααααΆαααΈαααα ααΎααααα·αααααΌαααααα α’αααΈααΆαααΆααααααα·αααααααααααααα αααααααααα’αα·αα·ααααΆααααααΈααΆαα αΆαα ααααΈα’αααααααΎααααΆαααααΆαα αααΎαα
ααΆαα§ααααααα·ααΆααααΌαααΆαααΆαααΆα ααΆαα
αααααααααααααααΆαα
αααα»α memcached αα·αααΆαααααααΆααααΆαα
αααα αααα»αααααΈααΆαααα α»αα¬ααα α»αα ααΆααα½αααΎαα’αα»αααααα»αααααΆααααααααα
mcrouter
αααααΊααΆααααααα memcached ααααααααΎαα‘αΎαααα Facebook ααΎααααΈαααααααΆααααα αΆααααααΆα ααΆααΆαααααα·ααΈααΆαα’ααααα memcached αααα’αα»ααααΆα ααΆαααα‘αΎαααΆαααααααΆα memcached αα
αααΆααΆααααααα½αα ααΆααα·αααααΆαααα’α·ααα mcouter α’αΆα
ααααΆααα
αααα»α
- ααα αααα;
- αααα‘αααα ααΆαααααΆαααΈααααααααααααα αααα»ααααα»αααααα·αααΎααΆαααα α»αααΎαα‘αΎαα
αα ααααΎααΆα!
ααΆαααααααα ααΆαααααααα mcouter
αααα»αααΉααα ααΆαααααααα ααΆααααααααα
{
"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"
]
}
}
}
}
α ααα»α’αααΈααΆαααΆα’αΆαααΉαααΈ? α ααα»α’αααΈααΆαααΆαααΆαααΈαααααΎαα‘αΎαααααααα? α αΌαααΎαααααααααααΈαααααααααΆααααΎαααΆαα
- αα
αααα»αααΆαααααααα
ααΆααααααααααα mcouter ααααΎαααΎαααααΌααααααααΎααΉαααααΌαααΆαααααΎαααααα’ααααΎααΆααααααααΆααααΎα αα»ααααααΆααααΆααα’αααΈααΏαααα
OperationSelectorRoute
. - ααα½αααΆαααααΎαα
ααΆααα’ααααααααααΆα
RandomRoute
αααααααΎαααΎααααα αααααααΌαα’αΆα α¬ααααΌααααα»αα ααααααααα»α’αΆααchildren
. ααΆαα»ααΈαα½ααααα’αΆαααααααΊαα αααα»ααααααΆα’ααααααααααΆαMissFailoverRoute
αααααΉαααααααΆαααααΆαααΈαααααΈαα½αααα αααα»αα’αΆα αα αΌαααΆααααααΆααα½αααΆαααΆαααααΎαααααΆαα½αααΉααα·αααααα αααααΉαααααΌαααααααααΌαα’αα·αα·αααα·αα - ααααα·αααΎααΎαααααΎααααΆα
ααα»α
MissFailoverRoute
ααΆαα½αααΉααααα»ααααααΆαααΈαααα ααα½αααΈ αααααααΎααΆααα’ααααΉααααα»αααααΌααα ααΆαα memcached ααααΌα α αΎααα αααααΉαααα½αααααΎαα ααΎααΌαααααΆαααααα ααααα αααααααα·αααΆααα·ααααααα αα·ααΈααΆαααααααααααααΉαααΆαα±ααααΆα ααααα»αααΎααα ααΎαααΆαααΈαααααααΌααααα»ααααααΈααΌα ααααααΆααααΌαααΆααααααααα α α·ααααααααΎααααα»αα ααα½αααΈαααααΆαα’αΆααααααΆααα αααα»αααααΆαααααααααααΆ α αΎαααααΎαααΎααα½αααΆαααα αααααα - ααααΎααααααααααΆααα’αα (α αΎααααααΊααΆαααααααααΆ) ααααΌαααΆαααααΎαααΆααααααααΎ
AllMajorityRoute
. αααααα·ααΈααααααααααααααααΎααααΎαα ααΆαααααΆαααΈαααααΆααα’αααα αααα»αα’αΆα α αΎααααα αΆαααΆαααααΎαααααΈαααΆαα αα ααΆαα N/2 + 1 αααα»αα αααααα½αααα ααΈααΆαααααΎααααΆααAllSyncRoute
αααααΆααααααα·ααααα·ααΆααααααααααΌαααααααααα αα α αΆααααΆααααΈαα·ααΈααΆααααααααααΆαααΆαααΆαααααΎαααααΆαα·αααααΆαααΈ Π²ΡΠ΅Ρ αααΆαααΈααααα αααα»ααααα»α - ααΎαα·αααΌα ααααααααΆααΉααααα‘αααααα·αSERVER_ERROR
. αααααΈααΆ mcrouter ααΉααααααααα·αααααααα ααααΆαααααααΆαααααααΆα αα»αααΆα PHP α α ααΉααααα‘ααααα α»α α αΎαααΉααααααΎαααΆαααΌαααααΉααAllMajorityRoute
αα·αααΆαααΆαααΉααααΉαααααΆαααα α αΎαα’αα»ααααΆαα±αααα αΌααααααΆαααααααΆαααα’αααααΆαααααΌαααΆαααα ααααΈααααΆαααααααααααΆααααα αΆααΌα αααααΆααα·αααααΆααΆαααΎα
αα»ααα·ααααα·α αααα αααααααΆααααααααΊααΆααααα·αααΎαα·αααΆαα·αααΆααα·αααααααα αααα»αααααΆαααααααΆααααααααααααΆααααααΎααΈαα½ααααΈα’αα·αα·αα N ααααΎαα memcached ααΉαααααΌαααΆαααααα·ααααα· - αα αα ααΆααα’αα αααΆαααΈααααα αααα»αα’αΆαα ααΎαβα’αΆα βααΆααβαααααβα ααα½αβαααΆαααΈαβαααααΎβαααα»αβα’αΆαβααΆβα§ααΆα αααβααβααΆβααΈαα ααΆαβαααααβααΆαβαα»αβα α·αααβααβααΆαβαααα»α ααΎαβααα½αβααΆαΠΎααααΏαααΆααααααααα αα·αααααα»ααα·α ααΈααααΎαα αααααααΆααα
NBα α’αααααα’αΆα
ααααΎααααααααΆαααααααΆααααααααααααααΆααααΆαααα mcouter
ααΆαααΆαααααα·αααααΎαααΆα mcouter
αααααα·ααΈααααααΎα (αα·α 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' ]
... α αΎαααΌαααΆα αα ααααΌαααΆααα½ααα»ααααα·ααΆα. α’αααΈβαααβαα½αβα±ααβα αΆααβα’αΆααααααβααΊβααΆβααΆαβααβαααΆαααΈαβααααΎαβαααααβαα ααΆααααααααβαααβααα’ααβααΎβα ααα½αβααβααΆαβα ααααβ (ααααα·αααΎααααΆααααΆααααΆααααααΎα laconic αα·αααΎαααΆαααΆααααα αααααααααΆαα αααα»αααα·ααααα):
{{- $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α αα·ααΈααΆα ASCII αααα»α memcached ααΊααΊαααΆααααααααααααααΈα α αΎααααααααΆααααααααΆαααααΆα hashing key ααΆααααΆααααααΎαααΆαααααΆαα½α binary protocol ααα»αααααα ααα»ααααααααα·ααααααΎααααα αΆαααααΆααααααΈααΆααααΆαααααααα
αααα·α
ααΊαα
αααα»αααΆααΌαα α’αααΈαααα’αααααααΌαααααΎααΊααααΌααα
αα·ααΈααΆα ASCII α αΎαα’αααΈαααΉαααααΎαααΆα.... ααααααΆαααΆααααααααα»αααααΈααααααααΆααααααΆααααααααα
ααααΎααα
αααα»α
ααΆα ααααααααααΎαααααΉαααααΌαααΊ memcached.sess_binary_protocol
. ααΆααααΌαααααααΌαααΆααα·α αααααΆααααΈαααααααααΉαα
αΆααααααΎαααααΎαααΆαα α’αααΈααααα
αααααΊααΆαααα»αααΊαααααΆαα½α mcouter α
αΌααα
αααα»αααααΆαα½α PHP!
ααα ααααΈααααα·ααααΆα
ααΌα αααα αααααααΆααααααΆαααΆαααααΆααααααΌααα ααΆαααααααα ααΎαα’αΆα αααααααΆααααα αΆααΆαα αααα αΆααΆαα½αααΉαααΆαα’ααα±αααα α»ααααα memcached ααααΌαααΆααααααααΆα α αΎαααΆαααΏααΆααααααΆααααα»αααααΆαααααααΆααααααΌαααΆαααΎαα‘αΎαα ααααααααΈααΎαα»ααααααααα·ααΆααααααααααααΆαααααααα·ααΈ αααααΆαααααααααααααααααΆααααααΎαααα»ααααα αααααααΎααΆααα ααΎαααα·ααΆα αα αααααααααΆαααΆαα»ααΆααα’ααααΆααα»ααααα»α αααααΈαα·αααααα’ααααααααααααααΊααΆααααααΆααα ααΆα αα·ααΈααΆααααααααααααΆααα»ααα·ααααα·ααααααΆααα ααΆα’αΆα ααΎααα ααΌα ααΆ "ααΎα αααα" ααα»ααααααααα·αααΎααΆααααααα»α ααααααα αΆ α αΎααα·ααααααΎαααααΈ - α ααα»α’αααΈαα·αααααΎ?
PS
ααΌαα’αΆαααααααα ααΎαααααααααααΎαα
- "α’αα»ααααααΆαα½α dapp" (ααααΎ symfony-demo ααΆα§ααΆα ααα):
αααααααΈ 1 (αααααΎααααααα·ααΈααΆαααα) ΠΈαααααααΈ 2 (ααΆαααΆαααααααΆαααΌαααΆα Docker αα Kubernetes αααααααΎ Helm) ; - Β«
ααΈααΈαα·αααΆαα½α Kubernetesα ααααααααααΆαααΈααα HTTP αα·ααααα α·αααααααΆαα·α’ααααααΆα "α
ααααα: www.habr.com