业务层百万读写进入数据库,单个的数据库一定是顶不住压力的,所以需要建立集群
从服务器会复制主服务器.
1. 所以,要进行读写分离,一般是主服务器写,从服务器读,因为从服务器可以创建无数个来应付那80%的读请求.
2. 如果写请求量太大,一个主顶不住,那么就需要多个主来抗住压力,也就是主主复制(会有数据不一致问题)
解决数据不一致的问题:用机械硬盘, 传输数据用光纤 ,就是快!!!越快出现不一致现象越少
数据一致性: 因为主服务器写入数据之后需要同步到其他主服务器,这其中有延迟,不能立刻同步数据,那么就让其达到最终一致性.
这里顺便提一句,如果是涉及到多数据源,并且是boot项目,可以这么配置,并且框架自动会分辨读请求和写请求,将其分配给对应的库
一般来说,运维搭建好数据库集群,我们开发只需要按下面这么配置就ok
1,准备多个MYSQL Server
2.规划哪个是master,哪个是slave -> my.cnf
3.让master把每次数据改变都记录bin_log
4.配置slave同步数据
-指明master的地址, 访问的账号密码等
5. 让slave启动同步
提示:一定要将虚拟机运行内存调成4g,不然会栈溢出
我们用docker来搞一个Mysql的主从,至于docker的下载,我就不赘述了
docker安装mysql
docker pull mysql:5.7.36
启动mysql
docker run --name mysql-02 -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3307 -d mysql:5.7.36
-e的环境变量:指定mysql的密码
-d:后台运行
-p:端口暴露 -p物理机端口: 容器端口
-v:数据挂载 将mysql的配置文件和数据文件以及日志都应该挂出来
密码是:123456
创建三个
# mysql的配置文件和数据文件以及日志都应该挂出来
# 配置文件只要在容器的 /etc/mysql/conf.d 目录下 随便叫xxx.cnf mysql都会认为是mysql的配置
docker run -p 3333:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /soft/mysql-1/data:/var/lib/mysql \
-v /soft/mysql-1/conf:/etc/mysql/conf.d \
-v /soft/mysql-1/logs:/var/log \
-d --restart=always --name=mysql-1a mysql:5.7.36
docker run -p 3334:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /soft/mysql-2/data:/var/lib/mysql \
-v /soft/mysql-2/conf:/etc/mysql/conf.d \
-v /soft/mysql-2/logs:/var/log \
-d --restart=always --name=mysql-2b mysql:5.7.36
docker run -p 3335:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /soft/mysql-3/data:/var/lib/mysql \
-v /soft/mysql-3/conf:/etc/mysql/conf.d \
-v /soft/mysql-3/logs:/var/log \
-d --restart=always --name=mysql-3c mysql:5.7.36
然后用navicat连接
当然不要忘了给配置文件改编码格式
vim /soft/mysql-1/conf/base.cnf
vim /soft/mysql-2/conf/base.cnf
vim /soft/mysql-3/conf/base.cnf
插入以下
##字符集
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
主服务器的配置,还是在vim /soft/mysql-1/conf/base.cnf对应指代文件中配置
[mysqld]
server-id=1 #服务器id
log-bin=mysql-bin #开启bin_log ;把数据的改变记录到 mysql-bin这个文件中
binlog-ignore-db=mysql #设置bin-log不需要感知的数据库
binlog-ignore-db=infomation_schema
binlog-ignore-db=sys
binlog-ignore-db=performance_schema
binlog-do-db=text #bin-log需要感知的数据库
binlog_format=STATEMENT
然后运行命令
# 给 slave 123456 给一个能复制所有库的权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
flush privileges;
重启主机,然后看看二进制文件又没有生成
我这里是生成了
然后show master status,就有东西了
vim /soft/mysql-2/conf/base.cnf
vim /soft/mysql-3/conf/base.cnf
对应配置文件中配置
[mysqld]
server-id=2
relay-log=mysql-relay
因为是从机,所以给一个专门的slave1.cnf目录
从机也要运行命令
CHANGE MASTER TO MASTER_HOST='主机ip地址',
MASTER_USER='X',MASTER_PASSWORD='X',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;
CHANGE MASTER TO MASTER_HOST='192.168.48.128',MASTER_PORT=3333,MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
start slave; #开始同步
show slave status; #观察状态
看到这个就是已经配置完成了
两个从数据库都要执行这三行命令
很简单,我们只需要在主服务器建一张表,然后看看从服务器有没有同步就ok了
当然,我一开始就指定的是同步test库,所以建立别的库是无法被同步的
创建text库
其他的从服务器就自动同步了,建表也是一样
下次整合mybatis-plus做一个crud,并且,写去主库,读去从库