Linux.中国 - 开源社区

 找回密码
 骑士注册

QQ登录

微博登录


用 Docker 构建分布式 Redis 集群

2015-2-6 10:28    评论: 6 收藏: 5 分享: 9    

4. 提交镜像以便于重用

现在我们的redis容器运行良好, 我们想要把它保存为伪模板,以便在Docker上重复部署。做到这个非常简单,我们只要使用‘docker commit ...’这个镜像到我们本地的库就可以了,像下面这样:

root@server:/home/sam# docker ps -as
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
e3919192d9e3 phusion/baseimage:0.9.15 "/sbin/my_init --ena 3 hours ago Up 3 hours redis 164.9 MB
root@server:/home/sam# docker commit redis redis-cluster-node
root@server:/home/sam# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
redis-cluster-node latest babfb02edf4d 5 hours ago 561.2 MB

5. 部署新镜像的3个实例

为了解释清楚,我会删除之前创建的容器,以免后面搞晕。首先使用docker stop redis,之后再docker rm redis:

root@server:/home/sam# docker stop redis
redis
root@server:/home/sam# docker rm redis
redis
root@server:/home/sam#

很简单,下面让我们部署新镜像的3个实例,我们使用了Docker的端口映射机制,从而我们就可以使用Host服务器的IP访问这些实例,我们给这些实例关联的端口如下:

node1 - hostip:7001
node2 - hostip:7002
node3 - hostip:7003

所以我们运行redis-cli -h 192.168.0.2 -p 7001,它将重定向到172.17.0.x -p 6379,例如下面我们部署了三个实例:

root@server:/home/sam# docker run -d --name node1 -p 7001:6379 redis-cluster-node /sbin/my_init
cd1c1f96346bdf9c1cec04333c2e849992ecbc4375dcea6b30902dd9842d8c99
root@server:/home/sam# docker run -d --name node2 -p 7002:6379 redis-cluster-node /sbin/my_init
cd1c1f96346bdf9c1cec04333c2e849992ecbc4375dcea6b30902dd9842d8c99
root@server:/home/sam# docker run -d --name node3 -p 7003:6379 redis-cluster-node /sbin/my_init
cd1c1f96346bdf9c1cec04333c2e849992ecbc4375dcea6b30902dd9842d8c99
root@server:/home/sam#

现在我们可以运行docker ps -as来查看我们运行的三个Redis容器:

root@server:/home/sam# docker ps -as
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
a532b4ac60d9 redis-cluster-node:latest "/sbin/my_init" 5 hours ago Up 5 hours 0.0.0.0:7003->6379/tcp node3 2.267 MB
6c8a87a0a76a redis-cluster-node:latest "/sbin/my_init" 5 hours ago Up 5 hours 0.0.0.0:7002->6379/tcp node2 2.318 MB
39e02633ccf8 redis-cluster-node:latest "/sbin/my_init" 5 hours ago Up 5 hours 0.0.0.0:7001->6379/tcp node1 2.334 MB
root@server:/home/sam#

现在我们看到了3个容器,分别名字为node1、node2和node3,并且有一个专门的端口与Redis 服务的端口相映射。为了测试这样的映射是正确的,可以在另外一台机器使用redis-cli登录到各个Redis服务器上面:

root@server:/home/sam# redis-cli -h 192.168.0.2 -p 7001
redis 192.168.0.16:7001>
root@server:/home/sam# redis-cli -h 192.168.0.2 -p 7002
redis 192.168.0.16:7002>
root@server:/home/sam# redis-cli -h 192.168.0.2 -p 7003
redis 192.168.0.16:7003>
root@server:/home/sam# redis-cli -h 192.168.0.2 -p 7005
Could not connect to Redis at 192.168.0.2:7005: Connection refused
not connected>

正如你看到的, 我们可以使用 hostip+port登录到对应的Redis服务器上, 当我们尝试一个不正确的端口时,却不行。

译者增加: 如果这里验证失败了的可以登录进容器中检查下Redis的服务有没有起来:
docker exec -t -i redis bash -l
  netstat -anp | grep redis  #看看有没有网络监听,如果没有执行下面的命令启动redis服务
  redis-server /etc/redis/redis.conf
  

