docker部署mysql主主备份 haproxy代理(swarm)

docker部署mysql主主备份 haproxy代理(swarm)

docker部署mysql主主备份

docker部署mysql主主备份(keepalived)跨主机自动切换

docker部署mysql主主备份 haproxy代理(swarm)

1. 环境准备

主机IP
node1192.168.56.100
node2192.168.56.101
  • 互开防火墙
  • 默认安装了docker docker-compose
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.100" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" accept"
firewall-cmd --reload
firewall-cmd --list-all

在这里插入图片描述

1.1. 在3台主机上配置swarm

  • 创建 目录
mkdir -p /home/liuhmpackage/liuhm-4.0.0-x16_64 && cd /home/liuhmpackage/liuhm-4.0.0-x16_64
  • 在node1上执行:
docker swarm init --advertise-addr 192.168.56.100

返回类似以下内容:

docker swarm join --token SWMTKN-1-614xi9dvksycykobgifxb4pgopc1wwgczwqct5wqkq8zao6tmx-0ds4jj3ozclrr2wukcaoakxso 192.168.56.100:2377
  • 在node2上执行上面的返回结果:
docker swarm join --token SWMTKN-1-2c2xopn2rld8oltcof24sue370681ijhbo3bwcqarjlhq9lkea-2g53o5qn2anre4j9puv4hecrn 192.168.0.101:2377

1.2. 创建swarm网络

在node1上执行以下命令:

docker network create -d overlay --subnet 10.0.1.0/24 --attachable liuhm-net# 检查网络,如果存在表示创建成功
docker network ls | grep liuhm-net

1.3 创建文件

复制下面的sh命令即可获取第二步所需的安装文件

