主从同步概述
主从同步介绍
· 数据库复制技术
可以将一个MySQL数据库的变更操作同步到另外一个或多个MySQL数 据库中,分为2种角色:
一一 主(master)服务器:接受客户端访问连接
一一 从(slave) 服务器:自动同步主服务器数据
主从同步原理
l master操作:
1. 当master数据发生变化时,该事件变化会按照顺序写入bin-log中。当slave链接到master时,master会为slave开启binlog dump线程。
2. 当master的bin-log发生变化时,bin-log dump线程会通知slave,并将相应的binlog内容发送给slave。
l slave操作:
1. 从库生成两个线程,一个I/O线程,一个SQL线程 。
2. I/O线程请求主库的bin-log,并将得到的bin-log日志写到relay log(中继日志) 文件中。
3. SQL线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,达到最终数据一致的目的
l 主从复制过程:
1. MySQL之间数据复制的基础是二进制日志文件(binlog)。
2. MySQL数据库一旦启用二进制日志后,库中所有写操作都会以"事件"的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化。
3. 若发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的"事件"执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。
主从同步主要有三种形式:
statement:将对数据库操作的sql语句写入bin-log中。
row:将每一条数据的变化写入bin-log中。
mixed:statement与row的混合。Mysql决定何时写statement格式的bin-log,何时写row格式的bin-log。
主从同步结构
· 基本形式
· 扩展形式
构建主从同步
构建思路
· 配置主服务器
→ 启用binlog 日志、授权用户、查看binlog 日志信息
· 配置从服务器
→ 设置server_id 并重启数据库服务
→ 指定主服务器信息
→ 启动slave进程
→ 查看状态信息
配置一主一从
拓扑图:
配置流程
1、· 配置主数据库服务器
→ 启用binlog日志并重启服务
]#vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
log-bin=日志名//启用binlog日 志
server_id=id值//指定服务器ID
.. ..
]#systemctl restart mysqld
2、· 授权用户
→ 用户权限 replication slave
→ 用户名 repluser
→ 客户端地址 %
→ 密码 123qqq…A
mysql>create user repluser@"%" identified by "123qqq..A";
mysql>grant replication slave on *.* to
3、· 查看日志信息主要看日志名和偏移量
mysql>SHOW MASTER STATUS\G;
**********************1.row **********************
File:mysql53.000001
Position:156
Binlog_Do_DB:
Binlog_lgnore_DB:
Executed_Gtid_Set:
4、· 配置从服务器
→ server-id不允许与主服务器server-id值相同
]#vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id =数字 //指定服务器ID
.. ..
]#systemctl restart mysqld
5、· 指定主服务器信息
mysql>CHANGE MASTER TO
->master_host="主服务器ip地址",
->master_user="主服务器授权用户",
->master_password="授权用户密码",
->master_log_file="主服务器binlog日志",
->master_log_pos=日志偏移量;
mysql>START SLAVE; //启动slave 进程
6、· 查看Slave 状态
→ 确认I0 线 程 、SQL线程都是Yes状态
mysql>SHOW SLAVE STATUS \G;
**********************1.row**********************
Slave l0 State:Waiting for master to send event
Master_Host:192.168.88.5 //主服务器ip地址
3 Master_User:repluser
.. ..
Slave_l0_Running:Yes //IO线程已运行
Slave_SQL_Running:Yes //SQL线程已运行
配置一主多从
配置流程
1、· 配置从服务器55
→ 指定server-id 并重启服务
]#vim /etc/my.cnf.d/mysql-server.cnf [mysqld]
server-id=数字 :wq
]#systemctl restart mysqld
2、· 确保与主服务器数据一致
→ 在主服务器上备份数据,将备份文件拷贝给从服务器
→ 从服务器使用备份文件恢复数据
→ 在从服务器查看备份文件记录的binlog日志信息
]#mysqldump -uroot -p密码 --master-data 库名> /allbak.sql
]#scp /allbak.sql root@192.168.88.55:/root/
//从服务器恢复数据
]#mysql -uroot -p密码 < /root/allbak.sql
]#systemctl restart mysqld
]#grep mysql53 /root/allbak.sql//查看binlog日志名及偏移量
3、· 指定主服务器信息
mysql>CHANGE MASTER TO master_host="主服务器Ip地址",
->master_user ="用户名",
->master_password="密码",
->master_log_file ="binlog日志文件名",
->master_log_pos =偏移量;
mysql>START SLAVE; //启动slave进程
mysql>SHOW SLAVE STATUS\G; //检查状态
数据读写分离
读写分离概述
MySQL读写分离介绍
·MySQL数据读写分离
是指将MySQL数据库的读操作和写操作分别分配到不同的服务器上,通过这种方式可以提高数据库的并发处理能力和性能、降低系统失败的风险。要保证负责读访问主机与负责写访问主机的数据一致。
中间件软件
· 运行在应用程序和数据库之间的软件,
通过拦截和处理数据库请求来 实现读写分离、负载均衡、故障切换等功能。
软件 | 介绍 |
MySQL Proxy | 基于Lua脚本语言编写的代理服务器 |
MaxScale | 开源的MySQL数据库代理服务器 |
Cobar | 阿里巴巴开发的一款开源的MySQL数据库中间件 |
TcaplusDB | 腾讯云开发的一款分布式NoSQL数据库 |
Mycat2 | 是阿里巴巴旗下的一个项目 |
案例拓扑
· 添加一个MySQL代理
→ 接收客户端访问,为客户端提供访问数据接口
SourceURL:file:///home/student/Desktop/01mysql.docx
读写分离原理
·客户端连接mycat服务,访问数据库服务,mycat服务
→ 收到SQL写请求时,交给master服务器处理
→ 收到SQL 读请求时,交给slave服务器处理
构建思路
部署MySQL一主一从结构
→ 主服务器:192.168.88.56
→ 从服务器:192.168.88.57
部署MyCat服务
→ 装包、修改配置文件、配置数据库服务、启动服务 添加主机
→ 添加master角色主机
→ 添加slave角色主机
构建读写分离
配置流程
1、部署MyCAT服务
· 安装软件
]#yum -y install java-1.8.0-openjdk.x86_64
]#which unzipll yum -y installunzip
]#unzip mycat2-install-template-1.21.zip
]#mv mycat /usr/local/
]#cp mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/
]#chmod -R +777 /usr/local/mycat/
· 修改配置文件,定义客户端连接时使用的用户名和密码
]#cat /usr/local/mycat/conf/users/root.user.json
{
"dialect":"mysql",
"ip":null,
"password":"654321", 密码
"transactionType":"proxy",
"username":"mycat" 用户名
}
[root@mycat58 conf]#
· 修改配置文件,指定连接的数据库服务器
]#vim /usr/local/mycat/conf/datasources/prototypeDs.datasource.json
{
"password":"668899", 密码
... ...
"url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asi a/Shanghai&characterEncoding=UTF-8", 连接本机数据库
... ...
"user":"plj",用户
... ...
}
· 配置数据库服务器
]#yum -y install mysql-server mysql
]#systemctl start mysqld
]#mysql
mysql>create user plj@"localhost"identified by"668899";
Mysql>grant all on*.*to plj@"localhost";
mysql>exit
· 主要操作:启动服务、查看端口、停止服务
]#/usr/local/mycat/bin/mycat start
Starting mycat2...
]#netstat -utnlp I grep 8066
tcp6 0 0::8066 :::* LISTEN 251201/java
]# /usr/local/mycat/bin/mycat stop
Stopping mycat2...
Stopped mycat2...
2、连接mycat服务
· 命令格式
]#mysql -h127.0.0.1 -P端 口 -u 用 户 名 -p密 码
]#mysql -h127.0.0.1 -P8066 -umycat -p654321
mysql>show databases;
+-----------------------+
| `Database` |
+-----------------------+
| information_schema |
| mysql |
| performance_schema |
+-----------------------+
3 rows in set (0.00 sec)
mysql>exit
3、添加数据源
· 命令格式
/*+mycat:createdatasource{
"name":"名称",
"url":"jdbc:mysql://IP地址:3306",
"user":"用户名",
"password":"密码"
}*/;
· 查看数据源
mysql>/*+mycat:showDataSources{}*/\G
4、配置数据库服务器
·根据数据源的定义,添加用户
mysql>create user 用户名@"客户端地址" identified by "密码";
mysql>grant all on *.* to 用户名@"客户端地址";
5、创建集群
· 命令格式
/*!mycat:createcluster {
"name":"集群名",
"masters":["master 角色主机名"],
"replicas":["slave角色主机名"]
}*/;
· 查看集群
mysql>/*+mycat:showClusters{}*/;
6、指定主机角色
· 修改配置文件
]#vim /usr/local/mycat/conf/datasources/主机名.datasource.json
{
"instanceType":"WRITE", #maste角色主机仅负责写访问
}
]#vim /usr/local/mycat/conf/datasources/主机名.datasource.json
{
"instanceType":"READ", #slave 角色主机仅负责读访问
}
]# /usr/local/mycat/bin/mycat restart
7、修改读策略
· 修改配置文件
]#vim /usr/local/mycat/conf/clusters/集群名称.cluster.json
{
......
"readBalanceType":"BALANCE_ALL_READ", //BALANCE_ALL 获取集群中所有数据源
//BALANCE_ALL_READ 获取集群中允许读的数据源
//BALANCE_READ_WRITE 获取集群中允许读写的数据源,但允许读的数据源优先
//BALANCE_NONE 获取集群中允许写数据源既主节点中选择
}
]#/usr/local/mycat/bin/mycat restart
8、测试配置
· 思路如下
1、连接mycat服务建库
2、指定存储数据使用的集群
3、连 接mycat服务建表
4、客户端连接mycat服务执行select 或 insert
· 连接mycat服务建库
]#mysql -hmycat服务器ip -P8066 -u用户名 -p密码
mysql>create database 库名;
· 指定存储数据使用的集群
]#vim /usr/local/mycat/conf/schemas/库名.schema.json
{
"targetName":"集群名称",
}
]#/usr/local/mycat/bin/mycat restart 重启mycat服务
· 连接mycat服务建表
]#mysql -hmycat地址 -P端口 -u用户名 -p密码
mysql>create table 库.表(
表头名 数据类型, ……);
· 客户端连接mycat服务执行select 或 insert
mysql>insert into testdb.user values("yaya","123456");
mysql>select * from testdb.user