docker 配置Mysql集群

Docker version 20.10.17, build 100c701

MySQL Image version: 8.0.32

Docker container mysql-master is source. mysql-replica is replication.

master == source. replica == slave.名称叫法不一样而已。

Choose one of the way,与replica同步数据两种情况:

  1. source有存在的数据并且你想同步到replica,这种需要mysqldump备份source数据,然后CHANGE REPLICATION SOURCE TO
  2. you are setting up a new source and replica combination,其实就是你source没有数据,没有想同步到replica的,这种的不需要mysqldump备份source数据复原到replica,直接CHANGE REPLICATION SOURCE TO

网络大多为第二种情况,那么我就写第一种情况,第一种情况基本就多了mysqldump这个步骤。

Pull MySQL image And run mysql-master

docker pull mysql/mysql-server:latest

你可以去Docker Hub寻找适合的版本: docker hub

主节点的my.cnf配置为:

[mysqld]
server_id=1
socket=/var/lib/mysql/mysql.sock
user=mysql

Mysql8很多配置已经为默认,比如binlog默认开启,log_replica_updates默认开启,注意server_id需要source和replica不要相同。

datadir文件夹下要注意为空才行,否则会启动不成功。如果启动过程遇到任何问题,可以使用docker logs mysql-master命令查看出了什么问题。

注意docker使用mount命令,需要文件或者文件夹都存在,而-v不需要。

可搜索--mount和-v两个命令的区别。

docker run -p 3307:3306 --name mysql-master \
--mount type=bind,src=/root/working/mydata/mysql-master/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/root/working/mydata/mysql-master/datadir,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql/mysql-server:latest

-p: 3307为云服务器端口,我用他连接datagrip。3306为容器内部端口。

mount:src为云服务路径,dst为容器内部路径。

MYSQL_ROOT_PASSWORD:为root用户指定密码,否则需要在docker logs去查看此容器自己生成的密码。

创建一个远程访问的账号和一个做主从同步的账号

创建一个远程访问的账号,方便我们使用datagrip等工具连接我们的数据库。

注意云服务器的安全组规则,是否把我们需要的端口放开了,比如3306,3307,3308

docker exec -it mysql-master mysql -uroot -p命令进入到数据库,root账号的密码为上面我们设置的root

进来数据库后,我们创建账号:

#添加远程登录用户
CREATE USER 'keboom'@'%' IDENTIFIED BY 'keboom';
GRANT ALL PRIVILEGES ON *.* TO 'keboom'@'%';

keboom这个账号用来datagrip软件连接我们的数据库。

接着我们创建一个用来做主从同步的用户:

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

repl这个账号用来replica节点来向source节点同步数据。

mysqldump命令在主库备份数据,接着从库恢复此备份

  1. 在主库执行FLUSH TABLES WITH READ LOCK;将主库只读,这时记录主库binlog位置,并做mysqldump备份。备份做好之后,则解锁。

  2. 我们新开一个终端,进入数据库执行SHOW MASTER STATUS\G 获得主库binlog位置。

    mysql> SHOW MASTER STATUS\G
    *************************** 1. row ***************************
    File: binlog.000002
    Position: 2185
    Binlog_Do_DB:
    Binlog_Ignore_DB:
    Executed_Gtid_Set:
    1 row in set (0.00 sec)
  3. 我们再新开一个终端,执行 docker exec -it mysql-master bash,进入容器进行备份。

    注意docker exec -it mysql-master bash 和 docker exec -it mysql-master mysql -uroot -p 区别

  4. mysqldump -uroot -p --databases test --source-data > dbdump.db,这里我自己创建了一个test数据库,我只备份这一个数据库。可以在test数据库创建一个表,插入几条数据,用来验证同步数据是否成功。

  5. UNLOCK TABLES; 备份好数据之后,就可以解锁了。

启动replica节点

replica—my.cnf配置为:

[mysqld]
server_id=21
socket=/var/lib/mysql/mysql.sock
user=mysql
docker run -p 3308:3306 --name mysql-replica \
--mount type=bind,src=/root/working/mydata/mysql-replica/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/root/working/mydata/mysql-replica/datadir,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql/mysql-server:latest
  1. replica启动好后,将dbdump.db 文件复制到挂载的目录下,进入到replica容器,执行mysql -uroot -p < dbdump.db ,这时我们就把备份恢复到从节点了,我们可以在主库试着添加几条数据,可以看到此时从库还不能同步数据。

  2. 进入到replica数据库,执行命令:

    CHANGE REPLICATION SOURCE TO
    -> MASTER_HOST='172.17.0.2',SOURCE_USER='repl',SOURCE_PASSWORD='repl',SOURCE_LOG_FILE='binlog.000002',SOURCE_LOG_POS=2185,GET_MASTER_PUBLIC_KEY=1; MASTER_PORT如果你的mysql用的不是3306,记得设置一下。

    获得MASTER_HOST,可执行:

    docker inspect mysql-master | grep IP
    "LinkLocalIPv6Address": "",
    "LinkLocalIPv6PrefixLen": 0,
    "SecondaryIPAddresses": null,
    "SecondaryIPv6Addresses": null,
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "172.17.0.2",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "IPAMConfig": null,
    "IPAddress": "172.17.0.2",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,

    SOURCE_USER就是我们在主库创建的用于主从同步的用户。

    SOURCE_LOG_FILE,SOURCE_LOG_POS是上面在主库中查询到的。

    GET_MASTER_PUBLIC_KEY,mysql8 默认使用 caching_sha2_password authentication plugin。replica需要向source获得公匙。

  3. START REPLICA;

  4. SHOW REPLICA STATUS\G 查看同步状态。如果Replica_IO_Running 和Replica_SQL_Running 都为Yes那么基本就成功了。如果有其他问题,可以通过docker logs mysql-replica查看日志。

