我这里是在自己的服务器中基于docker来实现(你也可以用虚拟机来实现这个,或者你有多台服务器也行)
回归正题-主从复制的实现,先看看我配置的结构,mycat分布式数据库中间件(你也可以用别的中间件,作者经过查找和对比,在不花钱的情况下这个是目前最理想的中间件之一,操作简单,社区活跃,开源免费),是用来实现读写分离的,mycat下篇文章在说
上图mysql_primary和mysql_secondary分别是主库和从库,我这里是基于dockerfile和docker-compose工具来构建mysql
docker和docker-compose可以看下我之前的文章
上图是mysql中的构建文件-无论主库还是从库都一样只是配置里面的内容有点不同
这个是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你对应你自己的容器编号
这里会出现日志文件的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;查看是否配置成功,如下图所示就可以了