使用 Docker 搭建 Redis Cluster,最重要的环节就是容器通信的问题,这一块我们在之前的文章中已经给大家解决了《Docker 网络模式详解及容器间网络通信》,本篇文章主要练习使用多个容器完成 Redis Cluster 集群环境的搭建,顺便为学习 Docker Compose 铺铺路。俗话说没有对比就没有伤害,通过对比才能感受到 Docker Compose 的好处 😄。 关于 Redis Cluster 集群更多的内容请阅读《最通俗易懂的 Redis 架构模式详解》。 按照 Redis 官网:https:///topics/cluster-tutorial 的提示,为了使 Docker 与 Redis Cluster 兼容,您需要使用 Docker 的
环境为了让环境更加真实,本文使用多机环境:
每台机器所使用的基础设施环境如下:
搭建整体搭建步骤主要分为以下几步:
编写 Redis 配置文件创建目录及文件分别在 # 创建目录mkdir -p /usr/local/docker-redis/redis-cluster# 切换至指定目录cd /usr/local/docker-redis/redis-cluster/# 编写 redis-cluster.tmpl 文件vi redis-cluster.tmpl
编写配置文件
port ${PORT}requirepass 1234masterauth 1234protected-mode nodaemonize noappendonly yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 15000cluster-announce-ip 192.168.10.10cluster-announce-port ${PORT}cluster-announce-bus-port 1${PORT}123456789101112
port ${PORT}requirepass 1234masterauth 1234protected-mode nodaemonize noappendonly yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 15000cluster-announce-ip 192.168.10.11cluster-announce-port ${PORT}cluster-announce-bus-port 1${PORT}
在 for port in `seq 6371 6373`; do \ mkdir -p ${port}/conf \ && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \ && mkdir -p ${port}/data;\done12345 在 for port in `seq 6374 6376`; do \ mkdir -p ${port}/conf \ && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \ && mkdir -p ${port}/data;\done
在 在 以下内容为每个节点的配置文件详细信息。 ============================== 192.168.10.10 ==============================[root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{1..3}/conf/redis.confport 6371requirepass 1234masterauth 1234protected-mode nodaemonize noappendonly yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 15000cluster-announce-ip 192.168.10.10cluster-announce-port 6371cluster-announce-bus-port 16371port 6372requirepass 1234masterauth 1234protected-mode nodaemonize noappendonly yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 15000cluster-announce-ip 192.168.10.10cluster-announce-port 6372cluster-announce-bus-port 16372port 6373requirepass 1234masterauth 1234protected-mode nodaemonize noappendonly yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 15000cluster-announce-ip 192.168.10.10cluster-announce-port 6373cluster-announce-bus-port 16373============================== 192.168.10.10 ============================================================ 192.168.10.11 ==============================[root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{4..6}/conf/redis.confport 6374requirepass 1234masterauth 1234protected-mode nodaemonize noappendonly yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 15000cluster-announce-ip 192.168.10.11cluster-announce-port 6374cluster-announce-bus-port 16374port 6375requirepass 1234masterauth 1234protected-mode nodaemonize noappendonly yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 15000cluster-announce-ip 192.168.10.11cluster-announce-port 6375cluster-announce-bus-port 16375port 6376requirepass 1234masterauth 1234protected-mode nodaemonize noappendonly yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 15000cluster-announce-ip 192.168.10.11cluster-announce-port 6376cluster-announce-bus-port 16376============================== 192.168.10.11 ==============================1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 创建 Redis 容器创建容器将宿主机的 在 for port in $(seq 6371 6373); do \ docker run -di --restart always --name redis-${port} --net host \ -v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \ -v /usr/local/docker-redis/redis-cluster/${port}/data:/data \ redis redis-server /usr/local/etc/redis/redis.conf; \done
在 for port in $(seq 6374 6376); do \ docker run -di --restart always --name redis-${port} --net host \ -v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \ -v /usr/local/docker-redis/redis-cluster/${port}/data:/data \ redis redis-server /usr/local/etc/redis/redis.conf; \done123456 在 在 创建 Redis Cluster 集群随便进入一个容器节点,并进入 # 进入容器docker exec -it redis-6371 bash# 切换至指定目录cd /usr/local/bin/
接下来我们就可以通过以下命令实现 Redis Cluster 集群的创建。 redis-cli -a 1234 --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 11 出现选择提示信息,输入 yes,结果如下所示: 集群创建成功如下: 以下内容是创建集群时返回的详细信息,也就是上两幅图中的所有内容。 root@localhost:/usr/local/bin# redis-cli -a 1234 --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 1Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.>>> Performing hash slots allocation on 6 nodes...Master[0] -> Slots 0 - 5460Master[1] -> Slots 5461 - 10922Master[2] -> Slots 10923 - 16383Adding replica 192.168.10.11:6376 to 192.168.10.10:6371Adding replica 192.168.10.10:6373 to 192.168.10.11:6374Adding replica 192.168.10.11:6375 to 192.168.10.10:6372M: 299cf79ddafc83dced27f628f1f82dac483fbc4e 192.168.10.10:6371 slots:[0-5460] (5461 slots) masterM: ac805b90b6e20e26dc4268454bb2855beea6cc19 192.168.10.10:6372 slots:[10923-16383] (5461 slots) masterS: db35494fcc5db0c88d27da7885c817e6cdcc9373 192.168.10.10:6373 replicates 7013270480d37eeab79b9cd0272e934d4548136aM: 7013270480d37eeab79b9cd0272e934d4548136a 192.168.10.11:6374 slots:[5461-10922] (5462 slots) masterS: 8435e1b0d51f2690c5f94f9a5682a4ac34e94326 192.168.10.11:6375 replicates ac805b90b6e20e26dc4268454bb2855beea6cc19S: 7b13c16fa6fe8e13cdc0b4846b87edffed55c62e 192.168.10.11:6376 replicates 299cf79ddafc83dced27f628f1f82dac483fbc4eCan I set the above configuration? (type 'yes' to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join.>>> Performing Cluster Check (using node 192.168.10.10:6371)M: 299cf79ddafc83dced27f628f1f82dac483fbc4e 192.168.10.10:6371 slots:[0-5460] (5461 slots) master 1 additional replica(s)S: 8435e1b0d51f2690c5f94f9a5682a4ac34e94326 192.168.10.11:6375 slots: (0 slots) slave replicates ac805b90b6e20e26dc4268454bb2855beea6cc19S: db35494fcc5db0c88d27da7885c817e6cdcc9373 192.168.10.10:6373 slots: (0 slots) slave replicates 7013270480d37eeab79b9cd0272e934d4548136aS: 7b13c16fa6fe8e13cdc0b4846b87edffed55c62e 192.168.10.11:6376 slots: (0 slots) slave replicates 299cf79ddafc83dced27f628f1f82dac483fbc4eM: 7013270480d37eeab79b9cd0272e934d4548136a 192.168.10.11:6374 slots:[5461-10922] (5462 slots) master 1 additional replica(s)M: ac805b90b6e20e26dc4268454bb2855beea6cc19 192.168.10.10:6372 slots:[10923-16383] (5461 slots) master 1 additional replica(s)[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.
至此一个高可用的 Redis Cluster 集群搭建完成,如下图所示,该集群中包含 6 个 Redis 节点,3 主 3 从。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点。 查看集群状态我们先进入容器,然后通过一些集群常用的命令查看一下集群的状态。 # 进入容器docker exec -it redis-6371 bash# 切换至指定目录cd /usr/local/bin/1234 检查集群状态redis-cli -a 1234 --cluster check 192.168.10.11:6375
查看集群信息和节点信息# 连接至集群某个节点redis-cli -c -a 1234 -h 192.168.10.11 -p 6376# 查看集群信息cluster info# 查看集群结点信息cluster nodes123456 SET/GET在 6371 节点中执行写入和读取,命令如下: # 进入容器并连接至集群某个节点docker exec -it redis-6371 /usr/local/bin/redis-cli -c -a 1234 -h 192.168.10.10 -p 6371# 写入数据set name mrhelloworldset aaa 111set bbb 222# 读取数据get nameget aaaget bbb
别着急,让我来解释一下上图中的操作过程:
通过以上操作我们得知 客户端连接最后来一波客户端连接操作,随便哪个节点,看看可否通过外部访问 Redis Cluster 集群。 至此使用多机环境多个容器搭建 Redis Cluster 集群环境就到这里,其实整体搭建过程不算特别麻烦,因为:
综上所述,有没有更简单的办法呢?当然有了,不然我在这跟你卖什么关子。 Docker Compose 就可以解决这个问题。后面我们先学习一下什么是 Docker Compose,然后使用 Docker Compose 再来搭建一遍 Redis Cluster 集群环境,感受感受这前后的区别。 |
|