centos7使用docker-compose一键搭建mysql高可用主从集群

news2024/12/23 19:16:40

docker部署

环境准备

卸载旧版本

yum remove -y docker \
  docker-client \
  docker-client-latest \
  docker-common \
  docker-latest \
  docker-latest-logrotate \
  docker-logrotate \
  docker-selinux \
  docker-engine-selinux \
  docker-engine

安装依赖

yum install -y yum-utils \ device-mapper-persistent-data \ lvm2

下载阿里云仓库

wget http://mirrors.aliyun.com/repo/Centos-7.repo
 
wget  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 
yum install -y epel-release
 
mv *.repo /etc/yum.repo.d/

安装docker

yum install -y docker-ce

开启docker

systemctl start docker.service 
systemctl enable docker.service 
systemctl status  docker.service 
docker version

安装docker-compose

linux安装docker和docker-compose_linux安装docker-compose_yuanzelin8的博客-CSDN博客

服务器IP:192.168.100.8 

文件夹和其他文件如图:

编写docker-compose.yml文件

version: '3'
services:
  mysql-slave-lb:
    image: nginx:latest
    container_name: mysql-slave-lb
    ports:
    - 3307:3307
    volumes:
    - /home/docker/mariadb10.7/nginx/nginx.conf:/etc/nginx/nginx.conf
    networks:
    - mysql
    depends_on:
    - mysql-master
    - mysql-slave1
    - mysql-slave2
    - mysql-slave3
  mysql-master:
    image: mariadb:10.7.3
    container_name: mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MASTER_SYNC_USER: "sync_admin" #设置脚本中定义的用于同步的账号
      MASTER_SYNC_PASSWORD: "123456" #设置脚本中定义的用于同步的密码
      ADMIN_USER: "root" #当前容器用于拥有创建账号功能的数据库账号
      ADMIN_PASSWORD: "123456"
      ALLOW_HOST: "10.10.%.%" #允许同步账号的host地址
      TZ: "Asia/Shanghai" #解决时区问题
    ports:
    - 3306:3306
    networks:
      mysql:
        ipv4_address: "10.10.10.10" #固定ip,因为从库在连接master的时候,需要设置host
    volumes:
    - /home/docker/mariadb10.7/master:/docker-entrypoint-initdb.d #挂载master脚本
    - /home/docker/mariadb10.7/master/data:/var/lib/mysql
    command:
    -  "--server-id=1"
    -  "--character-set-server=utf8mb4"
    -  "--collation-server=utf8mb4_unicode_ci"
    -  "--log-bin=mysql-bin"
    -  "--sync_binlog=1"
  mysql-slave1:
    image: mariadb:10.7.3
    container_name: mysql-slave1
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      SLAVE_SYNC_USER: "sync_admin" #用于同步的账号,由master创建
      SLAVE_SYNC_PASSWORD: "123456"
      ADMIN_USER: "root"
      ADMIN_PASSWORD: "123456"
      MASTER_HOST: "10.10.10.10" #master地址,开启主从同步需要连接master
      TZ: "Asia/Shanghai" #设置时区
    networks:
     mysql:
       ipv4_address: "10.10.10.20" #固定ip
    volumes:
    - /home/docker/mariadb10.7/slave1:/docker-entrypoint-initdb.d #挂载slave脚本
    - /home/docker/mariadb10.7/slave1/data:/var/lib/mysql
    command:
    -  "--server-id=2"
    -  "--character-set-server=utf8mb4"
    -  "--collation-server=utf8mb4_unicode_ci"
  mysql-slave2:
    image: mariadb:10.7.3
    container_name: mysql-slave2
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      SLAVE_SYNC_USER: "sync_admin"
      SLAVE_SYNC_PASSWORD: "123456"
      ADMIN_USER: "root"
      ADMIN_PASSWORD: "123456"
      MASTER_HOST: "10.10.10.10"
      TZ: "Asia/Shanghai"
    networks:
      mysql:
        ipv4_address: "10.10.10.30" #固定ip
    volumes:
    - /home/docker/mariadb10.7/slave2:/docker-entrypoint-initdb.d #挂载slave脚本
    - /home/docker/mariadb10.7/slave2/data:/var/lib/mysql
    command: #这里需要修改server-id,保证每个mysql容器的server-id都不一样
    -  "--server-id=3"
    -  "--character-set-server=utf8mb4"
    -  "--collation-server=utf8mb4_unicode_ci"
  mysql-slave3:
    image: mariadb:10.7.3
    container_name: mysql-slave3
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      SLAVE_SYNC_USER: "sync_admin" #用于同步的账号,由master创建
      SLAVE_SYNC_PASSWORD: "123456"
      ADMIN_USER: "root"
      ADMIN_PASSWORD: "123456"
      MASTER_HOST: "10.10.10.10" #master地址,开启主从同步需要连接master
      TZ: "Asia/Shanghai" #设置时区
    networks:
     mysql:
       ipv4_address: "10.10.10.40" #固定ip
    volumes:
    - /home/docker/mariadb10.7/slave3:/docker-entrypoint-initdb.d #挂载slave脚本
    - /home/docker/mariadb10.7/slave3/data:/var/lib/mysql
    command:
    -  "--server-id=4"
    -  "--character-set-server=utf8mb4"
    -  "--collation-server=utf8mb4_unicode_ci"
