学习搭建MySQL主从分离
- 提升性能,我们会将数据库操作进行读写分离,写操作在主数据库(Master)完成,读操作在从数据库(Slave)完成
- 架构模式
- 一主一从 M-S
- 主主复制 M-S
- 一主多从 M-SSS
- 多主一从(5.7) MMM-S
- 联结复制 M-S-SS-S
一般都是读多写少,因此呈现的通常是一主多从的架构,如果一个应用是读少写多,则可以考虑多主一从。双 M 架构主要是为了方便随时切换主库,降低配置成本。
- 搭建一主一从
底层流程
-
在从库(Slave)中通过 change master 命令设置要同步数据的主库 IP、端口、用户名、密码;
-
在从库执行 start slave 命令启动两个线程,即上图中的 I/O Thread 和 SQL Thread;
-
其中 I/O Thread 会通过第一步设置的主库配置信息与主库(Master)建立长连接,主库检验完这些配置后,
-
从库传递的 binlog 同步位置读取 binlog 日志发送给从库(binlog 里面记录着主库所有更新记录);
从库拿到 binlog 日志后,会写入到一个为 Relay Log(中转日志)的本地文件;
SQL Thread 读取从库中的 Relay Log,解析命令,由从库执行完成数据同步。 -
主库和从库一旦建立连接后,主库会有一个专门的线程来维护与从库的长连接,以便新增的 binlog 日志能够源源不断地发送给从库进行数据同步。
docker命令
- docker ps 查看状态
- docker images 查看本地镜像
- systemctl daemon-reload
- systemctl restart docker.service
- 拉取mysql镜像docker pull mysql:latest
- 运行容器
启动主
- docker run -itd --name mysql-test -p 3306:3306(映射容器服务) -e MYSQL_ROOT_PASSWORD=123456(设置 MySQL 服务 root 用户的密码) mysql
启动从
- docker run -itd --name mysql-slave -p 3307:3307 -e MYSQL_ROOT_PASSWORD=123456 mysql/mysql-server
进入某个容器
- docker exec -it mysql-master bash
查找端口
- netstat -antup | grep docker
显示所有容器和启动
- docker ps -a
- docker start [容器id]
查看主mysql的信息
- show master status;
登录从mysql
登录容器,配置
-
从mysql的账号密码设置,为 mysql -hlocalhost -proot -p123456 -P3307
-
从mysql设置 :
``
change master to MASTER_HOST='127.0.0.1',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='binlog.000002',MASTER_LOG_POS=0;
``
- 启动 start slave;
- show slave status;
- 两个都是Yes才是配置成功
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
关闭主从同步
无法登录Mysql,执行如下
-
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-
flush privileges;
注意事项: uuid或者server-id相同会导致配置失败
Slave_SQL_Running:no解决:
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
` start slave;