mysql主从配制
当单台 MYSQL 服务器无法满足当前网站流量时的优化方案。需要搭建 mysql 集群技术。
复制功能:
- 数据分布
- 负载均衡(读)
- 备份
- 高可用和故障切换
- MySQL升级测试
复制方式:
- 主–从复制
- 主–主复制
- 半同步复制
复制原理:
Mysql 中有一种日志叫做 bin 日志(二进制日志)。这个日志会记录下所有修改了数据库的SQL 语句(insert,update,delete,create/alter/drop table, grant 等等)。
主从复制的原理其实就是把主服务器上的 bin 日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
复制流程图:
复制过程:
- 主节点必须启用二进制日志,记录任何修改了数据库数据的事件。
- 从节点开启一个线程(I/O Thread)把自己扮演成 mysql 的客户端,通过 mysql 协议,请求主节点的二进制日志文件中的事件
- 主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
- 从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具体哪一个二进制日志文件内部的哪一个位置(主节点中的二进制文件会有多个,在后面详细讲解)。
- 从节点启动另外一个线程(sql Thread ),把 Relay log 中的事件读取出来,并在本地再执行一次。
复制中线程的作用:
从节点:
- I/O Thread: 从 Master 节点请求二进制日志事件,并保存于中继日志中。
- Sql Thread: 从Relay log 中读取日志事件并在本地完成重放。
主节点:
- Dump Thread:为每个 Slave 的 I/O Thread 启动一个 dump 线程,用于向从节点发送二进制事件。
**思考:**从节点需要建立二进制日志文件吗?
看情况,如果从节点需要作为其他节点的主节点时,是需要开启二进制日志文件的。这种情况叫做级联复制。如果只是作为从节点,则不需要创建二进制文件。
Mysql复制特点:
- 异步复制:主节点中一个用户请求一个写操作时,主节点不需要把写的数据在本地操作完成同时发送给从服务器并等待从服务器反馈写入完成,再响应用户。主节点只需要把写入操作在本地完成,就响应用户。但是,从节点中的数据有可能会落后主节点,可以使用(很多软件来检查是否落后)
- 主从数据不一致。
主从复制配置过程:
主节点:
- 启用二进制日志。
- 为当前节点设置一个全局唯一的server_id。
- 创建有复制权限的用户账号 REPLIACTION SLAVE ,REPLIATION CLIENT。
从节点:
- 启动中继日志。
- 为当前节点设置一个全局唯一的server_id。
- 使用有复制权限的用户账号连接至主节点,并启动复制线程。
安装MySQL数据库
1、下载并安装MySQL官方的 Yum Repository
[root@localhost ~]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
2、yum 安装 Repository
[root@localhost ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm
3、开始安装MySQL服务器
[root@localhost ~]# yum -y install mysql-community-server
4、启动MySQL
[root@localhost ~]# systemctl start mysqld.service
5、查看MySQL运行状态,运行状态
57版本:
#查看密码策略
show variables like '%validate_password_policy%';
show variables like '%validate_password_length%';
#修改密码策略
set global validate_password_policy=0;
set global validate_password_length=1;
8.X版本:
#查看密码策略
show variables like '%validate_password.policy%';
show variables like '%validate_password.length%';
#修改密码策略
set global validate_password.policy=0; #设置为弱口令
set global validate_password.length=1; #密码最小长度为1
[root@localhost ~]# systemctl status mysqld.service
6、此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:
[root@localhost ~]# grep "password" /var/log/mysqld.log
7、进入数据库
[root@localhost ~]# mysql -uroot -p
8、修改初始化密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '1qaz!QAZ';
9、重新登录mysql,至此MySQL安装完毕
MySQL主从配置
场景:
MySQL01:10.0.50.91 主
MySQL02:10.0.50.88 从
主MYSQL配置
1、给从数据库设置授权用户(创建复制账号)
grant replication slave on *.* to 'javen'@'10.0.50.88' identified by '123456';
flush privileges;
2、修改主mysql配置,在my.cnf中添加一下内容
server-id=1 ID号
log_bin=master_bin 启用主库二进制文件
log_slave_updates=true
3、重启mysql服务
[root@localhost ~]# service mysqld restart
4、登录mysql
mysql -uroot -p
5、查看主服务器上当前的二进制日志名和偏移量值
mysql> show master status;
从MYSQL配置
1、修改my.cnf配置
vi /etc/my.cnf
-------------------添加以下内容--------------------
server-id=3 ID号
relay_log=relay-log-bin 中继日志
relay_log_index=slave-relay-bin.index
2、重启mysql服务
[root@localhost ~]# service mysqld restart
3、登录mysql
mysql -uroot -p
4、建立从mysql与主mysql连接
change master to master_host='10.0.50.91',master_user='javen',master_password='123456',master_log_file='master_bin.000003',master_log_pos=599;
4、开启slave 启动复制线程
START SLAVE 可以指定线程类型:IO_THREAD ,SQL_THREAD, 如果不指定,则两个都启动。
start slave(关闭:stop slave)
5、查询slave状态
show slave status \G
6、验证是否可以正常同步
过程:在主mysql创建一个数据库,去从数据库里面看看是否同步过去了。

浙公网安备 33010602011771号