前言

目前已完成:php7及扩展、redis5的Dockerfile测试版编写,稍许完善后同步上传到github,(记下这里memcached还没有剥离安装)。

今天数据库,编程的一个重要原则是不要重复造轮子,php因为需要很多自定义插件、所以单独编译镜像,其实其他包括redis都应该使用官方的,直接pull就行。

参考官方镜像,根据官方镜像,准备的mysql、mysql_slave文件树,添加了个数据文件夹。

[]:~/tmp/dk/mysql/mysql_slave# tree ./

./

├── config

│   ├── conf.d #后面修改my.cnf后删掉

│   │   └── docker.cnf

│   └── my.cnf

└── data

1、创建mysql镜像

[]:~/tmp/dk# docker pull mysql:8.0

# 清空旧数据库数据

[]:~/tmp/dk# rm -rf /root/tmp/dk/mysql/data/* /root/tmp/dk/mysql_slave/data/*

[]:~/tmp/dk# docker run --name mm -p 3306:3306 \

-v /root/tmp/dk/mysql/data:/var/lib/mysql \

-v /root/tmp/dk/mysql/config:/etc/mysql \

-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0

[]:~/tmp/dk# docker run --name ms -p 3308:3306 \

-v /root/tmp/dk/mysql_slave/data:/var/lib/mysql \

-v /root/tmp/dk/mysql_slave/config:/etc/mysql \

-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0

退出后台运行的容器,按 Ctrl+D 进行退出容器,请牢记!

run后运行的容器进入:

a.旧式进入 []:~/tmp/dk# docker attach mm

b.命令进入 []:~/tmp/dk# docker exec -it mm /bin/bash(或/bin/sh)

参考《Docker容器进入的4种方式》

a.普通进入:有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。所以docker attach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。

b.推荐

-- 小内存主机需要开启swap交换分区,并加入开机启动:

[]:~/tmp/dk# vim /etc/rc.local

# +swap

swapon /swapfile

-- mysql的重启:

不能进入容器、在容器中重启,会报 Unable to lock ./ibdata1 error: 11 的错误,容器无法对共享文件加锁。

# 重启mysql容器

[]:~# docker restart mm

2、mysql配置

[mysqld]

user = mysql

pid-file = /var/run/mysqld/mysqld.pid

socket = /var/run/mysqld/mysqld.sock

datadir = /var/lib/mysql

# 主从赋值增加项

log-bin=mysql-bin #[必须]启用二进制日志

server-id=1 #[必须]服务器唯一ID,默认是1

binlog-do-db=test #要同步的数据库名,从服务器不需要这几项

binlog-ignore-db = mysql #不同步mysql库和sys库

binlog-ignore-db = sys

replicate-ignore-db=mysql

secure-file-priv= NULL

# 忽略表名大小写

lower_case_table_names = 1

character-set-server=utf8mb4

collation-server=utf8mb4_unicode_ci

init_connect='SET NAMES utf8mb4'

#是否对sql语句大小写敏感,1表示不敏感

lower_case_table_names=1

#最大连接数

max_connections = 150

#最大错误连接数

max_connect_errors=1000

#TIMESTAMP如果没有显示声明NOT NULL,允许NULL值

explicit_defaults_for_timestamp=true

#SQL数据包发送的大小,如果有BLOB对象建议修改成1G

max_allowed_packet=2M

#MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭

#MySQL默认的wait_timeout 值为8个小时, interactive_timeout参数需要同时配置才能生效

interactive_timeout = 1800

wait_timeout = 1800

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

#时区

default-time_zone = '+8:00'

3、主从同步数据

在主服务器添加用于同步的账户。上需要主从服务器端配合完成

a.初始化同步用户

### 主服务器端

mysql> CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Ron_master_1';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

mysql> flush privileges;

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000003 | 825 | test | mysql,sys | |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

b.手动同步初始数据

