Mysql 主从配置(docker镜像)

MYSQL主从配置

指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。
PS:这里需要用到binlog日志

主从复制工作原理剖析

1.Master 数据库只要发生变化,立马记录到Binary log 日志文件中
2.Slave数据库启动一个I/O thread连接Master数据库,请求Master变化的二进制日志
3.Slave I/O获取到的二进制日志,保存到自己的Relay log 日志文件中。
4.Slave 有一个 SQL thread定时检查Realy log是否变化,变化那么就更新数据

使用MYSQL主从配置好处

1.实现服务器负载均衡
即可以通过在主服务器和从服务器之间切分处理客户查询的负荷,从而得到更好的客户相应时间。通常情况下,数据库管理员会有两种思路。
(1) 一是在主服务器上只实现数据的更新操作。包括数据记录的更新、删除、新建等等作业。而不关心数据的查询作业。数据库管理员将数据的查询请求全部 转发到从服务器中。这在某些应用中会比较有用。如某些应用,像基金净值预测的网站。其数据的更新都是有管理员更新的,即更新的用户比较少。而查询的用户数 量会非常的多。此时就可以设置一台主服务器,专门用来数据的更新。同时设置多台从服务器,用来负责用户信息的查询.
(2)二是在主服务器上与从服务器切分查询的作业。在这种思路下,主服务器不单单要完成数据的更新、删除、插入等作业,同时也需要负担一部分查询作业。而从服务器的话,只负责数据的查询。当主服务器比较忙时,部分查询请求会自动发送到从服务器重,以降低主服务器的工作负荷。

2.通过复制实现数据的异地备份
可以定期的将数据从主服务器上复制到从服务器上,这无疑是先了数据的异地备份。在传统的备份体制下,是将数据备份在本地。此时备份 作业与数据库服务器运行在同一台设备上,当备份作业运行时就会影响到服务器的正常运行。有时候会明显的降低服务器的性能。同时,将备份数据存放在本地,也 不是很安全。如硬盘因为电压等原因被损坏或者服务器被失窃,此时由于备份文件仍然存放在硬盘上,数据库管理员无法使用备份文件来恢复数据。这显然会给企业 带来比较大的损失。

3.提高数据库系统的可用性
数据库复制功能实现了主服务器与从服务器之间数据的同步,增加了数据库系统的可用性。当主服务器出现问题时,数据库管理员可以马上让从服务器作为主服务器,用来数据的更新与查询服务。然后回过头来再仔细的检查主服务器的问题。此时一般数据库管理员也会采用两种手段。
(1)一是主服务器故障之后,虽然从服务器取代了主服务器的位置,但是对于主服务器可以采取的操作仍然做了一些限制。如仍然只能够进行数据的查询,而 不能够进行数据的更新、删除等操作。这主要是从数据的安全性考虑。如现在一些银行系统的升级,在升级的过程中,只能够查询余额而不能够取钱。这是同样的道 理。
(2)二是从服务器真正变成了主服务器。当从服务器切换为主服务器之后,其地位完全与原先的主服务器相同。此时可以实现对数据的查询、更新、删除等操 作。为此就需要做好数据的安全性工作。即数据的安全策略,要与原先的主服务器完全相同。否则的话,就可能会留下一定的安全隐患

环境配置

  1. linux 操作系统,mysql的docker镜像(8.0)
  2. 主数据库(master):120.77.85.233:3306
  3. 从数据库(slave):120.77.85.233:3307

PS:由于之前的服务器都到期了,目前只剩下一台,将就着在docker里面部署

开始配置

1. 创建2个mysql的docker镜像

docker run -p 3306:3306 --name my_mysql -v /docker-data/mysql/data/:/var/lib/mysql -v /docker-data/mysql/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

docker run -p 3307:3306 --name my_mysql2 -v /docker-data/mysql2/data/:/var/lib/mysql -v /docker-data/mysql2/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=654321 -d mysql:latest
创建对应目录
/docker-data/mysql/data/  //文件目录
/docker-data/mysql/conf/my.cnf   //mysql中docker的配置文件(如果没有,则使用docker cp 复制一份出来使用)
PS:这里没有那配置文件出来,大家在使用中可以配置log目录并挂载出来
root@iZwz91om21c05x13m3q3u6Z:/docker-data/mysql_default# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
80eb896f3a97        mysql:latest        "docker-entrypoint.s…"   4 seconds ago       Up 3 seconds        33060/tcp, 0.0.0.0:3307->3306/tcp   my_mysql2
c5ff7e2b8d5f        mysql:latest        "docker-entrypoint.s…"   10 seconds ago      Up 9 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   my_mysql

遇到旧版本无法登录问题

Plugin caching_sha2_password could not be loaded
Mysql 主从配置(docker镜像)_第1张图片
原因:
mysql8.0默认采用caching_sha2_password的加密方式,而Navicat使用的加密方式mysql_native_password,所以在登录时候出现错误。

解决方法:

  1. 升级新版本的Navicat,但是在这个全民皆破解时代,买正版,毕竟只有少数人
  2. 更改数据库加密方式

步骤:

