一. 搭建Mysql主从
1.1 Linux中创建两个容器
创建一个mysq01 给端口33061
再创建一个mysql02给端口33062
1.2 两个mysql连接上sqlyog
连接好后如上所示
1.3准备两台主机
这里,我们准备两台机器:
主机:192.168.248.128
从机:192.168.248.139
1.4 开始配置主机
第一步:授权给从机服务器
MySql 8.0以下
GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.248.139' identified by '123';
作用:mysql里面有三个日志,重要的有两个,这个里面用到的叫做binglog,就像Redis中的RDB备份一样,binglog里面会记录下来你所有的操作,然后从机会来到主机里面来读取他的binglog,把binglog拿回去然后自己再重放一下就知道,就可以恢复出来主机的数据了,但是得先认证身份,并不是谁来都可以去进行上面操作必须得是root用户,那么问题来了,我们把root用户给从机去进行验证本身就是错误的行为,怎么去打破这种僵局?
这一句的意思就是,我们先通过这一行命令让从机去创建一个用户,从机等下通过这一行命令从从机登录到主机上面来去读取binglog,这一句是用户创建+授权一步完成,但是mysql8.0之后已经不允许这么写了,我们要创建和授权的步骤要分离开。
几个配置项的含义:
1.*.*表示操作的库,这里指的是主机能操作任何库中的任何表。
2. rep1 表示我从机创建的用户的名字
3. 192.168.248.139 后面紧跟着的表示用户将来得从这个地址进行登录,就跟我们之前提到的Redis中的bind的后面跟着的ip地址是一样的意思,我们下面去把他改成一个%,即让他从任意的地址登录,不去做限制
4. 123 显然,这个是密码
FLUSH PRIVILEGES;
第二行的意思是刷新一下mysql不执行这一行的话我们每次都要去重启mysql
上面两行命令经过更改后如下所示:
GRANT REPLICATION SLAVE ON *.* to 'rep1'@'% ' identified by '123';
FLUSH PRIVILEGES;
MySql 8.0 :
CREATE USER `rep1`@`192.168.248.139` IDENTIFIED WITH caching_sha2_password BY '123';
GRANT Replication Slave ON *.* TO rep1`@`192.168.248.139`;
第二步:
执行前看一下能登录的用户
执行mysql的代码,创建出了新的用户rep1
第二步: 修改主库配置文件
开启binlog,并设置server-id ,每次修改配置文件后都要重启Mysql服务才会生效。
放在你的docker包
进入容器mysql01中的etc下的my.cnf,修改其中的配置
vi /etc/my.cnf
这个配置文件位置也可能是 /etc/mysql/my.cnf ,我这里是5.7的数据库,我是上面一种。
修改的内容如下:
[mysqld]
log-bin=/var/lib/mysql/binlog
server-id=128
binlog-do-db = cmd
如何修改?
这里面没有vi编辑器我们该怎么办?
由于这是容器中的配置,我们没办法用vi编辑器对他机进行修改,而如果安装一个vi编辑器的话会把容器撑大,没有必要,我们还是把那my.cnf
里面的关键代码拷贝出来给修改一下然后再把my.cnf这个文件直接替换掉。
原来的my.cnf文件配置
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
#修改MySQL的
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#修改Mysql客户端的,一般乱码了就是这里出现了问题
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
进行我们需要的进行修改之后的配置
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
#修改MySQL的
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
log-bin=/var/lib/mysql/binlog
server-id=33061
binlog-do-db = db01
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#修改Mysql客户端的,一般乱码了就是这里出现了问题
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
然后用上面配置好的文件把mysql01里面的文件给覆盖
再docker restart mysql01
去重启mysql01
重启完成后数据库中输入SHOW MASTER STATUS;
这样我们就把主机给配置好了。
上图中的几项重要的配置
binlog的名字是:binlog.000001
Position是154
Binlog_Do_DB是我们要去备份的东西
1.5 开始配置从机
从机配置也是配置my.cnf
与上面不同的是把从机端口改一下,然后端口上下两行命令删除即可
配置完成后复制到mysql02中然后重启,与主机配置类似
Mysql02对应的从机中写入
:
#主机地址改成我们自己的地址,比如黄黄这里是1.12.235.192
#主机端口master_port改为33061
#master_log_file和master_log_pos根据主机配好后查询出来的更改
CHANGE MASTER TO MASTER_HOST=‘1.12.235.192’,MASTER_PORT=33061,
MASTER_USER=‘rep1’,MASTER_PASSWORD=‘123’,MASTER_LOG_FILE=‘binlog.000001’,
MASTER_LOG_POS=154;
##启动从机
START SLAVE
#查看从机的状态
SHOW SLAVE STATUS;
从机主要查看的参数:
主要看这两个地方没问题就没啥问题了
如果出现了,Connecting ,no 就是你的linux的配置配错或者你的mysql的指令出错了
到此我们的主从就配置好了,下面来看看主从有什么作用和为什么要配置主从吧
二.主从配置实现读写分离
2.1 主机中创建表
在主机33061中先创建数据库db01
再创建表user
加入数据
2.2 从机中读取数据
在从机33062中刷新库
2.3 为什么不推荐在从机中写入数据
从机中也出现了数据,且,数据是在主机中添加的,可以在从机中读取,实现了读写分离。
注意
:从机中也是可以插入数据的,但是并不推荐,因为插入到从机的数据就会造成紊乱
1.从机中插入数据是不会同步到主机上面去的。
2.如果不想去从机中插入数据,可以通过数据库锁来实现。