DEV Community

GBASE Database
GBASE Database

Posted on

GBASE数据库 | GBase 8a Cluster Automated Installation and Deployment Using ansible

In this article, we will guide you through the process of automating the installation and deployment of a GBase 8a cluster using Ansible. This solution simplifies the deployment of the GBase 8a database (GBase数据库) in a cluster environment, making it easier to manage and scale.

Host Configuration

An example configuration is as follows:

[all]
192.168.56.3 gbaseRole=coor RoleId=1 vc_name='' private_ip1=192.168.56.3 private_ip2=192.168.56.3 
192.168.56.4 gbaseRole=newcoor RoleId=1 vc_name=vc1 private_ip1=192.168.56.4 private_ip2=192.168.56.6 
192.168.56.5 gbaseRole=newnode RoleId=2 vc_name=vc1 private_ip1=192.168.56.4 private_ip2=192.168.56.6 
192.168.56.6 gbaseRole=node RoleId=1 vc_name=vc2 private_ip1=192.168.56.4 private_ip2=192.168.56.6
Enter fullscreen mode Exit fullscreen mode
  • 192.168.56.3: Business network IP
  • gbaseRole: The role of GBase (management node: coor, compute node: node)
  • RoleId: Role ID, fill in sequentially
  • vc_name: Virtual Cluster name for compute nodes, leave empty for management nodes, set to data in compatibility mode
  • private_ip1: Private network IP address 1 for compute nodes
  • private_ip2: Private network IP address 2 for compute nodes (not required for single-instance setups)

Variables Explanation

# GBase installation package name
gbase_setup_file: 'xxxx.tar.bz2'
# Operating system root password
root_passwd: '111111'
# GBase password for the operating system
gbase_passwd: '111111'
# Database DBA user (root, gbase) password
dba_password: '111111'
# Database character set (utf8, utf8mb4, gbk, etc.)
db_charset: utf8
vc_lists: ['vc1']
# Management node ID list, generally recommended to be the IP address's last segment, separated by commas
coorHostNodeIDlist: '1,2,3'
Enter fullscreen mode Exit fullscreen mode

Task Descriptions

Initial Installation Preparation

- name: Install necessary RPM packages
  yum: name={{ item }} state=installed
  with_items:
    - bzip2
    - expect
    - gcc
    - '*cgroup*'
    - bc  
    - numactl
    - rsync
  tags:
    init_env

- name: Upload GBase installation package
  copy: 
    src: files/{{ gbase_setup_file }} 
    dest: /opt/
  when: "gbaseRole == 'coor' and RoleId == 1"
  tags:
    init_env

- name: Extract GBase installation package
  unarchive:
    src: /opt/{{ gbase_setup_file }}
    dest: /opt/
    remote_src: yes
  when: "gbaseRole == 'coor' and RoleId == 1"
  tags:
    init_env

- name: Create GBase user
  user:
    name: gbase
    state: present
    update_password: always
    password: '{{ gbase_passwd | password_hash('sha512') }}'
  tags:
    init_env

- name: Change ownership of /opt directory
  file:
    path: /opt
    state: directory
    owner: gbase
    group: gbase
    recurse: yes
  tags:
    init_env

- name: Upload system environment variable initialization script
  copy: 
    src: SetSysEnv.py
    dest: /tmp
  tags:
    init_env

- name: Initialize system environment variables
  shell: 'python /tmp/SetSysEnv.py --dbaUser=gbase --installPrefix=/opt --cgroup'
  tags:
    init_env
Enter fullscreen mode Exit fullscreen mode

Generate Installation Configuration File

- name: Generate installation configuration file
  template: 
    src: demo.options.j2
    dest: /opt/gbase_workspace/setup/gcinstall/demo.options
  when: "gbaseRole == 'coor' and RoleId == 1 and InstanceType == 0"
  tags:
    install           
  become: true
  become_user: gbase
