MySql基于Docker的快速主从搭建以及常见问题处理方式

MySql基于docker的主从搭建:

1.Mysql启动:

本文主要记录了之前在公司搭建MySql高可用服务的流程,感谢您的点赞和浏览啦~

1.1 my.cnf配置文件

my.cnf文件:

# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_connections=300
# Custom config should go here
!includedir /etc/mysql/conf.d/

1.2 配置流程:

  1. 按照“/mnt/docker/mysql/conf/”新建文件夹。
  2. 将mysql的配置文件/conf/my.cnf文件拷到上述文件夹。
  3. 执行命令:
docker run --name master -e MYSQL_ROOT_PASSWORD=xxxx -e TZ=Asia/Shanghai -p 3306:3306 --privileged=true --restart always -v /mnt/docker/mysql/data/:/var/lib/mysql -v /mnt/docker/mysql/mysql-files:/var/lib/mysql-files/ -v /mnt/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -d mysql:8.0.16 --lower_case_table_names=1 --default-time_zone='+8:00'

【说明】:root用户密码为xxxx;端口号:3306,密码可根据用户要求进行修改。

docker ps -a,查看master服务是否启动。
在这里插入图片描述
注意: 是UP状态,表示正在运行中

  1. 开放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

注: --permanent 永久开启,避免下次开机需要再次手动开启端口

1.3 连接测试:

使用Navicat连接测试:
在这里插入图片描述
MySQL主容器已经启动成功。

1.4 创建主容器的复制账号:

使用Navicat友好的图像化界面执行SQL:

--为从库服务器 设置用户名和密码 账号为 slave 密码为 slave123
CREATE USER 'slave'@'%' IDENTIFIED WITH sha256_password BY 'slave123'
--设置权限
grant replication slave, replication client on *.* to 'slave'@'%'; 
--权限生效
flush privileges;

注:此账号有别与数据库连接账号,是用来同步主从数据的账号。

特别提醒:mysql8.0以后需要以sha256_password是ssl加密格式进行创建,否则会出现主从权限校验不通过问题。

报错示例:

2021-11-16T08:56:12.068465Z 18 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'slave2@192.168.174.131:3306' - retry-time: 60  retries: 13, Error_code: MY-002061

1.5 配置mysql8:

docker exec -it master bash #进入mysql镜像 
mysql -uroot -pxxxx #登录mysql
use mysql #切换mysql库
alter user 'root'@'localhost' identified by 'xxxx' PASSWORD EXPIRE NEVER #修改密码不过期
ALTER user 'root'@'%' identified WITH mysql_native_password BY 'xxxx' #更改默认的身份认证插件
select host, user, authentication_string, plugin from user #查看用户
GRANT ALL ON *.* TO 'root'@'%' #开启远程访问

mysql配置文件修改:

flush privileges; #刷新配置
CREATE USER 'nacos'@'%' IDENTIFIED BY 'nacos1234' #新建用户和密码,如果用户不允许使用root用户的话,可用该语句新建用户和密码。
GRANT ALL ON *.* TO nacos@'%'  WITH GRANT OPTION #开启远程访问
mysql配置文件修改:
eixt #退出mysql但是不用退出镜像!
cd /mnt/docker/mysql/conf/  #进入配置文件目录下
vim my.cnf  #修改mysql配置 在 [mysqld] 节点最后加上后保存

server-id=100  ## 同一局域网内注意要唯一

log-bin=mysql-bin ## 开启二进制日志功能,可以随便取(关键)

注:server-id=100 唯一服务器ID,非0整数,不能和其他服务器的server-id重复

ps:此过程可以在原有的/conf/my.cnf文件中修改后,再覆盖到/mnt/docker/mysql/conf/文件目录下(保证修改mysql的配置文件即可)。

注:vim 执行失败 bash: vi: command not found
可以参考博客:command not found

重启服务,加载修改后的配置:

#MYSQL是上面启动的时候 为该容器起的名称
docker restart master

至此,Master配置完成。

1.6 配置从库:

创建方式和配置Master库一致,运行从库容器

1.6.1 创建第一个从库:
docker run --name slave1 -e MYSQL_ROOT_PASSWORD=xxxx -e TZ=Asia/Shanghai -p 3307:3306 --privileged=true --restart always -v /mnt/docker/mysql/data/:/var/lib/mysql -v /mnt/docker/mysql/mysql-files:/var/lib/mysql-files/ -v /mnt/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -d mysql:8.0.16 --lower_case_table_names=1 --default-time_zone='+8:00'
注意:--name master 修改为--name slave1
     -p 3306:3306 修改为 -p 3307:3306

与主容器相似,修改从库镜像的my.cnf:
修改第一个从库配置文件:

server-id=101 ## 设置server_id,注意要唯一 和master也不能一样
log-bin=mysql-slave1-bin  ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
read_only = 1  ## 设置为只读,该项如果不设置,表示slave可读可写
1.6.2 创建第二个从库:
docker run --name slave2 -e MYSQL_ROOT_PASSWORD=xxxx -e TZ=Asia/Shanghai -p 3308:3306 --privileged=true --restart always -v /mnt/docker/mysql/data/:/var/lib/mysql -v /mnt/docker/mysql/mysql-files:/var/lib/mysql-files/ -v /mnt/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -d mysql:8.0.16 --lower_case_table_names=1 --default-time_zone='+8:00'
修改第二个从库配置文件:
server-id=102 ## 设置server_id,注意要唯一 和master也不能一样

log-bin=mysql-slave2-bin  ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用

read_only = 1  ## 设置为只读,该项如果不设置,表示slave可读可写

1.7 开启Master-Slave主从复制:

上面两步Master和Slave都配置成功了,而且Master也为Slave读取Master数据专门设置了一个账号,下面就来实现同步。

首先进入Master库
执行查询(通过Navicat或其他数据库连接软件)查看Master状态:

#通过该命令可以查看master数据库当前正在使用的二进制日志及当前执行二进制日志位置
show master status

在这里插入图片描述
记录fileposition 数据 eg: mysql-bin.000001 5933
后面Slave库会在这个文件这个位置进行同步数据。此时一定不要操作Master库,否则将会引起Master状态的变化,File和Position字段也将会进行变化。

进入slave1从库
在这里插入图片描述
执行以下命令:

change master to
master_host='192.168.174.131',
master_user='slave',
master_password='slave123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=5124;

命令说明:

master_host :Master库的地址,指的是容器的独立ip,可以通过:
master_port :Master的端口号,指的是容器的端口号(默认3306)
master_user :用于数据同步的用户
master_password :用于同步的用户的密码
master_log_file :指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos :从哪个 Position 开始读,即上文中提到的 Position 字段的值

使用start slave命令开启主从复制过程:

start slave; 

顺便提供下其它命令:

 stop slave    #停止slave。
 reset slave   #重启slave。 
 reset master  #重启master。

启动之后我们来看下有没有成功。

show slave status

在这里插入图片描述
Slave_IO_Running: 从服务器中I/O线程的运行状态,YES为运行正常 Slave_SQL_Running: 从服务器中SQL线程的运行状态,YES为运行正常
从这张图很明显看出,对于Slave的两个线程都成功了,那就说明整个MYSQL主从搭建成功了。如果有一个为NO,那就需要到后台看错误日志,是什么原因出错了,解决下就好。

进入slave2从库:
在这里插入图片描述
其配置方式和slave1配置相同。

1.8 问题查看日志方式(示例):

docker logs slave1 -f   #可以查看从服务连接的日志信息,方便定位问题
eg:
2021-11-16T08:58:55.833241Z 8 [System] [MY-010597] [Repl] 'CHANGE MASTER TO FOR CHANNEL '' executed'. Previous state master_host='192.168.174.131', master_port= 3306, master_log_file='mysql-bin.000001', master_log_pos= 3353, master_bind=''. New state master_host='192.168.174.131', master_port= 3306, master_log_file='mysql-bin.000001', master_log_pos= 4403, master_bind=''.
2021-11-16T08:58:57.656994Z 20 [Warning] [MY-010897] [Repl] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
2021-11-16T08:58:57.660301Z 20 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'slave5@192.168.174.131:3306' - retry-time: 60  retries: 1, Error_code: MY-002061
2021-11-16T08:59:57.663757Z 20 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'slave5@192.168.174.131:3306' - retry-time: 60  retries: 2, Error_code: MY-002061
2021-11-16T09:00:57.666726Z 20 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'slave5@192.168.174.131:3306' - retry-time: 60  retries: 3, Error_code: MY-002061
2021-11-16T09:01:57.671739Z 20 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'slave5@192.168.174.131:3306' - retry-time: 60  retries: 4, Error_code: MY-002061
2021-11-16T09:02:57.674447Z 20 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'slave5@192.168.174.131:3306' - retry-time: 60  retries: 5, Error_code: MY-002061
2021-11-16T09:03:57.678233Z 20 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'slave5@192.168.174.131:3306' - retry-time: 60  retries: 6, Error_code: MY-002061

解决方式:配置支持mysql8.0以上的密码策略

1.9 问题处理步骤:

  1. 再次检查mysql配置文件修改是否正确
  2. 重启镜像
  3. 查看镜像是否均正常运行
  4. 检查网络是否连通
  5. 检查账户密码是否设置错误
  6. 检查连接服务器的语法
  7. 检查mysql主服务权限
  8. 检查端口是否配置正确

进行逐项检查一一排除问题。

1.10 总结:

在搭建集群的过程中会遇到各种各样的问题,遇到问题的时候不要着急,可以现在网络上搜一下此类问题。因为大多数你遇到的问题别人指定也会遇到,并且对于搭建集群来讲更像是个体力活而非脑力。搜索的多了,慢慢摸索尝试最终会解决掉遇到的问题的~

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值