MySQL实现主从复制
在进行curd的同时,主服务器的复制数据库到从服务器中,保证数据不流失
环境介绍
系统环境:centos7.0 客户端连接工具:Xshell 远程文件传输工具:xftp 服务器(虚拟机): 主服务器:自己随便安装一个centos配置好ip地址和sshd即可 从服务器:同上
安装MySQL
基于rpm实现MySQL安装
# 查询有没有安装MySQL rpm -qa | grep -i mysql # 查询所有有关MySQL的文件 find / -name mysql # 删除存在MySQL的文件 rm -rf 文件路径 # 安装server rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm --force --nodeps # 安装客户端 rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm --force --nodeps # 主从服务器都需要进行安装!
登录MySQL
mysql -u root -p ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(2) # 出现错误(因为密码不正确) # 实现免密登录 # 修改配置文件 vi /etc/my.conf # 在msyqld下加上跳过授权 skip-grant-tables # 再次登录时需要重启MySQL服务 service mysqld restart # 再次登录,连续回车即可 # 免密登录不安全,所以进去之后重新设置密码 # 刷新系统权限表 mysql> flush PRIVILEGES; # 重新设置密码 mysql> alter user 'root'@'localhost' identified by '123456'; # 再次刷新权限表 mysql> flush PRIVILEGES; # 此时密码为123456 # 修改配置文件 vi /etc/my.conf # 将跳过授权注释掉 # 即可以用新的密码进行登录 # 此操作步骤,从服务器也需要
原理:
假设主服务器执行了任何的insert update delete
MySQL服务器户记录一个日志文件
a-bin.log => 保存的就是对用的sql语句
将这个日志文件通过网络手段复制给从服务器
从服务器获取这个a-bin.log文件之后,就会执行里面相应的操作
实现MySQL的主从复制
主服务器配置
# 先配置主服务器
# 修改配置文件
vi /etc/my.conf
# 添加以下内容
log_bin=master-a-bin
# 日志文件的格式
binlog_format=ROW
# 服务器的id,一定要是唯一的
server-id=1
# 对应需要实现主从复制的数据库
binlog_do_db=ddm(数据库名称)
# 添加完之后需要登录主服务器给从服务器授权
mysql> grant replication slave on *.* to 'root'@'ip地址前缀.%' identified by '123456';
# 刷新系统权限
mysql> flush PRIVILEGES;
从服务器配置
# 先配置主服务器
# 修改配置文件
vi /etc/my.conf
# 添加以下内容
log_bin=master-a-bin
# 日志文件的格式
binlog_format=ROW
# 服务器的id,一定要是唯一的
server-id=2
# 双主互相备份(表示从服务器可能是另外一台服务器的主服务器)
log-slave-updates=ture
设置并验证主从复制
# 重启主服务器和从服务器
service mysqld restart
# 查看主服务器的状态
mysql> show master status;
# 解释对应的一些名词
#File 生成的日志文件名
#Position 文件名所属的位置(偏移量)
#Binglog_Do_DB 需要实现的主从数据库
# 启动服务器 systemctl mysqld restart也可以
# 设置从服务器如何找到主服务器
# 登录从服务器
# 设置主从复制的日志和偏移量
# 让从机找到主机的日志名称
mysql> change master to master_host='主机ip地址',master_port=3306,master_user='root',master_password='123456',master_log_file='maste-a-bin.000001',master_log_pos=154;
# 启动slave数据同步
mysql> start slave;
# 停止slave的数据同步
mysql> stop slave;
# 查看slave的配置信息
mysql> show slave status\G;
出现connecting,说明还正在连接中
# 需要解决正则连接中的问题
# 外界用navicat客户端进行连接发现连接不上
- 防火墙问题
- 端口未开放
- 未授权
# 可以开放端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重新加载防火墙
firewall-cmd --reload
# 再次用navicat连接,则连接成功,但是没有将权限授予客户端
# 先登录mysql
# with grant option不仅仅授予增删改查的权限还授予权限的权限
mysql> grant all privileges on *.* to root@'%' identified by '123456' with grant option;
# 授权报错
Error 1819 (HY000): unkonwn error 1819
# 密码格式不正确
# 查看密码状态
mysql> show variables like 'validate_password%';
如果有上述报错的就按以下方式进行解决:
mysql> set global validate_password_policy=0;
mysql> set global validate_password_mixed_case_count=0;
mysql> set global validate_password_number_count=3;
mysql> set global validate_password_special_char_count=0;
mysql> set global validate_password_length=3;
# 再次查看密码状态
mysql> alter user 'root'@'localhost' identified with mysql_native_password by '123456';
mysql> flush PRIVILEGES;
# 再一次进行授权
mysql> grant all privileges on *.* to root@'%' identified by '123456' with grant option;
mysql> flush PRIVILEGES;
# 重启从服务器并查看状态
# 测试,先关闭slave,在开启
mysql> stop slave;
mysql> start slave;
mysql> show slave status\G;
测试
在主服务器数据里新增表并插入数据,然后进入从服务器进行查看是否有表和数据
mysql> show database;
mysql> use 数据库;
mysql> show tables;
mysql> create table user(id int primary key auto_increment,name varchar(20) not null)charset='utf8';
mysql> insert into user (name) values ('a');
# 然后去从服务器查看是否有数据
读写分离
读写分离必须基于主从复制才能实现
- 主从复制确实实现了高可用
- 但是主服务器挂掉之后,如何实现从服务器的自由切换?(缺点)
- 从服务区除了备份数据,基本上没有其他作用,并没有分担主服务器的压力
- 写数据是非常耗时的操作(基本上是读数据的一百倍不止)
进而出现:客户端写数据写入主服务器,读数据从从服务器进行读取