docker-machine swarm 创建Redis集群多主机综合案例

创建跨主机Redis集群

部署流程
1.在宿主机使用docker-machine 创建多台虚拟主机,按量收费,安装参考https://blog.df5g.com/article/34

  1. # 规划造 1个manager 1个worker 共2个虚拟主机,加上本身的宿主机一共3台机器
  2. docker-machine create -d aliyunecs --aliyunecs-io-optimized=optimized --aliyunecs-description=aliyunecs-machine-driver --aliyunecs-instance-type=ecs.n4.small --aliyunecs-access-key-id=<你的阿里云accessKey> --aliyunecs-access-key-secret=<你的阿里云对应秘钥> --aliyunecs-region=cn-hongkong --aliyunecs-ssh-password=<ssh登录密码> --aliyunecs-image-id=centos_7_04_64_20G_alibase_201701015.vhd <自定义虚拟主机名称>
  3. # 都创建好后查看所有虚拟主机
  4. docker-machine ls

2.利用docker swarm 初始化集群,将所有新建的虚拟主机进行通信

  1. # 在宿主机初始化集群,指定IP 为宿主的IP 用于通告其他节点访问的API和overlay网络通信,将返回通信秘钥
  2. docker swarm init --advertise-addr <宿主机IP>
  3. ---------------------------返回信息start------------------------------
  4. To add a worker to this swarm, run the following command:
  5. docker swarm join --token SWMTKN-1-31kemylbxdxkg235xwhb27evcrcqu2lm71nune78dz71d2oq8j-94bpvbuwyzia30xbach7lhtf4 47.90.102.215:2377
  6. ----------------------------end-----------------------------------
  7. # 或者在宿主机 执行以下命令获取manager / worker 通信秘钥
  8. docker swarm join-token manager
  9. docker swarm join-token worker
  10. # 在对应的虚拟主机上开放端口(注意这里开发tcp和udp,我遇到的坑就是这里)
  11. 必备端口(tcp/udp):2376,2377,4789,7946.为一下案例Redis集群再开放端口:6397,16397,6379,16379
  12. # 进入其他虚拟主机依次连接输入宿主机给出的通信秘钥
  13. docker-machine ssh <自定义虚拟主机的名称>
  14. 在运行返回的通信秘钥加入集群
  15. # 加入成功后查看信息,宿主机为leader,2个管理主机1个工作主机
  16. docker node ls
  17. ---------------------------返回信息start------------------------------
  18. [root@hk ~]# docker node ls
  19. ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
  20. 8ydo7titht894s hk Ready Active Leader 18.06.1-ce
  21. nvf6oicre930u manager1 Ready Active Reachable 18.06.1-ce
  22. e3vukvczp1 worker1 Ready Active 18.06.1-ce
  23. ----------------------------end-----------------------------------

3.挂载宿主机的目录到虚拟主机中

  1. # 在宿主机 ~(家目录或者自定义,这里为家目录) 目录创建 虚拟主机要挂载的相应目录
  2. mkdir manager1 worker1
  3. # 依次在对应虚拟主机创建 挂载目录 这里都挂载在 /config下(脚本对所有虚拟主机创建挂载目录config)
  4. docker-machine ssh manager1 mkdir /config
  5. docker-machine ssh worker1 mkdir /config
  6. # 在宿主机依次进行挂载
  7. docker-machine mount manager1:/config manager1
  8. docker-machine mount worker1:/config worker1
  9. # 注意:如果用到了宿主机,则宿主机的/config也同样要上传配置文件
  10. 这样就挂载成功了,然后在宿主机中对应虚拟主机挂载目录中增加或修改文件虚拟主机会同步,反过来虚拟主机变更文件宿主机会同步

4.在将Redis.conf 配置文件加入到对应的虚拟主机目录中,可以直接打开GitHub地址复制
配置文件 -> GitHub地址:https://github.com/keepondream/docker/tree/master/docker-swarm/config
镜像地址 -> https://hub.docker.com/r/keepondream/docker-machine-swarm-cluster-redis/

  1. # 介绍 可供参考
  2. Dockerfile 是构建镜像的
  3. docker-compose.yaml 是启动服务的,里面的镜像我已经构建好了,默认配了8Redis 44
  4. #### 当然想要启动任意台,可以修改yaml 中的文件镜像 直接 build
  5. redis-trib.rb 是基于ruby 的集群管理工具
  6. redis.conf 是公共配置文件 里面统一端口为 6397
  7. #### 将这4个文件都依次拖入到 宿主机的 /config 和 家目录下的虚拟主机目录 manager1 manager2 worker1 worker2
  8. #### 然后进入到任意一个虚拟主机中查看 ll /config 所有文件都已经有了

