环境:
操作系统: CentOS Linux release 7.8.2003 (Core)
MySQL版本:8.0.21
安装 ansible 机器:192.168.31.127
目标机器:192.168.31.45
首先要知道,我们为什么要使用多实例?
- 物理机强劲,单个项目无法把资源使用完
- 现在单个实例数据库大小
- 资源隔离,减少相互影响
- 分担连接数
- 更充分的利用资源
MySQL 多实例安装方式
- 手动新建一个新的实例(本文不做讨论)
- 利用 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