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

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.repowget  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install -y epel-releasemv *.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:latestcontainer_name: mysql-slave-lbports:- 3307:3307volumes:- /home/docker/mariadb10.7/nginx/nginx.conf:/etc/nginx/nginx.confnetworks:- mysqldepends_on:- mysql-master- mysql-slave1- mysql-slave2- mysql-slave3mysql-master:image: mariadb:10.7.3container_name: mysql-masterenvironment: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:3306networks:mysql:ipv4_address: "10.10.10.10" #固定ip,因为从库在连接master的时候,需要设置hostvolumes:- /home/docker/mariadb10.7/master:/docker-entrypoint-initdb.d #挂载master脚本- /home/docker/mariadb10.7/master/data:/var/lib/mysqlcommand:-  "--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.3container_name: mysql-slave1environment: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地址,开启主从同步需要连接masterTZ: "Asia/Shanghai" #设置时区networks:mysql:ipv4_address: "10.10.10.20" #固定ipvolumes:- /home/docker/mariadb10.7/slave1:/docker-entrypoint-initdb.d #挂载slave脚本- /home/docker/mariadb10.7/slave1/data:/var/lib/mysqlcommand:-  "--server-id=2"-  "--character-set-server=utf8mb4"-  "--collation-server=utf8mb4_unicode_ci"mysql-slave2:image: mariadb:10.7.3container_name: mysql-slave2environment: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" #固定ipvolumes:- /home/docker/mariadb10.7/slave2:/docker-entrypoint-initdb.d #挂载slave脚本- /home/docker/mariadb10.7/slave2/data:/var/lib/mysqlcommand: #这里需要修改server-id,保证每个mysql容器的server-id都不一样-  "--server-id=3"-  "--character-set-server=utf8mb4"-  "--collation-server=utf8mb4_unicode_ci"mysql-slave3:image: mariadb:10.7.3container_name: mysql-slave3environment: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地址,开启主从同步需要连接masterTZ: "Asia/Shanghai" #设置时区networks:mysql:ipv4_address: "10.10.10.40" #固定ipvolumes:- /home/docker/mariadb10.7/slave3:/docker-entrypoint-initdb.d #挂载slave脚本- /home/docker/mariadb10.7/slave3/data:/var/lib/mysqlcommand:-  "--server-id=4"-  "--character-set-server=utf8mb4"-  "--collation-server=utf8mb4_unicode_ci"
networks:mysql:driver: bridgeipam:driver: defaultconfig:- 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}'`#解析出logfileLOG_FILE_NAME=`echo $RESULT | grep -v grep | awk '{print $1}'`#解析出posLOG_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;"#关闭同步STOP_SYNC_SQL="stop slave;"#查看同步状态STATUS_SQL="show slave status\G;"mysql -u"$ADMIN_USER" -p"$ADMIN_PASSWORD" -e "$STOP_SYNC_SQL $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;}
}

启动容器docker-compose up -d

数据库连接测试

宝塔后台查看docker服务

发现从库的slave.sh没有执行

 docker ps

docker exec -it d5be2c90cc93 bash  进从机docker内部运行 

cd docker-entrypoint-initdb.d/

./slave.sh

查看同步状态

mysql -uroot -p123456 -e "show slave status\G";

在宝塔后台配置远程服务器

创建新数据库测试是否同步

查看从库中是否存在新创建的库,存在就是主从同步成功 

docker内部安装vi命令

apt-get update

apt-get install vim

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

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

相关文章

操作指南 | 如何参与Moonbeam投票委托

投票委托允许没有时间或者专业度一般的用户能够在治理中拥有话语权。该功能加强了决策流程,并且确保更大范围地代表社区利益。 通过Moonbeam委托平台,你需要 $GLMR 和一个相兼容的钱包。此教程使用MetaMask示范。 如何参与投票委托 前往http://delega…

无涯教程-JavaScript - XIRR函数

描述 XIRR函数返回的现金Stream量表的内部收益率不一定是周期性的。要计算一系列定期现金Stream量的内部收益率,请使用IRR函数。 语法 XIRR (values, dates, [guess])争论 Argument描述Required/OptionalValues 与日期付款时间表相对应的一系列现金Stream量。 请参阅下面的…

SpringCloud

微服务: 可以单独部署,单独运行(启动类) 狭义: 集群:相同模块(系统)部署多个微服务:可独立运行的小系统分布式:由不同模块构建而成的系统 广义&#xff1a…

【C语言】指针详解(3)

大家好,我是苏貝,本篇博客带大家了解指针(2),如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一.函数指针数组二.指向函数指针数组的指针(不重要)三.回调函数 一.函…

【C++进阶】:红黑树

红黑树 一.红黑树简单实现1.性质二.更新颜色1.情况一2.情况二3.情况三 3.完整代码(代码有注释,稍微画图很容易理解,旋转部分可以看我的AVL树博客) 二.map和set1.基本实现2.迭代器 一.红黑树简单实现 1.性质 红黑树,是一种二叉搜索树,但在每个…

