Ansible Playbook快速部署一主多从MySQL集群

部署目标:

1、快速部署一套一主两从的mysql集群

2、部署过程中支持交互式定义安装目录及监听端口号

部署清单目录结构:

root@master:/opt/mysql# tree .
.
├── group_vars
│   └── all.yml
├── hosts
├── mysql.yml
└── roles└── mysql├── files│   └── mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz├── tasks│   └── main.yml└── templates├── my.cnf.j2└── mysqld.service.j26 directories, 7 files

主机清单:

定义了需要部署mysql的主机组、IP及设定mysql主机角色

# 主机清单
root@master:/opt/mysql# cat hosts 
[mysql]
192.168.16.140 slave=true
192.168.16.150 slave=true
192.168.16.129 master=true
  • 声明变量:

声明变量的好处在于用户可以按需改这一个文件,而不需要挨个儿修改部署清单,同时可以在交互式中进行个性化安装设置。

# 声明变量
root@master:/opt/mysql# cat group_vars/all.yml 
mysql_pkg: mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
mysql_version: mysql-5.7.33-linux-glibc2.12-x86_64
mysql_install_path: /opt/soft
mysql_link: mysql
mysql_sock: /tmp/mysql.sock
mysql_port: 3306
mysql_root_passwd: Root_123^
repl_user: repl
repl_passwd: Repl_123^
user: mysql
group: mysql
master_ip: 192.168.16.129 
  • 交互式配置文件:
root@master:/opt/mysql# cat mysql.yml 
---
- hosts: mysqlgather_facts: falsevars_prompt:- name: mysql_install_pathprompt: 请输入mysql安装目录default: "/opt/soft"private: no- name: mysql_portprompt: 请输入mysql服务的端口default: 3306private: no- name: mysql_sockprompt: 请输入mysql服务的socket文件default: "/tmp/mysql.sock"private: no- name: mysql_root_passwdprompt: 请输入mysql的root密码default: Root_123^ private: yes- name: repl_userprompt: 请输入复制用户名default: replprivate: no- name: repl_passwdprompt: 请输入复制用户密码default: Repl_123^private: yes- name: userprompt: 请输入mysql服务的启动用户default: mysqlprivate: noroles:- mysql

部署清单:

其实就是把手动部署MySQL集群的步骤通过Ansible的相关模块、playbook语法及条件判断进行组合,继而实现自动化部署的过程。原理很简单,但是其中涉及的关于操作MySQL的模块需要着重研究,还有关于template模板的用法也非常重要,在通过Ansible playbook部署一些更复杂的系统时,经常会用到使用template模板语法渲染不同的配置,实现更为复杂系统的部署。比如通过Ansible playbook离线部署Kubernetes集群。

