暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

使用dbops部署mysql主从数据库

原创 飞天 2024-10-30
308

一、前言

芬达大佬的dbops自动化部署工具1.6版本支持 MySQL5.7、8.0、8.4的自动化部署。今天分享一下在centos7.9虚拟机里面使用dbops工具部署mysql8.0的整个过程。

二、dbops工具介绍

dbops 是一套高效的 ansible playbook 集合,目前是一个可以自动化安装和部署生产级别的 MySQL 及周边生态的工具。dbops 正在持续迭代开发中,未来将支持更多功能。你可以查看 roadmap (待补充)以了解 dbops 已经支持的和未来将要支持的功能。开发历史请查看 releasehistory。目前,支持了 MySQL5.7、8.0、8.4,openGauss5.0、6.0,磐维数据库V2.0-S2.0.3,磐维数据库V2.0-S3.0.0。

dbops主要解决的问题:

  1. 各类生产环境的规范化建设(如开源数据库部署、高可用架构部署、监控工具部署、备份脚本部署)
  2. 实例生命周期中的备份、监控、事态感知与修复方案下发 roadmap (待开发)
  3. 生命周期结束时的清理与资源回收

使用前注意:

  1. dbops 是个人开发的,因此并未经过大量的测试。如果你打算在生产系统中使用它,请详细阅读源代码,通过公司的安全扫描,并确保在测试环境中进行充分的测试,以避免高危操作。由于 dbops 目前只专注于部署,因此在建设期直接使用基本上不会有问题。
  2. dbops 服务器端(也就是安装 ansible 的位置)和被控端(即实际要部署软件/架构的节点)只支持以下操作系统。
操作系统 说明
RHEL7 系列 理论上支持 RHEL7 及其兼容系统,包括: RedHat7、CentOS7 等等
RHEL8 系列 理论上支持 RHEL8 及其兼容系统,包括: RedHat8、CentOS8、AnolisOS8 等等
RHEL9 系列 理论上支持 RHEL9 及其兼容系统,包括:RockyLinux9 等等
Euler 系列 理论上支持 Euler 及其兼容系统,包括: openEuler 20.03 LTS、openEuler 22.03 LTS 、openEuler 24.03 LTS等等

支持的系统和数据库架构
ansible
image.png
mysql-ansible
image.png
image.png
opengauss-ansible(目前版主还没更新opengauss支持的最新版本文档,其实6.0企业版已支持)
image.png

三、dbops工具下载&mysql软件包下载

dbops工具下载地址:
https://gitee.com/fanderchan/dbops

mysql软件包下载地址:
https://dev.mysql.com/downloads/mysql/
选择适合您操作系统的版本(例如 Linux - Generic),下载 tar 包(mysql-8.4.3-linux-glibc2.17-x86_64.tar.xz)。

四、使用dbops工具部署mysql数据库

环境说明

dbops版本:1.6
数据库环境如下:

主机名 ip地址 OS版本 内存、CPU 节点角色 数据库端口
node1 192.*.*.60 Centos7.9 4G 、 1个双核 主节点 3307
node2 192.*.*.62 Centos7.9 4G 、 1个双核 从节点 3307

1.下载dbops工具

[root@node1 ~]# wget https://gitee.com/fanderchan/dbops/releases/download/dbops.1.6.20241029/dbops.1.6.20241029-Linux-x86_64.tar.gz
[root@node1 ~]# tar -zxvf dbops.1.6.20241029-Linux-x86_64.tar.gz -C /usr/local/

2. 安装dbops自带的绿色版ansible

[root@node1 ~]# cd /usr/local/dbops
[root@node1 dbops]# cd portable-ansible-v0.5.0-py3
[root@node1 portable-ansible-v0.5.0-py3]# sh setup_portable_ansible.sh
[root@node1 portable-ansible-v0.5.0-py3]# source ~/.bashrc

检查ansible是否安装成功

[root@node1 portable-ansible-v0.5.0-py3]# ansible --version
ansible 2.10.5
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/dbops/portable-ansible-v0.5.0-py3/ansible/ansible
  executable location = /usr/local/dbops/portable-ansible-v0.5.0-py3/ansible
  python version = 3.6.8 (default, Nov 14 2023, 16:29:52) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
[root@node1 portable-ansible-v0.5.0-py3]# 

3. 上传mysql安装包到/usr/local/dbops/mysql_ansible/downloads目录

将文件mysql-8.4.3-linux-glibc2.17-x86_64.tar.xz上传到/usr/local/dbops/mysql_ansible/downloads目录。

如果服务器可以联网,也可以使用以下命令将mysql安装包下载到服务器正确的位置:
cd /usr/local/dbops/mysql_ansible/
cd downloads
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.4.3-linux-glibc2.17-x86_64-minimal.tar.xz
此步骤不是必须的,因为如果服务器可以联网,dbops会自动下载。如果自己下载,请务必保证是下载glibc2.17、x86_64、minimal版本。

4. 修改ansible的hosts.ini

cd /usr/local/dbops/mysql_ansible/inventory/
vi hosts.ini

[dbops_mysql]
192.*.*.60 ansible_user=root ansible_ssh_pass="'密码'"   #改为你的ip和密码,只支持root不能改root
192.*.*.62 ansible_user=root ansible_ssh_pass="'密码'"   #改为你的ip和密码,只支持root不能改root

[all:vars]
#ansible_python_interpreter=/usr/bin/python3

5. 修改playbook参数和执行playbook安装mysql

如果有东西需要改,那么改common_config.ymlvars/var_enterprise_deployment.yml (/usr/local/dbops/mysql_ansible/playbooks目录下)即可。

修改common_config.yml:

