使用Docker自动启动Redis集群,同时使用PHP7
我将活动上传到GitHub。
一般方法是在启动容器后使用命令来执行,但因为繁琐所以决定自动化处理。
重点是在网络设置上分配IP,并在启动时指定node.conf。
首先是关于 docker-compose.yml 的说明
version: '2'
services:
#nginxの設定
cluster-test-web:
build: docker/web
container_name: cluster-test-web
ports:
- 80:80
links:
- cluster-test-app:php
volumes_from:
- cluster-test-app
#redisと同じネットワークに
networks:
app_net:
#phpの設定
cluster-test-app:
build: docker/app
container_name: cluster-test-app
volumes:
- ./:/var/www/html
links:
#redisと接続するのでその設定
- cluster-test-redis:redis
#redisと同じネットワークに
networks:
app_net:
#redisの設定
cluster-test-redis:
image: redis:latest
container_name: cluster-test-redis
# ./docker/redis の内容を /data/conf にマウント
volumes:
- ./docker/redis/:/data/conf
# コンテナが起動したら、
# redis-serverとクラスター・レプリケーションの設定を行うshellスクリプトを実行。
# その後、常時起動のコマンドを走らせる。
command: bash -c "/bin/bash /data/conf/redis.sh && while true; do echo 1; sleep 1; done"
ports:
- 7000:7000
- 7001:7001
- 7002:7002
- 7003:7003
- 7004:7004
- 7005:7005
#shellスクリプト内でipを使用するのでここで設定。
networks:
app_net:
ipv4_address: 172.16.239.10
networks:
app_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.239.0/24
gateway: 172.16.239.1
Redis服务器的启动是在docker-compose.yml中通过command命令执行redis.sh文件来完成的。
#!/bin/bash
# 邪魔なファイルを削除。
rm -f \
/data/conf/r7000i.log \
/data/conf/r7001i.log \
/data/conf/r7002i.log \
/data/conf/r7003i.log \
/data/conf/r7004i.log \
/data/conf/r7005i.log \
/data/conf/nodes.7000.conf \
/data/conf/nodes.7001.conf \
/data/conf/nodes.7002.conf \
/data/conf/nodes.7003.conf \
/data/conf/nodes.7004.conf \
/data/conf/nodes.7005.conf ;
#redisを6台クラスターモードで(クラスターモードの設定はredis.conf)起動。
# nodes.****.conf はそれぞれ別々のファイルを指定する必要がある。
redis-server /data/conf/redis.conf --port 7000 --cluster-config-file /data/conf/nodes.7000.conf --daemonize yes ;
redis-server /data/conf/redis.conf --port 7001 --cluster-config-file /data/conf/nodes.7001.conf --daemonize yes ;
redis-server /data/conf/redis.conf --port 7002 --cluster-config-file /data/conf/nodes.7002.conf --daemonize yes ;
redis-server /data/conf/redis.conf --port 7003 --cluster-config-file /data/conf/nodes.7003.conf --daemonize yes ;
redis-server /data/conf/redis.conf --port 7004 --cluster-config-file /data/conf/nodes.7004.conf --daemonize yes ;
redis-server /data/conf/redis.conf --port 7005 --cluster-config-file /data/conf/nodes.7005.conf --daemonize yes ;
REDIS_LOAD_FLG=true;
#全てのredis-serverの起動が完了するまでループ。
while $REDIS_LOAD_FLG;
do
sleep 1;
redis-cli -p 7000 info 1> /data/conf/r7000i.log 2> /dev/null;
if [ -s /data/conf/r7000i.log ]; then
:
else
continue;
fi
redis-cli -p 7001 info 1> /data/conf/r7001i.log 2> /dev/null;
if [ -s /data/conf/r7001i.log ]; then
:
else
continue;
fi
redis-cli -p 7002 info 1> /data/conf/r7002i.log 2> /dev/null;
if [ -s /data/conf/r7002i.log ]; then
:
else
continue;
fi
redis-cli -p 7003 info 1> /data/conf/r7003i.log 2> /dev/null;
if [ -s /data/conf/r7003i.log ]; then
:
else
continue;
fi
redis-cli -p 7004 info 1> /data/conf/r7004i.log 2> /dev/null;
if [ -s /data/conf/r7004i.log ]; then
:
else
continue;
fi
redis-cli -p 7005 info 1> /data/conf/r7005i.log 2> /dev/null;
if [ -s /data/conf/r7005i.log ]; then
:
else
continue;
fi
#redis-serverの起動が終わったらクラスター・レプリカの割り当てる。
#ipを127.0.0.1で割り当てるとphpで不具合が起こるのでpublic ipを指定。
yes "yes" | redis-cli --cluster create 172.16.239.10:7000 172.16.239.10:7001 172.16.239.10:7002 172.16.239.10:7003 172.16.239.10:7004 172.16.239.10:7005 --cluster-replicas 1;
REDIS_LOAD_FLG=false;
done
redis.conf的内容如下:
#クラスターモードON
cluster-enabled yes
cluster-node-timeout 5000
#接続のip制限を解除
bind 0.0.0.0
编写用于确认动作的PHP代码。
<?php
#接続は docker-compose.yml の link の設定で繋がる
$rc = new \RedisCluster(null, [
'redis:7000',
]);
# php7だと RedisCluster::FAILOVER_DISTRIBUTE_SLAVES が動かないので、ランダムで replica にアクセスの RedisCluster::FAILOVER_DISTRIBUTE を設定。
# https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#automatic-slave-failover--distribution
# https://github.com/phpredis/phpredis/issues/937
$rc->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_DISTRIBUTE);
echo "<pre>";
# master系のnodeのリストが表示できます
print_r($rc->_masters());
# replica(slave)も含めて全てのnodeを表示
print_r($rc->rawcommand(['172.16.239.10', 7000], 'cluster', 'nodes'));
$t = microtime();
$k = md5($t);
# 適当の値をセットして
$rc->set($k, $t);
# とりあえずゲットしてみる。ゲットできていれば万事上手く動いているんじゃないんですかね
print_r($rc->get($k));
如果使用docker-compose up -d –build启动,可以尝试在浏览器中访问http://localhost/redis_test.php。
这样的话,Master列表和Node列表会被显示出来。
集群被恰当地分配,并且复制也已经完成了,是吧。
以上。 .)