saltstack部署MySQL主从

2023-11-15

1. 目录结构

[root@master mysql]# pwd
/srv/salt/prod/mysql

[root@master prod]# tree mysql/
mysql/
├── files
│   ├── master.cnf
│   ├── my.cnf.j2
│   ├── mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz
│   ├── mysql.server
│   ├── mysql.service
│   ├── mysql.sh
│   └── slave.cnf
├── main.sls
├── master.sls
└── slave.sls

[root@master bbs]# pwd
/srv/salt/prod/bbs

[root@master prod]# tree bbs/
bbs/
├── files
│   └── start_slave.sh
├── grant-mysql.sls
├── master_mysql.sls
└── slave-mysql.sls

2. 编写状态文件

2.1 main.sls文件内容


{% if grains['osmajorrelease'] == 8 %}  //如果是8版本的系统就安装这个包
ncurses-compat-libs:
  pkg.installed
{% endif %}

{% if grains['osmajorrelease'] == 7 %}  //如果是7版本的系统就安装这个包
libaio-devel:
  pkg.installed
{% endif %}

unzip_pkg:  //解压mysql的包
  archive.extracted:
    - name: /usr/local
    - source: salt://mysql/files/mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz

user-mysql:   // 创建MySQL属主
  user.present:
    - name: mysql
    - shell: /sbin/nologin
    - createhome: false
    - system: true

/usr/local/mysql:    //创建软链接
  file.symlink:
    - target: /usr/local/mysql-5.7.34-linux-glibc2.12-x86_64

mysql-create:   //设置mysql的属主和属组
  file.directory:
    - name: /usr/local/mysql
    - user: mysql
    - group: mysql
    - mode: 755
    - recurse:
      - user
      - group

varable:    // 环境变量的脚本,让系统能找到MySQL命令
  file.managed:
    - name: /etc/profile.d/mysql.sh
    - source: salt://mysql/files/mysql.sh
    - user: root
    - group: root
    - mode: 644

mysql.server:   //提供service文件使用systemctl控制MySQL
  file.managed:
    - name: /usr/local/mysql/support-files/mysql.server
    - source: salt://mysql/files/mysql.server
    - user: root
    - group: root
    - mode: 755


create-directory:    //创建数据库目录
  file.directory:
    - name: /opt/data
    - user: mysql
    - group: mysql
    - mode: 755
    - makedirs: true
    - recurse:
      - user
      - group

/etc/my.cnf.d:    //创建目录
  file.directory:
    - user: mysql
    - group: mysql
    - mode: 755
    - makedirs: true
    - recurse:
      - user
      - group

mysql.service:    //将service文件传到对端
  file.managed:
    - name: /usr/lib/systemd/system/mysql.service
    - source: salt://mysql/files/mysql.service

initialization-mysql:   //初始化数据库
  cmd.run:
    - name: "/usr/local/mysql/bin/mysqld --initialize-insecure --user mysql --datadir /opt/data/" 
    - require:
      - archive: unzip_pkg
      - user: user-mysql
      - file: create-directory
    - unless: test $(ls -l /opt/data | wc -l) -gt 1    //为了让初始化数据库具有幂等性,如果/opt/data下没有文件的话就初始化数据库

/etc/my.cnf:   //提供MySQL的配置文件
  file.managed:
    - source: salt://mysql/files/my.cnf.j2
    - user: root
    - group: root
    - mode: 644
    - template: jinja
    

start-mysql:   //启动MySQL服务
  service.running:
    - name: mysql
    - enable: true
    - reload: true
    - watch:
      - file: /etc/my.cnf     // 如果/etc/my.cnf文件内容发生改变就重新加载服务或重启服务

2.2 master.sls的文件内容

/etc/my.cnf.d/master.cnf:   //提供master的端的配置文件
  file.managed:
    - source: salt://mysql/files/master.cnf
    - user: root
    - group: root
    - mode: 644
    
restart_mysql:    //重启MySQL服务
  service.running:
    - name: mysql
    - enable: true
    - reload: true
    - watch: 
      - file: /etc/my.cnf.d/master.cnf

2.3 slave.sls文件内容

include:  //包含mysql目录下的main.sls文件
  - mysql.main

/etc/my.cnf.d/slave.cnf:  //提供从服务器上的配置文件
  file.managed:
    - source: salt://mysql/files/slave.cnf
    - user: root
    - group: root
    - mode: 644
    

restart-mysql-slave:  //重启MySQL服务
  service.running:
    - name: mysql
    - reload: true
    - watch:
      - file: /etc/my.cnf
      - file: /etc/my.cnf.d/slave.cnf

2.4 grant-mysql.sls文件内容

master-grant:
  cmd.run:  //给从库授权
    - name: /usr/local/mysql/bin/mysql -e "grant replication slave,super on *.* to 'repl'@'192.168.182.131' identified by '123';flush privileges;"

2.5 master_mysql.sls文件内容

include:  //包含mysql目录下面的main.sls、master和bbs目录下的grant-mysql.sls文件
  - mysql.main
  - mysql.master
  - bbs.grant-mysql

