mysql 主从复制

一. mysql 主从同步原理

1)在Slave 服务器上执行sart slave命令开启主从复制开关,开始进行主从复制。

2)此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。

3)Master服务器接收到来自Slave服务器的IO线程的请求后,其上负责复制的IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在Master服务器端记录的IO线程。返回的信息中除了binlog中的下一个指定更新位置。

4)当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容。

5)Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点。

#二. goodrain云平台整合mysql集群

2.1 实现步骤

  • 构建mysql镜像;
  • 构建集群镜像,发布云市场;
  • 利用云市场镜像构建mysql集群。

2.2 构建mysql镜像 目前github上已将代码更新, 设计到的修改主要有以下几点:

2.2.1 master节点和slave节点的uuid不同

用同一mysql镜像创建mysql主从同步集群时,发现每台mysql服务的uuid都是相同的,是因为在数据初始化时将uuid写在了/var/lib/mysql/auto.cnf文件中,这时候需要在mysql启动生成配置文件后修改此文件的uuid,确保每个mysql服务的uuid不相同即可。

解决:克隆代码,修改配置文件

2.2.2 master节点和slave节点的server_id不同。

如何确保每个mysql服务的server_id不同,k8s在创建容器时,会为每个容器创建创建一个主机名( 如:gr78648d-0),创建多个容器后面的数字会依次递增,所以可以利用这一特性生成不同的server_id(主机名数字部分 + 环境变量数字),然后在maser和slave使用不同的环境变量数字数字即可。

2.2.3 创建镜像,并将镜像推到dockerhub上

2.3 构建集群镜像,发布云市场。

2.3.1 创建master应用

配置–》环境变量

2.3.2 创建slave应用

2.3.3 设置slave依赖master

2.3.4 创建两台slave

####2.3.5 发布到云市场(实例为发送到团队中)

3. 利用云市场镜像构建mysql集群。

####3.1 创建容器

####3.2 进入master查看bin_log 详情

####3.3 进入slave 设置连接