networks:
  mysql:
    driver: bridge
    ipam:
      driver: default
      config:
      - subnet: "10.10.0.0/16"


编写master用于创建同步账号的脚本create_sync_user.sh

#!/bin/bash
#定义用于同步的用户名
MASTER_SYNC_USER=${MASTER_SYNC_USER:-sync_admin}
#定义用于同步的用户密码
MASTER_SYNC_PASSWORD=${MASTER_SYNC_PASSWORD:-123456}
#定义用于登录mysql的用户名
ADMIN_USER=${ADMIN_USER:-root}
#定义用于登录mysql的用户密码
ADMIN_PASSWORD=${ADMIN_PASSWORD:-123456}
#定义运行登录的host地址
ALLOW_HOST=${ALLOW_HOST:-%}
#定义创建账号的sql语句
CREATE_USER_SQL="CREATE USER '$MASTER_SYNC_USER'@'$ALLOW_HOST' IDENTIFIED BY '$MASTER_SYNC_PASSWORD';"
#定义赋予同步账号权限的sql,这里设置两个权限,REPLICATION SLAVE,属于从节点副本的权限,REPLICATION CLIENT是副本客户端的权限,可以执行show master status语句
GRANT_PRIVILEGES_SQL="GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO '$MASTER_SYNC_USER'@'$ALLOW_HOST';"
#定义刷新权限的sql
FLUSH_PRIVILEGES_SQL="FLUSH PRIVILEGES;"
#执行sql
mysql -u"$ADMIN_USER" -p"$ADMIN_PASSWORD" -e "$CREATE_USER_SQL $GRANT_PRIVILEGES_SQL $FLUSH_PRIVILEGES_SQL"

编写slave脚本slave.sh

#定义连接master进行同步的账号
  SLAVE_SYNC_USER="${SLAVE_SYNC_USER:-sync_admin}"
  #定义连接master进行同步的账号密码
  SLAVE_SYNC_PASSWORD="${SLAVE_SYNC_PASSWORD:-123456}"
  #定义slave数据库账号
  ADMIN_USER="${ADMIN_USER:-root}"
  #定义slave数据库密码
  ADMIN_PASSWORD="${ADMIN_PASSWORD:-123456}"
  #定义连接master数据库host地址
  MASTER_HOST="${MASTER_HOST:-%}"
  #等待10s,保证master数据库启动成功,不然会连接失败
  sleep 10
  #连接master数据库,查询二进制数据,并解析出logfile和pos,这里同步用户要开启 REPLICATION CLIENT权限,才能使用SHOW MASTER STATUS;
  RESULT=`mysql -u"$SLAVE_SYNC_USER" -h$MASTER_HOST -p"$SLAVE_SYNC_PASSWORD" -e "SHOW MASTER STATUS;" | grep -v grep |tail -n +2| awk '{print $1,$2}'`
  #解析出logfile
  LOG_FILE_NAME=`echo $RESULT | grep -v grep | awk '{print $1}'`
  #解析出pos
  LOG_FILE_POS=`echo $RESULT | grep -v grep | awk '{print $2}'`
  #设置连接master的同步相关信息
  SYNC_SQL="change master to master_host='$MASTER_HOST',master_user='$SLAVE_SYNC_USER',master_password='$SLAVE_SYNC_PASSWORD',master_log_file='$LOG_FILE_NAME',master_log_pos=$LOG_FILE_POS;"
  #开启同步
  START_SYNC_SQL="start slave;"
  #查看同步状态
  STATUS_SQL="show slave status\G;"
  mysql -u"$ADMIN_USER" -p"$ADMIN_PASSWORD" -e "$SYNC_SQL $START_SYNC_SQL $STATUS_SQL"