---
- name: "1、创建{{ user }}用户"user:name: "{{ user }}"shell: /bin/bash- name: "2、创建安装目录"file:path: "{{ mysql_install_path }}"state: directoryowner: "{{ user }}"group: "{{ group }}"recurse: yes- name:  "3、解压mysql二进制包"unarchive:src:  "{{ mysql_pkg }}"dest: "{{ mysql_install_path }}"owner: "{{ user }}"group: "{{ group }}"- name: "4、创建数据目录"file:path: "{{ item }}"state: directoryowner: "{{ user }}"group: "{{ group }}"recurse: yeswith_items:- "{{ mysql_install_path }}/{{ mysql_version }}/data"- "{{ mysql_install_path }}/{{ mysql_version }}/undolog"- name: "5、修改权限"command: chown -R "{{ user }}:{{ group }}" "{{ mysql_install_path }}"- name: "6、创建链接文件"file:src: "{{ mysql_install_path }}/{{ mysql_version }}"dest: "{{ mysql_install_path }}/{{ mysql_link }}"owner: "{{ user }}"group: "{{ group }}"state: link- name: "7、生成配置文件"template:src: my.cnf.j2dest: /etc/my.cnf- name: "8、数据库初始化"shell: ./mysqld --initialize --user={{ user }} --basedir={{ mysql_install_path }}/{{ mysql_link }} --datadir={{ mysql_install_path }}/{{ mysql_link }}/dataargs:chdir: "{{ mysql_install_path }}/{{ mysql_link }}/bin"- name: "9、注册初始密码"shell: cat error.log |grep localhost|grep "temporary password"|awk '{print $NF}'register: mysql_init_passwdargs:  chdir: "{{ mysql_install_path }}/{{ mysql_link }}/data"- name: "10、打印初始密码"debug: msg: "{{ mysql_init_passwd.stdout }}"- name: "11、配置systemd守护进程"template:src: mysqld.service.j2dest: /usr/lib/systemd/system/mysqld.service- name: "12、启动mysqld服务"systemd:name: mysqldstate: starteddaemon_reload: yesenabled: yes- name: "13、修改初始密码"shell: ./mysqladmin -u root -p"{{ mysql_init_passwd.stdout }}" password "{{ mysql_root_passwd }}"args:chdir: "{{ mysql_install_path }}/{{ mysql_link }}/bin"- name: "14、创建{{ repl_user }}同步用户"mysql_user: login_host: localhostlogin_port: "{{ mysql_port }}"login_user: rootlogin_unix_socket: "{{ mysql_sock }}" login_password: "{{ mysql_root_passwd }}"name: "{{ repl_user }}"password: "{{ repl_passwd }}"priv: "*.*:ALL"state: present host: "%"when: master is defined- name: "15、从库配置从主库同步"mysql_replication:login_unix_socket: "{{ mysql_sock }}"login_host: localhostlogin_port: "{{ mysql_port }}"login_user: root     login_password: "{{ mysql_root_passwd }}"master_host: "{{ master_ip }}" master_user: "{{ repl_user }}" master_password: "{{ repl_passwd }}"master_port: "{{ mysql_port }}"master_auto_position: 1mode: changemasterwhen: slave is defined- name: "16、Start Slave"mysql_replication: login_unix_socket: "{{ mysql_sock }}"login_user: root login_host: localhostlogin_port: "{{ mysql_port }}"login_password: "{{ mysql_root_passwd }}"mode: startslavewhen: slave is defined- name: "17、注册复制状态"mysql_replication:login_host: localhostlogin_user: rootlogin_port: "{{ mysql_port }}"login_password: "{{ mysql_root_passwd }}"login_unix_socket: "{{ mysql_sock }}"mode: getslavewhen: slave is definedregister: info- name: "18、打印复制状态信息"debug:msg: "Slave_IO_Running={{ info.Slave_IO_Running }}       Slave_SQL_Running={{ info.Slave_SQL_Running }}"when: slave is defined

MySQL配置文件:

MySQL配置文件中的系统参数可以根据实际按需修改,以下配置只供参考,着重看一下文件中有标注的地方。

