搭建mysql主从服务
[!TIP]
基于docker和mysql 8搭建主从服务,一主二从的结构,并且把数据文件放置在master_slave_mysql 文件夹下
首先规划端口,master:3306,slave_one:3307,slave_two:3308
- 创建文件&文件夹
mkdir -p /root/master_slave_mysql/mysql_3306/conf \/root/master_slave_mysql/mysql_3306/data \/root/master_slave_mysql/mysql_3307/conf \/root/master_slave_mysql/mysql_3307/data \/root/master_slave_mysql/mysql_3308/conf \/root/master_slave_mysql/mysql_3308/data \
touch /root/master_slave_mysql/mysql_3306/conf/my.cnf/root/master_slave_mysql/mysql_3307/conf/root/master_slave_mysql/mysql_3308/conf
可以按照自己的喜好创建到不同的位置
-
修改配置
/root/master_slave_mysql/mysql_3306/conf/my.cnf加入
[mysqld] # 服务器唯一ID,默认值1 server-id=1 # 设置日志格式,默认ROW binlog_format=STATEMENT
/root/master_slave_mysql/mysql_3307/conf/my.cnf加入
[mysqld] # 服务器唯一ID,默认值1 server-id=2
/root/master_slave_mysql/mysql_3308/conf/my.cnf加入
[mysqld] # 服务器唯一ID,默认值1 server-id=3
[!NOTE]
server-id 在主从架构中是不能重复的,建议把主机设置为1,从机设置为其他值
-
拉取mysql镜像
docker pull mysql:latest
-
创建主mysql容器
docker run -d -p 3306:3306 \-v /root/master_slave_mysql/mysql_3306/conf/etc/mysql/conf.d \-v /root/master_slave_mysql/mysql_3306/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=自定义密码 \--name=master mysql:latest
-
创建从slave容器
-
创建第一个slave容器
docker run -d -p 3307:3306 \ -v /root/master_slave_mysql/mysql_3307/conf/etc/mysql/conf.d \ -v /root/master_slave_mysql/mysql_3307/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=自定义密码 \ --name=slave_one mysql:latest
-
创建第二个slave容器
docker run -d -p 3308:3306 \ -v /root/master_slave_mysql/mysql_3308/conf/etc/mysql/conf.d \ -v /root/master_slave_mysql/mysql_3308/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=自定义密码 \ --name=slave_two mysql:latest
-
-
配置主机
进入容器
docker exec -it master env LANG=C.UTF-8 /bin/bash
配置从机用于登录主机的用户
mysql -uroot -p
add user 'slave'@'%' identified with mysql_native_password by '123456';
授权
GRANT REPLICATION SLAVE ON *.* TO `slave_account`@`%`
[!WARNING]
上例授权范围在生产环境中是不被允许的,建议授权只到业务数据库,而不要授权全部数据库!比如:GRANT REPLICATION SLAVE ON order_server.* TO `slave_account`@`%`
刷新权限
flush privileges;
查看状态(记住
file
和position
字段的值,我的是binlog.000003和3049)show master status;
OK,到此主机配置结束了,然后退出容器(退出命令exit,需退出2次,第一次退出mysql,第二次退出容器)
-
配置从机(从机的配置步骤都一样,为节省篇幅仅拿一台从机配置说明配置步骤)
进入容器
docker exec -it slave_one env LANG=C.UTF-8 /bin/bash
mysql -uroot -p
执行(注意master_log_pos和master_log_file的值)
CHANGE master tomaster_host = '主机IP',master_port = 3306,master_user='slave',master_password='123456',master_log_file ='binlog.000003',master_log_pos=3049;
运行复制服务
START SLAVE;
[!NOTE]
stop slave : 停止复制服务
当遇到错误提示:This operation cannot be performed with a running replica io thread; run STOP REPLICA IO_THREAD FOR CHANNEL ‘’ first时,请执行 STOP REPLICA IO_THREAD FOR CHANNEL ‘’
验证是否成功
show slave status \G;
出现如下:Slave_IO_Running: Yes,Slave_SQL_Running: Yes 则成功;若不成功,请看Last_IO_Error和Last_SQL_Error中的表述
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: xxx.xx.xxx.xxxMaster_User: slave_accountMaster_Port: 3306Connect_Retry: 60Master_Log_File: binlog.000003Read_Master_Log_Pos: 3049Relay_Log_File: a066fb82d4ba-relay-bin.000002Relay_Log_Pos: 594Relay_Master_Log_File: binlog.000003Slave_IO_Running: YesSlave_SQL_Running: Yes...Last_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error:...
[!WARNING]
-
在主从架构配置完成之前,不要对主/从数据库做:增删数据库和表以及增删查改数据的操作。
-
主从架构配置完成之后,不要对从表做增删改的操作,无论是对表,数据库,行,都不要做。不然可能出现失败
-