Я пытаюсь создать простую демоверсию Redis Sentinel с помощью docker и роя.
Есть два узла: узел1 (менеджер роя), узел2. Node1 запустит master-сервер redis и страж, Node2 запустит slave-сервер redis.
Это мой docker -компонентный файл (управляющий распределением контейнеров с метками):
version: "3.3"
services:
master:
image: "redis:5.0.7"
deploy:
mode: global
placement:
constraints: [node.labels.redismaster == true]
networks:
myredisnet:
command: redis-server /etc/redis.conf
volumes:
- "~/redis.conf:/etc/redis.conf"
salve:
image: "redis:5.0.7"
deploy:
mode: global
placement:
constraints: [node.labels.redisslave1 == true]
networks:
myredisnet:
command: redis-server /etc/redis-slave.conf
volumes:
- "~/redis-slave.conf:/etc/redis-slave.conf"
sentinel:
image: "redis:5.0.7"
ports:
- "26379:26379"
volumes:
- "~/sentinel.conf:/usr/local/bin/sentinel.conf"
deploy:
mode: global
placement:
constraints: [node.labels.redismaster == true]
networks:
myredisnet:
command: redis-sentinel /usr/local/bin/sentinel.conf
networks:
myredisnet:
driver: overlay
И мой файл Redis Conf и файл Redis-Slave похожи, за исключением slaveof master 6379
в файле Redis-Slave. (master
- имя службы в docker -составить файл):
bind 0.0.0.0
protected-mode yes
masterauth redispass
requirepass redispass
И Это мой файл Confent дозорного:
port 26379
logfile "/var/log/sentinel.log"
protected-mode no
dir "/root"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster master 6379 1
sentinel auth-pass mymaster redispass
После того, как я использую docker stack deploy -c docker-compose.yml redis
для развертывания этих служб, все кажется нормальным и Redis Master Slave построен правильно.
Но, похоже, дозорный проблема. Когда я вхожу в дозорный контейнерный терминал (docker exec -it
) и проверяю журнал дозорного:
root@d2fe4dc7ffa4:/data# cat /var/log/sentinel.log
1:X 23 Feb 2020 11:22:25.114 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:X 23 Feb 2020 11:22:25.114 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
1:X 23 Feb 2020 11:22:25.114 # Configuration loaded
1:X 23 Feb 2020 11:22:25.115 * Running mode=sentinel, port=26379.
1:X 23 Feb 2020 11:22:25.115 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:X 23 Feb 2020 11:22:25.116 # Sentinel ID is 1f9c8c8f688f0a9925dad749fea86c196781f6bf
1:X 23 Feb 2020 11:22:25.116 # +monitor master mymaster 10.0.9.2 6379 quorum 1
1:X 23 Feb 2020 11:22:25.118 * +slave slave 10.0.9.7:6379 10.0.9.7 6379 @ mymaster 10.0.9.2 6379
1:X 23 Feb 2020 11:22:55.168 # +sdown slave 10.0.9.7:6379 10.0.9.7 6379 @ mymaster 10.0.9.2 6379
Как видите, страж думает, что подчиненный узел недоступен. Меня удивляет то, что дозорный обнаружил, что IP-адрес раба был 10.0.9.7. На узле 2. По команде я обнаружил, что IP-адрес подчиненного контейнера должен быть 10.0.9.6:
on node2:
[root@node02 ~]# docker inspect 4ba57e6fd395
...
"Networks": {
"redis_myredisnet": {
"IPAMConfig": {
"IPv4Address": "10.0.9.6"
},
"Links": null,
"Aliases": [
"4ba57e6fd395"
],
"NetworkID": "ziry6mb6fkz5ido2cg9j86t6a",
"EndpointID": "771da42d9d7dc03ecb3892d2c3cdf83be97268625b0ee24f0fa3ffb6c2377b6d",
"Gateway": "",
"IPAddress": "10.0.9.6",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:0a:00:09:06",
"DriverOpts": null
}
}
И когда я вхожу в терминал терминала Redis (docker exec -it
) и выполняю redis-cli
, auth redispass
, info
чтобы проверить информацию о репликации на узле 1:
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.9.7,port=6379,state=online,offset=224628,lag=1
master_replid:f4bf3ba64df96919b6e9cd4e0935ace6d31b0ba6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:224759
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:224759
Как видите, подчиненный ip также равен slave0:ip=10.0.9.7
. Итак, я провел небольшой эксперимент, я использую apt-get update; apt-get install telnet
и пытаюсь набрать lnet 10.0.9.7 6379 в своем мастер-контейнере redis:
root@d2fe4dc7ffa4:/data# telnet 10.0.9.7 6379
Trying 10.0.9.7...
telnet: Unable to connect to remote host: Connection refused
И я также проверяю te lnet 10.0.9.6 6379 :
root@d2fe4dc7ffa4:/data# telnet 10.0.9.6 6379
Trying 10.0.9.6...
Connected to 10.0.9.6.
Escape character is '^]'.
auth redispass
+OK
Кроме того, я выполняю docker inspect (slave service name)
, и это vip-версия подчиненного сервиса:
[root@node03 ~]# docker inspect redis_salve
...
"Endpoint": {
"Spec": {
"Mode": "vip"
},
"VirtualIPs": [
{
"NetworkID": "ziry6mb6fkz5ido2cg9j86t6a",
"Addr": "10.0.9.5/24"
}
]
}
Так откуда взялся этот IP 10.0.9.7? И, похоже, у меня есть проблемы с моим дозорным сервисом. Когда я приостанавливаю мой главный контейнер redis, страж не может переключиться на подчиненный узел.
Кроме того, это мой файл стража стража после запуска службы стража:
[root@node03 ~]# cat sentinel.conf
port 26379
logfile "/var/log/sentinel.log"
protected-mode no
dir "/root"
sentinel myid 1f9c8c8f688f0a9925dad749fea86c196781f6bf
sentinel deny-scripts-reconfig yes
# Generated by CONFIG REWRITE
sentinel monitor mymaster 10.0.9.2 6379 1
sentinel auth-pass mymaster redispass
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 10.0.9.7 6379
sentinel current-epoch 0
Любая помощь приветствуется !! !!!!!!!