docker-compose keep-alive mysql8 互为主从

news2024/11/19 16:29:37

一、准备2台物理机器master-1、master-2,目标虚拟VIP。
  VIP:192.168.1.139
  master-1:192.168.1.17
  master-2:192.168.1.20
  
二、然后分别在2台物理机器master-1、master-2上使用docker-compose安装mysql8,并配置互为主从。
1)配置master-1

         cd /opt
         mkdir docker_compose_keep_alive_mysql8_both_master
         cd docker_compose_keep_alive_mysql8_both_master
         mkdir mysql8data
         # master_1_init.sql见文件[master-1]
         touch master_1_init.sql
         # Dockerfile_master_1见文件[master-1]
         touch Dockerfile_master_1
         # docker-compose.yml见文件[master-1]
         touch docker-compose.yml

[master-1]文件 master_1_init.sql

CREATE USER 'repl'@'%' IDENTIFIED WITH caching_sha2_password BY 'repl';
grant replication slave, replication client on *.* to 'repl'@'%';
flush privileges;

[master-1]文件 Dockerfile_master_1

FROM mysql:8.0.31
MAINTAINER "hsj<2356899074@qq.com>"
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY ./master_1_init.sql /docker-entrypoint-initdb.d

[master-1]文件 docker-compose.yml

version: "3.9"
services:
  mysql8-master-1:
    build:
      context: ./
      dockerfile: ./Dockerfile_master_1
    image: mysql8-master-1
    restart: always
    container_name: mysql8-master-1
    volumes:
      - /opt/docker_compose_keep_alive_mysql8_both_master/mysql8data/conf/my.cnf:/etc/mysql/my.cnf
      - /opt/docker_compose_keep_alive_mysql8_both_master/mysql8data/data:/var/lib/mysql
      - /opt/docker_compose_keep_alive_mysql8_both_master/mysql8data/logs:/var/log/mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_ROOT_HOST=%
    privileged: true
    extra_hosts:
      # master_1容器可以使用的host访问master_2
      - mysql8-master-2:192.168.1.20
    command: ['--server-id=1',
              '--sync_binlog=1',
              '--log-bin=mysql8-master-1-bin',
              '--binlog-ignore-db=mysql,information_schema,performance_schema,sys',
              '--binlog_cache_size=256M',
              '--binlog_format=mixed',
              '--relay_log=mysql8-master-1-relay',
              '--lower_case_table_names=1',
              '--character-set-server=utf8mb4',
              '--collation-server=utf8mb4_general_ci',
              '--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION']

2)配置master-2

         cd /opt
         mkdir docker_compose_keep_alive_mysql8_both_master
         cd docker_compose_keep_alive_mysql8_both_master
         mkdir mysql8data
         # master_2_init.sql见文件[master-2]
         touch master_2_init.sql
         # Dockerfile_master_2见文件[master-2]
         touch Dockerfile_master_2
         # docker-compose.yml见文件[master-2]
         touch docker-compose.yml

[master-2]文件 master_2_init.sql

CREATE USER 'repl'@'%' IDENTIFIED WITH caching_sha2_password BY 'repl';
grant replication slave, replication client on *.* to 'repl'@'%';
flush privileges;

[master-2]文件 Dockerfile_master_2

FROM mysql:8.0.31
MAINTAINER "hsj<2356899074@qq.com>"
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY ./master_2_init.sql /docker-entrypoint-initdb.d

[master-2]文件 docker-compose.yml

version: "3.9"
services:
  mysql8-master-2:
    build:
      context: ./
      dockerfile: ./Dockerfile_master_2
    image: mysql8-master-2
    restart: always
    container_name: mysql8-master-2
    volumes:
      - /opt/docker_compose_keep_alive_mysql8_both_master/mysql8data/conf/my.cnf:/etc/mysql/my.cnf
      - /opt/docker_compose_keep_alive_mysql8_both_master/mysql8data/data:/var/lib/mysql
      - /opt/docker_compose_keep_alive_mysql8_both_master/mysql8data/logs:/var/log/mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_ROOT_HOST=%
    privileged: true
    extra_hosts:
       # master_2容器可以使用的host访问master_1
      - mysql8-master-1:192.168.1.17
    command: ['--server-id=2',
     		  '--sync_binlog=1',
              '--log-bin=mysql8-master-2-bin',
              '--binlog-ignore-db=mysql,information_schema,performance_schema,sys',
              '--binlog_cache_size=256M',
              '--binlog_format=mixed',
              '--relay_log=mysql8-master-2-relay',
              '--lower_case_table_names=1',
              '--character-set-server=utf8mb4',
              '--collation-server=utf8mb4_general_ci',
              '--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION']

