ืคืืชืื ืคืจืืืงืืื ืืขืืืก ืืืื ืืื ืฉืคื ืืืจืฉ ืืืฉื ืืืืืืช ืืฉืืืืฉ ืืืืื ืืืืืืื, ืื ืืฉืืืืืจ ืืืคืืืงืฆืืืช ื-PHP ืืืฆื ืืืื ืืืืืืจ ืขื ืืื ืื ืฉืฆืจืื ืืคืชื, ืืืฉื,
ืืืืืจ ืืืืจืืข ืืื ืืคืืืงืฆืืืช PHP ืืืืืกืกืช ืขื ืืกืืจืช ืกืืืคืื ืื 2.3, ืฉืืื ืื ื ืืืืช ืืชืืื ืืืช ืืขืกืงืืืช ืืขืืืื. ืื ืืกืฃ ืืืืกืื ืืคืขืืืช ืกืื ืืจืื ืืืื, ืืคืจืืืงื ืืื ืขืฉื ืื ืฉืืืืฉ ืืื ืืืื ืืืช "ืืฉืืืจ ืืื ืืืืืื". ื-memcached: ืชืืืืืช ืืืงืฉืืช ืืืกืืก ืื ืชืื ืื ืืฉืจืชื ื-API, ืืืืื ืฉืื ืื, ืื ืขืืืื ืืกื ืืจืื ืืืฆืืข ืงืื ืืขืื ืืขืื. ืืืฆื ืืื, ืืชืืืืืืช ืฉื memcached ืืืคืืช ืงืืื ืืช ืืชืคืขืื ืืืคืืืงืฆืื. ืื ืืกืฃ, ืืืืื ืืืืื ืืืืื ืืชืืฆืืืช ืืืืจืืช: ื-DBMS ืืชืืื ืืคืจืืฅ ืืชืคืจืื, ืฉืืจืืชื API ืืชืืืืื ืืืกืืจ ืืงืฉืืช ืืื'. ืืืฆืื ืืืฆื ืขืฉืื ืืืืืฉื ืขืฉืจืืช ืืงืืช, ืืืืืื ืืืื ืืื ืืฉืืจืืช ืืืื ืืืื ื ืืจื ืื ืื ืืืื ืืืืืืื.
ืืืื ื ืฆืจืืืื ืืกืคืง ืืืืืืช ืืฉื ืืช ืืืคืงืืช ืืช ืืืืฉืื ืขื ืืขื ืืืืฅ, ืืืืืจ ืขื ืฉืื ืืืื ืืื ืืืืืื ืืงืื ืืืงืืจ ืืืคืื ืงืฆืืื ืืืืช ืืืืื ื ืฉืืจืช. ืืคืื ืืช ืืืืืื ืื ืจืง ืขืืื ืืคื ื ืืฉืืื, ืืื ืื ื ืกื ืืืืขืจ ืืืืื ื ืชืื ืื ืืื ื.
ืื ืจืข ื-memcached ืขืฆืื?
ืืืืคื ืืืื, ืืชืืกืฃ memcached ืขืืืจ PHP ืชืืื ืื ืชืื ืื ืืืืืจืื ืืืืกืื ืืคืขืื ืืืืฅ ืืงืืคืกื. ืื ืื ืื ืืืืืื ืขืงืื ืฉื ืืคืชืืืช ืืืคืฉืจ ืื ืืืคืืฅ ื ืชืื ืื ืืืืคื ืฉืืื ืืฉืจืชืื ืจืืื, ืชืื ืืชืืืืกืืช ืืืืืืืช ืืื ืืคืชื ืกืคืฆืืคื ืืฉืจืช ืกืคืฆืืคื ืืืงืืืฆื, ืืืื ืืฉื ืืืื ืื ืืืืืืื ืืืื ืืช ืืืืื ืฉื ืฉืืจืืช ืืืืืื (ืื, ืืืจืื ืืฆืขืจ, ืืื ืืืืข).
ืืืฆื ืงืฆืช ืืืชืจ ืืื ืขื ืืืกืื ืืคืขืืืช: ืืชื ืืืื ืืืืืืจ memcached.sess_number_of_replicas
, ืืชืืฆืื ืืื ืื ืชืื ืื ืืืืืกื ื ืืืกืคืจ ืฉืจืชืื ืื ืืื ืืช, ืืืืงืจื ืฉื ืืฉื ืฉื ืืืคืข ืืื ืฉื memcached, ืื ืชืื ืื ืืืขืืจื ืืืืจืื. ืขื ืืืช, ืื ืืฉืจืช ืืืืืจ ืืืื ืืจื ื ืืื ื ืชืื ืื (ืืคื ืฉืงืืจื ืืืจื ืืื ืืืืจ ืืคืขืื ืืืืฉ), ืืืง ืืืืคืชืืืช ืืืืืงื ืืืืฉ ืืืืืชื. ืืืขืฉื ืื ืืืืจ ืืืืื ื ืชืื ื ืืคืืืฉื, ืฉืื ืืื ืืจื "ืืืืช" ืืขืชืง ืืืจ ืืืงืจื ืฉื ืคืกืคืืก.
ืืื ืกืคืจืืื ืกืื ืืจืืืื ืืืืื ืื ืืขืืงืจ ืืืคืงื ืงื ื ืืืื: ืื ืืืคืฉืจืื ืื ืืืืืื ืืช ืืืืืื ืืืืืื ืขืฆืืืื ืืืกืคืง ืื ืืืฉื ืืงืื ืืืชืืจื ืืฉืจืชืื ืฉืื ืื. ืขื ืืืช, ืืืฆืื ื, ื ืคื ืื ืชืื ืื ืืืืืืกื ืื ืืื ื ืขืืื ืขื ืืกืคืจ ืืืื-ืืืื, ืืืืืฆืืขืื ืฉื ืฆืืช ืืื ืื ืฉื ืืื ืืกืคืืงืื. ืืืชืื ืืื, ืืืืื ืืกืื ืืจืืืื ืืฉืืืืฉืืื ืืืืืืื ืืืืืื ืืืืืช ืืืืืช ืืืื ืืช ื-memcached ืชืื ืฉืืืจื ืขื ืืืคืข ืืืืื ืืื ืืคืืืช ืืืฆื ืขืืืื. ืขื ืืืช, ืื ื ืืชื ืืื ืื ืฆื ืืคืืื ืืืืื ืืช ืื... ืืื ืืืื ืืืืืจ ืืช ืืขืชืืงืืช ืฉื ืืืกืืจืช ืฉืฉืืืฉื ืืคืจืืืงื, ืืืื ืื ืืคืฉืจ ืืื ืืืจืื ืืืคืืืงืฆืื ืืขืืื ืขื ืืืืจ ืฉืจืชืื. ืื ืื ื ืืฉืืื ืื ืืช ืืืืื ื ืชืื ื ืืคืืืฉื: ืขืื ื ืฉื ืืืงืื ืืชืขืืืชื ืืืืชื ืชืงืืช ืืืกืืืืช ืฉื ืืืฉืชืืฉืื.
ืืืืคื ืืืืืืื ืื ืืื ื ืืจืฉ ืฉืืคืื ืฉื ืจืฉืืืืช ืืืขืชืงืื ืืืืงืืื ืืืขืืงืคืื ืืืงืจื ืฉื ืืขืืช ืื ืืขืืช. ืขืืจ ืื ื ืืืืฉื ืืกืืจืืืื ืื
ืืงืจืืืืจ
ืืื ื ืชื memcached ืฉืคืืชื ืขื ืืื ืคืืืกืืืง ืืื ืืคืชืืจ ืืช ืืืขืืืช ืฉืื. ืืื ืชืืื ืืคืจืืืืงืื ืืืงืกื memcached, ืืืืคืฉืจ ืงื ื ืืืื ืฉื ืืชืงื ืื ืืืืืกื ืื ืืืืืจืื ืืืืืื ืืืืจืคืื. ื ืืชื ืืืฆืื ืชืืืืจ ืืคืืจื ืฉื mcrouter ื
- ืฉืืคืื ืจืฉืืื;
- ืืฆืข ืืืจื ืืฉืจืชืื ืืืจืื ืืงืืืฆื ืื ืืชืจืืฉืช ืฉืืืื.
ืืขืกืงืื!
ืชืฆืืจืช mcrouter
ืื ื ืืขืืืจ ืืฉืจ ืืืืืจืืช:
{
"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
. - ืืงืฉืืช GET ืขืืืจืืช ืืืืคื
RandomRoute
ืฉืืืืจ ืืืงืจืื ืืืืจ ืื ืืกืืื ืืื ืืืืืืงืื ืืขืจืchildren
. ืื ืจืืื ืืืขืจื ืืื ืืื ืืชืืจื ืืืคืMissFailoverRoute
, ืฉืืขืืืจ ืืื ืฉืจืช ืืืืืจ ืขื ืืงืืืช ืืขื ื ืขื ื ืชืื ืื, ืฉืืืืืจื ืืืงืื. - ืื ืืฉืชืืฉื ื ืื ืืจืง
MissFailoverRoute
ืขื ืืืืจ ืฉื ืฉืืืฉื ืฉืจืชืื, ืื ืื ืืืงืฉืืช ืืืืขื ืชืืืื ืืืืคืข ืืจืืฉืื ืฉื memcached, ืืืฉืืจ ืืงืืื ืืงืฉืืช ืขื ืืกืืก ืฉืืืจื ืืืฉืจ ืืื ื ืชืื ืื. ืืืฉื ืืื ืชืืืื ื ืขืืืก ืืืคืจื ืขื ืืฉืจืช ืืจืืฉืื ืืจืฉืืื, ืื ืืืืื ืืืฆืืจ ืฉืืืฉื ืืืืจืื ืขื ืืชืืืืช ืืจืฆืคืื ืฉืื ืื ืืืืืืจ ืืืชื ืืืืคื ืืงืจืื. - ืื ืฉืืจ ืืืงืฉืืช (ืืื ืจืฉืืื) ืืขืืืืืช ืืืืฆืขืืช
AllMajorityRoute
. ืืืืคื ืืื ืฉืืื ืืงืฉืืช ืืื ืืฉืจืชืื ืืืืืจ ืืืืื ืืชืืืืืช ืืคืืืช ื-N/2 + 1 ืืื. ืืฉืืืืฉAllSyncRoute
ืขืืืจ ืคืขืืืืช ืืชืืื ืืื ืฆืจืื ืื ืืืฉ, ืฉืื ืฉืืื ืื ืืืจืฉืช ืชืืืื ืืืืืืช ื ืื ืฉืจืชืื ืืงืืืฆื - ืืืจืช ืื ืืืืืจSERVER_ERROR
. ืืืจืืช ืฉ-mcrouter ืืืกืืฃ ืืช ืื ืชืื ืื ืืืืืื ืื ืืืื ืื, ืืคืื ืงืฆืื ืืงืืจืืช ื-PHP ืืืืืจ ืฉืืืื ืืืืฆืืจ ืืืืขื.AllMajorityRoute
ืืื ื ืื ืืืืืจ ืืืืคืฉืจ ืืืืฆืื ืขื ืืืฆืืช ืืืืืืืืช ืืฉืืจืืช ืืื ืืืขืืืช ืืืชืืืจืืช ืืขืื.
ืืืืกืจืื ืืขืืงืจื ืกืืืื ืื ืืื ืฉืื ืืืืช ืืื ื ืชืื ืื ืืืืืื, ืื ืขืืืจ ืื ืืงืฉื ืืืืงืื ืืืืฆืขื ืืคืืขื N ืืงืฉืืช ื-memcached - ืืื ืื ืฉืจืชืื ืืืจืืื. ืื ืื ื ืืืืืื ืืฆืืฆื ืืช ืืกืคืจ ืืฉืจืชืื ื-pools, ืืืฉื, ืืฉื ืืื: ืืืงืจืื ืืช ืืืื ืืช ืืืืกืื, ืื ืื ื ืืงืืืืะพืืืืจืืช ืืืืื ืืืชืจ ืืคืืืช ืขืืืก ืืืงืฉืืช ืืืคืชืืืช ืืกืจืื.
NB: ืืืชืื ืฉืชืืฆื ืื ืงืืฉืืจืื ืฉืืืืฉืืื ืืืืืื mcrouter
ืื ืืื ืืืคืขืื ืฉื ืืงืจืืืืจ
ืืืคืืืงืฆืื ืฉืื ื (ืืื 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' ]
... ืืืฉืจืื ืืช ืื ืชืจืฉืื ืืื. ืืืืจ ืืืขื ืืื ืืื ืฉืืฉ ืจืง ืืืืื ืืืืจืืช ืืืืืกืก ืขื ืืกืคืจ ืืืขืชืงืื (ืื ืืืืฉืื ืืฉ ืืคืฉืจืืช ืืงืื ืืช ืืืืื ืืืช ืืืชืจ, ืฉืชืคื ืืืชื ืืชืืืืืช):
{{- $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 ืืืื ืืืชืจ ืืืคืจืืืืงืื ืืืื ืืจื, ืืืืฆืขืื ืกืื ืืจืืืื ืฉื ืืืืื ืืคืชื ืขืงืื ืขืืืืื ืจืง ืขื ืืคืจืืืืงืื ืืืื ืืจื. ืืื ืื ืื ืืืฆืจ ืืขืืืช ืืืงืจื ืกืคืฆืืคื.
ืืืจืืง ื ืืฆื ืืชืืง: ืื ืื ืฉืฆืจืื ืืขืฉืืช ืื ืืขืืืจ ืืคืจืืืืงืื ASCII ืืืื ืืขืืื.... ืขื ืืืช, ืืืงืจื ืื, ืืืจืื ืืืคืฉ ืชืฉืืืืช ื
ืื, ืฉื ืืืืคืฆืื ืื ืืื ืืื memcached.sess_binary_protocol
. ืื ืืืื ืืืืืช ืืืฉืืช, ืืืืืจ ืืื ืืคืขืืืช ืืชืืืื ืืขืืื. ืื ืื ืฉื ืฉืืจ ืื ืืืื ืืก ืืช ืืืืื ืขื mcrouter ืืชืจืืื ืขื PHP!
ืืกืงื ื
ืืคืืื, ืืขืืจืช ืฉืื ืืืื ืชืฉืชืืชืืื ืืืื ืืฆืืื ื ืืคืชืืจ ืืช ืืืขืื: ืืืขืื ืขื ืกืืืืืช ืชืงืืืช ื-memcached ื ืคืชืจื, ืืืืืื ืืช ืฉื ืืืกืื ืืืืืื ืืืืืื. ืื ืืกืฃ ืืืชืจืื ืืช ืืืจืืจืื ืืืคืืืงืฆืื, ืื ื ืชื ืืจืื ืชืืจืื ืืขืืืื ืขื ืืคืืืคืืจืื: ืืืฉืจ ืืื ืืจืืืืื ืืฉ ืจืืจืื, ืืื ืืื ืื ืืคืืฉืืื ืืืื. ืื, ืืฉืืื ืืื ืืฉ ืื ืืกืจืื ืืช, ืืื ืืืื ื ืจืืืช ืืื "ืงื", ืืื ืื ืืื ืืืกืืช ืืกืฃ, ืงืืืจืช ืืช ืืืขืื ืืื ืืืจืืช ืืืืฉืื - ืืื ืื?
ื .ื.
ืงืจื ืื ืืืืื ืฉืื ื:
- "ืชืืื ืขื ืืค" (ืืืืฆืขืืช ืกืืืคืื ืื-ืืื ืืืืืื):
ืืืง 1 (ืื ืืืช ืืืฉืืืื ืคืฉืืืื) ะธืืืง 2 (ืคืจืืกืช ืชืืื ืืช Docker ื-Kubernetes ืืืืฆืขืืช Helm) ; - ยซ
ืืืืืื ืขื Kubernetes: ืืื ืฉืจืช ื-HTTP ืื ืืขืืืฃ ืืช ืืกืคืจืืื ".
ืืงืืจ: www.habr.com