本地虚拟机置备

如何使用Vagrant与Virtualbox迅速在本机创建Pigsty部署所需的虚拟机资源

通常为了测试“数据库集群”这样的系统,用户需要事先准备若干台虚拟机。尽管云服务已经非常方便,但本地虚拟机访问通常比云虚拟机访问方便,响应迅速,成本低廉。本地虚拟机配置相对繁琐,Vagrant 可解决这一问题。

Pigsty用户无需了解vagrant的原理,只需要知道vagrant可以简单、快捷地按照用户的需求,在笔记本、PC或Mac上拉起若干台虚拟机。用户需要完成的工作,就是将自己的虚拟机需求,以vagrant配置文件的形式表达出来。

太长;不看

对于MacOS用户,直接使用homebrew命令行一键安装Vagrant与Virtualbox即可,安装完毕后,一键拉起4台虚拟机。

  1. make deps # 安装homebrew,并通过homebrew安装vagrant与virtualbox(需重启)
  2. make dns # 向本机/etc/hosts写入静态域名 (需sudo输入密码)
  3. make start # 使用Vagrant拉起单个meta节点 (start4则为4个节点)

其他操作系统与平台请参考 VagrantVirtualbox 图形安装指南。

实际上底下真正管事的命令是:

  1. # 安装Homebrew
  2. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  3. # 安装Vagrant与Virtualbox
  4. brew install vagrant virtualbox ansible
  5. # 拉起由Vagrantfile预先定义的4台虚拟机
  6. cd vagrant; vagrant up

Vagrant安装

这里介绍了图形界面下下载、安装Vagrant的过程

访问Vagrant官网

https://www.vagrantup.com/downloads

本地虚拟机置备 - 图1

下载Vagrant

本地虚拟机置备 - 图2

最新版本为2.2.19

本地虚拟机置备 - 图3

安装Vagrant

点击 vagrant.pkg 执行安装,安装过程需要输入密码。https://www.virtualbox.org/

本地虚拟机置备 - 图4

在MacOS上安装Virtualbox非常简单,其他操作系统上与之类似。

Virtualbox安装

这里介绍了图形界面下下载、安装Virtualbox的过程

前往Virtualbox官网https://www.virtualbox.org/

本地虚拟机置备 - 图5

下载Virtualbox

本地虚拟机置备 - 图6

最新版本为6.1.24

本地虚拟机置备 - 图7

安装Virtualbox

点击 VirtualBox.pkg 执行安装,安装过程需要输入密码并重启。

本地虚拟机置备 - 图8

如果安装失败,请检查您的 系统偏好设置 - 安全性与隐私 - 通用 - 允许以下位置的App中点击“允许”按钮。

本地虚拟机置备 - 图9

Vagrant配置文件

https://github.com/Vonng/pigsty/blob/master/vagrant/Vagrantfile 提供了一个Vagrantfile样例。

这是Pigsty沙箱所使用的Vagrantfile,定义了四台虚拟机,包括一台2核/4GB的中控机/元节点,和3台 1核/1GB 的数据库节点

vagrant 二进制程序根据 Vagrantfile 中的定义,默认调用 Virtualbox 完成本地虚拟机的创建工作。