5.在leader主机上创建并启动服务,这里默认在宿主机中创建

  1. # 进入 /config 目录
  2. cd /config
  3. # 创建服务
  4. docker stack deploy -c docker-compose.yaml redis-nodes
  5. # 查看服务是否启动完毕,8/8代表所有Redis启动成功
  6. docker service ls
  7. ---------------------------返回信息start------------------------------
  8. ID NAME MODE REPLICAS IMAGE PORTS
  9. jma8gc0gp9pd redis-nodes_redis-nodes replicated 1/8 keepondream/docker-machine-swarm-cluster-redis:latest *:6397->6397/tcp, *:16397->16397/tcp
  10. ----------------------------end-----------------------------------
  11. #### 启动完成后是随机分配在各个虚拟主机中的,所有数量不一很正常

6.在各个虚拟主机中查看运行的容器,并提取Redis节点IP

  1. # 在各个虚拟主机中查看运行的Redis节点容器
  2. docker ps
  3. ---------------------------返回信息start------------------------------
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. b0ab23097ded keepondream/docker-machine-swarm-cluster-redis:latest "redis-server /confi…" 3 minutes ago Up 3 minutes redis-nodes_redis-nodes.4.u5zok33mctkduoujkub98n3dp
  6. ----------------------------end-----------------------------------
  7. #### 这里names 为redis-nodes_redis-nodes.4 说明这个是老四
  8. # 查看我们的网络
  9. docker network ls #### 返回中有个 redis-nodes_swarmnet 的名字的就是 Redis集群的网络
  10. # 提取老四的IP
  11. docker network inspect redis-nodes_swarmnet
  12. ---------------------------返回信息start------------------------------
  13. "Containers": {
  14. "b0ab23097ded505a87865157971c013c878f3a9fa318177233c360d0455870e4": {
  15. "Name": "redis-nodes_redis-nodes.4.u5zok33mctkduoujkub98n3dp",
  16. "EndpointID": "31141cef05e33ff1076aeb580734932f728f955ea64755a4db4c6b6ffa42c346",
  17. "MacAddress": "02:42:0a:00:00:0c",
  18. "IPv4Address": "10.0.0.12/24",
  19. "IPv6Address": ""
  20. },
  21. ----------------------------end-----------------------------------
  22. # 老四的IP 是 10.0.0.12,这样依次在其他主机中将其他几兄弟的IP都提取出来
  23. 老大: 10.0.0.9
  24. 老二: 10.0.0.10
  25. 老三: 10.0.0.11
  26. 老四: 10.0.0.12
  27. 老五: 10.0.0.13
  28. 老六: 10.0.0.8
  29. 老七: 10.0.0.14
  30. 老八: 10.0.0.15
  31. # 可以进入任意一个容器,然后ping 其他几兄弟
  32. docker exec -it e9f8410a2b79 bash
  33. ping 10.0.0.9 # 发现都能连接就说明OK,没毛病
  34. #### 注意如果ping不通你的宿主机,请查看阿里云的配置规则和主机中的防火墙,记住一定要开放(tcp/udp[4789,7946,2376,2377])端口

7.任意进入一个容器,创建Redis-cluster集群

  1. # 进入任意容器
  2. dcoker exec -it 9aeeb5953d74 bash
  3. # 创建集群cluster 下面命令会一键平均分配,讲所有查出来的IP和端口都一次性加入
  4. redis-trib.rb create --replicas 1 10.0.0.9:6397 10.0.0.10:6397 10.0.0.11:6397 10.0.0.13:6397 10.0.0.8:6397 10.0.0.14:6397 10.0.0.15:6397

8.最终可以利用Redis客户端,指定集群模式进入查看所有Redis节点

  1. # 查看Redis节点
  2. cluster nodes

9.如果你需要修改你启动节点的数量可以直接修改docker-compose.yaml进行更改数量

  1. # 前提最好将之前的服务终止,删除运行的容器
  2. docker service rm redis-nodes
  3. # 然后修改docker-compose.yaml文件中的数量,再创建
  4. docker stack deploy -c docker-compose.yaml redis-nodes


评论 0

发表评论

Top