可以试试在test数据库的表中插入几条数据,看看从库是否同步过来。

参考文档:https://dev.mysql.com/doc/refman/8.0/en/binlog-replication-configuration-overview.html

docker 配置 Mysql主从集群的更多相关文章

  1. Docker搭建MySQL主从集群,基于GTID

    写在前边 搭建MySQL读写分离主从集群,这里未使用binlog方式,使用的是GTID方式 源码见我的Github https://github.com/hellxz/mysql-cluster-do ...

  2. docker搭建redis主从集群和sentinel哨兵集群,springboot客户端连接

    花了两天搭建redis主从集群和sentinel哨兵集群,讲一下springboot客户端连接测试情况 redis主从集群 从网上查看说是有两种方式:一种是指定配置文件,一种是不指定配置文件 引用地址 ...

  3. 基于Docker的Mysql Cluster集群

    参考 mysql-cluster镜像 https://medium.com/@ahmedamedy/mysql-clustering-with-docker-611dc28b8db7 使用Docker ...

  4. Mysql:主从集群配置

    我这里是去网易蜂巢取得镜像:https://c.163yun.com/hub#/m/home/ 命令:docker pull hub.c.163.com/library/mysql:latest 拉取 ...

  5. 搭建mysql主从集群的步骤

    前提条件是:须要在linux上安装4个mysql数据库,都须要配置完对应的信息. 须要搭建: mysql 01: 主数据库  master                  mysql 02 :   ...

  6. docker配置mysql主从与django实现读写分离

    一.搭建主从mysql环境 1 下载mysql镜像 docker pull mysql:5.7 2 运行刚下载的mysql镜像文件 # 运行该命令之前可以使用`docker images`是否下载成功 ...

  7. docker中mysql pxc集群

    PXC集群 https://hub.docker.com/r/percona/percona-xtradb-cluster 安装PXC镜像 下载镜像或者导入本地镜像 docker pull perco ...

  8. 使用docker部署mysql主从复制集群

    一.环境搭建 虚拟机环境:centos7 IP: 启动3个容器,一个是master,端口是3307,另外两个是slaver,端口是3308和3309 docker pull mysql:5.7 doc ...

  9. openstack controller ha测试环境搭建记录(四)——配置mysql数据库集群

    内容正式开始前,我已经在集群中添加了新的节点controller1(IP地址为10.0.0.14). 在所有节点上安装软件:# yum install -y mariadb-galera-server ...

  10. mysql主从集群搭建;(集群复制数据)

    1.搭建mysql 5.7环境chown mysql:mysql -R /data/groupadd mysqluseradd -g mysql mysql yum install numactlrp ...

随机推荐

  1. linux 离线安装mysql 配置开机自启动

    系统版本:centos7.8 | mysql版本:5.7.35 安装配置mysql数据库 mysql数据库配置开机自启动 1. 安装配置mysql数据库 mysql版本:5.7.35 点击下载 提取码 ...

  2. CF 1272 D. Remove One Element

    D. Remove One Element time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  3. ybtoj 12F

    求值的话改为求解前缀和的值,通过两个前缀和相减即可得到每个值. 每次询问相当于给一个方程. 一共有 $n$ 个未知数,因此需要 $n$ 个方程,同时每个数都必须至少在方程中出现一次. 最小生成树求解即 ...

  4. Python MySQLdb连接被多线程共享引发的内核segfault段错误

    Python celery Worker exited prematurely: signal 11 (SIGSEGV) --一种解决方案 Python libmysqlclient segfault ...

  5. Selenium常见方法

    1.打开和关闭浏览器  打开浏览器   driver=webdriver.Ie()   driver=webdriver.Chrome()   driver=webdriver.Firefox() ...

  6. EurekaServer高可用搭建

    生产环境中需要搭建集群达到高可用.eurekaServer每个实例可以注册到其他一个或多个eurekaServer实例中达到高可用.配置比较简单 比如: application-master.prop ...

  7. 2.IDEA的快捷键

    1.IDEA代码等式两边自动加空格:ctrl+alt+L

  8. Docker基本概念及命令

    1.Docker三个重要概念:仓库(Repository).镜像(image)和容器(Container) Docker基本用法: docker  命令关键字(COMMAND) 一系列的参数 dock ...

  9. element ui upload 组件多文件上传,最终只显示上传一个的问题

    问题描述:一次选多张图片上传的时候界面上只有一张图片显示,并且上传调用的接口次数与选择的图片数量一致,且接口已200. JSON格式,"url"是最终显示的图片地址 {     & ...

  10. Matlab - 在Figure界面去掉图像的坐标刻度

    Matlab版本:2018b 经过一番尝试,发现有两种方法 第一种:修改坐标轴的Visible属性,去掉坐标轴数字和坐标轴标签 第二种:删除Tick,只去掉坐标轴数字 第一种 ①原图 ②如果有多个子图 ...