2.6 slave.sls文件内容

[root@master bbs]# cat slave-mysql.sls 
include:
  - mysql.slave

salt://bbs/files/start_slave.sh:   //到对端执行start_slave.sh脚本
  cmd.script

3. 配置文件

3.1 master.cnf文件内容

[mysqld]
server-id = 10
log-bin = mysql-bin

3.2 my.cnf.j2文件内容

[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve

!includedir /etc/my.cnf.d

3.3 mysql.server文件内容

// 此文件的内容就是当你解压mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz包时会自动生成,此文件在解压目录下的support-files目录下
只需要修改两行内容:
basedir=/usr/local/mysql
datadir=/opt/data

3.4 mysql.service文件内容

[Unit]
Description=mysql server daemon
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/mysql/support-files/mysql.server start
ExecStop=/usr/local/mysql/support-files/mysql.server stop
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

3.5 mysql.sh文件内容

export PATH=/usr/local/mysql/bin:$PATH

3.6 slave.cnf文件内容

[mysqld]
server-id = 20
relay-log = mysql_relay

3.7 start_slave.sh文件内容

#!/bin/bash

master_ip=192.168.182.142
mysql=/usr/local/mysql/bin/mysql
repl_user=repl
repl_pass=123
log_file=$($mysql -u$repl_user -p$repl_pass -h$master_ip -e 'show master status;' 2>/dev/null | grep -v File | awk '{print $1}')

log_pos=$($mysql -u$repl_user -p$repl_pass -h$master_ip -e 'show master status;' 2>/dev/null | grep -v Position | awk '{print $2}')

$mysql -e "change master to master_host='$master_ip',master_user='$repl_user',master_password='$repl_pass',master_log_file='$log_file',master_log_pos=$log_pos;start slave;show slave status\G"

4. 执行顺序

先执行master_mysql.sls文件,再执行slave-mysql.sls

如果觉得看的觉得有点累也可以去码云复制代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

saltstack部署MySQL主从 的相关文章

  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • JDBC 错误:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我在 Java Eclipse 中收到错误消息 我在 MySql 中有一个数据库 它有列 String user name int id time int id desk int user password 我想
  • 显示和随机化 php 数组

    我有一个显示结果的数组 如下所示 Array 0 gt 71 1 gt 56 2 gt 64 3 gt 82 4 gt 90 5 gt 80 6 gt 65 7 gt 62 8 gt 14 9 gt 3 我的代码是 while row my
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 无法连接到 MAMP 上的 phpMyAdmin

    我收到此错误消息 MySQL 说道 无法连接 设置无效 phpMyAdmin 尝试连接 MySQL 服务器 但服务器拒绝连接 您应该检查配置中的主机 用户名和密码 并确保它们与 MySQL 服务器管理员提供的信息相对应 用户和通行证是默认的
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • 如何为 MySQL 中的字段或列添加别名?

    我正在尝试做这样的事情 但我收到未知的列错误 SELECT SUM field1 field2 AS col1 col1 field3 AS col3 from core 基本上 我只想使用别名 这样我就不需要执行之前执行的操作 这在mys
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • 条件触发器的Django迁移sql

    我想创建一个触发器 仅在满足条件时插入表 我尝试过使用 IF BEGIN END 和 WHERE 的各种组合 但 Django 每次都会返回 SQL 语法错误 这里 type user id指的是触发该事件的人 user id指的是接收到通
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 奇怪的 MySQL Python mod_wsgi 无法连接到 'localhost' (49) 上的 MySQL 服务器问题

    StackOverflow上也有类似的问题 但我还没有发现完全相同的情况 这是在使用 MySQL 的 OS X Leopard 机器上 一些起始信息 MySQL Server version 5 1 30 Apache 2 2 13 Uni
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我

随机推荐

  • python遍历文件夹下的所有子文件夹,并将指定的文件复制到指定目录

    python遍历文件夹下的所有子文件夹 并将指定的文件复制到指定目录 需求 复制单个文件夹 遍历所有子文件夹中的文件 并复制 代码封装 需求 在1文件夹中有1 2两个文件夹 将这两个文件夹中的文件复制到 after copy中 复制单个文件
  • Deathnote

    Deathnote 1 主机发现 arp scan l 2 扫描端口 nmap Pn sV P A 192 168 80 132 开放了80 22端口 3 访问80端口 修改host文件访问80端口时进行了跳转到deathnote vuln
  • Allegro 17.4设置中文界面

    一 Allegro 17 4 中文界面效果 二 Allegro 17 4 中文界面设置方法 2 1 需要打上此时 20210820 最新的S019的升级补丁 2 2 设置环境变量 变量名 intl enabled 变量值 1 要去除中文显示
  • LeetCode刷题-1

    数组 1 两数之和 题目描述 题目样例 Java方法 暴力枚举 思路及算法 代码 执行结果 复杂度 Java方法 哈希表 思路及算法 代码 执行结果 复杂度 题目描述 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组
  • StarCraft开发:用肮脏的技巧解决难题

    http www csdn net article 2013 02 28 2814299 the starcraft path finding hack 摘要 在之前的文章中 Warcraft之父讲述了自己是如何以及为何重启StarCraf
  • Linux中的fork()函数

    Linux中的fork 函数 在Linux中 fork 函数是创建进程的基础 它是一个系统调用 用于创建一个新的进程作为当前进程的副本 新进程将拥有与原进程相同的代码 数据和堆栈 但是拥有不同的进程ID PID 并且它是原进程的子进程 函数
  • 【debug】(0, slice(None, None, None))‘ is an invalid key

    简单介绍 我获取了一个dataframe里的符合条件的多个index 想通过index对dataframe进行筛选 在筛选的时候反馈错误 原始代码为 input index df select df select item input in
  • 【word】如何设置交叉引用标注参考文献

    文章目录 1 定义参考文献编号格式 2 设置交叉引用 插入正文位置 3 修改连续多个参考文献的格式 4 更新正文标注 1 定义参考文献编号格式 开始 gt 编号 gt 定义新编号格式 2 设置交叉引用 插入正文位置 设置好固定的参考文献格式
  • 【vscode,python】pip成功的包却不能导入(import)问题

    第一次遇到这个问题 在网上找了些资料 网上的教程大致上都是需要去修改settings json这个文件 我问了我朋友 然后轻松地解决了这个问题 方法一 关掉编译软件重新打开即可解决问题 方法二 我认为造成这个问题的原因是在另一个新的路径上新
  • 真实GPS转腾讯/高德地图坐标系,百度地图与腾讯/高德地图坐标系转换

    1 获取真实坐标GPS wgs84转为gcj编码方式 positiontransform array manual 定义常量 var GPS PI 3 14159265358979324 x pi 3 14159265358979324 3
  • 对称矩阵的压缩存储、基于压缩矩阵的矩阵乘法

    def disp A 输出方阵A n len A for i in range n for j in range n print d A i j end print def compression A a 压缩矩阵A到a中 A是一个对称矩阵
  • 面试总结(五):搜索引擎

    问题导读 1 搜索引擎有哪些特点 优势 2 搜索引擎使用到哪些场景中 3 如何将原文档传给分次组件 4 如何将得到的词 Term 传给索引组件 Indexer 搜索引擎概述全文搜索就是对文本数据的一种搜索方式 文本数据的都多 可以分为顺序搜
  • 基于verilog语言的SPI协议实现

    前言 关于SPI协议的基础知识这里就不在叙述了 感兴趣的小伙伴可以自行百度 本文基于verilog语言 实现SPI的四种通信模式 封装成通用模块 更新时间 2023年7月11日 更新原因 之前的版本存在bug 通用性不够 模块端口如下 sp
  • java设计模式--[创建模式]--简单工厂[simple factory]

    一 簡單工廠 其實它不是一個設計模式 反而比較像是一種編程習慣 由于經常被使用 有些人把這個習慣誤認為是 工廠模式 在談論工廠模式前 先將簡單工廠熟悉一下 二 簡單工廠的UML類圖如下 三 在此用一個事例說明簡單工廠的用法 在一個酒店里可以
  • 爬虫使用Selenium生成Cookie

    在爬虫的世界中 有时候我们需要模拟登录来获取特定网站的数据 而使用Selenium登录并生成Cookie是一种常见且有效的方法 本文将为你介绍如何使用Selenium进行登录 并生成Cookie以便后续的爬取操作 让我们一起探索吧 一 Se
  • 关系数据库——关系操作和关系完整性

    文章目录 一 关系操作 1 基本的关系操作 2 关系数据语言的分类 关系代数语言 关系演算语言 具有关系代数和关系演算双重特点的语言 二 关系的完整性 1 实体完整性 Entity Integrity 实体完整性规则 2 参照完整性 Ref
  • JavaScript实现三子棋

    目录 要做的事 1 初始化棋盘 2 落子操作 3 判断获胜 4 轮流落子 5 重置棋盘 6 棋盘判满 7 源代码 8 效果展示 要做的事 1 初始化棋盘 首先棋盘是一个3 3的二维数组 而我们的二维数组又是分别由一个一个的一维数组组成的 如
  • PTA 7-11 学生CPP成绩计算 总结

    生成上述类并编写主函数 根据输入的学生基本信息 建立一个学生对象 计算其cpp总评成绩 并输出其学号 姓名 总评成绩 输入格式 测试输入包含若干测试用例 每个测试用例占一行 学生姓名 学号 年龄 cpp成绩 cpp考勤 当读入0时输入结束
  • matlab的diag函数

    1 diag函数 基础用法 生成对角矩阵 diag 1 2 3 4 5 ans 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 5 2 进阶用法 作用 平移对角线 diag a a为正 表示向
  • saltstack部署MySQL主从

    saltstack部署MySQL主从 1 目录结构 2 编写状态文件 2 1 main sls文件内容 2 2 master sls的文件内容 2 3 slave sls文件内容 2 4 grant mysql sls文件内容 2 5 ma