Docker Mysql主从环境配置

1、MySQL 主从复制原理

主服务器数据库的每次操作都会记录在其二进制文件 mysql-bin.xxx(该文件可以在 mysql 目录下的 data 目录中看到)中,从服务器的 I/O 线程使用专用账号登录到主服务器中读取该二进制文件,并将文件内容写入到自己本地的中继日志 relay-log 文件中,然后从服务器的 SQL 线程会根据中继日志中的内容执行 SQL 语句

2、MySQL 主从同步的作用

1、可以作为备份机制,相当于热备份 2、可以用来做读写分离,均衡数据库负载

3、项目场景

1、主服务器 10.10.20.111,其中已经有数据库且库中有表、函数以及存储过程

2、从服务器 10.10.20.116,空的啥也没有

4、准备工作

主从服务器需要有相同的初态

4.1、将主服务器要同步的数据库枷锁,避免同步时数据发生改变

shell 复制代码
mysql>use db;
mysql>flush tables with read lock;

4.2、将主服务器数据库中数据导出

ini 复制代码
mysql>mysqldump -uroot -pxxxx db > db.sql;

这个命令是导出数据库中所有表结构和数据,如果要导出函数和存储过程的话使用

shell 复制代码
mysql>mysqldump -R -ndt db -uroot -pxxxx > db.sql

4.3、备份完成后,解锁主服务器数据库

ini 复制代码
mysql>unlock tables;

4.4、将初始数据导入从服务器数据库

shell 复制代码
mysql>create database db;
mysql>use db;
mysql>source db.sql;

好了,现在主从服务器拥有一样的初态了

5、现在使用 docker 模拟双数据库

bash 复制代码
docker pull mysql:5.6
docker run -p 13306:3306 --name mysql_1  \
-v /data/mysql_1/conf/my.conf:/etc/mysql/mysql.conf.d/mysqld.cnf  \
-v /data/mysql_1/logs:/logs -v /data/mysql_1/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yourpassword -d mysql:5.6

对于 mysql_1 的配置如下 (/data/mysql_1/conf/my.conf):

ini 复制代码
[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket        = /var/run/mysqld/mysqld.sock
datadir        = /var/lib/mysql
#log-error    = /var/log/mysql/error.log
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#这个地方端口控制是无效的,也不要乱加,修改这个地方也没什么意义
#port = 13306
server_id = 1
log-bin = mysql-bin
binlog-do-db = db
log-slave-updates = true
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 1
expire_logs_days = 7
log_bin_trust_function_creators = 1

6、主服务器配置

6.1、修改 MySQL 配置=>这里是详细的说明,具体已经配置的将上面。

在[mysqld]中添加

ini 复制代码
#主数据库端ID号
server_id = 1
 #开启二进制日志
log-bin = mysql-bin
#需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
binlog-do-db = db
#将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中
log-slave-updates = true
#控制binlog的写入频率。每执行多少次事务写入一次
#(这个参数性能消耗很大,但可减小MySQL崩溃造成的损失)
sync_binlog = 1
#这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
auto_increment_offset = 1
#这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
auto_increment_increment = 1
#二进制日志自动删除的天数,默认值为0,表示"没有自动删除",启动时和二进制日志循环时可能删除
expire_logs_days = 7
#将函数复制到slave
log_bin_trust_function_creators = 1

6.2、重启 MySQL,创建允许从服务器同步数据的账户

创建 slave 账号 account,密码 123456 mysql>grant replication slave on *.* to 'account'@'172.17.0.1' identified by '123456'; 更新数据库权限 mysql>flush privileges;

6.3、查看主服务器状态

markdown 复制代码
mysql>show master status\G;
***************** 1. row ****************
        File: mysql-bin.000033 #当前记录的日志
        Position: 337523 #日志中记录的位置
    Binlog_Do_DB:
Binlog_Ignore_DB:

执行完这个步骤后不要再操作主服务器数据库了,防止其状态值发生变化

7、从服务器配置

7.1、修改 MySQL 配置

vi /data/mysql_2/my.conf 写入配置如下:

ini 复制代码
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
#log-error      = /var/log/mysql/error.log
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
server_id = 2
log-bin = mysql-bin
log-slave-updates = true
sync_binlog = 0
innodb_flush_log_at_trx_commit = 0
replicate-do-db = db #这个很重要 表示要同步的数据库
slave-net-timeout = 60
log_bin_trust_function_creators = 1

mysqld 中的配置说明如下: 在[mysqld]中添加

ini 复制代码
server_id = 2
log-bin = mysql-bin
log-slave-updates
sync_binlog = 0
#log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。
#该模式下在事务提交的时候,不会主动触发写入磁盘的操作
innodb_flush_log_at_trx_commit = 0
#指定slave要复制哪个库
replicate-do-db = db
#MySQL主从复制的时候,当Master和Slave之间的网络中断,
#但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。
#Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障,
#然后才会重连并且追赶这段时间主库的数据
slave-net-timeout = 60
log_bin_trust_function_creators = 1

使用 docker 启动 mysql

bash 复制代码
docker run -p 23306:3306 --name mysql_2  \
-v /data/mysql_2/conf/my.conf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-v /data/mysql_2/logs:/logs -v /data/mysql_2/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

启动后注意检查启动的 ip 地址是否正确。 因为在授权的时候,我们用的是指定的 ip 进行授权 172.17.0.3

7.2、执行同步命令

执行同步命令,设置主服务器 ip,同步账号密码,同步位置

ini 复制代码
mysql>change master to master_host='10.10.20.111',master_user='account',
master_password='123456',master_log_file='mysql-bin.000033',master_log_pos=337523;

开启同步功能 mysql>start slave;

7.3、查看从服务器状态

yaml 复制代码
mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.20.111
                  Master_User: account
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000033
          Read_Master_Log_Pos: 337523
               Relay_Log_File: db2-relay-bin.000002
                Relay_Log_Pos: 337686
        Relay_Master_Log_File: mysql-bin.000033
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
          ...

Slave_IO_Running 及 Slave_SQL_Running 进程必须正常运行,即 Yes 状态,Slave_IO_Running 及 Slave_SQL_Running 进程必须正常运行,即 Yes 状态, 否则说明同步失败 若失败查看 mysql 错误日志中具体报错详情来进行问题定位 最后可以去主服务器上的数据库中创建表或者更新表数据来测试同步

相关推荐
赵渝强老师10 小时前
【赵渝强老师】K8s的DaemonSets控制器
linux·docker·云原生·容器·kubernetes
江西昊仔10 小时前
Docker指令学习1
学习·docker·eureka
大田斗小木子14 小时前
Docker学习
学习·docker·容器
铁板鱿鱼14016 小时前
docker基本(仅供自己参考)
运维·docker·容器
江池俊17 小时前
本地快速部署一个简洁美观的个人Halo博客网站并发布公网远程访问
docker·个人博客
admin_23318 小时前
docker入门总结(附错误处理,持续更新)
运维·docker·容器
linux修理工18 小时前
docker desktop windows stop
docker
Ceder1c18 小时前
【已解决】Linux ubuntu 20.04 docker 不需要sudo权限
linux·ubuntu·docker
hybaym18 小时前
Docker修改默认的存储路径
docker
EricWang135821 小时前
【无标题】
docker