3)启动master-1、master-2数据库服务
[master-1] 执行:

# mysql8真正启动需要一些时间,navicat链接成功说明启动成功
docker-compose up -d

[master-2] 执行:

# mysql8真正启动需要一些时间,navicat链接成功说明启动成功
docker-compose up -d

4)启动master-1、master-2互为主从

①查看[master-1]作为主节点 的bin-log-file、bin-log-pos:

show master status

在这里插入图片描述
配置及其查看[master-1]作为从节点的slave并启动(需要获取master-2主节点的日志):

change master to master_host='192.168.1.20', master_user='repl',master_password='repl',master_port=3306,GET_MASTER_PUBLIC_KEY=1,master_log_file='mysql8-master-2-bin.000003', master_log_pos= 157, master_connect_retry=60;
start slave;
show slave status;

在这里插入图片描述

②查看[master-2] 作为主节点 的bin-log-file、bin-log-pos:

show master status

在这里插入图片描述
配置及其查看[master-2]作为从节点的slave并启动(需要获取master-1主节点的日志):

change master to master_host='192.168.1.17', master_user='repl',master_password='repl',master_port=3306,GET_MASTER_PUBLIC_KEY=1,master_log_file='mysql8-master-1-bin.000003', master_log_pos= 157, master_connect_retry=60;
start slave;
show slave status;

在这里插入图片描述
三、验证
1)[master-1]执行操作:

#创建一个测试库db_test
create database db_test;
#使用db_test
USE db_test;
#创建一张测试表tb_user
create table tb_user (id int,name varchar(20));
#插入一条数据
insert into tb_user(id,name) values (1, 'tomcat');
#查看数据
select * from tb_user;

2)[master-2]执行操作:

#使用db_test
USE db_test;
#查看数据
select * from tb_user;

四、keep-alive 配置VIP
1)master-1、master-2安装依赖包

yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel

2)master-1、master-2 使用yum安装keepalived

yum install -y keepalived

3)master-1配置keepalived.conf
(MASTER或BACKUP,MASTER会抢占VIP),
本次原则master-1提供服务,master-1宕机VIP漂移到master-2继续服务

cd /etc/keepalived/
#备份原始的
mv keepalived.conf keepalived.conf.bak
#编辑新的,keepalived.conf见文件
vim keepalived.conf

keepalived.conf文件:

global_defs {
    router_id MySQL-Master-1
}

vrrp_instance MAIN {
    state MASTER
    interface ens33
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hsj
    }
    virtual_ipaddress {
        192.168.1.139
    }
}

4)master-2配置keepalived.conf

cd /etc/keepalived/
#备份原始的
mv keepalived.conf keepalived.conf.bak
#编辑新的,keepalived.conf见文件
vim keepalived.conf

keepalived.conf文件:

global_defs {
    router_id MySQL-Master-2
}

vrrp_instance MAIN {
    state BACKUP
    interface ens33
    virtual_router_id 1
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hsj
    }
    virtual_ipaddress {
        192.168.1.139
    }
}

5)master-1、master-2同时启动keepalived服务

systemctl start keepalived

————————————————————————————
systemctl start keepalived 启动keepalived服务
systemctl stop keepalived 停止keepalived服务
systemctl enable keepalived 设置keepalived服务开机自启动
systemctl disable keepalived 禁止keepalived服务开机自启动

6)测试master-1宕机ip漂移
关闭master-1宿主机实例,模拟master-1宕机。
通过VIP:192.168.1.139 链接数据库操作任然正常,进行操作insert:

insert into tb_user(id,name) values (9, '听妈妈的话');

7)恢复master-1
重启master-1宿主机实例,master-1、master-2互为主从依然正常,听妈妈的话 这条数据两个库分别存储了。

8)测试master-2宕机ip漂移
关闭master-2宿主机实例,模拟master-2宕机。
通过VIP:192.168.1.139 链接数据库操作任然正常,进行操作insert:

insert into tb_user(id,name) values (10, '听爸爸的话');

9)恢复master-2
重启master-2宿主机实例,master-1、master-2互为主从依然正常,听爸爸的话 这条数据两个库分别存储了。

结语:
​ 1、当sync_binlog=0的时候,表示每次提交事务都只write,不fsync
​ 2、当sync_binlog=1的时候,表示每次提交事务都执行fsync
​ 3、当sync_binlog=N的时候,表示每次提交事务都write,但积累N个事务后才fsync。

