前言:
企业中的业务通常数据量都比较大,而单台数据库在数据存储、安全性和高并发方面都无法满足实际的需求,所以需要配置多台主从数据服务器,以实现主从复制,增加数据可靠性,读写分离,也减少数据库压力和存储引擎带来的表锁定和行锁定问题。
一.准备阶段
我这里使用的是两台服务器使用Docker分别创建一个Mysql实例,搭建一主一从,读写分离的架构。
1.1 Master相关准备
-
启动Master 节点
docker run -p 3310:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.34
-
在/mydata/mysql-master/conf 创建文件 my.cnf,并做如下配置
[mysqld]
\##设置server_id , 同一局域网中需要唯一
server_id=101
\##指定不需要同步的数据库名称
binlog-ignore-db=mysql
\##开启二进制日志功能
log-bin=mall-mysql-bin
\##设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
\##设置使用二进制日志格式(mixed,statement,row)
binlog_format=mixed
\##而简直日志过期清理时间,默认值为0,表示不自动清理
expire_logs_days=7
\##跳过主从复制中遇到的所有错我或指定类型的错误,避免slave端复制中断
\##如:1062错误指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
-
重启主库
docker restart mysql-master
1.2 Slave相关准备
1.启动slave节点
docker run -p 3310:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.34
2.在/mydata/mysql-slave/conf 创建文件 my.cnf,并做如下配置
[mysqld]
\##设置server_id , 同一局域网中需要唯一
server_id=102
\##指定不需要同步的数据库名称
binlog-ignore-db=mysql
\## 开启二进制日志功能,以备slave作为其他数据库实例的master时使用
log-bin=mall-mysql-slave1-bin
\##设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
\##设置使用二进制日志格式(mixed,statement,row)
binlog_format=mixed
\##而简直日志过期清理时间,默认值为0,表示不自动清理
expire_logs_days=7
\##跳过主从复制中遇到的所有错我或指定类型的错误,避免slave端复制中断
\##如:1062错误指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
\## relay_log 配置中继日志
relay_log=mall-mysql-relay-bin
\## log_slave_updates 表示 slave 将复制时间写进自己的二进制日志
log_slave_updates=1
\## slave设置为只读 (具有super权限的用户除外)
read_only=1
3.重启从库
docker restart mysql-slave
1.3查看容器是否正常运行
docker ps -- 查看运行中的容器
docker ps -a -- 查看所有未被删除的容器
docker logs -f 容器ID -- 查看该容器的运行日志
如果容器未被成功启动,通过查看该容器的日志排查问题,报错某临时文件夹不存在的话,可尝试更换一个稳定的mysql版本。
二.搭建主从复制
2.1主库设置
-
进入Master容器内部并登录mysql
[root@VM-12-8-centos ~]# docker exec -it mysql-master bin/bash
root@5242e0x86fx6:/# mysql -uroot -p123456
2.在Master上建立帐户并授权 Slave
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
3.查询master状态
mysql> show master status;
其中File 与 Position 的值需要我们暂时记住:
File:mysql-bin.000001 为当前binlog日志文件名
Position:472775 为当前binlog日志偏移量
注意:此步骤后不要再操作主库,防止主库binlog状态值变化
2.2从库设置
1.进入Slave容器内部并登录mysql
[root@VM-12-10-centos ~]# docker exec -it master-slave bin/bash
root@1e2a0354c906:/# mysql -uroot -p123456
2.与Master建立主从关系
CHANGE MASTER TO MASTER_HOST='主机的ip地址',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_PORT=3310,
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=438;
其中:
CHANGE MASTER TO MASTER_HOST=’主机的IP地址’,
MASTER_USER=’slave'(刚刚配置的用户名),
MASTER_PASSWORD=’123456′(刚刚授权的密码),
Master_port=3310 (Master主机开放的端口,)
MASTER_LOG_FILE=’mysql-bin.具体数字’,MASTER_LOG_POS=具体值(之前的Position);
3.启动从库复制功能
start slave;
在这里出现错误,可通过以下命令重置。
stop slave;
reset master;
4.查看从服务器状态
show slave status\G;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 101.33.199.5
Master_User: slave
Master_Port: 3310
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 472775
Relay_Log_File: mysql-relay.000002
Relay_Log_Pos: 471386
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 472775
Relay_Log_Space: 471589
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: d7dcc566-bfd8-11ed-800d-0242ac110007
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
ERROR:
No query specified
其中:Slave_IO_Running 与 Slave_SQL_Running都是Yes则说明主从配置成功!
当Slave_IO_Running: No 时,在再看往下查看异常Error信息,也可重复以上的步骤:重置主从配置->获取Master日志名与偏移量-> 重新建立主从配置
此时,在主库上的DDL及插入、更新都会在从库进行复制。
至此,MySQL主从复制搭建完成。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154443.html