MySQL主从复制

MySQL主从复制

参考文章:mysql主从复制

做完项目之后,翻翻以前的博客,发觉之前配置了SpringBoot动态选择数据源,然后仔细想想当时MySQL的主从复制并没有弄出来,今儿就来弄一下MySQL的主从复制,加上之前的动态选择数据源,真正向读写分离进一步靠近。同时也向分布式一步一步靠近。

由于使用了Docker配置,因此我将在Docker上进行MySQL的主从复制的配置。当然实际生产环境中,MySQL的主从复制应该是由两台机进行的,原因是当单机的MySQL已经无法承载其用户体量的时候,应考虑进行读写分离。而在Docker配置两个MySQL纯属练习。目的是掌握核心配置步骤。(讲真,还是因为Docker比较方便)当然,本文还是会讲下如何不使用Docker进行主从配置,其实道理都是一样的。

Docker容器搭建MySQL主从复制

Docker下载MySQL

  1. 在Docker上输入命令 sudo docker search mysql,当然如果你是root,请无视掉sudo。
  2. 将mysql pull到本地,执行命令 sudo docker pull mysql:5.6.40,本例使用mysql:5.6.40,当然什么版本都可以,但是有一点必须注意的是 主从容器的MySQL版本一定要一致
  3. 使用 sudo docker images 看看是否已经下载好了~,由于我之前已经下载好了,所以可以看到下图的情况

Docker images

(请忽略掉hello-world~)

Docker运行MySQL

  1. 在主机下建立/mysql/conf,/mysql/logs,/mysql/data这三个文件夹,同时创建一个slave的文件夹,用来存放从服务器的mysql配置,当然也可以在/mysql/conf下建立两个配置文件:master.cnf,slave.cnf。关于这两个配置文件的内容可以参考这篇文章:docker配置mysql主从复制。当然整个docker配置也可以参考这个。不过我更倾向于在容器内设置,然后重启这种方法
  2. 运行容器:

运行主容器:sudo docker run -p 3306:3306 –name mysql-master-5.6.40 -v $PWD/mysql/conf:/etc/mysql/conf.d -v $PWD/mysql/logs:/logs -v $PWD/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=’123456’ -d mysql:5.6.40

运行从容器:sudo docker run -p 3307:3306 –name mysql-slave-5.6.40 -v $PWD/mysql/slave/conf:/etc/mysql/conf.d -v $PWD/mysql/slace/logs:/logs -v $PWS/mysql/slave:/var/lib/mysql -e MYSQL_ROOT_PASSWORF=’123456’-d mysql:5.6.40

解释一下:

  • -p:-p参数中,3306:3306,冒号前表示主机的端口,冒号后表示容器的端口,看看从容器就知道了,3307:3306,将容器的3306端口映射到主机的3307端口。
  • -v:将主机目录的/mysql/conf挂载到容器的/etc/mysql/conf.d下,($PWD表示获取当前目录),当然也可以指定文件:-v $PWD/mysql/conf/master.cnf:/etc/mysql/conf.d/master.cnf这样也是可以的
  • -e:初始化root用户的密码

运行结果如下所示:
docker下运行的容器

Docker MySQL主从配置

主容器配置

  1. 进入到容器当中,执行命令sudo docker exec -it bash,其中的container-id是上一图中的container-id。首先上图第二个是主容器,所以sudo docker exec -it 477 bash就可以了,container-id不用太长,取前面的2,3位就行。
  2. 进入到容器之后,找到/etc/mysql

容器中的/etc/mysql

可以看到下面有这几个东西,我看了网上说在conf.d下写my.cnf~但是我看到my.cnf里的内容。
my.cnf的内容

里面明确写了包括这两个文件夹下的东西,所以之前说的master.cnf是可以的,当然我看了下mysql.conf.d下的东西,有一个mysqld.cnf的配置文件,我索性就在下面配置了

mysqld.cnf的配置

如上图,重要配置代码如下:

1
2
3
[mysqld]
log-bin=mysql_bin
server-id=226 //默认为1,服务器唯一id,一般取IP的最后一段,我这里参考了上面博客的,只要唯一就行。

哦对了,在docker容器里是没有vim和gedit的,这些东西要自行安装,在容器外安装没用,得在容器里安装:执行命令 apt-get update之后,再执行命令apt-get install vim这样就可以使用vim去编辑了。(好麻烦感觉,在宿舍网络差的10k/s也是很迷人)

  1. 主容器重启:

退出docker容器后,使用命令:sudo docker restart 进行重启容器

从容器配置

从容器配置跟主容器配置基本一致。

  1. 进入容器内
  2. 找到/etc/mysql/mysql.conf.d/mysqld.cnf文件,添加以下代码
1
2
3
[mysqld]
log-bin=mysql_bin
server-id=222
  1. 退出容器,重启容器,sudo docker restart

至此,在容器上的配置已经完成了,此时应转入到mysql里面的配置。

mysql的主从配置

主服务器操作
  1. 打开主容器的mysql,连接上之后,打开命令行界面。我使用的是Navicat,所以我这样说,如果各位用惯mysql的纯命令行也行的哈。
  2. 查看主容器状态

mysql主容器状态

记住其中的File,Position,待会有用

  1. 授权给从容器

授权

1
mysql> GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456';

解释一下上面的sql语句:‘slave’@‘%’中slave表示User,即账号名,像root一样。而后面的%表示Host,此时可以填入从服务器的ip地址。identified by ‘123456’表示设置密码。

从服务器操作

从服务器只需要配置一下代码即可

1
mysql> change master to master_host='119.119.119.119', master_user='slave', master_password='123456', master_log_file='mysql_bin.000001', master_log_pos='416262';

解释一下:

  • master_host:这里表示的是主服务器的ip地址
  • master_user:这里表示主服务器中登录的账户名,即上述在主服务器中设置的账户
  • master_password:这里表示密码,上面主服务器设置的登录密码
  • master_log_file:主服务器的日志文件名,在上面需要记住的file,即在主服务器通过show master status查看到的file列
  • master_log_pos:主服务器日志开始同步的位置

然后执行命令 start slave;启动从服务器复制功能

检验从服务器复制功能

在从服务器中执行命令 show slave status ,当Slave_IO和Slave_SQL为Yes时,表示正常执行,否则都是错误的

主服务器测试数据库

从服务器测试数据库

主服务器里的表

从服务器数据表

由上图可见,从服务器实现了在主服务器上通过二进制文件进行复制的操作。

-------------本文结束感谢您的阅读-------------