​ 一般在公司的大部分应用场景中,我们建议将此参数的值设置为1,因为这样的话能够保证数据的安全性,但是如果出现主从复制的延迟问题,可以考虑将此值设置为100~1000中的某个数值,非常不建议设置为0,因为设置为0的时候没有办法控制丢失日志的数据量,但是如果是对安全性要求比较高的业务系统,这个参数产生的意义就不是那么大了。

-- 查看并行的slave的线程的个数,默认是0.表示单线程
show global variables like 'slave_parallel_workers';
-- 根据实际情况保证开启多少线程
set global slave_parallel_workers = 4;
-- 设置并发复制的方式,默认是一个线程处理一个库,值为database
show global variables like '%slave_parallel_type%';
-- 停止slave
stop slave;
-- 设置属性值
set global slave_parallel_type='logical_check';
-- 开启slave
start slave
-- 查看线程数
show full processlist;

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

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

相关文章

优先级队列、仿函数和反向迭代器

文章目录优先级队列priority_queue的模拟实现框架无参的构造(默认构造)迭代器区间构造向上调整向下调整插入删除取堆顶的数据求数据个数验满初识仿函数模拟实现仿函数更改后的向上调整仿函数更改后的向下调整反向迭代器具体实现优先级队列 1.优先队列是一种容器适配器&#xf…

微信转账api(企业付款)

企业付款介绍 提供企业向用户付款的功能&#xff0c;支持企业通过API接口付款&#xff0c;或通过微信支付商户平台网页功能操作付款。 1. 充值 登录微信支付商户平台&#xff0c;通过网页充值功能充值&#xff08;商户平台-资金管理-现金管理-充值&#xff09;。 温馨提示&a…

BreederDAO x DigiCult AMA——要点总结

问&#xff1a;为什么 BreederDAO 决定花费 200ETH 用于购买 Mythic DigiDaigaku Genesis — Ifrit&#xff1f; 答&#xff1a;除了投资之外&#xff0c;这也是为了确保这个领域中有更多的可触达性&#xff0c;尤其是随着我们 DigiDaigaku 市场工具的推出之后。这也是我们进入…

(十七)Async异步和多线程-语言进阶1

&#xff08;十七&#xff09;Async异步和多线程-语言进阶1一、进程-线程-多线程&#xff0c;同步和异步1.概念2.同步和异步3.异步与多线程异同点二、委托启动异步调用1.同步方法2.异步方法三、多线程的特点四、异步的回调和状态参数1.顺序控制2.状态参数五、异步等待三种方式1…

开学季,护眼灯什么牌子好?2023年护眼台灯推荐

2023年开始了&#xff0c;时间飞逝&#xff0c;而每个父母都越来越紧张自家娃的学业情况&#xff0c;我国近视人数超过7亿人&#xff0c;而儿童时期是视力发育的关键时期&#xff0c;为啥有那么高的近视率呢&#xff1f;主要是用眼过度&#xff0c;以及用眼习惯&#xff0c;而现…

微信小程序——模板与配置,数据绑定,事件绑定

一.数据绑定1.数据绑定的基本原则在data中定义数据在WXML中使用数据2.在data中定义页面的数据在页面对应的.js文件中&#xff0c;把数据定义到data对象中即可3. Mustache 语法的格式把 data 中的数据绑定到页面中渲染&#xff0c;使用 Mustache 语法&#xff08;双大括号&#…

想提高办公效率?可试试java开源工作流框架

在数据化管理越来越规范的当今社会&#xff0c;采用优质的办公软件平台能提高企业的办公协作效率&#xff0c;因而受到了广泛的欢迎和喜爱。那么&#xff0c;什么是java开源工作流框架&#xff1f;我们可以从它的特点、发展前景等方面来加以了解&#xff0c;一起来了解这一产品…

微信公众号运营工具有哪些?赶紧收藏

再厉害的公众号运营大神背后都有一套宝藏工具大全&#xff0c;辅助运营人一路披荆斩棘&#xff0c;堪称神器&#xff01; 我相信网上一搜也能出来很多的运营工具或是网站&#xff0c;但是这里再来给大家来一个大汇总&#xff0c;这次整理绝对是非常详细和实用的&#xff0c;纯…

Fiddler中常用的功能

