【编者的话】本文介绍了如何使用Docker搭建Redis集群,很多读者都在问Docker能带来哪些实质性的好处,我想本文就是一个很好的例子。不使用Docker你也可以搭建Redis集群,那使用Docker后会有怎么样的优势了?我想可以用两个词总结:快速和复用。 我们经常会遇到这样一个问题:当我们想进行一个完整的测试的时候,往往缺少硬件或者其它资源。为了满足需求,我可能需要三台服务,或者说三个虚拟机。但是我发现我们没有时间来创建它们,并且如果要物理机的话我们也没有那么多资源。这也是为什么我对Docker如此感兴趣,因为它可以解决我的问题。 我想在Ubuntu上创建三个运行Redis的Docker容器,并把它们连接起来,然后我就可以自由的在测试和开发过程中水平的扩展了, 接下来我就给你们展示我是怎么做的,以及这样做的优势。 1. 下载和配置基础镜像 我使用的是非常优秀的phusion镜像作为基础镜像,它增加了很多Docker忽略的特性, 比如按序启动服务等等, 关于这个镜像的更多信息,可以点击这里了解。 首先,让我们使用Docker来pullphusion镜像(译者注:建议使用高版本的Docker下载,低版本会有问题)。 root@server:/home/sam# docker pull phusion/baseimage 下载完成之后, 你可以通过 docker images 命令看到最新下载的镜像。root@server:/home/sam# docker images 这个镜像非常好用,你可以在容器启动的时候指定特定服务的启动顺序, 在这里我想给这个镜像加一个SSH密码登录的功能,而不是使用SSH key。因为是在本地运行,所以不用太担心安全的问题。我们需要创建一个phusion的实例, 然后通过SSH key登录, 并且修改配置,重启SSH,之后我们就可以使用root登录了。 首先,用phusion基础镜像创建一个新的容器。 root@server:/home/sam# docker run -d --name redis phusion/baseimage /sbin/my_init /sbin/my_init 是允许phusion在容器启动的时候启动你的服务。 enable-insecure-key 允许我们使用‘insecure key‘ssh进新的容器。现在我们已经部署了容器, 接下来需要得到它的IP地址,可以使用 docker inspect 命令。root@server:/home/sam# docker inspect redis | grep IPA 接下来,下载’insecure key‘并使用它登录这个容器。 root@server:/home/sam# curl -o insecure_key -fSL https://github.com/phusion/baseimage-docker/raw/master/image/insecure_key 祝贺你, 你现在SSH进入容器了!下面你需要修改SSH,从而我们不再需要’insecure key‘了,为了做到这个,打开’/etc/ssh/sshd_config‘找到下面这一行, 并去掉注释。 PermitRootLogin yes 保存文件, 我们再设置root的密码。 root@c36b4bba7dd4:~# passwd 以上我们做了一些准备工作,接下来我们将在这个容器中安装Redis。 2 安装Redis 现在我们已经有了配置好的镜像了,接下来我们需要去下载和安装Redis,你可以从这里下载到你想要的Redis,在我们的例子中用到的是3.0.0 RC1,下载地址是:https://github.com/antirez/red ... ar.gz。 注意:你还需要安装wget、gcc、make以及一些其它的工具。可以使用下面的命令: apt-get update #更新系统 首先,我们下载Redis 3.0.0 RC1。 root@e3919192d9e3:/home# wget https://github.com/antirez/redis/archive/3.0.0-rc1.tar.gz 解压这个包并make。 root@e3919192d9e3:/home# tar -zxvf 3.0.0-rc1.tar.gz 最后, 我们把编译好的代码中的几个可执行命令移动到/usr/bin/下面 root@e3919192d9e3:/home/redis-3.0.0-rc1# cd src 现在打开文件/etc/redis/redis.conf, 找到‘daemonize no’改为‘daemonize yes‘,然后启动它! root@e3919192d9e3:/home/redis-3.0.0-rc1/src# redis-server /etc/redis/redis.conf 好了, Redis现在已经安装好了,并且在容器里面运行了,使用的配置文件是/etc/redis/redis.conf。 3. 让Docker在启动容器的时候启动Redis服务 现在我们的容器正在运行Redis,并且也可以使用SSH登录了,我们还需要让它在容器启动的时候自动启动Redis服务,使用phusion基础镜像来实现这点相当的容易。首先,因为我们启动容器的时候使用了/sibn/my_init, 它会去运行任何我们放在/etc/service/*下面的程序。所以,对于我们来说,我们只要去创建一个目录以及在这个目录里面再创建一个叫run的文件,像下面这样: root@e3919192d9e3:/etc/service# cd /etc/service 在这个run文件里面,我们加入下面的内容: #!/bin/sh 最后,记得给run文件添加可执行权限。 4. 提交镜像以便于重用 现在我们的redis容器运行良好, 我们想要把它保存为伪模板,以便在Docker上重复部署。做到这个非常简单,我们只要使用‘docker commit ...’这个镜像到我们本地的库就可以了,像下面这样: root@server:/home/sam# docker ps -as 5. 部署新镜像的3个实例 为了解释清楚,我会删除之前创建的容器,以免后面搞晕。首先使用 docker stop redis ,之后再docker rm redis :root@server:/home/sam# docker stop redis 很简单,下面让我们部署新镜像的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 现在我们可以运行 docker ps -as 来查看我们运行的三个Redis容器:root@server:/home/sam# docker ps -as 现在我们看到了3个容器,分别名字为node1、node2和node3,并且有一个专门的端口与Redis 服务的端口相映射。为了测试这样的映射是正确的,可以在另外一台机器使用 redis-cli 登录到各个Redis服务器上面:root@server:/home/sam# redis-cli -h 192.168.0.2 -p 7001 正如你看到的, 我们可以使用 hostip+port登录到对应的Redis服务器上, 当我们尝试一个不正确的端口时,却不行。 6. 配置Redis的从节点 我们有了三个独立的Redis服务器, 现在我们想把它们连接到一起, 从而我们可以测试这个集群的扩展性,对集群的监控,或者是做其它的事情。 我们把node1作为主节点,把node2和node3配置为它的从节点,这可以简单的通过修改/etc/redis/redis.conf这个文件来实现。SSH进入node2和node3节点,修改配置文件,然后重启容器: root@server:/home/sam# docker inspect node1 | grep IPA 在这个配置文件中我们只要找到‘salveof’这一行,然后去掉注释,修改为node1的ip地址,像下面这样: root@6c8a87a0a76a:~# cat /etc/redis/redis.conf | grep slaveof 最后使用命令 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 对于node3也做同样的配置即可。 恭喜,基于Docker的、拥有三个节点且可水平扩展的Redis集群就这样搭好了。 接下来的下一篇博客中,我将给大家展示如何使用Opsview去监控Redis集群,你可以看到一个像下面这样展示你的集群统计信息的可视化界面: 原文链接:Creating a distributed Redis system using Docker(翻译:左伟 校对:李颖杰) |
|