root@master:/opt/mysql# cat roles/mysql/templates/my.cnf.j2
[client]
port = {{ mysql_port }}
socket = {{ mysql_sock }}
default-character-set=utf8mb4[mysqldump]
single-transaction[mysqld]
port = {{ mysql_port }}
socket = {{ mysql_sock }}
character-set-server=utf8mb4
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
log_bin_trust_function_creators=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1gtid-mode = on
enforce_gtid_consistency
log-bin = on
log-slave-updates = on#rpl_semi_sync_master_enabled=1
#rpl_semi_sync_master_timeout=1000
#rpl_semi_sync_slave_enabled=1master_info_repository = TABLE
relay_log_info_repository = TABLEreplicate-ignore-table=mysql.failover_consoledatadir={{ mysql_install_path }}/{{ mysql_link }}/data# 设置主节点server-id=1,模式为读写;从节点server-id=2,模式为只读
{% if master is defined %}
server-id=1
#read-only=0                             
{% else %}
server-id=2
#read-only=1
{% endif %}#relay_log_purge=0
log_timestamps=SYSTEM
lower_case_table_names=1
log_slave_updates=onskip-name-resolve
#skip-networking
back_log = 600slave_parallel_workers = 16
slave-parallel-type = LOGICAL_CLOCK
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
slave_preserve_commit_order = 1innodb_undo_directory={{ mysql_install_path }}/{{ mysql_link }}/undolog
innodb_undo_tablespaces=4
innodb_undo_logs=128
innodb_max_undo_log_size=512M
innodb_purge_rseg_truncate_frequency
innodb_undo_log_truncate=1max_connections = 4000
max_connect_errors = 6000
open_files_limit = 1024
table_open_cache = 4096
table_open_cache_instances = 64
max_allowed_packet = 128M
binlog_cache_size = 32M
max_heap_table_size = 128M
tmp_table_size = 32M
read_buffer_size = 8M  
read_rnd_buffer_size = 8M  
sort_buffer_size = 8M  
join_buffer_size = 8M  
key_buffer_size = 8M  
thread_cache_size = 64
query_cache_type = 0
query_cache_size = 0
#query_cache_size = 16M  
#query_cache_limit = 8M
ft_min_word_len = 4
log_bin = mysql-bin
binlog_format = row
expire_logs_days = 15
log_error ={{ mysql_install_path }}/{{ mysql_link }}/data/error.log
slow_query_log = 1
long_query_time = 3
performance_schema = 0
explicit_defaults_for_timestamp
#lower_case_table_names = 1
skip-external-locking
default_storage_engine = InnoDB
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_stats_persistent_sample_pages = 64
innodb_open_files = 10000
innodb_buffer_pool_size = 2G
innodb_write_io_threads = 24
innodb_read_io_threads = 24
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_log_buffer_size = 64M
innodb_sort_buffer_size = 64M
innodb_log_file_size = 512M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 75
innodb_lock_wait_timeout = 120
#log_warnings=1
log_error_verbosity=1
#local-infile=0
#connection-control-failed-connections-threshold=10
#connection-control-min-connection-delay=10800
wait_timeout = 3600
interactive_timeout = 3600
innodb_temp_data_file_path = ibtmp1:200M:autoextend:max:5G

部署:

# 部署命令root@master:/opt/mysql# ansible-playbook -i hosts mysql.yml