Enter fullscreen mode Exit fullscreen mode
demo.options.j2 Template:
installPrefix= /opt
coordinateHost = {% for host in groups['all'] -%}
        {% if hostvars[host]['gbaseRole']=='coor' -%}
                {% if hostvars[host]['RoleId'] == 1 -%}
                        {{ hostvars[host]['private_ip1'] }}
                {%- else -%}
                        ,{{ hostvars[host]['private_ip1'] }}
                {%- endif %}
        {%- endif %}
{%- endfor %}

coordinateHostNodeID = {{ coorHostNodeIDlist }}
dataHost = {% for host in groups['all'] -%}
        {% if hostvars[host]['gbaseRole']=='node' -%}
                {% if hostvars[host]['RoleId'] == 1 -%}
                        {{ hostvars[host]['private_ip1'] }}
                {%- else -%}
                        ,{{ hostvars[host]['private_ip1'] }}
                {%- endif %}
        {%- endif %}
{%- endfor %}

gcwareHost = {% for host in groups['all'] -%}
        {% if hostvars[host]['gbaseRole']=='coor' -%}
                {% if hostvars[host]['RoleId'] == 1 -%}
                        {{ hostvars[host]['private_ip1'] }}
                {%- else -%}
                        ,{{ hostvars[host]['private_ip1'] }}
                {%- endif %}
        {%- endif %}
{%- endfor %}

gcwareHostNodeID = {{ coorHostNodeIDlist }}
dbaUser = gbase
dbaGroup = gbase
dbaPwd = '{{ gbase_passwd }}'
rootPwd = '{{ root_passwd }}'
characterSet = {{ db_charset }}
Enter fullscreen mode Exit fullscreen mode

Environment Installation and Deployment

- name: Install and deploy GBase
  shell: 'sh ansible_install.sh'
  when: "gbaseRole == 'coor' and RoleId == 1"
  tags:
    install
  become: true
  become_user: gbase
Enter fullscreen mode Exit fullscreen mode
ansible_install.sh Script:
#!/usr/bin/sh
###########################################################
##creator :                                               
##create time:                                       
##Description: Silent installation script
##Version:                                            
###########################################################

cd /opt/gcinstall
spawn python gcinstall.py --silent=demo.options -i
expect {
  "*])?" {send "y\r"; exp_continue}
  "*])?" {send "y\r"; exp_continue}
}
Enter fullscreen mode Exit fullscreen mode

Re-initialize System Environment Variables

- name: Reinitialize system environment variables
  shell: 'python /tmp/SetSysEnv.py --dbaUser=gbase --installPrefix=/opt --cgroup'
  tags:
    init_env
Enter fullscreen mode Exit fullscreen mode

Generate VC Creation Configuration File

- name: Generate VC creation configuration file
  vars:
    cur_vcname: "{{ item }}"  
  template: 
    src: createvc.xml.j2
    dest: /opt/gcinstall/createvc_{{ item }}.xml
  when: "gbaseRole == 'coor' and RoleId == 1"
  with_items:
    "{{ vc_lists }}"
  tags:
    install          
  become: true
  become_user: gbase
Enter fullscreen mode Exit fullscreen mode
createvc.xml.j2 Template:
<?xml version='1.0' encoding="utf-8"?>
<servers>

{% for host in groups['all'] %}
{% if hostvars[host]['vc_name']==cur_vcname %}
    <rack>
        <node ip="{{ hostvars[host]['private_ip1'] }}"/>
    </rack>
{% endif %}
{% endfor %}

    <vc_name name="{{ cur_vcname }}"/>
    <comment message="{{ cur_vcname }}"/>

</servers>
Enter fullscreen mode Exit fullscreen mode

Create VC

- name: Create VC
  shell: 'source ~/.bash_profile; cd /opt/gcinstall; gcadmin createvc createvc_{{ item }}.xml'
  when: "gbaseRole == 'coor' and RoleId == 1"
  with_items:
    "{{ vc_lists }}"
  tags:
    install
  become: true
  become_user: gbase
