因为业务需求,最近需要部署redis主从集群进行测试。正好最近在研究docker,发现docker配置redis集群特别方便迅速。

1.mac系统安装docker环境

  • docker官网已经支持直接下载安装。很久之前都是通过Boot2Docker进行安装,需要本地启动Boot2Docker,现在已经很方便了。
  • 下载链接

2.下载docker redis镜像

docker pull redis

3.开启主redis服务

docker run -h redis-master --name redis-master -p 6379:6379 -d redis

4.开启从redis服务

#下载配置文件到/tmp目录
wget -c http://download.redis.io/redis-stable/redis.conf -O /tmp/redis.conf
#配置从服务指定主服务器地址和连接
sed -i "" "s/# slaveof <masterip> <masterport>/slaveof redis-master 6379/g" /tmp/redis.conf
sed -i "" "s/bind 127.0.0.1/#bind 127.0.0.1/g" /tmp/redis.conf
sed -i "" "s/protected-mode yes/#protected-mode yes/g" /tmp/redis.conf
#开启从redis服务配置对外端口6380
docker run --link redis-master:redis-master -h redis-slave --name redis-slave \
	-p  6380:6379 -v /tmp/redis.conf:/usr/local/etc/redis.conf \
	-d redis redis-server /usr/local/etc/redis.conf

5.封装shell脚本部署

wget https://raw.githubusercontent.com/nanjishidu/shells/master/redis/redis.sh
chmod +x redis.sh
./redis.sh

6.redis配置问题记录

使用官方默认redis配置文件配置从服务器,只修改slaveof redis-master 6379。redis从服务启动后,本地客户端访问映射端口,获取数据时提示服务接口已经关闭。

通过如下命令登陆redis从服务器,redis客户端链接后发现正常,初步怀疑和网络有关

docker -it redis-slave /bin/sh

telnet 服务器映射端口发现链接后立即断开

➜  docker git:(master) ✗ telnet 127.0.0.1 6390
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

对比正常配置文件发现如下差异,注释后运行正常。

bind 127.0.0.1
protected-mode yes

7.备注 protected-mode

Redis protected-mode 是3.2 之后加入的新特性。Protected-mode 是为了禁止公网访问redis cache,加强redis安全的。如果启用了,则只能够通过lookback ip(127.0.0.1)访问Redis cache。