目录
1.为何搭建mysql的主从关系
解决mysql高并发的瓶颈
2.如何搭建mysql的主从关系
2.1 复制概述
复制是指将主数据库的DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。
2.2 复制原理
MySQL 的主从复制原理如下 :
从上层来看,复制分成三步:
(1)Master 主库在事务提交时,会把数据变更作为事件Events 记录在二进制日志文件 Binlog 中。
(2)主库推送二进制日志文件 Binlog 中的日志事件到从库的中继日志 Relay Log 。
(3)slave重做中继日志中的事件,将改变反映它自己的数据。
2.3 复制优势
MySQL 复制的优点主要包含以下三个方面:
(1)主库出现问题,可以快速切换到从库提供服务。
(2)可以在从库上执行查询操作,从主库中更新,实现读写分离,降低主库的访问压力。
(3)可以在从库中执行备份,以避免备份期间影响主库的服务。
注意:mysql允许远程连接
2.4 搭建步骤
使用之前先进行虚拟机的克隆(这样的话可以不用再次下载mysql)
因为克隆的虚拟机两者ip地址一致,使用命令进行ip更改
vi /etc/sysconfig/network-scripts/ifcfg-ens33
如何查看是否有mysql
注意:-u后边对应的是账号,-p对应的密码
mysql -uroot -p123456
如何启动mysql
systemctl start mysqld
2.4.1 master(主节点)
1) 在master 的配置文件(/etc/my.cnf)中,配置如下内容:
#mysql 服务ID,保证整个集群环境中唯一
server-id=1#mysql binlog 日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin#错误日志,默认已经开启
#log-err#mysql的安装目录
#basedir#mysql的临时目录
#tmpdir#mysql的数据存放目录
#datadir#是否只读,1 代表只读, 0 代表读写
read-only=0#忽略的数据, 指不需要同步的数据库
binlog-ignore-db=mysql#指定同步的数据库
#binlog-do-db=db01
2) 执行完毕之后,需要重启Mysql:
systemctl restart mysqld
3) 查看master状态:
show master status;
字段含义:
File : 从哪个日志文件开始推送日志文件 给从节点
Position : 从哪个位置开始推送日志 从什么位置开始同步
Binlog_Ignore_DB : 指定不需要同步的数据库
2.4.2 slave(从节点)
1) 在 slave 端配置文件中,配置如下内容:
#mysql服务端ID,唯一
server-id=2#指定binlog日志
log-bin=/var/lib/mysql/mysqlbin
2) 执行完毕之后,需要重启Mysql:
systemctl restart mysqld
3) 执行如下指令 :slaveof ip port
注意:master_password对应的是主节点连接数据库的密码;master_log_file,master_log_pos,要跟主节点查询到的master数据一致
change master to master_host= '192.168.227.175', master_user='root', master_password='123456', master_log_file='mysqlbin.000001', master_log_pos=154;
指定当前从库对应的主库的IP地址,用户名,密码,从哪个日志文件开始的那个位置开始同步推送日志。
4) 开启同步操作
start slave;
show slave status\G;
对应查询结果:
进入mysql的方法:
mysql -uroot -p123456
5) 解决问题
exit退出两个节点,找解决的办法:
停止同步操作语法:
stop slave;
注意:关闭主节点,从节点不会受影响,从可以进行任何操作,注意id可能在之后会重复的问题。
3.mycat的安装
3.1 为何安装mycat
为了减轻数据库的压力,主只负责添,从负责查
3.2 安装mycat的步骤
3.2.1 安装软件
将安装包放进/usr/local里面,进行解压:
tar -zxvf 压缩文件 文件名
3.2.2 修改配置文件
主要是修改如下3个配置文件
①schema.xml:定义逻辑库,表、分片节点等内容
②rule.xml:定义分片规则
③server.xml:定义用户以及系统相关变量,如端口等
修改配置文件server.xml
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<user name="mycat">
<property name="password">123456</property>
<property name="schemas">testdb</property>
</user></mycat:server>
修改schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><!--配置逻辑库 name:表示逻辑库的名称 dataNode:管理的节点名称-->
<schema name="testdb" checkSQLschema="true" sqlMaxLimit="1000" dataNode="dn1"></schema>
<!--dataNode表示定义数据节点的标签 name:节点名称 dataHost数据的主机名称 database表示真实数据库的名称-->
<dataNode name="dn1" dataHost="localhost1" database="maincong" />
<!--定义真实服务所在的地址 name表示名称-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--按照心跳机制来判断真实的数据库是否正确运行-->
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.227.175:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.227.176:3306" user="root" password="123456"></readHost>
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
</mycat:schema>
这里的testdb是我们mysql中的数据库名称
主要分schema、dataNode、dataHost三个主要配置。
3.2.3 启动程序
1、 控制台启动 :去 mycat/bin 目录下执行 ./mycat console
2 、后台启动 :去 mycat/bin 目录下 ./mycat start
为了能第一时间看到启动日志,方便定位问题,我们选择1控制台启动。
3.2.4 登录
此登录方式用于通过 Mycat 查询数据,我们选择这种方式访问 Mycat
mysql -umycat -p123456 -P 8066 -h 192.168.227.177
4.测试
注意:要将虚拟机的防火墙关闭或通过mycat接口
4.1 创建一个springboot项目
4.2 实体类
@Data
@TableName(value = "t_user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
}
4.3 dao层
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
4.4 配置
server.port=8080
#testdb数据源 192.168.227.177:8806 mycat接口默认为8066
spring.datasource.url=jdbc:mysql://192.168.227.177:8066/testdb?useSSL=true&useUnicode=true&characterEncoding=utf8
spring.datasource.password=123456
spring.datasource.username=mycat
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
4.5 pom
注意此处的mysql版本不应该过高
<groupId>com.qy151wd.maincong</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<!--改mysql的版本-->
<mysql.version>5.1.4</mysql.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
</dependencies>
4.6 测试类
@SpringBootTest
class DemoApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
User user = userMapper.selectById(1);
System.out.println(user);
}
@Test
void contextLoads02() {
User user=new User();
user.setName("hhhh");
userMapper.insert(user);
}
}
5.解决主从(主添从查)不成功问题
上述配置文件schema.xml文件中的参数需要注意,balance和switchType