环境:

操作系统: CentOS Linux release 7.8.2003 (Core)

MySQL版本:8.0.21

安装 ansible 机器:192.168.31.127

目标机器:192.168.31.45

 

首先要知道,我们为什么要使用多实例?

  1. 物理机强劲,单个项目无法把资源使用完
  2. 现在单个实例数据库大小
  3. 资源隔离,减少相互影响
  4. 分担连接数
  5. 更充分的利用资源

 

MySQL 多实例安装方式

  1. 手动新建一个新的实例(本文不做讨论)
  2. 利用 ansible 实现远程自动化的安装与部署(还有其他的工具可以使用,这里主要介绍 ansible)

 

实现过程

  • 安装 ansible(二选一,笔者这里使用的是 yum 方式)
#yum install ansible
#pip install ansible
  • 安装完成之后会出现 /etc/ansible/ 这样的目录
  • 接下来就是配置好相关的文档了(下图是我的 ansible 文件路径)
[root@*** 02:06:56 /etc/ansible]
#tree
.
├── ansible.cfg
├── hosts
├── mysql.yml
└── roles
    └── zst_mysql8
        ├── files
        │   └── mysql-8.0.21-linux-glibc2.12-x86_64.tar
        ├── handlers
        ├── meta
        ├── tasks
        │   ├── :
        │   ├── install.yml
        │   ├── main.yml
        │   └── prepare.yml
        ├── templates
        │   ├── after_start.sh
        │   └── my.cnf
        └── vars
            └── main.yml

8 directories, 11 files
  • 相关配置文件

# cat hosts

[mysql]
192.168.31.45 # 目标机器 ip 地址

#cat mysql.yml

#cat mysql.yml 
---
- hosts: mysql
  roles:
  - zst_mysql8

#cat roles/zst_mysql8/tasks/install.yml(一定要注意缩进哈)

- name: 1. 创建 MySQL 用户组
  group: name={{ MYSQL_USER }} state=present

- name: 2. 创建 MySQL 用户
  user: name={{ MYSQL_USER }} group={{ MYSQL_USER }} state=present create_home=False shell=/sbin/nologin

- name: 3. 创建所需目录及权限
  file: name={{ item }} state=directory owner={{ MYSQL_USER }} group={{ MYSQL_USER }} mode=0750 recurse=yes
  with_items:
  - "{{ SOURCE_DIR }}"
  - "{{ DATA_BASE }}"
  - "{{ DATA_BASE }}/data"
  - "{{ DATA_BASE }}/tmp"
  - "{{ DATA_BASE }}/logs"
  - "/opt/mysql"

- name: 4. 部署 MySQL
  stat: path={{ BASE_DIR }}
  register: base_ok

- name: 4. 部署 MySQL Server 相关软件
  unarchive: src=mysql-{{ MYSQL_VER }}-linux-glibc2.12-x86_64.tar dest=/opt/mysql owner={{ MYSQL_USER }} group={{ MYSQL_USER }}
  when: not base_ok.stat.exists

- name: 5. 创建 basedir 的软链
  file:
   src: /opt/mysql/mysql-{{ MYSQL_VER }}-linux-glibc2.12-x86_64
   dest: "{{ BASE_DIR }}"
   owner: "{{ MYSQL_USER }}"
   group: "{{ MYSQL_USER }}"
   state: link

# 复制 MySQL 配置文件
- name: 6. 拷贝 mysql 配置文件
  template: src=my.cnf dest={{ DATA_BASE }}/my{{ MYSQL_PORT }}.cnf owner=root group=root

- name: 7. 把 mysql 命令加入 PATH 中
  shell: " if [ `grep {{ BASE_DIR }}/bin /etc/profile |wc -l` -eq 0 ]; then echo export PATH=$PATH:{{ BASE_DIR }}/bin >> /etc/profile && source /etc/profile; else source /etc/profile; fi"

- name: 8. mysql 初始化
  shell: "{{ BASE_DIR }}/bin/mysqld --defaults-file={{ DATA_BASE }}/my{{ MYSQL_PORT }}.cnf --initialize-insecure --user={{ MYSQL_USER }}"

- name: 9. 启动 mysql 并开机启动
  shell: "{{ BASE_DIR }}/bin/mysqld_safe --defaults-file={{ DATA_BASE }}/my{{ MYSQL_PORT }}.cnf &"

- name: 10. 生成初始化脚本
  template: src=after_start.sh dest=/root/ owner=root group=root

- name: 11. 执行生成的脚本
  shell: bash /root/after_start.sh

#cat roles/zst_mysql8/tasks/main.yml

- include: install.yml

#cat roles/zst_mysql8/templates/after_start.sh

#!/bin/bash
echo "安装的 mysql 版本 {{ MYSQL_VER }}"
echo "DATA_DIR {{ DATA_DIR }}"

echo "指定你需要的初始化相关内容"
echo "create user 'test'@'%' identified by '123456';grant replication slave on *.* to 'test'@'%';"|mysql -S /tmp/mysql{{ MYSQL_PORT}}.sock -uroot

# my.cnf

这里需要注意的是,base_dir、data_dir、port 换成 vars 中相应的变量即可 “{{ XXX }}”

#cat roles/zst_mysql8/vars/main.yml