mkdir -p /home/liuhmpackage/liuhm-4.0.0-x16_64/haproxy
cd /home/liuhmpackage/liuhm-4.0.0-x16_64/haproxycat > haproxy.cfg << EOF
globalmaxconn     4000defaultslog     globallog 127.0.0.1 local3mode    httpoption  tcplogoption  dontlognullretries 10option redispatchmaxconn         2000timeout connect         10s#timeout client          1m#timeout server          1mtimeout http-keep-alive 10stimeout check           10s
######## 监控界面配置 #################	
listen  admin_stats#监控界面的访问的IP和端口bind  0.0.0.0:8888#访问协议mode        http#URI相对地址stats uri   /dbs#统计报告格式stats realm     Global\ statistics#登陆帐户信息stats auth  admin:admin# 隐藏HAProxy的版本号stats hide-version# 管理界面,如果认证成功了,可通过webui管理节点stats admin if TRUE# 统计页面自动刷新时间stats  refresh  30s
listen  mysqlbind 0.0.0.0:3306mode tcp#负载均衡算法(轮询算法)#轮询算法:roundrobin#权重算法:static-rr#最少连接算法:leastconn#请求源IP算法:source balance  roundrobin# 监控检查需要一个无密码的账号# mysql健康检查  haproxy为mysql登录用户名(需要在实体数据有这个账户,且无密码)# option mysql-check  user haproxy server s1 mysql-master1:3306 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2server s2 mysql-master2:3306 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2 backup# 使用keepalive检测死链option tcpka
EOFcat > dokcer-stark-haproxy.yml << EOF
version: '3'networks:liuhm-net:external: true services:haproxy:image: haproxy:alpinehostname: haproxyvolumes:- "${PWD}/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg"- "/etc/localtime:/etc/localtime:ro"restart: alwaysprivileged: trueports:- 8888:8888- 3306:3306networks:- liuhm-netdeploy:mode: global
EOFmkdir -p /home/liuhmpackage/liuhm-4.0.0-x16_64/mysql/mysql-master1/conf
cd /home/liuhmpackage/liuhm-4.0.0-x16_64/mysql/mysql-master1/conf
cat > my.cnf << EOF
!includedir /etc/mysql/conf.d/ 
!includedir /etc/mysql/mysql.conf.d/
[client]
default-character-set=utf8[mysql]
default-character-set=utf8[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone=+08:00
max_connections=1000# 开启binlog
log-bin=mysql-bin
log-bin-index=mysql-bin.index
# 服务器唯一id,默认值1
server-id=1
max_binlog_size=1G
max_binlog_cache_size=1G
# 设置日志格式,默认值ROW
binlog_format=mixed
expire_logs_days=7
# 开启慢查询
slow_query_log=1
long_query_time=2
slow_query_log_file=/data/mysql/slow.log
# 错误日志
log_error=/var/log/mysql/error.log
# 设置需要复制的数据库,默认复制全部数据库
#binlog-do-db=mcp_manager
# 设置不需要复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=infomation_schema
EOFcd /home/liuhmpackage/liuhm-4.0.0-x16_64/mysql/mysql-master1cat > docker-compose.yml << EOF
version: '3'networks:liuhm-net:external: true
services:mysql-master1:image: mysql:5.7.23hostname: mysql-master1container_name: mysql-master1restart: alwaysenvironment:- MYSQL_ROOT_PASSWORD=hancloud1234!- TZ=Asia/Shanghaivolumes:- $PWD/slowSql:/data/mysql- $PWD/data:/var/lib/mysql- $PWD/logs:/var/log/mysql- $PWD/conf/my.cnf:/etc/mysql/my.cnfprivileged: truenetworks:liuhm-net:ipv4_address: 10.0.1.50command: ['mysqld','--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci','--default-time-zone=+08:00']entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
EOFcat > install.sh << EOF
#!/bin/shCURRENT_DIR=$(cd "$(dirname "$0")"pwd
)
nowDate=$(date "+%Y%m%d%H%M%S")
logFileName="install_"$nowDate.log
touch $CURRENT_DIR/${logFileName}
# 日志函数
log(){#echo "["$(date "+%Y-%m-%d %H:%M:%S.")$((`date +%N`/1000000))"] " $1 | tee -a $CURRENT_DIR/$logFileNameecho "["$(date "+%Y-%m-%d %H:%M:%S")"]"$1 | tee -a $CURRENT_DIR/$logFileName
}master1Ip="10.0.1.50"
master2Ip="10.0.1.51"#///
log "【安装】开始安装"log "【安装】开始安装 ${master1Ip}" checkMysql()
{status=truewhile($status)do echo "Check MySQL status......"if docker exec -it $1 bash -c 'mysqladmin ping -h localhost -uroot -phancloud1234! '; thenecho "Check that MySQL has been started!"status=falseelseecho "Waiting for MySQL to start..."sleep 5fidone
}installMaster1(){# my.cnf 权限不能是777,会被忽略chmod 644 ./conf/my.cnflog "【启动程序】开始启动" docker-compose up -dsleep 20checkMysql mysql-master1# 创建slave用户# 设置密码# 授予复制权限# 刷新权限log "【初始化用户】创建用户" docker exec -it mysql-master1 bash -c "mysql -uroot -phancloud1234! -e \"CREATE USER 'slave'@'%';ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'hancloud@1234';GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';FLUSH PRIVILEGES;\"" log "【初始化用户】创建slave用户成功"# mysql-bin.000003sleep 10}installMaster1
log "【主1结束】主1执行完1"
log "【主1结束】下面的语句在主2安装完成后执行"fileName=$(docker exec -it mysql-master1 bash -c "mysql -uroot -phancloud1234! -e \"SHOW MASTER STATUS;\"" |grep "mysql-bin"|awk -F '|' '{print $2}' | awk '{gsub(/^\s+|\s+$/, "");print}') # 939
pos=$(docker exec -it mysql-master1 bash -c "mysql -uroot -phancloud1234! -e \"SHOW MASTER STATUS;\"" |grep "mysql-bin"|awk -F '|' '{print $3}' | awk '{gsub(/^\s+|\s+$/, "");print}') echo "docker exec -it mysql-master2 bash -c \"mysql -uroot -phancloud1234! \""
echo "CHANGE MASTER TO MASTER_HOST='${master1Ip}',MASTER_USER='slave',MASTER_PASSWORD='hancloud@1234', MASTER_PORT=3306,MASTER_LOG_FILE='${fileName}',MASTER_LOG_POS=${pos};"echo "START SLAVE;"
echo "SHOW SLAVE STATUS\G"
echo "exit"EOFmkdir -p /home/liuhmpackage/liuhm-4.0.0-x16_64/mysql/mysql-master2/conf
cd /home/liuhmpackage/liuhm-4.0.0-x16_64/mysql/mysql-master2/conf
cat > my.cnf << EOF
!includedir /etc/mysql/conf.d/ 
!includedir /etc/mysql/mysql.conf.d/
[client]
default-character-set=utf8[mysql]
default-character-set=utf8[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone=+08:00
max_connections=1000# 开启binlog
log-bin=mysql-bin
log-bin-index=mysql-bin.index
# 服务器唯一id,默认值1
server-id=2
max_binlog_size=1G
max_binlog_cache_size=1G
# 设置日志格式,默认值ROW
binlog_format=mixed
expire_logs_days=7
# 开启慢查询
slow_query_log=1
long_query_time=2
slow_query_log_file=/data/mysql/slow.log
# 错误日志
log_error=/var/log/mysql/error.log
# 设置需要复制的数据库,默认复制全部数据库
#binlog-do-db=mcp_manager
# 设置不需要复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=infomation_schema
EOFcd /home/liuhmpackage/liuhm-4.0.0-x16_64/mysql/mysql-master2cat > docker-compose.yml << EOF
version: '3'
networks:liuhm-net:external: trueservices:mysql-master2:image: mysql:5.7.23hostname: mysql-master2container_name: mysql-master2restart: alwaysenvironment:- MYSQL_ROOT_PASSWORD=hancloud1234!- TZ=Asia/Shanghaivolumes:- $PWD/slowSql:/data/mysql- $PWD/data:/var/lib/mysql- $PWD/logs:/var/log/mysql- $PWD/conf/my.cnf:/etc/mysql/my.cnfprivileged: truenetworks:liuhm-net:ipv4_address: 10.0.1.51command: ['mysqld','--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci','--default-time-zone=+08:00']entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
EOFcat > install.sh << EOF
#!/bin/shCURRENT_DIR=$(cd "$(dirname "$0")"pwd
)
nowDate=$(date "+%Y%m%d%H%M%S")
logFileName="install_"$nowDate.log
touch $CURRENT_DIR/${logFileName}
# 日志函数
log(){#echo "["$(date "+%Y-%m-%d %H:%M:%S.")$((`date +%N`/1000000))"] " $1 | tee -a $CURRENT_DIR/$logFileNameecho "["$(date "+%Y-%m-%d %H:%M:%S")"]"$1 | tee -a $CURRENT_DIR/$logFileName
}master1Ip="10.0.1.50"
master2Ip="10.0.1.51"#///
log "【安装】开始安装"log "【安装】开始安装 ${master2Ip}" checkMysql()
{status=truewhile($status)do echo "Check MySQL status......"if docker exec -it $1 bash -c 'mysqladmin ping -h localhost -uroot -phancloud1234! '; thenecho "Check that MySQL has been started!"status=falseelseecho "Waiting for MySQL to start..."sleep 5fidone
}installMaster1(){# my.cnf 权限不能是777,会被忽略chmod 644 ./conf/my.cnflog "【启动程序】开始启动" docker-compose up -dsleep 20checkMysql mysql-master2# 创建slave用户# 设置密码# 授予复制权限# 刷新权限log "【初始化用户】创建用户" docker exec -it mysql-master2 bash -c "mysql -uroot -phancloud1234! -e \"CREATE USER 'slave'@'%';ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'hancloud@1234';GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';FLUSH PRIVILEGES;\"" log "【初始化用户】创建slave用户成功"# mysql-bin.000003sleep 10}installMaster1
log "【主2结束】主2执行完2"
log "【主2结束】下面的语句在主2安装完成后执行"fileName=$(docker exec -it mysql-master2 bash -c "mysql -uroot -phancloud1234! -e \"SHOW MASTER STATUS;\"" |grep "mysql-bin"|awk -F '|' '{print $2}' | awk '{gsub(/^\s+|\s+$/, "");print}') # 939
pos=$(docker exec -it mysql-master2 bash -c "mysql -uroot -phancloud1234! -e \"SHOW MASTER STATUS;\"" |grep "mysql-bin"|awk -F '|' '{print $3}' | awk '{gsub(/^\s+|\s+$/, "");print}') echo "docker exec -it mysql-master1 bash -c \"mysql -uroot -phancloud1234! \""
echo "CHANGE MASTER TO MASTER_HOST='${master2Ip}',MASTER_USER='slave',MASTER_PASSWORD='hancloud@1234', MASTER_PORT=3306,MASTER_LOG_FILE='${fileName}',MASTER_LOG_POS=${pos};"echo "START SLAVE;"
echo "SHOW SLAVE STATUS\G"
echo "exit"EOF

1.4 拷贝文件

scp -r /home/liuhmpackage root@192.168.56.101:/home

2. mysql 集群安装

2.1. 启动 mysql-master1

进入 liuhm1服务器

mkdir -p /home/liuhmmysql/mysql-master1 && cd /home/liuhmmysql/mysql-master1\cp -r /home/liuhmpackage/liuhm-4.0.0-x16_64/haproxy /home/liuhmmysql\cp -r /home/liuhmpackage/liuhm-4.0.0-x16_64/mysql/mysql-master1/* ./bash install.sh

出现下面的日志代表启动成功
在这里插入图片描述

2.2. 启动 mysql-master2

进入 liuhm2服务器

mkdir -p /home/liuhmmysql/mysql-master2 && cd /home/liuhmmysql/mysql-master2\cp -r /home/liuhmpackage/liuhm-4.0.0-x16_64/haproxy /home/liuhmmysql\cp -r /home/liuhmpackage/liuhm-4.0.0-x16_64/mysql/mysql-master2/* ./bash install.sh

出现下面的日志代表启动成功
在这里插入图片描述

2.3. mysql-master1执行mysql-master2 完成后的语句

进入 liuhm1服务器

docker exec -it mysql-master1 bash -c "mysql -uroot -phancloud1234! "CHANGE MASTER TO MASTER_HOST='10.0.1.51',MASTER_USER='slave',MASTER_PASSWORD='hancloud@1234', MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=939;START SLAVE;SHOW SLAVE STATUS\Gexit

在这里插入图片描述

2.4. mysql-master2执行mysql-master1 完成后的语句

进入 liuhm2服务器

docker exec -it mysql-master2 bash -c "mysql -uroot -phancloud1234! "CHANGE MASTER TO MASTER_HOST='10.0.1.50',MASTER_USER='slave',MASTER_PASSWORD='hancloud@1234', MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=939;START SLAVE;SHOW SLAVE STATUS\Gexit

在这里插入图片描述

2.5. 启动代理

进入 liuhm1服务器

cd /home/liuhmmysql/haproxy
docker stack deploy -c dokcer-stark-haproxy.yml haproxy

mysql 连接方式 haproxy:3306 admin/hancloud1234!

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

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

相关文章

CSS3多列分页属性

CSS3多列 Firefox浏览器支持该属性的形式是-moz-column-count&#xff0c;而基于Webkit的浏览器&#xff0c;例如Safari和Chrome&#xff0c;支持该属性的形式是-webkit-column-count column-count&#xff1a;该属性定义多列文本流中的栏数 语法&#xff1a;column-count:int…

UG阵列特征

阵列特征&#xff1a;将一个或多个特征&#xff0c;沿线性方向阵列复制图形 实体建模时建议草图尽可能简单&#xff0c;能特征阵列的别草图阵列 阵列特征命令在如下位置&#xff1a;菜单-插入-关联复制-阵列特征 当我们只需要选中的特征沿着一个或两个方向进行阵列的时候&…

如何快速实现地源热泵远程监控

地源热泵远程监控解决方案 一、项目背景 山东省潍坊市盛世花园小区地源热泵项目是一个先进的供暖与制冷系统&#xff0c;旨在为整个小区提供高效且节能的温控服务。该系统主要由地下管道网络、地源热泵单元以及室内分配系统组成。 针对现有的地源热泵系统的管理和监控问题&a…

安装 PyCharm 2021.1 保姆级教程

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 目前能下载到的最新版本是 PyCharm 2021.1。 请注意对应 Python 的版本&#xff1a; Python 2: 2.7Python 3: >3.6, <3.11…

【AivaAI】做音乐,无人能比它更专业

关于Aiva Aiva AIVA是音乐制作初创公司AIVA Technologies打造的一款人工智能产品。是人工智能领域头款获得国际认证的虚拟作曲家。 Aiva登录 可以选择Google登录&#xff0c;或者其他邮箱登录。 输入用户名&#xff0c;登录完成。 开始制作音乐 在主页选择“创建曲目…

【Pika Labs】图片想法转视频-使用教程

关于Pika Labs 通过Pika Labs&#xff0c;可将你的想法转化为视频&#xff0c;将您的创造力付诸实践。 链接: Pika 登录Pika Labs 你可以通过Pika官方主页链接: Pika或者是Diacord社区邀请链接Discord Pika 进入Pika 社区。 接受邀请&#xff0c;按需回答完例行提问&#…

DRF之引入

目录 一、web应用模式 【1】前后端混合开发 【2】前后端分离 二、API接口 三、接口测试工具&#xff1a;Postman 四、RESTful API规范 【1】什么是RESTful 【2】RESTful API的规范 2.1 数据的安全保障 2.2 接口特征表现 2.3 多数据版本共存 2.4 数据即是资源&#…

nn.LSTM个人记录

简介 nn.LSTM参数 torch.nn.lstm(input_size, "输入的嵌入向量维度&#xff0c;例如每个单词用50维向量表示&#xff0c;input_size就是50"hidden_size, "隐藏层节点数量,也是输出的嵌入向量维度"num_layers, "lstm 隐层的层数&#xff0c;默认…

5. 创建型模式 - 单例模式

亦称&#xff1a; 单件模式、Singleton 意图 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 问题 单例模式同时解决了两个问题&#xff0c; 所以违反了单一职责原则&#xff1a; 保证一个类只有一…

postman几种常见的请求方式

1、get请求直接拼URL形式 对于http接口&#xff0c;有get和post两种请求方式&#xff0c;当接口说明中未明确post中入参必须是json串时&#xff0c;均可用url方式请求 参数既可以写到URL中&#xff0c;也可写到参数列表中&#xff0c;都一样&#xff0c;请求时候都是拼URL 2&am…

Mysql 数据库APi 编程(c/c++)-1.0

MySQL数据库API库 访问MySQL服务器&#xff0c;这需要使用mysqlclient库&#xff0c;MySQL的大多数客户端API&#xff08;除Java和.NET&#xff09;都是通过这个库来和MySQL服务器通讯的&#xff0c;而这个库正是使用C语言编写的。 可使用mysql -V 命令查看当前系统内所使用的…

【单调栈】LeetCode:2818操作使得分最大

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 题目 给你一个长度为 n 的正整数数组 nums 和一个整数 k 。 一开始&#xff0c;你的分数为 1 。你可以进行以下操作至多 k 次&#xff0c;目标是使你的分数最大&#xff1a; 选择一个之前没有选过的 非…