-- 修改密码为用不过期
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; 

-- 修改密码并指定加密规则为mysql_native_password(如果是从库的话,这里的密码改成654321,对应从库登录密码)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

-- 刷新权限
flush privileges;
mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; 
Query OK, 0 rows affected (0.02 sec)

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

重启docker镜像,你会发现已经连接成功
Mysql 主从配置(docker镜像)_第2张图片
PS:顺便创建一个library的数据库,再创建两个数据表

2. 设置master主库 my.cnf配置

[mysqld]
server-id=1 #设置主服务器的ID,可以任意配置但是多个主从之间不能重复
innodb_flush_log_at_trx_commit=2  #控制MySQL 磁盘写入策略,参数2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作
sync_binlog=1  #开启binlog日志同步功能
log-bin=mysql-bin-1 #binlog日志文件名(可以任意命名)
binlog-do-db=library  # 这个表示只同步某个库 (如果没有此项,表示同步所有的库)
slave_skip_errors=all #跳过从库任何错误
auto-increment-offset = 1 # 自增值的偏移量
auto-increment-increment = 1 # 自增值的自增量

3. 登录MYSQL进行操作

创建slave用户,为了主库传输数据到从库使用
CREATE USER 'slave'@'120.77.85.233' IDENTIFIED WITH mysql_native_password BY '654321';

给予该用户复制的权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'120.77.85.233';

刷新权限
FLUSH PRIVILEGES;

查看主库状态
show master status\G
记录MASTER_LOG_FILE、Position两个参数
mysql> CREATE USER 'slave'@'120.77.85.233' IDENTIFIED WITH mysql_native_password BY '654321';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'120.77.85.233';
Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql-bin-1.000001
         Position: 1049
     Binlog_Do_DB: library
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql> show master status\g;
+--------------------+----------+--------------+------------------+-------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------+----------+--------------+------------------+-------------------+
| mysql-bin-1.000001 |     1049 | library      |                  |                   |
+--------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

ERROR: 
No query specified

4. 重启master主库镜像

docker restart mysql

5. 进入slave从库镜像,设置my.cnf配置

server-id=2
innodb_flush_log_at_trx_commit=2
sync_binlog=1
log-bin=mysql-bin-2
server-id=2
innodb_flush_log_at_trx_commit=2
sync_binlog=1
log-bin=mysql-bin-2

进入MYSQL进行配置

关闭从库
stop slave; 

修改从库
CHANGE MASTER TO MASTER_HOST='120.77.85.233',MASTER_PORT=3306,MASTER_USER='slave',MASTER_PASSWORD='654321',MASTER_LOG_FILE='mysql-bin-1.000003',MASTER_LOG_POS=861;

MASTER_HOST //主库IP地址
MASTER_PORT //主库端口
MASTER_USER //主库用户(可使用主库创建的slave用户)
MASTER_PASSWORD //主库密码
MASTER_LOG_FILE //主库日志文件名称(主库状态查询)
MASTER_LOG_POS //主库日志记录端口(主库状态查询)

开启从库(每次重启后需要手动开启)
start slave;

查询从库状态
show slave status;
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CHANGE MASTER TO MASTER_HOST='120.77.82.203',MASTER_PORT=3306,MASTER_USER='slave',MASTER_PASSWORD='654321',MASTER_LOG_FILE='mysql-bin-1.000001',MASTER_LOG_POS=1049;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

开启成功

Mysql 主从配置(docker镜像)_第3张图片

Mysql 主从配置(docker镜像)_第4张图片
Mysql 主从配置(docker镜像)_第5张图片

总结

在搭建新版本的mysql时,遇到了很多的问题(新版命令、配置参数),这次总结一下解决问题的过程,首先定位问题,找到问题是最为重要的,当然定位的最快的就是看日志,通过日志反馈的信息去确定问题大概出现的位置;其次,百度,虽然百度提供的资料大部分是复制粘贴,但有一部分还是有点用;当然最好就是要去官网的论坛或者是问题列表中去查找一下,一般遇到的问题论坛内都会有,可以节省很多的时间。




可能遇到错误

情况一:
Slave_IO_Running: Connecting
Slave_SQL_Running: YES

Mysql 主从配置(docker镜像)_第6张图片

通常这种错误是因为账号无法登录造成

解决:

  1. 在从库中连接主库主从账号,发现无法连接
  2. 进入主库修改slave的账号密码
  3. 从库登录主从账号,成功
删除用户
drop user 'slave'@'120.77.85.233';
更改权限
ALTER USER 'slave'@'120.77.85.233' IDENTIFIED WITH mysql_native_password BY '654321';
刷新权限
FLUSH PRIVILEGES;

在这里插入图片描述
Mysql 主从配置(docker镜像)_第7张图片

情况二:
Slave_IO_Running: Yes
Slave_SQL_Running: No

通常情况是因为主库的日志文件名与端口对应不上所导致

主库
Mysql 主从配置(docker镜像)_第8张图片

解决:

  1. 进入主库,查看主库状态
  2. 进入从库,修改从库配置
  3. 重启从库

在这里插入图片描述

你可能感兴趣的:(mysql)