添加测试数据,适合从一台拓展至多台服务器的情况。如果库数据已同步,跳过此步骤。

现在master中已有数据,需要先同步到slave,登录master,执行锁表操作

### 容器mm(master)主服务器添加初始库、表,及后续操作

mysql> create database test;

Query OK, 1 row affected (0.01 sec)

mysql> use test

Database changed

mysql> create table sys ( id int unsigned auto_increment primary key, `column` varchar(255) not null );

Query OK, 0 rows affected (0.03 sec)

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000003 | 1272 | test | mysql,sys | |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

#只读锁表,等待复制

mysql> FLUSH TABLES WITH READ LOCK;

Query OK, 0 rows affected (0.01 sec)

# 等待主从关系建立完成后,解锁写入

mysql> UNLOCK TABLES;

Query OK, 0 rows affected (0.00 sec)

### 容器ms(slave):从服务器导入master的库数据

xx@fd8bb25a86fc:/# mysql -uroot -p123456

mysql> create database test;

Query OK, 1 row affected (0.01 sec)

mysql> quit

Bye

root@fd8bb25a86fc:/# mysqldump -uroot -p -h remote_host -P3306 test > /tmp/test.dump

Enter password:

# 或直接use然后source file

root@fd8bb25a86fc:/# mysql -u root -p test < /tmp/test.dump

c.建立主从关系,完成同步

这里需要注意的参数是master_log_file、master_log_pos改为与master当前值相同。

### 容器ms(slave):从服务器添加

# 查询当前状态:show slave status\G; 重置复制状态参数:reset slave all; 关闭:stop slave;

# remote_host可以是 192.168.1.102 的内网、公网地址

mysql> change master to master_host='remote_host',master_port=3306,master_user='repl',\

master_password='Ron_master_1',master_log_file='mysql-bin.000003',master_log_pos=1272;

Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

#查询设置结果

mysql> show slave status\G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: xx.xx.xx.xx

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000003

Read_Master_Log_Pos: 1272

Relay_Log_File: 6e9640cfaa53-relay-bin.000003

Relay_Log_Pos: 322

Relay_Master_Log_File: mysql-bin.000003

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

... ...

Slave_IO_Running和 Slave_SQL_Running都是Yes,说明主从复制已经开启成功。

小结

a.失败问题

Slave_IO_Running:Connecting ; Slave_SQL_Running: Yes

可能的错误原因:

1.网络不通,防火墙

2.账户密码错误

Slave_IO_Running:No ; Slave_SQL_Running: Yes

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not open log file'

从库:

#停止主从关系

mysql>stop slave;

mysql>flush logs;

主库

#刷新binlog日志和pos号

mysql>flush logs;

mysql>show master status;

重新主从操作。

这其中遇到很多问题,比如:mysql的容器无法启动(配置文件问题,或使用现成配置好的,通过docker logs mm查看日志解决),无法从内部重启(搜索良久,应该是官方的问题,也确实没有从外部方便,只是对不是用mysql命令restart的别扭而已),主从复制没好(要点:my.cnf配置,锁表/确定不写入也行,master_log_file、master_log_pos参数)。

以前只是看过些,浮于理论,实践完成后才感觉通畅。