进入Pigsty根目录下的vagrant目录,执行vagrant up,即可拉起所有的四台虚拟机。

  1. IMAGE_NAME = "centos/7"
  2. N=3 # 数据库机器节点数量,可修改为0
  3. Vagrant.configure("2") do |config|
  4. config.vm.box = IMAGE_NAME
  5. config.vm.box_check_update = false
  6. config.ssh.insert_key = false
  7. # 元节点
  8. config.vm.define "meta", primary: true do |meta| # 元节点默认的ssh别名为`meta`
  9. meta.vm.hostname = "meta"
  10. meta.vm.network "private_network", ip: "10.10.10.10"
  11. meta.vm.provider "virtualbox" do |v|
  12. v.linked_clone = true
  13. v.customize [
  14. "modifyvm", :id,
  15. "--memory", 4096, "--cpus", "2", # 元节点的内存与CPU核数:默认为2核/4GB
  16. "--nictype1", "virtio", "--nictype2", "virtio",
  17. "--hwv·irtex", "on", "--ioapic", "on", "--rtcuseutc", "on", "--vtxvpid", "on", "--largepages", "on"
  18. ]
  19. end
  20. meta.vm.provision "shell", path: "provision.sh"
  21. end
  22. # 初始化N个数据库节点
  23. (1..N).each do |i|
  24. config.vm.define "node-#{i}" do |node| # 数据库节点默认的ssh别名分别为`node-{1,2,3}`
  25. node.vm.box = IMAGE_NAME
  26. node.vm.network "private_network", ip: "10.10.10.#{i + 10}"
  27. node.vm.hostname = "node-#{i}"
  28. node.vm.provider "virtualbox" do |v|
  29. v.linked_clone = true
  30. v.customize [
  31. "modifyvm", :id,
  32. "--memory", 2048, "--cpus", "1", # 数据库节点的内存与CPU核数:默认为1核/2GB
  33. "--nictype1", "virtio", "--nictype2", "virtio",
  34. "--hwvirtex", "on", "--ioapic", "on", "--rtcuseutc", "on", "--vtxvpid", "on", "--largepages", "on"
  35. ]
  36. end
  37. node.vm.provision "shell", path: "provision.sh"
  38. end
  39. end
  40. end

如果用户的机器配置不足,则可以考虑使用更小的N值,减少数据库节点的数量。如果只希望运行单个元节点,将其修改为0即可。

用户还可以修改每台机器的CPU核数和内存资源等,如配置文件中的注释所述,详情参阅Vagrant与Pigsty文档。

沙箱环境默认使用IMAGE_NAME = "centos/7",首次执行时会从vagrant官方下载centos 7.8 virtualbox 镜像,确保宿主机拥有合适的网络访问权限(科学上网)!

快捷方式

Pigsty已经提供了对常用vagrant命令的包装,用户可以在项目的Makefile中看到虚拟机管理的相关命令:

  1. make # 启动集群
  2. make new4 # 销毁并创建新集群
  3. make dns # 将Pigsty域名记录写入本机/etc/hosts (需要sudo权限)
  4. make ssh # 将虚拟机SSH配置信息写入 ~/.ssh/config

更多信息,请参考Makefile

  1. #------------------------------#
  2. # vagrant vm management
  3. #------------------------------#
  4. # default node (meta)
  5. up:
  6. cd vagrant && vagrant up meta
  7. dw:
  8. cd vagrant && vagrant halt meta
  9. del:
  10. cd vagrant && vagrant destroy -f meta
  11. new: del up
  12. #------------------------------#
  13. # extra nodes: node-{1,2,3}
  14. up-test:
  15. cd vagrant && vagrant up node-1 node-2 node-3
  16. dw-test:
  17. cd vagrant && vagrant halt node-1 node-2 node-3
  18. del-test:
  19. cd vagrant && vagrant destroy -f node-1 node-2 node-3
  20. new-test: del-test up-test
  21. #------------------------------#
  22. # all nodes (meta, node-1, node-2, node-3)
  23. up4:
  24. cd vagrant && vagrant up
  25. dw4:
  26. cd vagrant && vagrant halt
  27. del4:
  28. cd vagrant && vagrant destroy -f
  29. new4: del4 up4
  30. clean: del4
  31. #------------------------------#
  32. # status
  33. st: status
  34. status:
  35. cd vagrant && vagrant status
  36. suspend:
  37. cd vagrant && vagrant suspend
  38. resume:
  39. cd vagrant && vagrant resume
  40. #------------------------------#

最后修改 2022-05-27: init commit (1e3e284)