6. 配置Redis的从节点

我们有了三个独立的Redis服务器, 现在我们想把它们连接到一起, 从而我们可以测试这个集群的扩展性,对集群的监控,或者是做其它的事情。

我们把node1作为主节点,把node2和node3配置为它的从节点,这可以简单的通过修改/etc/redis/redis.conf这个文件来实现。SSH进入node2和node3节点,修改配置文件,然后重启容器:

root@server:/home/sam# docker inspect node1 | grep IPA
"IPAddress": "172.17.0.46",
root@server:/home/sam# docker inspect node2 | grep IPA
"IPAddress": "172.17.0.47",
root@server:/home/sam# ssh root@172.17.0.47
root@172.17.0.47's password:
Last login: Tue Jan 13 11:47:31 2015 from 172.17.42.1
root@6c8a87a0a76a:~# nano /etc/redis/redis.conf

在这个配置文件中我们只要找到‘salveof’这一行,然后去掉注释,修改为node1的ip地址,像下面这样:

root@6c8a87a0a76a:~# cat /etc/redis/redis.conf | grep slaveof
# Master-Slave replication. Use slaveof to make a Redis instance a copy of
slaveof 172.17.0.46 6379
root@6c8a87a0a76a:~#

最后使用命令docker restart node2重启容器, 现在它就是node1的一个从节点了。为了验证这个, 使用redis-cli分别登录到node1和node2, 在node1上运行命令set hello world, 然后在node2上运行get hello,如果配置正确的话会得到下面的结果:

root@server:/home/sam# redis-cli -h 192.168.0.16 -p 7001
redis 192.168.0.12:7001> set hello world
OK
redis 192.168.0.12:7001> exit
root@server:/home/sam# redis-cli -h 192.168.0.16 -p 7002
redis 192.168.0.12:7002> get hello
"world"
redis 192.168.0.12:7002> exit
root@server:/home/sam#

对于node3也做同样的配置即可。

恭喜,基于Docker的、拥有三个节点且可水平扩展的Redis集群就这样搭好了。

接下来的下一篇博客中,我将给大家展示如何使用Opsview去监控Redis集群,你可以看到一个像下面这样展示你的集群统计信息的可视化界面:

redis.png

12
查看其它分页:

发表评论


最新评论

我也要发表评论

慕-小坏 [Chrome 47.0|Windows 7] 2015-12-30 00:36
docker run -d --name node1 -p 7001:6379 redis-cluster-node /sbin/my_init cd1c1f96346bdf9c1cec04333c2e849992ecbc4375dcea6b30902dd9842d8c99

/sbin/my_init后面那个一长串是啥。。。
回复
soli 2015-2-9 14:43
不过总得来说,对我这种 Docker 小白,这是讲的最清楚的一篇文章了。

尤其是从下载基础镜像开始、到安装服务、到制作镜像、到启动实例,这些一步步讲来才能让人清楚来龙去脉。
2 回复
soli 2015-2-9 14:40
文中的 IP 有点混乱。

命令输出是 172.17.0.46, 下面的命令却用了 172.17.0.52。Host机原来是 192.168.0.2 后来却写的 192.168.0.16。
回复
呼噜呼噜睡翻天 2015-2-6 19:33  新浪微博网友评论
说的很详细,呆会试一下
回复
不毒舌不舒服不吐槽不开心 2015-2-6 11:03  新浪微博网友评论
这个只是做了一主多从,不算集群。。
回复
cwinux 2015-2-6 11:03  新浪微博网友评论
对于存储类系统,用docker简化安装可以,但做failover还是不合适吧,除非用共享存储。docker的最大利好是对于web与应用这块领域:一体化的开发、测试、发布,保证了环境的统一并简化了failover。
回复

热点评论

soli 2015-2-9 14:43
不过总得来说,对我这种 Docker 小白,这是讲的最清楚的一篇文章了。

尤其是从下载基础镜像开始、到安装服务、到制作镜像、到启动实例,这些一步步讲来才能让人清楚来龙去脉。
2
返回顶部

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”将网页分享至朋友圈。