草庐IT

docker-compose搭建mysql8 主从

光头洗发水 2024-02-23 原文

docker和docker-compose怎么安装的 我这里就不介绍了,需要的自行百度

我这里模拟了一台服务器,开启了两个mysql8的容器,一个作为主,一个作为从

1、先创建目录结构,master和slave的结构是一致的

 2、编写主容器docker-compose.yml脚本

# 使用说明 V3.2.0
# docker-compose up
version: '3.1'
services:
  mysql8-master1:
    hostname: mysql8-master1
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: master
      MYSQL_PASSWORD: 123456
    command:
      --bind-address=192.168.100.12
      --default-authentication-plugin=mysql_native_password
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-time-zone='+8:00'
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --expire-logs-days=7
    image: mysql:8.0
    privileged: true
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
    restart: always
    container_name: mysql8-master1
    ports:
      - 13306:3306
    volumes:
      - ./data:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./conf/my.cnf:/etc/mysql/my.cnf
    networks:
      fuksou-net:
        ipv4_address: 192.168.100.12

networks:
  fuksou-net:
    external:  true

说明:

这里我新建了一个用户master和root一样的密码123456,然后绑定了ip是内网ip:192.168.100.12,注意参数default-authentication-plugin=mysql_native_password这个是mysql8的mysql5.7x版本的这个配置又不一样的 记得别搞错mysql的版本,然后隐射了端口容器里面的端口是3306,外部的端口是13306,我这里用到了局域网networks参数,这个你们没有可以自己去掉,

3、编写主容器的my.cnf

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL

#gtid:
server_id = 1                   #服务器id
gtid_mode = on                  #开启gtid模式
enforce_gtid_consistency = on   #强制gtid一致性,开启后对于特定create table不被支持

#binlog
log_bin = mysql-binlog
log_slave_updates = on
binlog_format = row             #强烈建议,其他格式可能造成数据不一致

#relay log
skip_slave_start = 1

# Custom config should go here
!includedir /etc/mysql/conf.d/

4、编写从容器的docker-compose.yml

# 使用说明 V3.2.0
# docker-compose up
version: '3.1'
services:
  mysql8-slave1:
    hostname: mysql8-slave1
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: slave
      MYSQL_PASSWORD: 123456
    command:
      --bind-address=192.168.100.13
      --default-authentication-plugin=mysql_native_password
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-time-zone='+8:00'
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --expire-logs-days=7
    image: mysql:8.0
    privileged: true
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
    restart: always
    container_name: mysql8-slave1
    ports:
      - 13307:3306
    volumes:
      - ./data:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./conf/my.cnf:/etc/mysql/my.cnf
    networks:
      fuksou-net:
        ipv4_address: 192.168.100.13

networks:
  fuksou-net:
    external:  true

说明:

主容器ip:192.168.100.12        外部端口:13306        容器内部端口:3306

从容器ip:192.168.100.13        外部端口:13307        容器内部端口:3306

5、编写从容器的my.cnf

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL

#gtid:
server_id = 2                   #服务器id
gtid_mode = on                  #开启gtid模式
enforce_gtid_consistency = on   #强制gtid一致性,开启后对于特定create table不被支持

#binlog
log_bin = mysql-binlog
log_slave_updates = on
binlog_format = row             #强烈建议,其他格式可能造成数据不一致

#relay log
skip_slave_start = 1

read_only = on                   #设置只读

# Custom config should go here
!includedir /etc/mysql/conf.d/

说明:

主容器的server_id是1,这里的id值要唯一

从容器的server_id是2,这里的id值要唯一

从容器设置只读

6、启动容器

6.1、进入主容器目录master1的根目录,启动容器:docker-compose up -d

cd master1
docker-compose up -d

6.2、进入从容器目录slave1的根目录,启动容器:docker-compose up -d

cd ..
cd slave1
docker-compose up -d

 7、docker ps -a 查看启动情况

 8、这里我都启动起来了  使用navicat测试连接情况

 

 我这里都连接上了,如果各自的连接不上,先解决连接问题,一般都是防火墙、或者端口没有开放之类的问题

9、给mysql的master账户和slave账户权限,其他权限各自按需添加

9.1、先进入主容器,然后登录mysql,执行权限添加,记得flush刷新一下

docker exec -it mysql8-master1 bash;
mysql -uroot -p123456;
GRANT ALL ON *.* TO master; 
flush privileges;

 9.2、从容器添加权限

docker exec -it mysql8-slave1 bash;
mysql -uroot -p123456;
GRANT REPLICATION CLIENT ON *.* TO slave;
GRANT REPLICATION SLAVE ON *.* TO slave;
GRANT SUPER ON *.* TO slave;
GRANT RELOAD ON *.* TO slave;
GRANT SELECT ON *.* TO slave;
flush privileges;

 10、进入从节点的mysql,使用slave账户连接主节点,开启备份

docker exec -it mysql8-slave1 bash;
mysql -uslave -p123456;
CHANGE MASTER TO master_host='192.168.100.12', master_port=3306, master_user='master', master_password='123456', master_auto_position=1;
START SLAVE;

 这里就已经完成了,SHOW SLAVE STATUS\G查看状态

SHOW SLAVE STATUS\G

测试在主库新建库和新建表,从库也相对应的更新了

注意:因为我是一个服务器启动了两个容器连接的时候要使用的是容器的端口3306,而不是13306,你们如果是两台服务器的话 就正常端口和ip就可以了

有关docker-compose搭建mysql8 主从的更多相关文章

  1. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  2. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  3. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  4. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  5. ruby-on-rails - 当我通过 rvm 使用 rails3 时,如何在 ubuntu 上安装 mysql2 gem? - 2

    我正在尝试绕过rails配置这个极其复杂的迷宫。到目前为止,我设法在ubuntu上设置了rvm(出于某种原因,ruby在ubuntu存储库中已经过时了)。我设法建立了一个Rails项目。我希望我的测试项目使用mysql而不是mysqlite。当我尝试“rakedb:migrate”时,出现错误:“!!!缺少mysql2gem。将其添加到您的Gemfile:gem'mysql2'”当我尝试“geminstallmysql”时,出现错误,告诉我需要为安装命令提供参数。但是,参数列表很大,我不知道该选择哪些。如何通过在ubuntu上运行的rvm和mysql获取rails3?谢谢。

  6. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  7. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

  8. ruby - 更新 gem 时 Docker 包安装缓存问题 - 2

    我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby​​应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了

  9. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  10. Centos7-yum安装mysql-修改密码-无密码登录-安全配置 - 2

    目录1、yum安装mysql修改密码(1)在mysql里面修改(2)第二种方式,利用mysqladmin修改密码2、没有密码,登录mysql修改密码3、mysql的安全设置1、yum安装mysql在CentOS中默认安装有MariaDB(MySQL的一个分支),安装完成之后可以直接覆盖MariaDB。rpm-qa|grepmariadb查询是否安装了mariadbrpm-e--nodepsmariadb-libs-5.5.60-1.el7_5.x86_64卸载mariadwgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.

随机推荐