中国各省市相关图标

中国各省市相关图标

长胜证券:政策东风频吹 慢牛格局或已打开

长胜证券认为,目前商场遭到央行社融数据提振,全体预期出现了必定的回暖,经济运行的部分不确定性得以落地,8月社融数据作为先行指标提振了出资者信心。操作上看出资者可逐步加大仓位,选择前期调整较为充沛,有…

代码随想录算法训练营day50|123.买卖股票的最佳时机III|188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 力扣题目链接 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉…

网络爬虫-----初识爬虫

目录 1. 什么是爬虫? 1.1 初识网络爬虫 1.1.1 百度新闻案例说明 1.1.2 网站排名(访问权重pv) 2. 爬虫的领域(为什么学习爬虫 ?) 2.1 数据的来源 2.2 爬虫等于黑客吗? 2.3 大数据和爬虫又有啥关系&…

el-select数据过多的解决(纯前端)

前言 el-select数据过多这个问题应该很多人都遇到过,在生产环境中数据几百、几千条是比较常见的。当数据过多时,就会造成浏览器卡顿,如果客户电脑性能不行,浏览器直接卡死也有可能。 解决 先说一下现在项目中遇到的两种解决方案…

python-爬虫-urllib3

导入模块 import urllib3urllib3:功能强大、条理清晰、用于HTTP客户端的python网络请求库 重要特征 1.线程安全 2.连接池 3.客户端SSL/TLS验证 4.使用分段编码长传文件 5.重试请求和处理HTTP复位的助手 6.支持gzip和deflate编码 7.HTTP和SOCKS的代理支持 8.100%的…

认识网线上的各种参数标号

最近工作需要,接触了很多不同类型的网线,为了能够区分不同型号的网线,特意做一篇笔记用来学习,如有记录有误之处,欢迎大家指正~初步认识网线 常用的网络电缆有三种:双绞线、同轴电缆和光纤电缆&#xff08…

uni-app 之 uni.request 网络请求API接口

uni-app 之 uni.request 网络请求API接口 image.png <template><!-- vue2的<template>里必须要有一个盒子&#xff0c;不能有两个&#xff0c;这里的盒子就是 view--><view>--- uni.request 网络请求API接口 ---<view><!-- 免费的测试接口 --…

Java线上故障排查(CPU、磁盘、内存、网络、GC)+JVM性能调优监控工具+JVM常用参数和命令

CPU/堆/类/线程 根据服务部署和项目架构&#xff0c;从如下几个方面排查&#xff1a; &#xff08;1&#xff09;运用服务器&#xff1a;排查内存&#xff0c;cpu,请求数等&#xff1b; &#xff08;2&#xff09;文件图片服务器&#xff1a;排查内存&#xff0c;cpu,请求数等…

Gateway网关

本章目标 学习目标 1、服务网关 Gateway 2、ServerWebExchange 服务网关Gateway API 网关是一个服务&#xff0c;是系统的唯一入口。从面向对象设计的角度看&#xff0c;它与外观模式类似。API 网关封装了系统内部架构&#xff0c;为每个客户端提供一个定制的 API 。它可能…

docker 方式安装mysql 主从方式keepalived实现高可用

一、环境介绍 二、MySQL安装 在两台服务器上都安装mysql 1、拉取镜像 docker pull mysql:8.0.272、创建挂载目录 mkdir -p /data/mysql/3、运行容器 主节点 docker run \--restartalways \--name master_mysql -p 3306:3306 \-e MYSQL_ROOT_PASSWORD123456 -d \-v /data/m…

FPGA开发

https://www.enclustra.com.cn/?bd_vid11435475462206745180 https://www.monolithicpower.cn/design-tools/design-tools/llc-design-tool.html https://www.elecfans.com/article/88/143/2012/20120718280641_2.html

HTTP协议初识·下篇

介绍 承接上篇&#xff1a;HTTP协议初识中篇_清风玉骨的博客-CSDN博客 本篇内容&#xff1a; 长链接 网络病毒 cookie使用&session介绍 基本工具介绍 postman 模拟客户端请求 fiddler 本地抓包的软件 https介绍 https协议原理 为什么加密 怎么加密 CA证书介绍 数字签名介绍…

阿里后端开发:抽象建模经典案例【文末送书】

文章目录 写作前面1.抽象思维2.软件世界中的抽象3. 经典抽象案例4. 抽象并非一蹴而就&#xff01;需要不断假设、验证、完善5. 推荐一本书 写作末尾 写作前面 在互联网行业&#xff0c;软件工程师面对的产品需求大都是以具象的现实世界事物概念来描述的&#xff0c;遵循的是人…

Tomcat多实例部署和动静分离

一、多实例部署&#xff1a; 多实例&#xff1a;多实例就是在一台服务器上同时开启多个不同的服务端口&#xff0c;同时运行多个服务进程&#xff0c;这些服务进程通过不同的socket监听不同的服务端口来提供服务。 1.前期准备&#xff1a; 1.关闭防火墙&#xff1a;systemctl …