Fiddler中常用的功能如下&#xff1a; 停止抓包-清空会话窗-内容过滤请求-解码-设置断点 一、 停止抓包 二、清空会话窗 方法一&#xff0c;工具栏工具&#xff1a; 方法二&#xff0c;命令行形式&#xff1a; 当然&#xff0c;命令行工具也还支持其他命令的输入&#xff0c…

word排版技巧:如何将段中文字生成标题目录

在许多Word文档里面&#xff0c;目录页是非常重要的一页内容&#xff0c;因为目录页展示的是当前文档的内容框型和结构。通过目录页&#xff0c;我们能知道这个文档主要分为哪几部分。就像看书一样&#xff0c;起到了检索的作用。今天&#xff0c;我们就来给大家分享一个偏门的…

焕新古文化传承之路,AI为古彝文识别赋能

目录1 古彝文与古典保护2 古文识别的挑战2.1 西文与汉文OCR2.2 古彝文识别难点3 合合信息&#xff1a;古彝文保护新思路3.1 图像矫正3.2 图像增强3.3 语义理解3.4 工程技巧4 总结1 古彝文与古典保护 彝文指的是云南、贵州、四川等地的彝族人使用的文字&#xff0c;区别于现代意…

【Linux】常用基本指令(续)

文章目录&#x1f3aa; Linux下基本指令1.1 &#x1f680; whoami1.2 &#x1f680; tree1.3 &#x1f680; echo(浅析)1.4 &#x1f680; zip/unzip1.5 &#x1f680; tar1.6 &#x1f680; bc1.7 &#x1f680; history1.8 &#x1f680; uname1.9 &#x1f680; nano1.10 &a…

数据结构基础之动态顺序表详解

文章目录前言一、动态顺序表的概念二、顺序表的结构体三、基本接口1.SeqListInit&#xff08;初始化数组&#xff09;2.SeqListDestory&#xff08;销毁数组&#xff09;3. SeqListCheckCapacity&#xff08;检查改顺序表是否需要扩容&#xff09;4.SeqListPushBack&#xff08…

用真实业务场景告诉你,高并发下如何设计数据库架构?

目录&#xff1a; 用一个创业公司的发展作为背景引入用多台服务器来分库支撑高并发读写大量分表来保证海量数据下查询性能读写分离来支撑按需扩容及性能提升高并发下的数据库架构设计总结 这篇文章&#xff0c;我们来聊一下对于一个支撑日活百万用户的高并系统&#xff0c;他…

如何搭建云进销存-销售管理系统?

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建云进销存-销售管理。1.2、应用场景云进销存-销售管理应用支持移动端扫码录入&#xff0c;提高开单效率&#xff0c;保证开单质量。支持自定义优先级自动取价&#xff0c;灵活满足不同商品价格管理。2、设置方法2.1、表单搭建…

马蹄集 大小写的转换

大小写的转换 难度&#xff1a;青铜 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 请编写一个简单程序&#xff0c;实现输入字符大小写的转换。其他非法输入&#xff08;非 字母的输入)则原样输出。 #include <bits/stdc.h> using namespace std; int main() { …

1700页!卷S人的 Java《八股文》PDF手册

2022已成为过去式&#xff0c;不论这一年好与坏&#xff0c;我们都需要抓住新一年的机会&#xff0c;不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&#xff0c;给大家搞…

Java关键字synchronized

提纲 定义 synchronized是同步块&#xff0c;实现了多线程间的互斥同步。它修饰的代码&#xff0c;确保任一时刻只有一个线程进入访问。 特性 因为在synchronized同步块内&#xff0c;只有一个线程能访问&#xff0c;因此确保了同步块内的原子性、可见性和有序性。 使用方式 总…

SpringBoot 统⼀功能处理 AOP

接下来是 Spring Boot 统⼀功能处理模块了&#xff0c;也是 AOP 的实战环节&#xff0c;要实现的⽬标有以下 3 个&#xff1a; 统⼀⽤户登录权限验证&#xff1b;统⼀数据格式返回&#xff1b;统⼀异常处理。 1.⽤户登录权限效验 ⽤户登录权限的发展从之前每个⽅法中⾃⼰验…

day35【代码随想录】贪心算法之加油站、分发糖果、柠檬水找零

文章目录前言一、加油站&#xff08;力扣134&#xff09;方法一方法二二、分发糖果&#xff08;力扣135&#xff09;三、柠檬水找零&#xff08;力扣860&#xff09;前言 1、加油站 2、分发糖果 3、柠檬水找零 一、加油站&#xff08;力扣134&#xff09; 在一条环路上有 n 个…