交互式配置,不输入即保持默认配置,如默认端口为3306,我自定义为33306,部署路径我自定义为/opt/software,其他的保持默认直接按回车

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wRyz2v1a-1691561951824)(https://mmbiz.qpic.cn/sz_mmbiz_png/MHMvTZWZSB8eia70OMf87WfLvkgC8wqAYOXmSox8HMOgQicUVgsE8mhBAS7hLk8CGYkFNVKfnYiaaCbReen0zlp9w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)]

获取到的初始密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H4r3p3Dl-1691561951825)(https://mmbiz.qpic.cn/sz_mmbiz_png/MHMvTZWZSB8eia70OMf87WfLvkgC8wqAYMIEIuH4FUd1gIxDVtke0E73cNaBpCXfKtW0iaY3ljPqaSp0iceK6icm8A/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)]

部署完成后的截图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nNBzbZPd-1691561951825)(https://mmbiz.qpic.cn/sz_mmbiz_png/MHMvTZWZSB8eia70OMf87WfLvkgC8wqAYElAuHj1DE71QOjzLxIibMv4YIbm6LIiaqiadiaNBmMqrRiaE8JThmvt2lew/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)]

可以看到,一主两从已成功部署完成,获取到的复制状态信息正常。

**验证:

**

  • 登录节点查看状态
# 主节点
root@ubuntu:/opt/software# mysql -u root -pRoot_123^ -e "show master status;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 |      852 |              |                  | 07c31ccf-208c-11ee-abc5-000c29e5c1ce:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+# 从节点1
root@work-01:/opt/software# mysql -u root -pRoot_123^ -e "show slave status\G;"
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.16.129Master_User: replMaster_Port: 33306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 852Relay_Log_File: work-01-relay-bin.000002Relay_Log_Pos: 1065Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: Yes# 从节点2
root@work-02:/opt/software#  mysql -u root -pRoot_123^ -e "show slave status\G;"
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.16.129Master_User: replMaster_Port: 33306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 852Relay_Log_File: work-02-relay-bin.000002Relay_Log_Pos: 1065Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: Yes

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5FA5yIX2-1691561951825)(https://mmbiz.qpic.cn/sz_mmbiz_png/MHMvTZWZSB8eia70OMf87WfLvkgC8wqAYBf6Nwuic1uKyHF2Gd31mCX7Vs5EwGNjsjsF0Kfpt4ibFu3Fq04A1HpEQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sefepukW-1691561951825)(https://mmbiz.qpic.cn/sz_mmbiz_png/MHMvTZWZSB8eia70OMf87WfLvkgC8wqAY9WPwL0lT4ibnx6Lt61g9UpAeMGKRxQnXdoqbLQABSm3ia0sdRfwESuzA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)]

在这里插入图片描述

  • 主节点建库,从节点查看同步正常
# 主节点建库
root@ubuntu:/opt/software# mysql -u root -pRoot_123^ -e "create database db_demo;"
mysql: [Warning] Using a password on the command line interface can be insecure.
# 从节点1查看
root@work-01:/opt/software# mysql -u root -pRoot_123^ -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_demo            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
# 从节点2查看
root@work-02:/opt/software# mysql -u root -pRoot_123^ -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_demo            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

以上便是这篇文章的全部内容。文章内容仅供参考,如有纰漏,欢迎大家留言指正。

-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/88143.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring Cloud +Vue+UniApp】智慧建筑工地平台源码

智慧工地源码 、智慧工地云平台源码、 智慧建筑源码支持私有化部署,提供SaaS硬件设备运维全套服务。 前言:互联网建筑工地,是将互联网的理念和技术引入建筑工地,从施工现场源头抓起,最大程度的收集人员、安全、环境、材…

C++的六大“天选之子“拷贝构造与与运算符重载

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 &#x1f…

MySql(干货)

写这篇博客的目的不是为了将介绍原理,而是为了Sql中的代码操作属实太多了,在这里进行一个汇总,方便查阅!!! Sql分类 分类全称说明 DDL Data Definintion Language数据定义语言,用来定义数据库对…

Docker知识(详细笔记)

概览图 文章目录 概览图docker 知识速查1. 初识 Docker1.1 概念1.2 特点1.3 架构1.4 应用场景1.5 安装 Docker1.6 配置 Docker 镜像 2. Docker 命令2.1 Docker 进程相关命令2.2 Docker 镜像相关命令2.3 Docker 容器相关命令 3. Docker 容器的数据卷3.1 数据卷概念及作用3.1.1 概…

jvm里的内存溢出

目录 堆溢出 虚拟机栈和本地方法栈溢出(栈溢出很少出现) 方法区和运行时常量池溢出 本机内存直接溢出(实际中很少出现、了解即可) 堆溢出 堆溢出:最常见的是大list,list里面有很多元素 堆溢出该怎么解决…

修改IDEA的idea.vmoptions参数导致IDEA无法打开(ReservedCodeCacheSize)

事发原因 Maven导依赖的时候OOM,因此怀疑是内存太小,尝试修改idea.vmoptions的参数,然后发现IDEA重启后打不开了,卸载重装后也无法打开。。。 实际上如果导包爆出OOM的话应该调整下图参数,不过这都是后话了 解决思路…

52.Linux学习day02 基础命令详解2

目录 Linux常见的基础命令 1.cp 2.mv 3.rm 4.find 5.grep 6.管道 | 7.wc 8.su 9.关机与重启 10.runleve Linux常见的基础命令 1.cp 用于复制文件或目录 使用 cp 命令的基本格式如下: cp [选项] 源文件 目标文件或目录选项:cp 命令支持一些选…

Spring5新功能

文章目录 前言一、整合日志功能二、Nullable注解三、函数式风格编程四、JUnit5单元测试框架总结 前言 整合日志、Nullable注解、函数式风格编程、整合JUnit5、Webflux 一、整合日志功能 Spring5移除了Log4jConfigListener,官方建议使用Log4j2. 依赖: &…

k8s 滚动更新控制(一)

在传统的应用升级时,通常采用的方式是先停止服务,然后升级部署,最后将新应用启动。这个过程面临一个问题,就是在某段时间内,服务是不可用的,对于用户来说是非常不友好的。而kubernetes滚动更新,…

研发工程师玩转Kubernetes——PVC使用Label和storage选择PV

在《研发工程师玩转Kubernetes——local型PV和PVC绑定过程中的状态变化》和《研发工程师玩转Kubernetes——使用local型PV在不同Pod上共享数据》中,我们介绍了指定VPC的spec.volumeName为PV名称来绑定它们的方法。本文将介绍PVC在创建时,系统自动选择绑定…

什么是DNS欺骗及如何进行DNS欺骗

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、什么是 DNS 欺骗?二、开始1.配置2.Ettercap启动3.操作 总结 前言 我已经离开了一段时间,我现在回来了,我终于在做一个教…

[vscode]vscode运行cmake时候exe不执行而且前面多一些字符

遇到一个奇怪问题,你单独打开cmd去执行vscode编译过程序没问题,但是你在vscode确不会执行,这是因为vscode没有读取到电脑环境变量导致加载DLL失败,但是在vscode终端不会给你提示少DLL,需要你自己把DLL复制到exe目录即可解决问题。…

Vue.js 生命周期详解

Vue.js 是一款流行的 JavaScript 框架,它采用了组件化的开发方式,使得前端开发更加简单和高效。在 Vue.js 的开发过程中,了解和理解 Vue 的生命周期非常重要。本文将详细介绍 Vue 生命周期的四个阶段:创建、挂载、更新和销毁。 …

计算机视觉的应用9-视觉领域中的61个经典数据集【大集合】的应用与实战

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用9-视觉领域中的61个经典数据集【大集合】的应用与实战,我们都知道计算机视觉是一门研究如何使计算机能够理解和解释数字图像或视频的技术和方法。在计算机视觉领域中,数据集是非常重要的资源,它们可以用于训练和评估…

从源码Debug深入spring事件机制,基于观察者模式仿写spring事件监听骨架

文章目录 1.测试案例2.DEBUG源码分析3. 异步监听4.ApplicationListener子接口5. 注解支持6. 基于观察者模式高仿spring事件监听6.1 先定义自定义一个事件6.2 定义两个监听器6.3 定义一个持有所有监听器的对象,类似spring的SimpleApplicationEventMulticaster6.4 事件…

什么是响应式设计?列举几种实现响应式设计的方法。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是响应式设计?⭐ 实现响应式设计的方法⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏…

Python实现图片文本支持中文,自定义字体

Python实现图片文本支持中文,自定义字体 # 支持中文 import matplotlib #用下载好的字体文件设置字体,从而正确显示中文 myfont matplotlib.font_manager.FontProperties(fnamer"./simsun.ttc") # 自定义的字体文件 plt.figure(figsize (1…

STM32F429IGT6使用CubeMX配置外部中断按键

1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、NVIC配置 PC13相同 5、生成工程配置 6、部分代码 中断回调函数 /* USER CODE BEGIN 0 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin GPIO_PIN_0){HAL_GPIO…

化工行业案例 | 甄知科技助力万华化学重构IT服务价值,打造信息中心ERP!

随着科技的发展,新材料的应用领域与日俱增,近年来,全球化工新材料产业发展整体步入高技术引领、产品迭代速度快、产业规模和需求不断扩大的阶段。一体化协同与数字化转型策略是实现化工新材料生产原料自给、节能降耗、降低排放和物料成本的重…

QT之UDP通信

QT之UDP通信 UDP不分客户端口服务器,只需要使用一个类QUdpSocket QT += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = udp TEMPLATE = app# The following define makes your compiler emit warnings if you use # any feature of Qt …