From dff289f8cfd4278aec5ca6c88e13d34c3c5c4aaa Mon Sep 17 00:00:00 2001 From: Haibin Lee Date: Fri, 13 Oct 2023 18:51:40 +0800 Subject: [PATCH 1/4] ADD: support cluster expansion --- 01-deploy.yml | 1 + README.md | 6 +- ansible-docker/Dockerfile | 2 + ansible-docker/Vagrantfile | 23 ++-- ansible-docker/ansible.cfg | 2 +- ansible-docker/docker-compose.yml | 8 +- .../inventories/opengauss/hosts.ini | 9 +- ansible-docker/ssh_config | 10 ++ docs/00-how-to.md | 3 +- docs/01-ansible-in-docker.md | 10 +- docs/03-deploy.md | 22 +++- docs/04-expansion.md | 52 +++++++++ docs/imgs/23-10-13_1155_909.png | Bin 0 -> 316365 bytes roles/openGauss/defaults/main.yml | 15 ++- roles/openGauss/tasks/cluster_check.yml | 29 +++++ roles/openGauss/tasks/deploy/add_auth.yml | 24 +++++ roles/openGauss/tasks/deploy/install.yml | 54 ++++++++++ roles/openGauss/tasks/deploy/known_hosts.yml | 26 +++++ roles/openGauss/tasks/deploy/main.yml | 37 +++++++ .../tasks/{install => deploy}/upload.yml | 19 ++-- roles/openGauss/tasks/install/cleanup.yml | 0 roles/openGauss/tasks/install/install.yml | 27 ----- roles/openGauss/tasks/install/ssh.yml | 88 --------------- roles/openGauss/tasks/main.yml | 100 +++++++----------- roles/openGauss/tasks/os/common_set.yml | 26 +++-- roles/openGauss/tasks/os/ssh.yml | 64 +++++++++++ .../openGauss/tasks/{install => os}/user.yml | 30 +++--- roles/openGauss/tasks/post_tasks.yml | 31 ++++++ roles/openGauss/tasks/pre_tasks.yml | 29 +++++ roles/openGauss/tasks/report.yml | 9 ++ roles/openGauss/tasks/runtime_facts.yml | 21 ++-- .../openGauss/templates/cluster_config.xml.j2 | 22 ++-- roles/pre-tasks/tasks/main.yml | 4 +- .../Kylin Linux Advanced Server_V10.yml} | 0 34 files changed, 535 insertions(+), 268 deletions(-) create mode 100644 ansible-docker/ssh_config create mode 100644 docs/04-expansion.md create mode 100644 docs/imgs/23-10-13_1155_909.png create mode 100644 roles/openGauss/tasks/cluster_check.yml create mode 100644 roles/openGauss/tasks/deploy/add_auth.yml create mode 100644 roles/openGauss/tasks/deploy/install.yml create mode 100644 roles/openGauss/tasks/deploy/known_hosts.yml create mode 100644 roles/openGauss/tasks/deploy/main.yml rename roles/openGauss/tasks/{install => deploy}/upload.yml (60%) delete mode 100644 roles/openGauss/tasks/install/cleanup.yml delete mode 100644 roles/openGauss/tasks/install/install.yml delete mode 100644 roles/openGauss/tasks/install/ssh.yml create mode 100644 roles/openGauss/tasks/os/ssh.yml rename roles/openGauss/tasks/{install => os}/user.yml (35%) create mode 100644 roles/openGauss/tasks/post_tasks.yml create mode 100644 roles/openGauss/tasks/pre_tasks.yml create mode 100644 roles/openGauss/tasks/report.yml rename roles/pre-tasks/tasks/{Kylin Linux Advanced Server.yml => os/Kylin Linux Advanced Server_V10.yml} (100%) diff --git a/01-deploy.yml b/01-deploy.yml index 73bdc43..584b474 100644 --- a/01-deploy.yml +++ b/01-deploy.yml @@ -1,5 +1,6 @@ - name: Deploy openGauss hosts: openGauss become: true + become_flags: "-i" roles: - openGauss \ No newline at end of file diff --git a/README.md b/README.md index c2f1882..7290535 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ 自动部署 openGauss,根据分组定义,自适应部署单点、一主一从、一主多从以及级联节点等架构模式。 -目前仅支持初次部署,不支持对集群架构做变更。 - # 已适配的系统 * x86_64 @@ -54,6 +52,10 @@ * [详细配置](docs/02-pre-set.md) * [开始部署](docs/03-deploy.md) +# 更新日志 + +* 2023-10-13: 支持集群扩容。 + # 开发指南 (待补充) diff --git a/ansible-docker/Dockerfile b/ansible-docker/Dockerfile index d4dccce..8c55e8a 100644 --- a/ansible-docker/Dockerfile +++ b/ansible-docker/Dockerfile @@ -2,6 +2,8 @@ FROM alpine LABEL Creator="haibin.l@linkingcloud.cn" ARG TIMEZONE="Asia/Shanghai" +ADD ssh_config /root/.ssh/config + RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.cloud.tencent.com/g' /etc/apk/repositories \ && apk --no-cache add bzip2 nano ansible fish byobu \ sshpass tzdata rsync wget curl net-tools tar unzip \ diff --git a/ansible-docker/Vagrantfile b/ansible-docker/Vagrantfile index 548020a..7397049 100644 --- a/ansible-docker/Vagrantfile +++ b/ansible-docker/Vagrantfile @@ -3,24 +3,35 @@ Vagrant.configure("2") do |config| + if Vagrant.has_plugin?("vagrant-vbguest") then + config.vbguest.auto_update = false + end + config.ssh.insert_key = false config.vm.provider :virtualbox do |vb| vb.memory = 4096 - vb.cpus = 2 + vb.cpus = 4 vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ] vb.linked_clone = true end + config.vm.provision "shell" do |s| + s.inline = <<-SHELL + sed -i "s/PasswordAuthentication no/PasswordAuthentication yes/g" /etc/ssh/sshd_config + /bin/systemctl restart sshd.service + SHELL + end + #Disabling the default /vagrant share config.vm.synced_folder ".", "/vagrant", disabled: true # How many vm do you want? - N = 3 + N = 9 (1..N).each do |i| - config.vm.define "opengauss#{i}" do |node| - node.vm.box = "centos/7" - node.vm.network :private_network, ip: "192.168.56.#{10+i}" - end + config.vm.define "opengauss#{i}" do |node| + node.vm.box = "centos/7" + node.vm.network :private_network, ip: "192.168.56.#{10+i}" + end end end diff --git a/ansible-docker/ansible.cfg b/ansible-docker/ansible.cfg index 8a0805d..6b038f5 100644 --- a/ansible-docker/ansible.cfg +++ b/ansible-docker/ansible.cfg @@ -1,6 +1,6 @@ [defaults] nocows = True -inventory = ./inventories/opengauss/hosts.ini +inventory = ./inventories/opengauss/hosts.ini roles_path = ~/.ansible/roles,/workdir/roles,./roles remote_tmp = $HOME/.ansible/tmp diff --git a/ansible-docker/docker-compose.yml b/ansible-docker/docker-compose.yml index 74bf051..0fb0568 100644 --- a/ansible-docker/docker-compose.yml +++ b/ansible-docker/docker-compose.yml @@ -3,8 +3,8 @@ version: "3.3" services: ansible: image: haibin.lee/ansible - container_name: ansible - hostname: ansible-in-docker + container_name: ansible-for-opengauss + hostname: ansible-for-opengauss restart: always build: context: . @@ -13,7 +13,7 @@ services: - "./inventories:/etc/ansible/inventories" - "../:/workdir" - "./ansible.cfg:/etc/ansible/ansible.cfg" - - "~/.vagrant.d/insecure_private_key:/root/.vagrant.d/insecure_private_key" entrypoint: - - "crond" + - "tail" - "-f" + - "/dev/null" diff --git a/ansible-docker/inventories/opengauss/hosts.ini b/ansible-docker/inventories/opengauss/hosts.ini index 51ae057..f2e9943 100644 --- a/ansible-docker/inventories/opengauss/hosts.ini +++ b/ansible-docker/inventories/opengauss/hosts.ini @@ -1,14 +1,17 @@ -; 主服务器组,仅设置 1 个目标机。 +; 主机,仅设置 1 个目标机。 [openGauss_master] 192.168.56.11 -; 从服务器组,可设置若干个或留空。 +; 备机,可设置若干个或留空。不可大于 8。 [openGauss_follower] 192.168.56.12 +192.168.56.14 +192.168.56.16 -; 级联服务器组,可设置若干个或留空。 +; 级联机,可设置若干个或留空。 [openGauss_cascade] 192.168.56.13 +192.168.56.15 ; 以上 3 个分组的合并组,勿动。 [openGauss:children] diff --git a/ansible-docker/ssh_config b/ansible-docker/ssh_config new file mode 100644 index 0000000..859e07a --- /dev/null +++ b/ansible-docker/ssh_config @@ -0,0 +1,10 @@ +Host * + TCPKeepAlive yes + ServerAliveInterval 5 + AddKeysToAgent yes + Compression yes + ConnectionAttempts 3 + ConnectTimeout 5 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + ControlPersist 4h diff --git a/docs/00-how-to.md b/docs/00-how-to.md index 706c989..e87df0b 100644 --- a/docs/00-how-to.md +++ b/docs/00-how-to.md @@ -24,9 +24,10 @@ openGauss_cascade # playbook.yml 示例 ``` -- name: Deploy openGauss database +- name: Deploy openGauss hosts: openGauss become: true + become_flags: "-i" roles: - openGauss ``` diff --git a/docs/01-ansible-in-docker.md b/docs/01-ansible-in-docker.md index 9987fd6..271e34d 100644 --- a/docs/01-ansible-in-docker.md +++ b/docs/01-ansible-in-docker.md @@ -1,16 +1,12 @@ 进入 `ansible-docker` 目录,按以下步骤创建容器。 -# 制作 ansible 容器镜像 +# 制作并启动 ansible 容器 -`docker-compose build` - -# 启动 ansible 容器 - -`docker-compose up -d` +`docker-compose up -d --build` # 进入容器环境 -`docker exec -it ansible byobu` +`docker exec -it ansible-for-opengauss byobu` # 声明 diff --git a/docs/03-deploy.md b/docs/03-deploy.md index 14a042e..ab3c5b4 100644 --- a/docs/03-deploy.md +++ b/docs/03-deploy.md @@ -5,11 +5,20 @@ 1. 进入 ansible 环境 ``` - docker exec -it ansible byobu + docker exec -it ansible-for-opengauss byobu ``` - 关于 byobu 的使用,大家可自行搜索一些教程。 + 关于 byobu 的使用,大家可自行搜索一些教程。在 byobu 里运行的程序或命令,不会因为 SSH 断开而终止。 + 基本键盘操作有: + + ``` + F2:新建虚拟终端窗口 + F3:向左切换窗口 + F4:向右切换窗口 + F6:将 byobu 置于后台。后续可以再次执行 `docker exec -it ansible-for-opengauss byobu` 进入。 + ``` + 1. 执行部署 ``` @@ -56,6 +65,7 @@ openGauss_cascade ## 1 主 1 从 ![1主1从](imgs/1695614019287.png) + 对应的 hosts.ini 分组编排内容 ``` @@ -76,6 +86,7 @@ openGauss_cascade ## 1 主 1 从 1 级联 ![1主1从1级联](imgs/1695614019263.png) + 对应的 hosts.ini 分组编排内容 ``` @@ -97,6 +108,7 @@ openGauss_cascade ## 1 主 2 从 ![1主2从](imgs/1695614019240.png) + 对应的 hosts.ini 分组编排内容 ``` @@ -113,4 +125,8 @@ openGauss_cascade openGauss_master openGauss_follower openGauss_cascade -``` \ No newline at end of file +``` + +## 集群扩容 + +[扩容](04-expansion.md) \ No newline at end of file diff --git a/docs/04-expansion.md b/docs/04-expansion.md new file mode 100644 index 0000000..f285a70 --- /dev/null +++ b/docs/04-expansion.md @@ -0,0 +1,52 @@ +# 集群扩容 + +*** !!!注意!!! *** + +*** 扩容有风险,操作前请仔细阅读 https://docs.opengauss.org/zh/docs/5.0.0/docs/ToolandCommandReference/gs_expansion.html *** + +*** 仅建议在部署初期,数据量小的情况下,使用本项目进行扩容。 *** + +## 修改 `ansible-docker\inventories\opengauss\hosts.ini` 文件 + +假设原编排为 1 主 1 备 1 级联。 + +``` +; 主服务器组,仅设置 1 个目标机。 +[openGauss_master] +192.168.56.11 + +; 从服务器组,可设置若干个或留空。 +[openGauss_follower] +192.168.56.12 + +; 级联服务器组,可设置若干个或留空。 +[openGauss_cascade] +192.168.56.13 + +``` + +增加 2 台备机,1 台级联机,则在对应的组里增加目标服务器。 + +``` +; 主服务器组,仅设置 1 个目标机。 +[openGauss_master] +192.168.56.11 + +; 从服务器组,可设置若干个或留空。 +[openGauss_follower] +192.168.56.12 +192.168.56.14 +192.168.56.16 + +; 级联服务器组,可设置若干个或留空。 +[openGauss_cascade] +192.168.56.13 +192.168.56.15 + +``` + +## 扩容 + +再次执行 `pansible 01-deploy.yml`。 + +![扩容结果](imgs/23-10-13_1155_909.png) \ No newline at end of file diff --git a/docs/imgs/23-10-13_1155_909.png b/docs/imgs/23-10-13_1155_909.png new file mode 100644 index 0000000000000000000000000000000000000000..56a0164387b481e23eb09d94e44412e9116ce004 GIT binary patch literal 316365 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