1. Подготовка инструментов
Установить докер (изОфициальный сайт)
(1) Установите необходимые пакеты программного обеспечения
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
(2) Используйте следующую команду для настройки стабильного репозитория.
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
(3) Установите docker ce (версия сообщества докеров)
$ sudo yum install docker-ce
(4) Запустить докер
$ sudo systemctl start docker
Получите образ Redis в библиотеке докеров (по состоянию на 27 марта 2019 г., последняя версия — 5.0.4)
$ docker pull redis
На данный момент все инструменты кластера Redis на докере готовы, Мы можем просмотреть установленные образы, введя образы докеров в командной строке.
2. Кластерная конструкция
Создайте контейнер Redis
##### (1) Создать файл конфигурации Redis (Redis-Cluster.tmpl)
Я создаю папку redis-cluster по пути /home, создаю файл redis-cluster.tmpl по пути /home/redis-cluster и копирую следующее содержимое. (注:路径可自定义,我用的是/home/redis-cluster
)
port ${PORT} ##节点端口
protected-mode no ##开启集群模式
cluster-enabled yes ##cluster集群模式
cluster-config-file nodes.conf ##集群配置名
cluster-node-timeout 5000 ##超时时间
cluster-announce-ip 192.168.XX.XX ##实际为各节点网卡分配ip 先用上网关ip代替
cluster-announce-port ${PORT} ##节点映射端口
cluster-announce-bus-port 1${PORT} ##节点总线端口
appendonly yes ##持久化模式
По команде можно просмотреть
[root@node-01 redis-cluster]# cat /home/redis-cluster/redis-cluster.tmpl
port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.221
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
Примечание. Этот файл шаблона является общим файлом для узлов кластера, где ${PORT} будет считывать переменную командной строки. IP будет заменен в соответствии с IP-адресом, назначенным сетевой картой, чтобы гарантировать, что файл конфигурации узла одинаков, за исключением порт и айпи.
(2) Создайте пользовательскую сеть
$ docker network create redis-net
docker network ls ##Просмотр информации о сетевой карте
[root@node-01 conf]# docker network ls
NETWORK ID NAME DRIVER SCOPE 7f804fa5fbd2 redis-net bridge local
Примечание. Цель создания виртуальной сетевой карты redis-net — позволить док-контейнеру соединить сеть с хостом (centos7) и косвенно подключиться к внешнему миру.
(3) Просмотрите IP-адрес шлюза виртуальной сетевой карты redis-net.
[root@node-01 conf]# docker network inspect redis-net | grep "Gateway" | grep --color=auto -P '(\d{1,3}.){3}\d{1,3}' -o 172.21.0.1
Примечания: docker network inspect network-name отображает информацию о конфигурации, соответствующую имени сети (gerp фильтрует строку конфигурации шлюза и фильтрует ip) Вручную
(4) Создайте цели conf и данных в /home/redis-cluster и создайте информацию о конфигурации.
$ for port in `seq 7000 7005`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
Всего генерируется 6 папок, от 7000 до 7005, в каждой папке находятся папки data и conf, а в conf есть конфигурационный файл redis.conf
(5) Создайте 6 контейнеров Redis
$ for port in `seq 7000 7005`; do \
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
-v /home/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /home/redis-cluster/${port}/data:/data \
--restart always --name redis-${port} --net redis-net \
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
备注:命令译为 循环7010 - 7015 运行redis 容器
docker run 运行
-d 守护进程模式
--restart always 保持容器启动
--name redis-710* 容器起名
--net redis-net 容器使用虚拟网卡
-p 指定宿主机器与容器端口映射 701*:701*
-P 指定宿主机与容器redis总线端口映射 1701*:1701*
--privileged=true -v /home/redis-cluster/701*/conf/redis.conf:/usr/local/etc/redis/redis.conf
付权将宿主701*节点文件挂载到容器/usr/local/etc/redis/redis.conf 文件中
--privileged=true -v /home/redis-cluster/${port}/data:/data \
付权将宿主701*/data目录挂载到容器/data目录中
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf;
容器根据挂载的配置文件启动 redis服务端
6. Вы можете просмотреть информацию о 6 контейнерах, только что сгенерированных командой docker ps.
[root@node-01 redis-cluster]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15c479074b87 redis "docker-entrypoint..." 10 seconds ago Up 9 seconds 0.0.0.0:7005->7005/tcp, 6379/tcp, 0.0.0.0:17005->17005/tcp redis-7005
45bec33c2c35 redis "docker-entrypoint..." 11 seconds ago Up 10 seconds 0.0.0.0:7004->7004/tcp, 6379/tcp, 0.0.0.0:17004->17004/tcp redis-7004
45482d9e5bb8 redis "docker-entrypoint..." 11 seconds ago Up 10 seconds 0.0.0.0:7003->7003/tcp, 6379/tcp, 0.0.0.0:17003->17003/tcp redis-7003
f633d5c767c9 redis "docker-entrypoint..." 11 seconds ago Up 10 seconds 0.0.0.0:7002->7002/tcp, 6379/tcp, 0.0.0.0:17002->17002/tcp redis-7002
eefc0d49fedf redis "docker-entrypoint..." 11 seconds ago Up 10 seconds 0.0.0.0:7001->7001/tcp, 6379/tcp, 0.0.0.0:17001->17001/tcp redis-7001
58b311e5dbcb redis "docker-entrypoint..." 12 seconds ago Up 11 seconds 0.0.0.0:7000->7000/tcp, 6379/tcp, 0.0.0.0:17000->17000/tcp redis-7000
7. Просмотр IP-адреса контейнера
[root@node-01 conf]# docker network inspect redis-net
[
{
"Name": "redis-net",
"Id": "7f804fa5fbd2473f1e6e9783ac52aa980c355e3253b15a28e10f8793c46fc39b",
"Created": "2019-03-27T12:59:14.45569686+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {
"449c38916b4ef919d1b1828da3f69e0f5256eb2023204f25f69fbb8c449f2163": {
"Name": "redis-7005",
"EndpointID": "5c89e6fdd0e983d6d2b950c9bc41616920265dda93f2852650ca5e9da1da22b1",
"MacAddress": "02:42:ac:15:00:07",
"IPv4Address": "172.21.0.7/16",
"IPv6Address": ""
},
"600aa2f84dfbe72a19caf5dc684cb7691e89a43753f70d74355468b7659caa23": {
"Name": "redis-7000",
"EndpointID": "75873081222c7a2eedc5f3ee639df5cc7645790012dd72e34c97fd97dcb5cf47",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
},
"78aeae8b2d381d3789848f45f766dd01d7c0d5443505920decf41fce751f765d": {
"Name": "redis-7002",
"EndpointID": "a70d816cd9e3650b1d10507a85fa85c0c2e143ba99c0974fb000ec87ad5b173d",
"MacAddress": "02:42:ac:15:00:04",
"IPv4Address": "172.21.0.4/16",
"IPv6Address": ""
},
"7ecd2e1372a2bc15cb89fad856ab410757b49936f662ce170990c04e1861037d": {
"Name": "redis-7004",
"EndpointID": "f8cdb522601e9667ec06dc0dc0d39b46331b3d24cbea1155b00b73e600eca8c7",
"MacAddress": "02:42:ac:15:00:06",
"IPv4Address": "172.21.0.6/16",
"IPv6Address": ""
},
"bd8254045c66bc6569c9a585b58cb028e864b6c7f16d836009debd3a3350913c": {
"Name": "redis-7003",
"EndpointID": "6a25ff0046e6d6575579cdf08bccbb2a62b29460e3932de3f8e476bb908fdc9c",
"MacAddress": "02:42:ac:15:00:05",
"IPv4Address": "172.21.0.5/16",
"IPv6Address": ""
},
"cfef6ca3aeea9d3b4fa527538fbe2a2f79aac25d52921b4edc31839b6f330887": {
"Name": "redis-7001",
"EndpointID": "98a36b61bc6f50f78444a6cefa5e9999f5366e72425602511bc95f602ef0dc93",
"MacAddress": "02:42:ac:15:00:03",
"IPv4Address": "172.21.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
Примечания: Каждому контейнеру назначается соответствующий ему IP.Вам необходимо изменить файл конфигурации узла redis.conf, чтобы он соответствовал ему, и перезапустить контейнер.
(8) Измените файл конфигурации каталога монтирования хоста.
vim /home/redis-cluster/700*/conf/redis.conf ##编辑ip为查询分配的ip 并esc+:wq退出
port 7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.21.0.2
cluster-announce-port 7000
cluster-announce-bus-port 17000
appendonly yes
запустить кластер
введите узел
docker exec -it redis-7000 bash
Чтобы создать кластер с Redis 5, просто введите redis-cli:
redis-cli --cluster create 172.21.0.2:7000 172.21.0.3:7001 172.21.0.4:7002 172.21.0.5:7003 172.21.0.6:7004 172.21.0.7:7005 --cluster-replicas 1
На данный момент кластер создан.
[root@node-01 data]# docker exec -it redis-7000 bash
root@600aa2f84dfb:/data# redis-cli --cluster create 172.21.0.2:7000 172.21.0.3:7001 172.21.0.4:7002 172.21.0.5:7003 172.21.0.6:7004 172.21.0.7:7005 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.21.0.6:7004 to 172.21.0.2:7000
Adding replica 172.21.0.7:7005 to 172.21.0.3:7001
Adding replica 172.21.0.5:7003 to 172.21.0.4:7002
M: 0d403d866c4bdfa90f3a1e21b2a33356474014ee 172.21.0.2:7000
slots:[0-5460] (5461 slots) master
M: ab4bf4833926dd7ffca5f2d34ef754466730e7d7 172.21.0.3:7001
slots:[5461-10922] (5462 slots) master
M: 846f087ee5885f17d5a5c05d2eb2ba470441f700 172.21.0.4:7002
slots:[10923-16383] (5461 slots) master
S: e44c2b96f1446b1860fe582547634b12a461407d 172.21.0.5:7003
replicates 846f087ee5885f17d5a5c05d2eb2ba470441f700
S: 4efa0a9b7b4b159807900efa5f86410e55c1d2b3 172.21.0.6:7004
replicates 0d403d866c4bdfa90f3a1e21b2a33356474014ee
S: 8a616ee30a7104bcd341d57af825c6b5b30176ff 172.21.0.7:7005
replicates ab4bf4833926dd7ffca5f2d34ef754466730e7d7
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 172.21.0.2:7000)
M: 0d403d866c4bdfa90f3a1e21b2a33356474014ee 172.21.0.2:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: e44c2b96f1446b1860fe582547634b12a461407d 172.21.0.5:7003
slots: (0 slots) slave
replicates 846f087ee5885f17d5a5c05d2eb2ba470441f700
M: ab4bf4833926dd7ffca5f2d34ef754466730e7d7 172.21.0.3:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 8a616ee30a7104bcd341d57af825c6b5b30176ff 172.21.0.7:7005
slots: (0 slots) slave
replicates ab4bf4833926dd7ffca5f2d34ef754466730e7d7
M: 846f087ee5885f17d5a5c05d2eb2ba470441f700 172.21.0.4:7002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 4efa0a9b7b4b159807900efa5f86410e55c1d2b3 172.21.0.6:7004
slots: (0 slots) slave
replicates 0d403d866c4bdfa90f3a1e21b2a33356474014ee
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Подключить клиент для просмотра информации от мастера
root@600aa2f84dfb:/data# redis-cli -c -p 7000
127.0.0.1:7000> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.21.0.6,port=7004,state=online,offset=3556,lag=1
master_replid:ef97265d34769b68096786c3e802fb3a13968fe9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3556
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3556
Другие соображения
Хост-хост открывает ip для внешнего мира
for port in `seq 7000 7005`; do \
firewall-cmd --zone=public --add-port=${port}/tcp --permanent
done
#重新载入
firewall-cmd --reload
#####Контейнер нужно поставить на паузу и удалить, чтобы повторить 6 шагов
for port in `seq 7000 7005`; do \
docker stop redis-${port};
docker rm redis-${port};
done