概述:
总所周知,使用docker安装一些中间件是非常快速和便捷的,搭建mysql主从复制【1主n从节点或n主n从节点】,这里我为了演示简单一点,选择搭建mysql主从复制的【1主1从】并使用mysql最新版的镜像进行搭建,话不多说,咱撸起袖子就是干!!!
一.mysql主从复制的原理【简单聊聊】
1.master服务器负责写,当master上的数据发生改变时,则将其改变写入binlog二进制日志中;
2.slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个IO线程请求master二进制文件内容事件
3.同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制文件事件,并保存至从节点本地的中继日志中,从节点将启动SQL解析线程从中继日志中读取二进制日志内容,在本地服务器重新执行改变的内容,使得其数据和主节点的保持一致
二.mysql主从复制搭建步骤【重点】
主【写】服务配置步骤
1.拉取镜像mysql默认是latest最新版本,拉取之后查看本地仓库是否有mysql镜像
docker pull mysql
docker images
2.使用该mysql:latest镜像创建并启动一个容器并将该3307端口容器作为我们的主[写]服务器,具体命令如下
docker run -p 3307:3306 --privileged=true
--name mysql-master
-v /mydata/mysql-master/log:/var/log/mysql
-v /mydata/mysql-master/data:/var/lib/mysql
-v /mydata/mysql-master/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
参数解释:
-p //宿主机端口映射:容器端口
--privileged //权限,挂载容器卷会使用到
--name //指定容器名称
-v //挂载容器卷,宿主机目录:容器目录
-e MYSQL_ROOT_PASSWORD //指定mysqlroot用户登录时的密码
-d //后台方式启动
3.执行完第二步的命令之后使用docker ps 查看容器有没有成功启动,如果报错/var/lib/mysql不存在错误,那我们在my.cnf配置[mysqld]中增加一项配置即可,然后需重新启动容器[docker restart mysql-master]否则无效
secure_file_priv=/var/lib/mysql
4.在刚才启动容器时指定的主节点的挂载目录/mydata/mysql-master/conf下创建my.cnf文件,然后编辑我们3307写服务器的my.cnf配置内容,开启二进制文件以及关于一些二进制文件的其他配置,详细的配置内容如下
[mysqld]
user=root
character-set-server=utf8
secure_file_priv=/var/lib/mysql
default_authentication_plugin=mysql_native_password
#master
server_id=101
binlog-ignore-db=mysql
log-bin=mall-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
//配置说明
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
5.然后进入主服务器的容器使用myslq -uroot -p123456登录mysql,创建主从同步用户slave并赋予相关权限
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; //创建用户
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';//赋予权限
从【读】服务配置步骤
1.使用该mysql:latest镜像创建并启动一个容器并将该3308端口容器作为我们的从[读]服务器,具体命令如下,参数说明参考写服务器,这里与写服务器的挂载目录,容器名称和映射端口不一样而已
docker run -p 3308:3306 --privileged=true --name mysql-slave
-v /mydata/mysql-slave/log:/var/log/mysql
-v /mydata/mysql-slave/data:/var/lib/mysql
-v /mydata/mysql-slave/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
2.在从服务器容器挂载的宿主机/mydata/mysql-slave/conf目录下创建my.cnf,修改完配置之后重新启动容器 docker restart mysql-slave
[mysqld]
user=root
character-set-server=utf8
secure_file_priv=/var/lib/mysql
default_authentication_plugin=mysql_native_password
#slave
server_id=102
binlog-ignore-db=mysql
log-bin=mall-mysql-slave1-bin
binlog_cache_size=1M
binlog_format=mixed
slave_skip_errors=1062
relay_log=mall-mysql-relay-bin
log_slave_updates=1
read_only=1
expire_logs_days=7
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
//配置说明
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
3.登录主数据库,查看主从同步状态,show master status 这些信息后续从节点的配置需要用到
4.登录从服务器数据库增加主从配置如:主服务器的地址,同步用户账号与密码master的二进制文件以及同步数据的读取position等信息,登录从节点数据库执行一下命令【注意下面的是一条命令连起来的而不是多条分开的命令】
change master to master_host='宿主机ip', //写服务器ip地址
master_user='slave', //同步用户名
master_password='123456', //同步用户密码
master_port=3307, //写服务器端口
master_log_file='mall-mysql-bin.000005', //二进制文件id
master_log_pos=2550, //读取位置
master_connect_retry=30;//重试次数
5.执行完上面的命令之后,使用 show slave status \G; 查看从节点的主从状态,从服务器默认是没有开启主从同步的,我们需执行start slave命令启动主从同步功能,如果没有执行start slave 那么下图中的io线程与sql默认的值都是NO
三.验证结果
测试主从同步有没有生效,在mysql-master主服务器上新创建一个数据库db01,在db01数据库下再创建一个employee表并且往employee表中插入一条数据,然后登录从服务节点数据库查询是否有同步到刚才主数据库写的数据库和数据表,如果有就证明配置成功啦!!!测试步骤如下。
1.登录查看从节点服务器有没有db01数据库
2.登录主服务器创建db01数据库并创建employee表,忘employee表中插入一条数据
3.返回从节点再次查看数据库以及查询employee数据
4.查看表employe数据
四.搭建过程中遇到的问题
1.从服务器开启主从同步时,连接不上master服务器查看日志显示Authentication plugin 'caching_sha2_password' cannot be loaded错误,出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后的加密规则是caching_sha2_password。
解决方案:修改加密规则在从节点和主节点的my.cnf的[mysqld]增加如下配置
default_authentication_plugin=mysql_native_password
2.mysql:latest启动容器失败Failed to access directory for --secure-file-priv. Please make sure
that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files错误出现这个原因主要是mysql高版本和低版本的不一样,MYSQL新特性secure_file_priv对读写文件的影响。
解决方案:在从节点和主节点的my.cnf的[mysqld]增加如下配置
secure_file_priv=/var/lib/mysql
附上参考链接:
https://www.cnblogs.com/zhurong/p/9898675.html
https://blog.youkuaiyun.com/qq_40604437/article/details/106680762