mycat实现主从复制读写分离-主从复制

我这里是在自己的服务器中基于docker来实现(你也可以用虚拟机来实现这个,或者你有多台服务器也行)

回归正题-主从复制的实现,先看看我配置的结构,mycat分布式数据库中间件(你也可以用别的中间件,作者经过查找和对比,在不花钱的情况下这个是目前最理想的中间件之一,操作简单,社区活跃,开源免费),是用来实现读写分离的,mycat下篇文章在说

mycat实现主从复制读写分离-主从复制

上图mysql_primary和mysql_secondary分别是主库和从库,我这里是基于dockerfile和docker-compose工具来构建mysql

docker和docker-compose可以看下我之前的文章

mycat实现主从复制读写分离-主从复制

上图是mysql中的构建文件-无论主库还是从库都一样只是配置里面的内容有点不同

mycat实现主从复制读写分离-主从复制

这个是mysqld.cnf的配置内容

[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket        = /var/run/mysqld/mysqld.sock
datadir        = /var/lib/mysql
#log-error    = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address    = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
sql_mode     = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

 

docker-compose.yml是dockerfile的启动文件里面有关使用的镜像/端口/文件挂载等内容,其中的networks你要看你自己服务器中docker有没master这个网络,可以用下面的语句查询新建

查看网络

docker network ls

创新新网络

docker network create master

services的内容:image是对应的mysql镜像-你可以根据你的情况更改镜像,container_name-镜像名,volumes-是对应的文件挂载,environment-是环境变量

version: '2'

networks:
  default:
    external:
      name: master

services:
   mysql_primary:
      image: mysql_master
      container_name: mysql_primary
      restart: always
      build: .
      ports:
       - 3306
      volumes:
       - ./my.cnf:/etc/my.cnf
       - ./data:/var/lib/mysql
       - ./conf:/etc/mysql/conf.d
       - /home/dump_primary:/home/dump
       - ./confd:/etc/mysql/mysql.conf.d
      environment:
       - MYSQL_ALLOW_EMPTY_PASSWORD=yes
       - MYSQL_USER=main
       - MYSQL_PASSWORD=*****
       - TZ=Asia/Shanghai
       - LANG=C.UTF-8

从库的

version: '2'

networks:
  default:
    external:
      name: master

services:
   mysql_secondary:
      image: mysql_master
      container_name: mysql_secondary
      restart: always
      build: .
      ports:
       - 3306
      volumes:
       - ./my.cnf:/etc/my.cnf
       - ./data:/var/lib/mysql
       - ./conf:/etc/mysql/conf.d
       - /home/dump_secondary:/home/dump
       - ./confd:/etc/mysql/mysql.conf.d
      environment:
       - MYSQL_ALLOW_EMPTY_PASSWORD=yes
       - MYSQL_USER=main
       - MYSQL_PASSWORD=*****
       - TZ=Asia/Shanghai
       - LANG=C.UTF-8
      

Dockerfile也是启动的相关配置,from后面是对应的镜像和版本-最好要和docker-compose.yml中指定的镜像一致否则会下载多余的mysql镜像的

FROM mysql:5.7

ADD ./init.sql /docker-entrypoint-initdb.d/

RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DB_SQL

my.cnf-这个是主从的关键配置

[mysqld]
server-id=1                 
#主库添加
log-bin=master-bin     #主库添加
pid-file    = /var/run/mysqld/mysqld.pid
socket        = /var/run/mysqld/mysqld.sock
datadir        = /var/lib/mysql
#log-error    = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address    = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
sql_mode     = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

下面是从库的

[mysqld]
server-id=2
#这个id必须不能和主数据库相同
read-only=on #设置该数据库是只读状态
relay-log=relay-bin  #这个也是要的
pid-file    = /var/run/mysqld/mysqld.pid
socket        = /var/run/mysqld/mysqld.sock
datadir        = /var/lib/mysql
#log-error    = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address    = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
sql_mode     = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

 

这样就完成了主从的配置,接下来就在你自己的服务器去到主从库的位置

运行  docker-compose up -d 构建出主从数据库的容器

 

接下来要进入主库的容器 70096你对应你自己的容器编号

mycat实现主从复制读写分离-主从复制

mycat实现主从复制读写分离-主从复制

这里会出现日志文件的File和position,这个在后面会用的到
 

接下了进入到从库中执行,如果你是3306端口的话可以不写Master_Port

change master to master_host='120.24.5.**',master_user='root',master_password='', master_log_file='master-bin.000001',master_log_pos=13608,Master_Port=32778;

master_host:主数据库IP
master_user:主数据库所设置的远程连接用户名
master_password:主数据库所设置的远程连接密码
master_log_file=‘master-bin.000001’:所生成的二进制日志文件,在上一张图片中有显示)
master_log_pos=13608:二进制日志文件的端口号(上张图片有显示)

Master_Port=32778  这个是指定mysql的端口默认3306

启动slave同步(在数据库中) START SLAVE;   这样就可以了(如果配置错了会报连接中或者其他失败提示,需要先暂停同步才能再次同步stop slave

最后通过

show slave status\G;查看是否配置成功,如下图所示就可以了

mycat实现主从复制读写分离-主从复制