主从同步概述

主从同步介绍

· 数据库复制技术

可以将一个MySQL数据库的变更操作同步到另外一个或多个MySQL数 据库中,分为2种角色:

一一 主(master)服务器:接受客户端访问连接

一一 从(slave) 服务器:自动同步主服务器数据

主从同步原理

MySQL 主从同步_服务器

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。


主从同步结构

·  基本形式

MySQL 主从同步_数据库_02

·  扩展形式

MySQL 主从同步_服务器_03

构建主从同步

构建思路

· 配置主服务器

→ 启用binlog 日志、授权用户、查看binlog 日志信息

· 配置从服务器

→ 设置server_id 并重启数据库服务

→ 指定主服务器信息

→ 启动slave进程

→ 查看状态信息

配置一主一从

拓扑图:

MySQL 主从同步_服务器_04

配置流程

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线程已运行


配置一主多从

MySQL 主从同步_mysql_05


配置流程

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代理

→ 接收客户端访问,为客户端提供访问数据接口

MySQL 主从同步_mysql_06

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