读和写所有压力都由一台数据库承担,压力大。数据库服务器磁盘损坏则数据丢失,单点故障。读写分离要以主从复制为基础。
MySQL主从复制:
mysql主从复制是一个异步的复制过程,底层是基于mysql数据库自带的二进制日志功能,就是一台或多台mysql数据库(slave,从库)从另一台mysql数据库(master,主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。mysql主从复制是mysql数据库自带功能,无需借助第三方工具。
mysql复制过程分为三步:
- master将改变记录到二进制日志(binary log)
- slave将master的binary log拷贝到它的中继日志(relay log)
- slave重做中继日志中的事件,将改变应用到自己的数据库中
配置主从数据库:
准备工作:
两台服务器,分别安装mysql并启动服务成功:
主库:192.168.153.131
从库:192.168.153.129
在本地SQLyog连接两个数据库,如果连接不成功,在虚拟机中将主从数据库所在的虚拟机关闭防火墙
systemctl stop firewalld
配置-主库master:
step1:修改MySQL数据库主库的配置文件
vim /etc/my.cnf
log-bin=mysql-bin #[必须]启用二进制日志
server-id=131 #[必须]服务器唯一id
step2:重启MySQL服务
systemctl restart mysqld
step3:登陆MySQL数据库(mysql -uroot -proot),执行下面SQL
grant replication slave on *.* to 'pin'@'%' identified by 'pin99';
注:上面SQL的作用是创建一个用户pin,密码为pin99,并且给pin用户授予replication slave权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。
step4:登陆MySQL数据库,执行下面SQL,记录下结果中的file和position的值,就不要再在主库进行任何操作,否则这两个值会变化。
show master status;
配置-从库slave:
step1:修改MySQL数据库的配置文件
vim /etc/my.cnf
server-id=129 #[必须]服务器唯一id
step2:重启MySQL服务
systemctl restart mysqld
step3:登陆MySQL数据库(mysql -uroot -proot),执行下面SQL
change master to master_host='192.168.153.131' , master_user='pin', master_password='pin99', master_log_file='mysql-bin.000004', master_log_pos=154;
如果报错已有一个slave线程正在运行,则先停掉slave:
stop slave;
start slave;
step4:登陆MySQL数据库,执行下面SQL,查看从数据库的状态
show slave status\G
当显示如下信息,则主从表创建成功,如果Slave_IO_Running显示的是Connecting而非yes,是因为防火墙没关闭,执行"systemctl stop firewalld"关闭防火墙即可。
测试:
在主库131创建新的数据表master_test,在表中写入数据,刷新从库129,可以查询到主库创建的表master_test和向表中插入的数据.