加入nginx,实现slave的负载均衡

nginx下创建nginx.conf
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

# 添加stream模块,实现tcp反向代理
stream {
    proxy_timeout 30m;
    upstream mysql-slave-cluster{
      #docker-compose.yml里面会配置固定mysql-slave的ip地址,这里就填写固定的ip地址
      server 10.10.10.20:3306 weight=1;
      server 10.10.10.30:3306 weight=1;  
      server 10.10.10.40:3306 weight=1 backup; #备用数据库,当上面的数据库挂掉之后,才会使用此数据库,也就是如果上面的数据库没有挂,则所有的流量都很转发到上面的主库
    }
    server {
      listen  0.0.0.0:3307;
      proxy_pass mysql-slave-cluster;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCB - 封装焊盘阻焊层的检查

文章目录 PCB - 封装焊盘阻焊层的检查概述检查做出的实际PCB正反面厂家提供的生产稿PCB对应的原始gerber文件查封装拿一个插件电阻为例插件封装焊盘的基本数据END PCB - 封装焊盘阻焊层的检查 概述 打样回来, 看到要焊接的几个插件管脚有阻焊, 无法焊接. 这几个封装是直接从第…

腾讯发布超千亿参数规模的混元大模型;深度学习与音乐分析与生成课程介绍

🦉 AI新闻 🚀 腾讯发布超千亿参数规模的混元大模型 摘要:腾讯在2023腾讯全球数字生态大会上发布混元大模型,该模型拥有超千亿的参数规模和超2万亿 tokens 的预训练语料。混元大模型将支持多轮对话、内容创作、逻辑推理、知识增强…

CleanShot X for mac安装下载,mac系统录屏、截图、标注软件

您是否经常需要截图、录屏或者标注图片?如果是,那么您一定会喜欢CleanShot X for mac,这是一款专为Mac用户设计的强大而简洁的工具。 CleanShot X for mac可以让您轻松地截取任何区域的屏幕,无论是整个屏幕、窗口还是选定的部分。…

Say Goodbye to OOM Crashes

内存管理 --- 在计算机编程中,内存管理是一项关键任务,用于在程序运行时正确分配和释放内存。一个有效的内存管理系统可以帮助程序提高性能,减少内存泄露和访问错误等问题。 内存管理涉及以下几个方面: 1. 内存分配&#xff1a…

MMDetection实验记录踩坑记录

AP值始终为0 在实验MMDetection的DAB-DETR模型进行实验时,AP值始终上不去。 可以看到,在第22个epoch时的AP值仅为0.002 因为在此之前已经运行过YOLOX,Faster-RCNN等模型,所以数据集的设置肯定是没有问题的,而博主也只是修改了DAB…

嵌入式学习笔记(18)代码重定位实战 下篇

adr和ldr伪指令的区别 ldr和adr都是伪指令,区别是ldr是长加载、adr是短加载。 adr指令加载的是运行时地址;ldr指令加载的是链接地址。 (通过反汇编文件可以深入分析adr和ldr的区别) 重定位(代码拷贝) …

行业Demo分享|「园区智慧安防可视化系统」实现园区安防全面保障

在当今社会,园区安全问题备受关注。**为了解决园区的安全隐患并提升安全管理水平,园区智慧安防可视化系统应运而生。**这一系统利用先进的技术手段,将智能监控与安全管理完美地融合在一起,并通过可视化的方式,为园区提…

无swing,高级javaSE毕业之贪吃蛇游戏(含模块构建,多线程监听服务)

JavaSE,无框架实现贪吃蛇 文章目录 JavaSE,无框架实现贪吃蛇1.整体思考2.可能的难点思考2.1 如何表示游戏界面2.2 如何渲染游戏界面2.3 如何让游戏动起来2.4 蛇如何移动 3.流程图制作4.模块划分5.模块完善5.0常量优化5.1监听键盘服务i.输入存储ii.键盘监…

win10 sourcetree打开一闪就退出

参考文档: 解决方案参考文档一: Solved: cant install Sourcetree on Windows 10Solved: when I double-click the installation file or run as administrator,I can see a splash screen and disappear in 10 seconds,then I open thehttps://community.atlassian.com/t5…

GoFrame框架

GoFrame框架 GoFrame简介第一个GoFrame应用使用GoFrame实现一个完整的用户案例GoFrame对象管理GoFrame配置管理-配置对象GoFrame配置管理-文件配置GoFrame日志组件GoFrame错误处理GoFrame数据校验GoFrame Web服务简介GoFrame Web服务-路由规则GoFrame Web服务-路由注册GoFrame…

长胜证券:A股三大指数缩量探底券商股逆势拉升

周四,A股全天低开低走,三大指数均跌超1%,创业板指领跌。截至收盘,上证综指报收3122.35点,跌落1.13%;深证成指报收10321.44点,跌落1.84%;创业板指报收2056.98点,跌落2.11%…

索尼 toio ™应用创意开发征文|一个理想的绘画小助手

引言 toio™机器人是索尼推出的一款创意玩具,它的小巧和可编程性使其成为一个理想的绘画助手。通过编程控制机器人的运动和绘画工具,我们可以为小朋友提供一个有趣的绘画体验。 创意描述 我们可以通过JavaScript编程来控制toio™机器人的运动和绘画工具…

自己设计CPU学习之路——基于Xilinx FPGA应用开发

1. 一个32组位宽为32的寄存器堆 框图 代码 regfile.h ifndef __FEGFILE_HEADER__define __REGFILE_HEADER__define HIGH 1b1define LOW 1b0define ENABLE_ 1b0define DISABLE_ 1b1define DATA_W 32define DataBus 31:0define DATA_D 32de…

谷歌SEO手工外链工具好用吗?

答案是:不建议使用工具做谷歌外链,会被判断为作弊惩罚。 在当今的SEO环境中,外链仍然是一个核心组件,影响着网站的权威性和在搜索引擎结果页面(SERP)上的排名。 但是,随着时间的推移&#xff…

可视化大屏UI模板,随需切换,一秒生效

善用模板能够最大化地提高效率,美化可视化大屏,同时也能腾出更多时间去做深度数据分析挖掘。奥威BI可视化大屏支持UI模板随需切换,一秒生效。用户可以根据自己的喜好和需求,选择不同的UI模板,快速改变可视化大屏的外观…

密钥协商的几种方式和过程

密钥协商是在通信双方之间建立共享密钥的过程,以确保在通信过程中的数据安全性和机密性。下面将介绍几种常见的密钥协商方式和过程。 对称密钥协商 对称密钥协商是最简单和常见的密钥协商方式。在对称密钥协商中,通信双方通过一个安全的信道交换密钥。这…

如何将DHTMLX Suite集成到Scheduler Lightbox中?让项目管理更可控!

在构建JavaScript调度器时,通常需要为最终用户提供一个他们喜欢的方式来计划事件,这是Web开发人员喜欢认可DHTMLX Scheduler的重要原因,它在这方面提供了完全的操作自由,它带有lightbox弹出窗口,允许通过各种控件动态更…

Qt/C++音视频开发51-推流到各种流媒体服务程序

一、前言 最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和ZLMediaKit,因为这两者支持的格式众多,不…

[Machine Learning][Day1]监督学习和无监督学习

目录 监督学习(Supervised Learning) 应用1:数据回归拟合 应用2:分类 无监督学习(Unsupervised Learning) 监督学习和无监督学习的区别 练习: 监督学习(Supervised Learning) 通过正确的输入和输出来进行学习的一种模型。输入x和正确的输…

你好,我是百川大模型|国内可开源免费商用Baichuan2揭秘

“ 百川智能发布了新一代语言模型Baichuan2。相比之前的第一代,新版本在各个学科领域的表现都有很大提升,特别是在数学、科学、安全方面的能力得到明显增强。Baichuan2以开源方式对外发布,为大模型领域提供了新的选择和可能。” 01 — 昨天下…