# #定义 mysql 安装中的变量
MYSQL_VER: 8.0.21
MYSQL_USER: mysql
#MYSQL_PORT: 3307    # 注意因为是多实例,这里给注释了。安装时手动添加即可
MYSQL_PASSWD: 626506
SOURCE_DIR: /data/soft
BASE_DIR: /usr/local/mysql
DATA_BASE: /data/mysql/mysql{{ MYSQL_PORT }}
DATA_DIR: /data/mysql/mysql{{ MYSQL_PORT }}/data
  • 接下来就是 ssh 连接主机了
#ssh-keygen    # 获得证书,一路回车就行(可查看 /root/.ssh/*)

#ssh-copy-id root@192.168.31.45    # 注意,ip 是目标机器

 

 

环境搭建完毕,接下来开始整活ヾ(◍°∇°◍)ノ゙

  • 首先来个小测试,看看 ansible是否能连接上目标机器
  • 看看目标机器 IP地址
#ansible 192.168.31.45 -m command -a 'ifconfig' 
192.168.31.45 | CHANGED | rc=0 >>
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.31.45  netmask 255.255.255.0  broadcast 192.168.31.255
  • 安装 mysql 3306实例
#ansible-playbook mysql.yml -e "MYSQL_PORT=3306"

PLAY [mysql] ********************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [192.168.31.45]

TASK [zst_mysql8 : 1. 创建 MySQL 用户组] *********************************************************************************************************************************************************
ok: [192.168.31.45]

TASK [zst_mysql8 : 2. 创建 MySQL 用户] **********************************************************************************************************************************************************
ok: [192.168.31.45]

TASK [zst_mysql8 : 3. 创建所需目录及权限] ************************************************************************************************************************************************************
ok: [192.168.31.45] => (item=/data/soft)
changed: [192.168.31.45] => (item=/data/mysql/mysql3306)
changed: [192.168.31.45] => (item=/data/mysql/mysql3306/data)
changed: [192.168.31.45] => (item=/data/mysql/mysql3306/tmp)
changed: [192.168.31.45] => (item=/data/mysql/mysql3306/logs)
ok: [192.168.31.45] => (item=/opt/mysql)

TASK [zst_mysql8 : 4. 部署 MySQL] *************************************************************************************************************************************************************
ok: [192.168.31.45]

TASK [zst_mysql8 : 4. 部署 MySQL Server 相关软件] *************************************************************************************************************************************************
changed: [192.168.31.45]

TASK [zst_mysql8 : 5. 创建 basedir 的软链] *******************************************************************************************************************************************************
changed: [192.168.31.45]

TASK [zst_mysql8 : 6. 拷贝 mysql 配置文件] ********************************************************************************************************************************************************
changed: [192.168.31.45]

TASK [zst_mysql8 : 7. 把 mysql 命令加入 PATH 中] **************************************************************************************************************************************************
changed: [192.168.31.45]

TASK [zst_mysql8 : 8. mysql 初始化] ************************************************************************************************************************************************************
changed: [192.168.31.45]

TASK [zst_mysql8 : 9. 启动 mysql 并开机启动] *******************************************************************************************************************************************************
changed: [192.168.31.45]

TASK [zst_mysql8 : 10. 生成初始化脚本] *************************************************************************************************************************************************************
changed: [192.168.31.45]

TASK [zst_mysql8 : 11. 执行生成的脚本] *************************************************************************************************************************************************************
changed: [192.168.31.45]

PLAY RECAP **********************************************************************************************************************************************************************************
192.168.31.45              : ok=13   changed=9    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  • 在 4. 部署 MySQL Server 相关软件 可能会比较慢一点
  • 这里failed、skipped 都是 0,说明进行的很顺利 (*^▽^*)

 

  • 切换到 192.164.31.45 机器,登陆下试试
#ps aux|grep mysql
root      11485  0.0  0.0 113416   648 ?        S    11月23   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/mysql3306/my3306.cnf
mysql     13018  0.7 21.3 9031716 825692 ?      Sl   11月23   0:57 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/mysql3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql3306/data/error.log --open-files-limit=65535 --pid-file=denyf.pid --socket=/tmp/mysql3306.sock --port=3306
root      30514  0.0  0.0 112828   976 pts/1    S+   02:01   0:00 grep --color=auto mysql


#mysql -S /tmp/mysql3306.sock -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

root@localhost [(none)]>

 

接下来再安装一个 3307 实例(这里就会快很多了,纵享新丝滑)

  • 这里需要注意的是 修改 after_start.sh 文件(注释或者删掉配置环境变量那一行)
  • 可以看到,现在已经起 2个 mysqld 实例了(3306、3307)
#ps aux|grep mysql
root      11485  0.0  0.0 113416   648 ?        S    11月23   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/mysql3306/my3306.cnf
mysql     13018  0.7 21.2 9031716 822308 ?      Sl   11月23   1:00 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/mysql3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql3306/data/error.log --open-files-limit=65535 --pid-file=denyf.pid --socket=/tmp/mysql3306.sock --port=3306
root      31944  0.1  0.0 113416  1632 ?        S    02:06   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/mysql3307/my3307.cnf
mysql     33478  5.6 22.1 8899104 855408 ?      Sl   02:06   0:03 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3307/my3307.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/mysql3307/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql3307/data/error.log --open-files-limit=65535 --pid-file=denyf.pid --socket=/tmp/mysql3307.sock --port=3307
root      33779  0.0  0.0 112824   976 pts/1    S+   02:07   0:00 grep --color=auto mysql