数据库主从分离实现(也可理解为读写分离)
好处:1:将读操作和写操作分离到不同的数据库上,避免主服务器出现性能瓶颈
2:主服务器进行写操作时,不影响查询应用服务器的查询性能,降低阻塞,提高并发
3:数据拥有多个容灾副本,提高数据安全性,同时当主服务器故障时,可立即切换到其他服务器,提高系统可用性
主数据库(master)、从数据库(slave)通过配置来设置他们的关系
原理:让主数据库处理事务性增、改、删操作,让从数据库处理查询操作,对主数据库的进行增删改操作造成的变更会
同步到从数据库里,主数据库在执行操作后,会在Binary log里打印日志,然后从数据库会从主数据库里获取改日志然后再
自己身上完全顺序执行日志中所记录的各种操作
笔者的环境:windows的mysql8
虚拟机上的centos,也安装了mysql8
windows的mysql当主数据库,centos上的当从数据库
实现步骤:
第一步:在window上打开mysql的配置文件my.ini,在[mysqld]下面添加几行,然后重启mysql
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index
解释:
server-id=1 //给数据库服务的唯一标识,一般为大家设置服务器Ip的末尾号
window停止mysql:net stop mysql
window启动mysql:net start mysql
第二步:重启完成后,登陆mysql,
show master status; //用来查看master信息。File字段很关键,
第三步:在centos上打开mysql的配置文件/etc/my.cnf(mysql的默认路径),在[mysqld]下面添加几行,并重启服务。注意重启服务要管理员权限
server-id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
centos里重启mysql:service mysqld restart
centos里停mysql:/etc/init.d/mysql stop 需要/etc/init.d/mysql文件存在才行
centos里启mysql:/etc/init.d/mysql start 需要/etc/init.d/mysql文件存在才行
第四步:在window的mysql创建一个用户,并给予权限,这个用户是给从库用的,用来拿二进制文件。
//创建用户,%意味着都是能连数据库
create user 'repl'@'%' identified by 'Repl@123!';
给与REPLICATION SLAVE 权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' ;
刷新操作
flush privileges;
注:笔者执行时发现在授权时使用identified by和with option时一直报错,所以我在创建用户的时候就赋予了密码。
也可给用户赋予所有的权限,其中包括REPLICATION SLAVE
grant all privileges on . to ‘repl’@’%’;
第五步:在centos里登陆mysql后执行
change master to master_host='192.168.1.16',master_port=3306,master_user='repl',master_password='Repl@123!',
master_log_file='master-bin.000001',master_log_pos=0;
注:192.168.1.16是主数据库的ip
3306:是著数据库的端口
repl:为我们在第四步创建的用户
Repl@123!:用户的密码
master-bin.000001:这个是第二步所的到的那个File字段的值
master_log_pos=0:这个为开始的位置,这个很重要,若从数据库崩了,记得这个数,在修复后设置为该值,则会接着上次的地方同步数库到从数据库里。
第6步:在myslq先执行start slave
然后
show slave status \G;
\G表示把内容纵向显示,
重点关注红框区域,两个running都必须是Yes。一旦不是yes,看下面,下面会有错误提示。
这块区域会有错误提示。第七步:验证
若前面几步都完成,且第六步的两个Running都是Yes,在主数据库中创建一个数据表,会发现在从数据库中也出现了相同的表(也可在主数据库里创建database进行验证)
主数据库:
从数据库:
这里还记录笔者在实践中遇到的一些问题:
1:mysql8.0 引入了新特性 caching_sha2_password;这种密码加密方式客户端不支持;
客户端(navicat)支持的是mysql_native_password 这种加密方式;select host,user,plugin from mysql.user;
//plugin就是密码加密方式
在这种情况下添加用户:
1:create user 'replslave'@'%' identified by 'Slave@123';
//创建用户,%意味着都是能连数据库
2:grant all privileges on *.* to 'replslave'@'%';
3:alter user 'replslave'@'%' identified with mysql_native_password by 'Slave@123';
//修改加密方式,并赋予新的密码
2:笔者在从数据库配置时发现Slave_IO_Running一直处于Connecting状态,Slave_IO_State也是Connecting的状态。
后续依据错误提示一点点的排查,发现当把window的防火墙关了时,在centos上用repl用户远程登陆成功,但当防火墙打开时
远程登陆就会失败;提示:ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.1.16’ (110)
最后做一些笔记:
centos里打开端口(iptables防火墙)
1:vi /etc/sysconfig/iptables
2:模仿已有的22端口添加需要开的端口
3: 保存退出
4:systemctl restart iptables.service //重启防火墙
5: systemctl enable iptables.service //设置防火墙开机启动
6: /sbin/iptables -L -n来查看防火墙开了那些端口
关防火墙:service iptables stop
开防火墙:service iptables start
stop slave;//关闭主从跟踪
每次改配置后记得重启数据库。
从库不要做增删改操作
从库的版本要比主库的版本高