Enter fullscreen mode Exit fullscreen mode

Generate Distribution Creation Configuration File

- name: Generate initialization configuration file
  vars:
    cur_vcname: "{{ item }}"  
  template: 
    src: gcChangeInfo_vcname.xml.j2
    dest: /opt/gcinstall/gcChangeInfo_{{ item }}.xml
  when: "gbaseRole == 'coor' and RoleId == 1"
  with_items:
    "{{ vc_lists }}"
  tags:
    install          
  become: true
  become_user: gbase
Enter fullscreen mode Exit fullscreen mode

Generate Configuration File Template for Creating Distribution (gcChangeInfo_vcname.xml.j2)

installPrefix= /opt
coordinateHost = {% for host in groups['all'] -%}
        {% if hostvars[host]['gbaseRole']=='coor' -%}
                {% if hostvars[host]['RoleId'] == 1 -%}
                        {{ hostvars[host]['private_ip1'] }}
                {%- else -%}
                        ,{{ hostvars[host]['private_ip1'] }}
                {%- endif %}
        {%- endif %}
{%- endfor %}

coordinateHostNodeID = {{ coorHostNodeIDlist }}
dataHost = {% for host in groups['all'] -%}
        {% if hostvars[host]['gbaseRole']=='node' -%}
                {% if hostvars[host]['RoleId'] == 1 -%}
                        {{ hostvars[host]['private_ip1'] }}
                {%- else -%}
                        ,{{ hostvars[host]['private_ip1'] }}
                {%- endif %}
        {%- endif %}
{%- endfor %}

#existCoordinateHost =
#existDataHost =
#existGcwareHost=
gcwareHost = {% for host in groups['all'] -%}
        {% if hostvars[host]['gbaseRole']=='coor' -%}
                {% if hostvars[host]['RoleId'] == 1 -%}
                        {{ hostvars[host]['private_ip1'] }}
                {%- else -%}
                        ,{{ hostvars[host]['private_ip1'] }}
                {%- endif %}
        {%- endif %}
{%- endfor %}

gcwareHostNodeID = {{ coorHostNodeIDlist }}
dbaUser = gbase
dbaGroup = gbase
dbaPwd = '{{ gbase_passwd }}'
rootPwd = '{{ root_passwd }}'
#dbRootPwd = ''
#rootPwdFile = rootPwd.json
characterSet = {{ db_charset }}
#sshPort = 22
Enter fullscreen mode Exit fullscreen mode

Create Distribution

- name: Initialize distribution for VC (multi-VC mode)
    shell: "source ~/.bash_profile; cd /opt/gcinstall; gcadmin distribution gcChangeInfo_{{ item }}.xml p 1 d 1 db_user gbase db_pwd 'gbase20110531' dba_os_password '{{ gbase_passwd }}' vc {{ item }}"
    when: "gbaseRole == 'coor' and RoleId == 1"
    with_items:
      "{{ vc_lists }}"
    tags:
      install
    become: true
    become_user: gbase
Enter fullscreen mode Exit fullscreen mode

Initialize nodedatamap

- name: Initialize nodedatamap for VC
    vars:
      cur_vcname: "{{ item }}"  
    shell: 'source ~/.bash_profile; gccli -ugbase -pgbase20110531 -e"use vc {{ item }}; initnodedatamap;"'
    when: "gbaseRole == 'coor' and RoleId == 1"
    with_items:
      "{{ vc_lists }}"
    tags:
      install    
    become: true
    become_user: gbase
Enter fullscreen mode Exit fullscreen mode

Conclusion

By automating the installation and deployment of GBase 8a clusters (GBase数据库) with Ansible, you can significantly reduce manual intervention and increase the efficiency of your database environment. This method is particularly useful for large-scale deployments and environments where consistency is crucial.

If you have any questions or need further clarification, feel free to reach out in the comments or via direct messages.

Top comments (0)