共计 13193 个字符,预计需要花费 33 分钟才能阅读完成。
【编者的话】本文介绍了如何使用 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
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
phusion/baseimage 0.9.15 cf39b476aeec 3 months ago 289.4 MB
phusion/baseimage latest cf39b476aeec 3 months ago 289.4 MB
这个镜像非常好用,你可以在容器启动的时候指定特定服务的启动顺序,在这里我想给这个镜像加一个 SSH 密码登录的功能,而不是使用 SSH key。因为是在本地运行,所以不用太担心安全的问题。我们需要创建一个 phusion 的实例,然后通过 SSH key 登录,并且修改配置,重启 SSH,之后我们就可以使用 root 登录了。
首先,用 phusion 基础镜像创建一个新的容器。
root@server:/home/sam# docker run -d --name redis phusion/baseimage /sbin/my_init --enable-insecure-key
/sbin/my_init 是允许 phusion 在容器启动的时候启动你的服务。enable-insecure-key 允许我们使用‘insecure key‘ssh 进新的容器。
现在我们已经部署了容器,接下来需要得到它的 IP 地址,可以使用 docker inspect 命令。
root@server:/home/sam# docker inspect redis | grep IPA"IPAddress": "172.17.0.46",
接下来,下载’insecure key‘并使用它登录这个容器。
root@server:/home/sam# curl -o insecure_key -fSL https://github.com/phusion/baseimage-docker/raw/master/image/insecure_key
root@server:/home/sam# chmod 600 insecure_key
root@server:/home/sam# ssh -i insecure_key root@<IP address>The authenticity of host '172.17.0.52 (172.17.0.52)' can't be established.
ECDSA key fingerprint is aa:bb:cc:xx:xx:xx:xx:xx:xx:xx:xx:yy:zz:04:bf:04.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.52' (ECDSA) to the list of known hosts.
root@c36b4bba7dd4:~#
祝贺你,你现在 SSH 进入容器了!下面你需要修改 SSH,从而我们不再需要’insecure key‘了,为了做到这个,打开’/etc/ssh/sshd_config‘找到下面这一行,并去掉注释。
PermitRootLogin yes
保存文件,我们再设置 root 的密码。
root@c36b4bba7dd4:~# passwd
Enter new UNIX password:Retype new UNIX password:
passwd: password updated successfully
root@c36b4bba7dd4:~#
以上我们做了一些准备工作,接下来我们将在这个容器中安装 Redis。
CentOS 6/ 7 系列安装 Docker http://www.linuxidc.com/Linux/2014-07/104768.htm
Docker 的搭建 Gitlab CI 全过程详解 http://www.linuxidc.com/Linux/2013-12/93537.htm
Docker 安装应用 (CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm
在 Ubuntu Trusty 14.04 (LTS) (64-bit) 安装 Docker http://www.linuxidc.com/Linux/2014-10/108184.htm
Docker 安装应用 (CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 14.04 安装 Docker http://www.linuxidc.com/linux/2014-08/105656.htm
阿里云 CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm
2 安装 Redis
现在我们已经有了配置好的镜像了,接下来我们需要去下载和安装 Redis,你可以从这里下载到你想要的 Redis,在我们的例子中用到的是 3.0.0 RC1,下载地址是:https://github.com/antirez/red … ar.gz。
注意:你还需要安装 wget、gcc、make 以及一些其它的工具。可以使用下面的命令:
apt-get update # 更新系统
apt-get upgrade # 升级系统
apt-get install wget gcc make# 安装 wget、gcc、make
首先,我们下载 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
root@e3919192d9e3:/home# cd redis-3.0.0-rc1/
root@e3919192d9e3:/home/redis-3.0.0-rc1# make
最后,我们把编译好的代码中的几个可执行命令移动到 /usr/bin/ 下面
root@e3919192d9e3:/home/redis-3.0.0-rc1# cd src
root@e3919192d9e3:/home/redis-3.0.0-rc1/src# mv redis-cli redis-server redis-sentinel /usr/bin/
root@e3919192d9e3:/home/redis-3.0.0-rc1/src# cd ..
root@e3919192d9e3:/home/redis-3.0.0-rc1# mkdir -p /etc/redis/
root@e3919192d9e3:/home/redis-3.0.0-rc1# cp redis.conf /etc/redis/redis.conf
现在打开文件 /etc/redis/redis.conf,找到‘daemonize no’改为‘daemonize yes‘,然后启动它!
root@e3919192d9e3:/home/redis-3.0.0-rc1/src# redis-server /etc/redis/redis.conf
root@e3919192d9e3:/home/redis-3.0.0-rc1/src#
好了,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
root@e3919192d9e3:/etc/service# mkdir redis
root@e3919192d9e3:/etc/service# cd redis
root@e3919192d9e3:/etc/service/redis# nano run
在这个 run 文件里面,我们加入下面的内容:
#!/bin/shset -e
exec /usr/bin/redis-server /etc/redis/redis.conf
最后,记得给 run 文件添加可执行权限。
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2015-02/112995p2.htm
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 7005Could 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 集群,你可以看到一个像下面这样展示你的集群统计信息的可视化界面:
Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm
Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm
Ubuntu 12.10 下安装 Redis(图文详解)+ Jedis 连接 Redis http://www.linuxidc.com/Linux/2013-06/85816.htm
Redis 系列 - 安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm
CentOS 6.3 安装 Redis http://www.linuxidc.com/Linux/2012-12/75314.htm
Redis 安装部署学习笔记 http://www.linuxidc.com/Linux/2014-07/104306.htm
Redis 配置文件 redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm
Docker 的详细介绍 :请点这里
Docker 的下载地址 :请点这里
【编者的话】本文介绍了如何使用 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
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
phusion/baseimage 0.9.15 cf39b476aeec 3 months ago 289.4 MB
phusion/baseimage latest cf39b476aeec 3 months ago 289.4 MB
这个镜像非常好用,你可以在容器启动的时候指定特定服务的启动顺序,在这里我想给这个镜像加一个 SSH 密码登录的功能,而不是使用 SSH key。因为是在本地运行,所以不用太担心安全的问题。我们需要创建一个 phusion 的实例,然后通过 SSH key 登录,并且修改配置,重启 SSH,之后我们就可以使用 root 登录了。
首先,用 phusion 基础镜像创建一个新的容器。
root@server:/home/sam# docker run -d --name redis phusion/baseimage /sbin/my_init --enable-insecure-key
/sbin/my_init 是允许 phusion 在容器启动的时候启动你的服务。enable-insecure-key 允许我们使用‘insecure key‘ssh 进新的容器。
现在我们已经部署了容器,接下来需要得到它的 IP 地址,可以使用 docker inspect 命令。
root@server:/home/sam# docker inspect redis | grep IPA"IPAddress": "172.17.0.46",
接下来,下载’insecure key‘并使用它登录这个容器。
root@server:/home/sam# curl -o insecure_key -fSL https://github.com/phusion/baseimage-docker/raw/master/image/insecure_key
root@server:/home/sam# chmod 600 insecure_key
root@server:/home/sam# ssh -i insecure_key root@<IP address>The authenticity of host '172.17.0.52 (172.17.0.52)' can't be established.
ECDSA key fingerprint is aa:bb:cc:xx:xx:xx:xx:xx:xx:xx:xx:yy:zz:04:bf:04.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.52' (ECDSA) to the list of known hosts.
root@c36b4bba7dd4:~#
祝贺你,你现在 SSH 进入容器了!下面你需要修改 SSH,从而我们不再需要’insecure key‘了,为了做到这个,打开’/etc/ssh/sshd_config‘找到下面这一行,并去掉注释。
PermitRootLogin yes
保存文件,我们再设置 root 的密码。
root@c36b4bba7dd4:~# passwd
Enter new UNIX password:Retype new UNIX password:
passwd: password updated successfully
root@c36b4bba7dd4:~#
以上我们做了一些准备工作,接下来我们将在这个容器中安装 Redis。
CentOS 6/ 7 系列安装 Docker http://www.linuxidc.com/Linux/2014-07/104768.htm
Docker 的搭建 Gitlab CI 全过程详解 http://www.linuxidc.com/Linux/2013-12/93537.htm
Docker 安装应用 (CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm
在 Ubuntu Trusty 14.04 (LTS) (64-bit) 安装 Docker http://www.linuxidc.com/Linux/2014-10/108184.htm
Docker 安装应用 (CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 14.04 安装 Docker http://www.linuxidc.com/linux/2014-08/105656.htm
阿里云 CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm
2 安装 Redis
现在我们已经有了配置好的镜像了,接下来我们需要去下载和安装 Redis,你可以从这里下载到你想要的 Redis,在我们的例子中用到的是 3.0.0 RC1,下载地址是:https://github.com/antirez/red … ar.gz。
注意:你还需要安装 wget、gcc、make 以及一些其它的工具。可以使用下面的命令:
apt-get update # 更新系统
apt-get upgrade # 升级系统
apt-get install wget gcc make# 安装 wget、gcc、make
首先,我们下载 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
root@e3919192d9e3:/home# cd redis-3.0.0-rc1/
root@e3919192d9e3:/home/redis-3.0.0-rc1# make
最后,我们把编译好的代码中的几个可执行命令移动到 /usr/bin/ 下面
root@e3919192d9e3:/home/redis-3.0.0-rc1# cd src
root@e3919192d9e3:/home/redis-3.0.0-rc1/src# mv redis-cli redis-server redis-sentinel /usr/bin/
root@e3919192d9e3:/home/redis-3.0.0-rc1/src# cd ..
root@e3919192d9e3:/home/redis-3.0.0-rc1# mkdir -p /etc/redis/
root@e3919192d9e3:/home/redis-3.0.0-rc1# cp redis.conf /etc/redis/redis.conf
现在打开文件 /etc/redis/redis.conf,找到‘daemonize no’改为‘daemonize yes‘,然后启动它!
root@e3919192d9e3:/home/redis-3.0.0-rc1/src# redis-server /etc/redis/redis.conf
root@e3919192d9e3:/home/redis-3.0.0-rc1/src#
好了,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
root@e3919192d9e3:/etc/service# mkdir redis
root@e3919192d9e3:/etc/service# cd redis
root@e3919192d9e3:/etc/service/redis# nano run
在这个 run 文件里面,我们加入下面的内容:
#!/bin/shset -e
exec /usr/bin/redis-server /etc/redis/redis.conf
最后,记得给 run 文件添加可执行权限。
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2015-02/112995p2.htm