1、随着数据量的增加,单个数据库服务器已经难以满足业务需要,必须考虑数据集群的方式来提升性能。高性能数据库集群的第一种方式是“读写分离”,第二种方式是“数据库分片”
读写分离原理:读写分离基本原理是将数据库读写操作分散到不同的节点上。
CAP定理:
读写分离的问题:读写分离分散了数据库读写操作的压力,但是没有分散存储压力,为了满足业务数据存储的需求,就需要将存储分散到多台数据库服务器上。因此就需要数据分片。
数据分片:将存放在单一数据库中的数据分散地存放至多个数据库或表中,以达到提升性能瓶颈以及可用性的效果。数据分片的有效手段是对关系型数据库进行分库和分表。数据分片的拆分方式又分为垂直分片和水平分片。
垂直分片->垂直分库:
2.ShardingSphere官网地址:shardingsphere.apache.org
3.前置知识:安装docker链接:阿里云轻量级服务器安装docker(一)_知守观天下行走叶青的博客-CSDN博客
docker安装一主二从mysql:主从服务器IP一致,端口号不一致
主服务器容器名:has-mysql-master 端口3306
从服务器容器名:has-mysql-slave1 端口3307
从服务器容器名:has-mysql-slave2 端口3308
注意:如果此时防火墙是开启的,则先关闭防火墙,并重启docker,否则后续安装mysql无法启动
第一步:主服务器:
step1:
docker run -d \
-p 3306:3306 \
-v /atguigu/mysql/master/conf:/etc/mysql/conf.d \
-v /atguigu/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
–name has-mysql-master \
mysql:8.0.29
docker run -d \
-p 3306:3306 \
-v /atguigu/mysql/master/conf:/etc/mysql/conf.d \
-v /atguigu/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
–name has-mysql-master \
mysql:8.0.29
执行完通过docker images 查看是否已经装载完成:
也可以通过命令docker ps -a 查看端口的映射:
step2: 创建mysql主服务器配置文件
默认情况下mysql的binlog日志是自动开启的,可以通过如下配置定义一些可选配置
vim /atguigu/mysql/master/conf/my.cnf
配置内容如下:
[mysqld]
# 服务器唯一id,默认值1
server-id=1
# 设置日志格式,默认值ROW
binlog_format=STATEMENT
# 二进制日志名,默认binlog
# log-bin=binlog
# 设置需要复制的数据库,默认复制全部数据库
#binlog-do-db=mytestdb
# 设置不需要复制的数据库
#binlog-ignore-db=mysql
#binlog-ignore-db=infomation_schema
重启mysql容器:
docker restart has-mysql-master
step3: 使用命令行登录mysql主服务器
#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it has-mysql-master env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
这个时候我通过navicat连接一下我的master机器会发现报了一个错:这是因为客户端版本低引起的
这个错误是因为客户端版本低引起的,可以修改下默认密码校验方式(直接在mysql中执行,可参考截图所示),修改脚本:
#修改默认密码校验方式
ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’;
执行完脚本之后直接再试一下客户端连接,发现连接成功:
step4: 主机中创建slave用户
下面命令都需要进入到主服务器中执行哦:
— 创建slave用户
CREATE USER ‘atguigu_slave’@’%’;
— 设置密码
ALTER USER ‘atguigu_slave’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’;
— 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO ‘atguigu_slave’@’%’;
— 刷新权限
FLUSH PRIVILEGES;
这个时候在mysql客户端中也可以看到slave创建好了:
step5: 主机中查询master状态
主服务器中执行命令:
SHOW MASTER STATUS;
binlog.000003表示主服务器写binlog日志的时候用的文件名,1357表示当前binlog日志文件位置(从服务器就是从这个文件读取的数据信息,一会从服务器配置会用到)
第二步:从服务器1:
step1: 在docker中创建并启动mysql从服务器;端口:3307
docker run -d \
-p 3307:3306 \
-v /atguigu/mysql/slave1/conf:/etc/mysql/conf.d \
-v /atguigu/mysql/slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
–name has-mysql-slave1 \
mysql:8.0.29
step2: 创建mysql从服务器配置文件
vim /atguigu/mysql/slave1/conf/my.cnf
配置如下内容:
[mysqld]
# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id
server-id=2
# 中继日志名,默认xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin
重启MySQL容器:
docker restart has-mysql-slave1
step3: 使用命令行登录mysql从服务器
#进入容器:
docker exec -it has-mysql-slave1 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
#修改默认密码校验方式
ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’;
step4: 在从机上配置主从关系【重要的步骤】
在从机1上执行以下SQL操作:MASTER_USER在创建master服务器第四步的时候创建的从机用户
MASTER_LOG_FILE和MASTER_LOG_POS配置从机从主机同步数据的位置信息
CHANGE MASTER TO MASTER_HOST=’自己的服务器ip地址’,
MASTER_USER=’atguigu_slave’,MASTER_PASSWORD=’123456′, MASTER_PORT=3306,
MASTER_LOG_FILE=’binlog.000003′,MASTER_LOG_POS=1357;
第三步: 从服务器2:
step1: 在docker中创建并启动mysql从服务器;端口:3308
docker run -d \
-p 3308:3306 \
-v /atguigu/mysql/slave2/conf:/etc/mysql/conf.d \
-v /atguigu/mysql/slave2/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
–name has-mysql-slave2 \
mysql:8.0.29
step2: 创建mysql从服务器配置文件
vim /atguigu/mysql/slave2/conf/my.cnf
配置如下内容:
[mysqld]
# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id
server-id=3
# 中继日志名,默认xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin
重启MySQL容器:
docker restart has-mysql-slave2
step3: 使用命令行登录mysql从服务器
#进入容器:
docker exec -it has-mysql-slave2 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
#修改默认密码校验方式
ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’;
使用客户端连接也是可以的:
step4: 在从机上配置主从关系【重要的步骤】
在从机2上执行以下SQL操作:MASTER_USER在创建master服务器第四步的时候创建的从机用户
MASTER_LOG_FILE和MASTER_LOG_POS配置从机从主机同步数据的位置信息【从机1和从机2从同一台主机的同一位置同步数据,所以下面执行的脚本和从机一的时候是一致的】
CHANGE MASTER TO MASTER_HOST=’自己的服务器ip地址’,
MASTER_USER=’atguigu_slave’,MASTER_PASSWORD=’123456′, MASTER_PORT=3306,
MASTER_LOG_FILE=’binlog.000003′,MASTER_LOG_POS=1357;
第四步:启动主从同步:
启动从机的复制功能,从机1和从机2分别执行sql(进入mysql命令行中执行):
— 启动复制功能
START SLAVE;
— 查看状态(不需要分号)
SHOW SLAVE STATUS\G
下面两个参数都是Yes,则说明主从配置成功!
第五步:实现主从同步
在主机中执行以下创建表的SQL,在从机中查看数据库、表和数据是否已经被同步:
CREATE DATABASE db_user;
USE db_user;
CREATE TABLE t_user (
id BIGINT AUTO_INCREMENT,
uname VARCHAR(30),
PRIMARY KEY (id)
);
INSERT INTO t_user(uname) VALUES(‘zhang3’);
INSERT INTO t_user(uname) VALUES(@@hostname);
已经亲测,主机执行完从机成功复制数据!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
主从复制常见的问题归纳:
问题1:
启动主从同步后,常见错误是Slave_IO_Running: No 或者 Connecting 的情况,此时查看下方的 Last_IO_ERROR错误日志,根据日志中显示的错误信息在网上搜索解决方案即可:
典型的错误例如:Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘Client requested master to start replication from position > file size’
解决方案:
— 在从机停止slave
SLAVE STOP;
— 在主机查看mater状态
SHOW MASTER STATUS;
— 在主机刷新日志
FLUSH LOGS;
— 再次在主机查看mater状态(会发现File和Position发生了变化)
SHOW MASTER STATUS;
— 修改从机连接主机的SQL,并重新连接即可
————————————————
版权声明:本文为CSDN博主「知守观天下行走叶青」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/royal1235/article/details/127273180