数据库主从复制和读写分离

主从复制

一、主从复制的介绍

  MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为我再Master端执行了一条SQL命令,那么在Salve端同样会执行一遍,从而达到主从复制的效果。

二、主从复制的原理

 MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为我在Master端执行了一条SQL命令,那么在Salve端同样会执行一遍,从而达到主从复制的效果。  从库生成两个线程,一个I/O线程,一个SQL线程;  i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中; 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;  SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

三、主从复制服务器配置

主从复制环境配置

服务器准备两台

192.168.196.176(主 mysql)

192.168.196.177(从 mysql)

四、安装步骤:

  1. 先检查系统是否装有mysql

rpm -qa | grep mysql

2、 下载mysql的repo源

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

 报错: -bash: wget: 未找到命令

 安装插件  yum -y install wget

      安装mysql-community-release-el7-5.noarch.rpm包

sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

  3、安装MySQL

sudo yum install mysql-server

    重置MySQL密码

mysql -u root

报错:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

原因:原因是/var/lib/mysql的访问权限问题。

chown root /var/lib/mysql/

     重启MySQL服务

service mysqld restart

     接着登陆设置密码

mysql -u root

use mysql;

update user set password=password('root') where user='root';

exit;

接着继续重启MySQL服务

service mysqld restart

      接着设置Root账户远程连接密码

 mysql -u root -p

      GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; 

重启服务器 service mysqld restart

 

     使用外网工具连接MySQL

关闭防火墙

systemctl stop firewalld.service

4、服务器节点    192.168.196.176

 

vi /etc/my.cnf  新增以下内容

server_id=176  ###服务器id(一般跟服务器的ip一致)

log-bin=mysql-bin   ###开启日志文件

重启mysql服务 service mysqld restart

验证是否已经配置成功

show variables like '%server_id%';

能够查询对应配置文件中的server_id 说明已经配置成功

show master status;

能够看到同步的文件,和行数 说明已经配置成功。

5、

服务器节点   192.168.196.177

克隆服务器

vi /etc/my.cnf

server_id=177  ###从服务器server_id

log-bin=mysql-bin  ###日志文件同步方式

binlog_do_db=test  ###同步数据库(多个数据库用,相隔)

 

重启mysql服务 service mysqld restart

验证是否已经配置成功

show variables like '%server_id%';

能够查询对应配置文件中的server_id 说明已经配置成功

从服务器同步主服务器配置

change master to master_host='192.168.196.175',master_user='root',master_password='root',

         master_log_file='mysql-bin.000001',master_log_pos=120;

开始同步 

start slave

检查从服务器复制功能状态

SHOW SLAVE STATUS

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

解决办法

因为服务器克隆的时候交UUID产生了重复 ,解决办法

 

Cat  /etc/my.cnf

cd /var/lib/mysql

rm -rf auto.cnf

重启服务器即可

service mysqld restart

另一个错误的解决办法:

五、主从复制的效果

在176服务器新建一个test数据库,那么在177服务器也会同步相应的操作。

重启服务器以后,数据库的主从复制效果消失,要重新设立同步的进程。

读写分离配置(使用mycat)

一、配置mycat

1、上传mycat的安装包到Linux系统  /usr/local

2、配置文件

(1) schema。xml配置文件(配置虚拟访问的数据库、实际需要读写分离的数据库,数据库实际的地址用户密码)

 

(2 ) server.xml  配置虚拟访问地址的角色

 

3、启动

1、进入bin目录   启动MyCat

./mycat start  

停止MyCat

./mycat stop

2、查看/usr/local/mycat/logs wrapper.log日志 如果是为successfully 则启动成功

关闭防火墙:systemctl stop firewalld.service

只可读的账号      user  user  端口号8066

可读可写的账号    root  123456  端口号8066

启动时遇到问题解决:https://blog.csdn.net/meilididiao/article/details/79865994

效果图:

4、使用springboot项目整合动态数据源,实现读写分离

.配置多个数据源,根据业务需求访问不同的数据,指定对应的策略:增加,删除,修改操作访问对应数据,查询访问对应数据,不同数据库做好的数据一致性的处理。由于此方法相对易懂,简单,不做过多介绍。 2. 动态切换数据源,根据配置的文件,业务动态切换访问的数据库:此方案通过Spring的AOP,AspactJ来实现动态织入,通过编程继承实现Spring中的AbstractRoutingDataSource,来实现数据库访问的动态切换,不仅可以方便扩展,不影响现有程序,而且对于此功能的增删也比较容易。 3. 通过mycat来实现读写分离:使用mycat提供的读写分离功能,mycat连接多个数据库,数据源只需要连接mycat,对于开发人员而言他还是连接了一个数据库(实际是mysql的mycat中间件),而且也不需要根据不同 业务来选择不同的库,这样就不会有多余的代码产生。 详细参考配置

在Spring 2.0.1中引入了AbstractRoutingDataSource, 该类充当了DataSource的路由中介, 能有在运行时, 根据某种key值来动态切换到真正的DataSource上。 1.项目中需要集成多个数据源分别为读和写的数据源,绑定不同的key。 2.采用AOP技术进行拦截业务逻辑层方法,判断方法的前缀是否需要写或者读的操作 3.如果方法的前缀是写的操作的时候,直接切换为写的数据源,反之切换为读的数据源 也可以自己定义注解进行封装

动态切换数据源配置步骤:
1、配置数据源 DataSourceConfig 
2、配置数据动态切换 DynamicDataSource  继承AbsractRountingDatabase
3、配置本地数据源存储DataSourceContextHolder
4、配置aof,看选择哪个数据源   SwitchDataSourceAOP

项目代码:https://github.com/xuexionghui/springboot-mybatis-02.git

 

数据库集群需要考虑的问题:

分布式事务、集群id的重复

数据库集群如何考虑数据库自增唯一性 在数据库集群环境下,默认自增方式存在问题,因为都是从1开始自增,可能会存在重复,应该设置每台节点自增步长不同。

查询自增的步长

SHOW VARIABLES LIKE 'auto_inc%'

修改自增的步长 SET @@auto_increment_increment=10;

修改起始值 SET @@auto_increment_offset=5;

假设有两台mysql数据库服务器 节点①自增  1 3 5 7 9 11 …. 节点②自增  2 4 6 8 10 12 …. 注意:在最开始设置好了每台节点自增方式步长后,确定好了mysql集群数量后,无法扩展新的mysql,不然生成步长的规则可能会发生变化。

 

使用mycat达到分库分表的功能:

1、数据库分库分表的策略:

垂直分库:根据业务功能,不同业务对应不同的数据库,就是不同的表分为不同的数据库,比如商城项目的数据库有用户表和用户地址表在同一个数据库,垂直分库就是将用户表放在A库,用户地址表放在B库

水平分库:将同在一个表拆分为不同数据库存储,就是每个数据库都有相同的数据结构,只是每个数据库根据分片策略存储一部分数据(通过mycat的rule.xml文件来配)

使用MyCat实现水平分片策略  MyCat支持10种分片策略 1、求模算法 2、分片枚举 3、范围约定 4、日期指定 5、固定分片hash算法 6、通配取模 7、ASCII码求模通配 8、编程指定 9、字符串拆分hash解析 详细:http://www.mycat.io/document/mycat-definitive-guide.pdf

用MyCat分表分库原理分析 Mycat中的路由结果是通过分片字段和分片方法来确定的,如果查询条件中有 id 字段的情况还好,查询将会落到某个具体的分片 如果查询没有分片的字段,会向所有的db都会查询一遍,让后封装结果级给客户端。   修改/usr/local/mycat/conf/log4j2.xml日志级别为debug       tail  --200f  mycat.log

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值