cd /usr/local/dbops/mysql_ansible/playbooks
vi common_config.yml
mysql_version: "8.4.3" #dbops1.6默认是8.4.3
mysql_port: 3307  #dbops1.6默认是3306

common_config.yml中有两处需特别注意:
如果数据库安装目录不是/database,需要修改mysql_base_dir 和 mysql_data_dir_base参数:

## mysql install directory
mysql_base_dir: /data/{{ db_type }}/base/{{ mysql_version }}

## mysql_data_dir_base define mysql datadir base, real datadir= mysql_data_dir_base + /port
mysql_data_dir_base: /data/{{ db_type }}

修改 playbooks/vars/var_master_slave.yml 文件,配置 MySQL 主从信息

cd /usr/local/dbops/mysql_ansible/
cd playbooks
vi vars/var_master_slave.yml
master_ip: 192.*.*.60   # 主库IP
slave_ips:
  - 192.*.*.62          # 从库IP
sub_nets: 192.*.*.%      # 主从复制账号可信网段,% 表示所有子网

执行playbook安装mysql:

cd /usr/local/dbops/mysql_ansible/
cd playbooks
ansible-playbook master_slave.yml

# 会先pre_tasks检查你的配置是否正确,然后你输入comfirm确认后,就一直等待直到部署完成即可。
confirm

安装日志如下:

...
TASK [../roles/pre_check_and_set : If it is a physical machine, double network card binding is required] ************************************************************************************************************************************
ok: [192.*.*.60] => {
    "msg": "ens33"
}
ok: [192.*.*.62] => {
    "msg": "ens36"
}

TASK [../roles/pre_check_and_set : If it is a physical machine, double network card binding is required] ************************************************************************************************************************************
skipping: [192.*.*.60]
skipping: [192.*.*.62]

TASK [../roles/pre_check_and_set : Add network interface alias to a temporary file] *********************************************************************************************************************************************************
ok: [192.*.*.62]
changed: [192.*.*.60]

TASK [../roles/pre_check_and_set : Fetch copy] **********************************************************************************************************************************************************************************************
ok: [192.*.*.62]
ok: [192.*.*.60]

TASK [../roles/pre_check_and_set : Append file /tmp/net_aliases.txt (delegate to 127.0.0.1)] ************************************************************************************************************************************************
ok: [192.*.*.60]

TASK [../roles/pre_check_and_set : Check if shell output is 1] ******************************************************************************************************************************************************************************
fatal: [192.*.*.60]: FAILED! => {
    "assertion": "pre_check_and_set__shell_output.stdout | int == 1",
    "changed": false,
    "evaluated_to": false,
    "msg": "Network card names are different!"
}

NO MORE HOSTS LEFT **************************************************************************************************************************************************************************************************************************

NO MORE HOSTS LEFT **************************************************************************************************************************************************************************************************************************

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
192.*.*.60             : ok=29   changed=4    unreachable=0    failed=1    skipped=23   rescued=0    ignored=1   
192.*.*.62             : ok=23   changed=1    unreachable=0    failed=0    skipped=23   rescued=0    ignored=1   

Playbook run took 0 days, 0 hours, 0 minutes, 33 seconds

可以看到,ansible准备工作做好之后,部署过程只花费了33秒,省时省力啊!

五、通过mysql客户端访问mysql数据库

主节点:
[root@node1 playbooks]# su - mysql
[mysql@node1 ~]$ mysql -uadmin -h127.0.0.1 -P3307 -pDbops@8888 -e "select @@version"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------+
| @@version |
+-----------+
| 8.4.3     |
+-----------+

从节点:
[root@node2 ~]# su - mysql
Last login: Tue Oct 29 18:07:55 CST 2024 on pts/1
[mysql@node2 ~]$  mysql -uadmin -h127.0.0.1 -P3307 -pDbops@8888 -e "select @@version"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------+
| @@version |
+-----------+
| 8.4.3     |
+-----------+

六、检查数据库主从状态

mysql> show replica status\G;
*************************** 1. row ***************************
             Replica_IO_State: Waiting for source to send event
                  Source_Host: 192.*.*.60
                  Source_User: repl
                  Source_Port: 3307
                Connect_Retry: 60
              Source_Log_File: mysql-bin.000002
          Read_Source_Log_Pos: 737
               Relay_Log_File: relay-bin.000003
                Relay_Log_Pos: 462
        Relay_Source_Log_File: mysql-bin.000002
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Source_Log_Pos: 737
              Relay_Log_Space: 1463
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File: 
           Source_SSL_CA_Path: 
              Source_SSL_Cert: 
            Source_SSL_Cipher: 
               Source_SSL_Key: 
        Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Source_Server_Id: 4272366266
                  Source_UUID: c859b0b8-95c4-11ef-8376-00505621a1ea
             Source_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Source_Retry_Count: 10
                  Source_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Source_SSL_Crl: 
           Source_SSL_Crlpath: 
           Retrieved_Gtid_Set: c859b0b8-95c4-11ef-8376-00505621a1ea:1-2
            Executed_Gtid_Set: c859b0b8-95c4-11ef-8376-00505621a1ea:1-2
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Source_TLS_Version: 
       Source_public_key_path: 
        Get_Source_public_key: 1
            Network_Namespace: 
1 row in set (0.01 sec)

ERROR: 
No query specified

数据库主从运行正常。

七、总结

整个安装过程非常顺利,dbops自动化部署工具大大提高了运维人员的工作效率,减少了手动部署过程中容易出现人为错误,如配置错误、遗漏步骤等错误的发生,提高了部署的准确性和可靠性,让运维人员把精力花费在更有价值的工作上。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论