使用Vagrant上的docker镜像构建Redis群集:无法ping机器

时间:2015-08-27 18:43:05

标签: docker vagrant

我试图在OSX上本地构建一个简单的redis集群,在virtualbox VMS中使用docker。具体来说,我想创建一个带有两个从站(.101和.102)的主redis节点(192.168.0.100)。这包括配置每台机器并向每个从机发出一个命令,告诉它主机在键值存储关系中是谁。

这很好用,直到我决定通过在Vagrantfile中做一些程序化的东西来使我的配置更灵活。结果是我甚至无法ping通.102旁边的任何机器,更不用说使用redis-cli命令(例如,redis-cli -h 192.168.0.100 INFO看到主机正确设置了从机)

我的目标/约束:

  • 在虚拟机VM中运行docker:我在阅读文档时看到了几种方法。我选择了我这样做的方式,因为我不想引用大量的外部文件。
  • 在配置后在每个VM上运行一系列命令,以设置从属和诸如此类的内容。
  • 我不想只使用boot2docker,因为我还有其他一些东西,我将要添加... twemproxy,sentinel,我想至少模拟一个生产环境。< / LI>

我在新文件中做错了什么?

编辑:我已经调查了一下。我试过的一件事是销毁所有图像,然后运行旧的流浪文件来构建机器,然后用新的流浪文件重新加载它们。在这种情况下,虽然每次机器升级后我都会看到redis1: Warning: Authentication failure. Retrying...等身份验证失败消息,但机器仍然有效。我能够ping机器没有问题。

新的Vagrantfile(使用下面的配置文件):

require './config.rb'
include RedisClusterConfig

Vagrant.configure(2) do |config|
    config.vm.provider "virtualbox"

    ## Redis Nodes (Can define multiple triplets) ##
    for node in RedisClusterConfig.redisNodes
        config.vm.define node.name do |a|
            a.vm.hostname = node.name
            a.vm.box = "ubuntu/trusty64"

            # Skip checking for an updated Vagrant box
            a.vm.box_check_update = false

            # Networking
            a.vm.network :private_network, ip: node.address
            a.ssh.forward_agent = true
            a.ssh.insert_key = false

            # Set up docker with 'redis' image
            a.vm.provision "docker" do |d|
                d.images = ["redis"]
                d.run "redis", name: "redis", args: "-p "+node.port+":"+node.port
            end

            # Additional configuration
            a.trigger.after [:up, :resume, :reload, :provision] do
                # Master/slave
                unless node.slaveOfAddress.nil?
                    system("redis-cli -h " + node.address + " SLAVEOF " + node.slaveOfAddress + " " + node.slaveOfPort)
                    puts "Finished setting up slave node: " + node.name
                else
                    puts "Finished setting up master node: " + node.name
                end
            end
        end 
    end

end

config.rb:

module RedisClusterConfig
    attr_reader :redisNodes 

    RedisNode = Struct.new("RedisNode", :name, :address, :port, :slaveOfAddress, :slaveOfPort)

    p = "6379" # Default redis port
    baseAddr = "192.168.0."

    # Define a triplet
    redis0 = RedisNode.new("redis0", baseAddr + "100", p, nil, nil)
    redis1 = RedisNode.new("redis1", baseAddr + "101", p, baseAddr + "100", p)
    redis2 = RedisNode.new("redis2", baseAddr + "102", p, baseAddr + "100", p)

    @redisNodes = [redis0, redis1, redis2]
end

Old Vagrantfile:

# Make sure you have triggers plugin:
#     vagrant plugin install vagrant-triggers
#
# TODO:
# - We really would like to run some shell commands after everything is done, not after each machine is provisioned

Vagrant.configure(2) do |config|
    config.vm.provider "virtualbox"

    ## Redis Nodes ##

    ### Master Node###
    config.vm.define "redis0" do |a|
        a.vm.hostname = "redis0"
        a.vm.box = "ubuntu/trusty64"

        # Skip checking for an updated Vagrant box
        a.vm.box_check_update = false

        # Networking
        a.vm.network :private_network, ip: "192.168.0.100"
        a.ssh.forward_agent = true
        a.ssh.insert_key = false

        a.vm.provision "docker" do |d|
          d.images = ["redis"]
          d.run "redis",
            name: "redis",
            args: "-p 6379:6379"
        end
    end

    ### Slave Nodes ###
    config.vm.define "redis1" do |a|
        a.vm.hostname = "redis1"
        a.vm.box = "ubuntu/trusty64"

        # Skip checking for an updated Vagrant box
        a.vm.box_check_update = false

        # Networking
        a.vm.network :private_network, ip: "192.168.0.101"
        a.ssh.forward_agent = true
        a.ssh.insert_key = false

        a.vm.provision "docker" do |d|
          d.images = ["redis"]
          d.run "redis",
            name: "redis",
            args: "-p 6379:6379"
        end
    end

    config.vm.define "redis2" do |a|
        a.vm.hostname = "redis2"
        a.vm.box = "ubuntu/trusty64"

        # Skip checking for an updated Vagrant box
        a.vm.box_check_update = false

        # Networking
        a.vm.network :private_network, ip: "192.168.0.102"
        a.ssh.forward_agent = true
        a.ssh.insert_key = false

        a.vm.provision "docker" do |d|
          d.images = ["redis"]
          d.run "redis",
            name: "redis",
            args: "-p 6379:6379"
        end
    end

    # After everything else has finished provisioning...
    config.trigger.after [:up, :resume, :reload] do
        # Configuring redis master/slave triplet
        system('echo Configuring redis master/slave triplet...')
        system('redis-cli -h 192.168.0.101 SLAVEOF 192.168.0.100 6379')
        system('redis-cli -h 192.168.0.102 SLAVEOF 192.168.0.100 6379')
    end

end

0 个答案:

没有答案