环境 环境:
操作系统: 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 方式)
1 2 # yum install ansible # pip install ansible
安装完成之后会出现 /etc/ansible/ 这样的目录,接下来就是配置好相关的文档了(下图是我的 ansible 文件路径)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [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
1 2 [mysql] 192.168.31.45 # 目标机器 ip 地址
# cat mysql.yml
1 2 3 4 --- - hosts: mysql roles: - zst_mysql8
# cat roles/zst_mysql8/tasks/install.yml (一定要注意缩进哈)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 - 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 # cat roles/zst_mysql8/templates/after_start.sh
1 2 3 4 5 6 #!/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 中相应的变量即可 “”
# cat roles/zst_mysql8/vars/main.yml
1 2 3 4 5 6 7 8 9 # #定义 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 连接主机了
1 2 3 #ssh-keygen # 获得证书,一路回车就行(可查看 /root/.ssh/*) #ssh-copy-id root@192.168.31.45 # 注意,ip 是目标机器
环境搭建完毕,接下来开始整活ヾ(◍°∇°◍)ノ゙ 首先来个小测试,看看 ansible是否能连接上目标机器
看看目标机器 IP地址:
1 2 3 4 #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实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #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 机器,登陆下试试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #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)
1 2 3 4 5 6 #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