mysql实现主从复制和读写分离


MySQL实现主从复制

1588660571291

在进行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(数据库名称)

1588661225959

# 添加完之后需要登录主服务器给从服务器授权
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;

1588661883488

# 解释对应的一些名词
#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;

1588662325968

# 启动slave数据同步
mysql> start slave;
# 停止slave的数据同步
mysql> stop slave;
# 查看slave的配置信息
mysql> show slave status\G;

1588662443607

出现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%';

1588663050983

如果有上述报错的就按以下方式进行解决:

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;
# 再次查看密码状态

1588663194079

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;

1588663389525

测试

在主服务器数据里新增表并插入数据,然后进入从服务器进行查看是否有表和数据

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');

# 然后去从服务器查看是否有数据

读写分离

读写分离必须基于主从复制才能实现

  1. 主从复制确实实现了高可用
  2. 但是主服务器挂掉之后,如何实现从服务器的自由切换?(缺点)
  3. 从服务区除了备份数据,基本上没有其他作用,并没有分担主服务器的压力
  4. 写数据是非常耗时的操作(基本上是读数据的一百倍不止)

进而出现:客户端写数据写入主服务器,读数据从从服务器进行读取


文章作者: virus
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 virus !
 上一篇
导出到excel 导出到excel
导出成excel下载到本地 批量将表数据导出成excel下载到本地,在laravel使用第三方插件库来完成此项工作 插件库:https://packagist.org/packages/maatwebsite/excel 官网: http
2020-05-09
下一篇 
PHP采集知识 PHP采集知识
序言采集文章著名的:火车头、收费、自定义比较差 需要自己编写程序采集目标网站的信息为我所用。 采集必要的知识点: 知道PHP发起网络请求的相关函数: file_get_contents fsockoptn curl 正则表达式/xpa
2020-05-03
  目录