MySQL 主从原理分析
- Master服务器数据提交后,会将数据写入到Binary log中
- Slave服务器通过IO线程监听Binary log日志,如果该日志发生变化,会将内容读取到并写入relay log(中继日志)中
- Relay线程监听relay log,如果该日志发生变化会将该日志增量的写操作执行一遍,写入数据文件
主机配置及IP
主机名 | 系统 | IP | 角色 |
---|---|---|---|
107 | centos7.5 | 192.168.0.107 | Master/写入 |
108 | centos7.5 | 192.168.0.108 | Slave/读取 |
109 | centos7.5 | 192.168.0.109 | Slave/读取 |
实现读写分离
- Master 配置
- 修改配置文件 my.cnf
添加如下vim /etc/my.cnf
#启用二进制文件 log-bin=mysql-bin #设置服务器唯一ID,用于区分主从服务器。 server-id=107
- 重启Mysql
systemctl restart mysqld
- 登录Mysql 进行授权
mysql -uroot -p
- 进入Mysql界面 在Master库创建一个账号,具备Replication Slave权限,提供给Slave库访问二进制日志使用
#创建用户
CREATE USER 'sluser'@'%' IDENTIFIED BY '123456';
#授权
GRANT REPLICATION SLAVE ON *.* TO 'sluser'@'%';
#刷新权限
flush privileges;
#查看状态
show master status;
- Slave 配置(俩个从数据库配置一样 除了id)
- 修改配置文件 my.cnf
添加如下vim /etc/my.cnf
#启用二进制文件 log-bin=mysql-bin #设置服务器唯一ID,用于区分主从服务器。 server-id=108
- 登录Mysql数据库
mysql -uroot -p
创建从数据库对主数据库监听
change master to master_host='192.168.0.107,master_port=3366,master_user = 'repl',master_password = '123456',master_log_file = 'mysql-bin.000001',master_log_pos = 2018;
master_host : master的ip或者域名
master_port : master的端口号 不写默认为3306
master_user: master 的登录名
master_password: master的密码
master_log_file: master 的 file 名
master_log_pos: master的position
- 启动从服务器复制功能
start slave;
- 查看服务状态
show slave status\G
测试主从复制
主库新建数据库 (test) 及数据表 (test)
添加数据
INSERT INTO `test`.`test`(`id`, `name`) VALUES (1, 'kang'),(2, 'yuan'),(3, 'zhao')
- Slave中自动复制
由此可见主从已经配置成功
遇到的问题解决
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
ERROR 1193 (HY000): Unknown system variable 'validate_password_policy'
- 问题原因
// 适用于sql的老版本如mysql5.0
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=4
// 新版本如mysql8.0就不支持了
// 为啥呢,进入mysql命令后,输入下面命令就清清楚楚了!
mysql> SHOW VARIABLES LIKE 'validate_password%';
// 结果如下
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.01 sec)
- 问题解决
// 调整设置密码策略
mysql> set global validate_password.policy=0;
Query OK, 0 rows affected (0.00 sec)
//调整设置密码长度
mysql> set global validate_password.length=1;
Query OK, 0 rows affected (0.00 sec)
再登录重新设置密码即可
ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
- 问题原因
io线程开启中无法对从服务器进行修改,因此我们需要关闭io线程 - 问题解决
mysql> STOP SLAVE IO_THREAD; //关闭线程
Query OK, 0 rows affected (0.00 sec)
mysql> change master to master_host='20.0.0.12', //指定主服务器
-> master_user='myslave', //管理用户名称
-> master_password='123456', //密码
-> master_log_file='master-bin.000002', //二进制文件
-> master_log_pos=154; //文件位置参数
Query OK, 0 rows affected, 2 warnings (0.00 sec) //提示成功
mysql> start SLAVE IO_THREAD; //开启io线程
Query OK, 0 rows affected (0.01 sec)
Last_IO_Error: error connecting to master 'repl@127.0.0.1:3316' - retry-time: 60 retries: 2 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
- 问题原因
Master 中 repl 密码的plugin是caching_sha2_password 导致连接不上,修改为mysql_native_password即可解决。 - 问题解决
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'root';