mysql主从docker_(学习到实践)四、docker搭建mysql主从实践相关推荐

  1. windows系统使用Docker搭建MySQL服务

    windows系统使用Docker搭建MySQL服务 文章目录 windows系统使用Docker搭建MySQL服务 前题 一.安装docker 二.建立镜像 三.连接mysql 前题 请先在wind ...

  2. Docker 学习笔记 - 进阶四 Docker网络和 Docker compose

    Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...

  3. [转]Docker学习之四:使用docker安装mysql

    本文转自:https://blog.csdn.net/qq_19348391/article/details/82998391 Docker学习之一:注册Docker Hub账号 Docker学习之二 ...

  4. Docker系列四~docker安装mysql

    Docker系列四 docker安装mysql 搜索mysql版本 [root@localhost conf.d]# docker search mysql INDEX NAME DESCRIPTIO ...

  5. docker搭建mysql主从

    前言 为什么要使用Docker搭建? 不管是使用源码安装还是离线安装,在服务器上安装一个mysql总会花费不少的时间,而且对于新人来说,中间稍不注意哪一步出错了就导致安装失败,我之前也是安装过2次才成 ...

  6. nas4free 安装mysql_[转]Docker学习之四:使用docker安装mysql

    Docker学习之一:注册Docker Hub账号 Docker学习之二:Docker基本简单操作命令 Docker学习之三:Docker在linux下简单安装使用 Docker学习之四:使用dock ...

  7. Docker学习七:使用docker搭建Hadoop集群

    本博客简单分享了如何在Docker上搭建Hadoop集群,我的电脑是Ubuntu20,听同学说wsl2有些命令不对,所以建议在虚拟机里按照Ubuntu或者直接安装双系统吧 Docker学习一:Dock ...

  8. Docker搭建Redis主从同步详细教程

    文章目录 介绍: redis主从同步概念 redis主从同步原理 redis主从同步流程图 搭建redis主从详细步骤: 拉取redis镜像 创建所需文件夹,用于映射容器相应文件路径 运行容器指定挂载 ...

  9. 【收藏】使用Docker搭建MySQL服务

    使用Docker搭建MySQL服务 https://www.cnblogs.com/sablier/p/11605606.html

  10. 【个人学习总结】使用docker搭建Teamspeak服务器

    [个人学习总结]使用docker搭建Teamspeak服务器 注:本文章仅为个人学习过程中的相关总结,不能保证文章正确性,如有错误还烦请各位大佬在评论区指正.文章核心内容为b站up主ROCBRAUN所 ...

最新文章

  1. Java-笔记16-复习
  2. linux下打开配置文件命令_Linux下用户权限相关命令
  3. DSP using MATLAB 示例Example3.1 3.2 3.3
  4. 腾讯技术直播间 | 轻量产品思维!手把手教你搭建在线甲醛监测系统
  5. 深度学习之生成对抗网络(7)WGAN原理
  6. CPU上下文切换(系统调用、进程上下文、线程上下文、中断上下文)
  7. LeetCode 1278. 分割回文串 III(区间DP)
  8. vue2.0中watch总结:普通监听和深度监听
  9. MySQL快速上手[学习笔记](一)
  10. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)
  11. ActivityMQ应用详解
  12. 2D纸娃娃系统的web演示
  13. 全国 下拉框 选项值:35个省级行政区
  14. 7、机器视觉之色彩空间转换
  15. 玩转算法与数据结构 C++描述 选择排序
  16. 程序员工作年限谜题:大数据为你解析,程序员到底能干到多少岁?
  17. 鲁大师发布2022半年报手机UI排行榜,vivo OriginOS成为最流畅UI
  18. Java 下载 Excel模板时,报修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?如果信任此工作簿的来源,请点击是
  19. 清除所有浏览器历史数据脚本_不要让浏览器吸收所有数据
  20. 计算机文档xsl,跟我学XSL(一)——第一个XML文档

热门文章

  1. 最佳开源大数据工具-2015
  2. 麦克风阵列能干这么多事你知道吗?
  3. 位、字、字节的区别 | 汇编伪指令db,dw,dd
  4. 黑马程序员C++学习笔记(第一阶段:基础)
  5. 不需要英语的计算机行业,北京评职称不再考外语计算机 将涉及300多万人
  6. python名片管理系统2.0_Python:名片管理系统2.0(增加登录功能)
  7. ABP之Javascript生成
  8. bash shell seq的用法
  9. Error pulling origin: error: The following untracked working tree files would be overwritten by...
  10. 将php分页类YII绑定框架,就需要改变风格的基础