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.hqwc.cn/news/103438.html

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

相关文章

命令执行漏洞复现攻击:识别威胁并加强安全

环境准备 这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。 一、攻击相关介绍 原理 主要是输入验证不严格、代码逻辑错误、应用程序或系统中缺少安全机制等。攻击者可以通过构造特定的输入向应用程序或系统注入恶意代码&#xff…

广电运营商三网融合监控运维方案

随着三网融合逐步发展、深化,广电网络从为用户提供原本单一的信息服务转向了集语音、文字、图像为一体的信息服务,同时也实现了由单一独立的网络向综合性网络的改变。如何在业务的融合与竞争中创造核心竞争力,利用自身网络覆盖率上的优势&…

jsp页面出现“String cannot be resolved to a type”错误解决办法

篇首语:小编为大家整理,主要介绍了jsp页面出现“String cannot be resolved to a type”错误解决办法相关的知识,希望对你有一定的参考价值。 jsp页面出现“String cannot be resolved to a type”错误解决办法 解决办法: 右键项目…

分类算法系列④:朴素贝叶斯算法

目录 1、贝叶斯算法 2、朴素贝叶斯算法 3、先验概率和后验概率 4、⭐机器学习中的贝叶斯公式 5、文章分类中的贝叶斯 6、拉普拉斯平滑系数 6.1、介绍 6.2、公式 7、API 8、示例 8.1、分析 8.2、代码 8.3、⭐预测流程分析 🍃作者介绍:准大三…

SpotBugs代码检查:在整数上进行没有起任何实际作用的位操作(INT_VACUOUS_BIT_OPERATION)

https://spotbugs.readthedocs.io/en/latest/bugDescriptions.html#int-vacuous-bit-mask-operation-on-integer-value-int-vacuous-bit-operation 在整数上进行无用的与、异或操作,实质上没有做任何有用的工作。 例如:v & 0xffffffff 再例如&…

RHCE——十七、文本搜索工具-grep、正则表达式

RHCE 一、文本搜索工具--grep1、作用2、格式3、参数4、注意5、示例5.1 操作对象文件:/etc/passwd5.2 grep过滤命令示例 二、正则表达式1、概念2、基本正则表达式2.1 常见元字符2.2 POSIX字符类2.3 示例 3、扩展正则表达式3.1 概念3.2 示例 三、作业1、作业一2、作业…

FPGA时序分析与约束(5)——时序路径

一、前言 在之前的文章中我们分别介绍了组合电路的时序,时序电路的时序和时钟的时序问题,我们也对于时序分析,时序约束和时序收敛几个基本概念进行了区分,在这篇文章中,我们将介绍时序约束相关的最后一部分基本概念&am…

【数据结构】二叉树的顺序结构实现及时间复杂度计算(二)

目录 一,二叉树的顺序结构实现 1,二叉树的顺序结构 2,堆的概念及结构 3,堆的接口实现 1,堆的创建 2,接口函数 3,初始化 4,销毁 5,是否增容 6,交换数据…

git 远程多分支,本地如何切换分支

1、git clone url 先clone 项目,git branch -a 查看所有分支,发现有多个远程分支 2、假如想在 remote 分支工作,但是本地还没有 remote 分支,可以先输入命令: git checkout ,不要按回车键,按…

C++ 学习之深拷贝 和 浅拷贝

前言 在C中,浅拷贝和深拷贝是涉及对象复制的两种不同方式,它们之间的关键区别在于拷贝对象时是否复制对象所指向的数据。 正文 浅拷贝(Shallow Copy): 浅拷贝只复制对象本身,而不复制对象所指向的数据。…

微电网的概念

微电网分布式控制理论与方法  顾伟等 微电网的概念和作用 微电网是由多种分布式电源、储能、负载以及相关监控保护装置构成的能够实现自我控制和管理的自治型电力系统,既可以与电网并网进行,也可以以孤岛运行。 分布式发电是指将容量在兆瓦以内的可再…

十一、做高并发内存池项目过程中遇到的bug以及调试bug的方法和心得

十一、做高并发内存池项目过程中遇到的bug以及调试bug的方法和心得 第一个bug是内存问题,程序直接崩溃,问题出现在:GetOneSpan函数中的切分span的时候结尾的span1的next没有置空。 第二个bug是还小内存块给span的时候找不到小内存所属的spa…