帮忙建网站的人,合肥网页定制,太原 网站建设,龙华专业网站建设目录
MySQL主从复制
一、概述
1、MySQL Replication优点#xff1a;
二、MySQL复制类型
1、异步复制#xff08;Asynchronous repication#xff09;
2、全同步复制#xff08;Fully synchronous replication#xff09;
3、半同步复制#xff08;Semisynchronous…
目录
MySQL主从复制
一、概述
1、MySQL Replication优点
二、MySQL复制类型
1、异步复制Asynchronous repication
2、全同步复制Fully synchronous replication
3、半同步复制Semisynchronous replication
三、MySQL支持的复制方式
1、基于SQL语句的复制
2、基于行的复制
3、混合模式复制
四、MySQL复制的工作过程
五、复制过程的限制
六、部署MySQL主从异步复制
1、配置mysql master服务器
2、创建Replication用户
3、 获得Master DB的相关信息
4、备份Master原有数据
5、在MySQL Slave上的配置
6、测试复制是否成功
基于Amoeba读写分离
七、概述
1、主从复制
2、数据同步
3、读写分离规则
八、常见的MySQL读写分离
1、基于程序代码内部实现
2、基于中间代理层实现
九、实验
1、在主机Amoeba上安装java环境
2、安装并配置amoeba赋予权限
3、配置Amoeba读写分离两个Slave读负载均衡
3.1、配置无误后启动Amoeba软件默认端口是TCP协议8066
3.2、在Client上进行访问测试
3.3、测试写操作
总结 MySQL主从复制 一、概述 MySQL Replication俗称MySQL AB复制、主从复制、主从同步是MySQL官方推荐的数据同步技术。数据同步基本过程为从数据库会实时去读取主数据库的二进制日志文件按照日志中记录对从库进行同样的操作以达到数据同步效果。
1、MySQL Replication优点 通过增加从服务器来提高数据库平台的可靠性。在主服务器上执行写入和更新在从服务器上向外提供读功能可以动态地调整从服务器地数量从而调整数据库平台地高性能。 提高数据安全性因为数据已复制到从服务器主数据库异常时可以将从服务器复制进程终止来达到保护数据完整性地特点。 在主服务器上生成实时数据而在从服务器上分析这些数据从而缓解主服务器地性能压力。
二、MySQL复制类型
1、异步复制Asynchronous repication MySQL默认地复制是异步地主库在执行完客户端提交地事务后会立刻将结果返回给客户端并不关心从库是否已经接受并处理了事务这样就会有一个问题主库如果down掉了此时主上已经提交地事务可能没有传到从库服务器上如果此时强制将从提升为主可能会导致新主上的数据不完整。默认情况下MySQL5.5/5.6/5.7和mariaDB10.0/10.1的复制功能是异步的。
2、全同步复制Fully synchronous replication 指当主库执行完一个事务所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回所以全同步复制的性能必然会收到严重的影响返回客户端的响应速度也会被拖慢。
3、半同步复制Semisynchronous replication MySQL由Google贡献的补丁才开始支持半同步复制模式介于异步复制和全同步复制之间主库在执行完客户端提交的事务后不是立刻返回给客户端而是等待至少一个从库接受到并写到relay log中才返回给客户端。相对于异步复制半同步复制提高了数据的安全性同时它也造成了一定程度的延迟这个延迟最少是一个TCP/IP往返的时间。所以半同步复制最好在低延时的网络中使用。当出现超时情况时源主服务器会暂时切换到异步复制模式直到至少有一台设置为半同步复制模式的从服务器及时收到信息为止。 半同步复制模式在主服务器和从服务器同时启用否则主服务器默认使用异步复制模式
三、MySQL支持的复制方式
1、基于SQL语句的复制 在主服务器上执行的SQL语句在从服务器上执行同样的SQL语句效率比较高。
2、基于行的复制 主服务器把表的行变化作为事件写入到二进制日志中主服务器把代表了行变化的事件复制到从服务器中。
3、混合模式复制 先采用基于语句的复制一旦发现基于语句无法精确复制时再采用行。
四、MySQL复制的工作过程 1、在每个事务更新完成数据之前Master会在二进制日志中记录这些数据的语句当MySQL将事务串行的写入二进制日志完成后Master通知存储引擎提交事务并将数据写入磁盘
2、Slave开启一个I/O工作线程在Master之间建立一个连接然后开始Binlog dump processBinlog dump process会从Master的二进制日志中读取操作事件如果已经跟Master达到一致状态它会催眠并等待Master产生新的操作事件I/O线程将这些改变数据的事件写入自己的中继日志。
3、SQL Slave ThreadSQL工作线程是处理MySQL Replication过程的最后一步。SQL线程从中继日志读取操作事件重放其中的事件从而更新Slave服务器的数据使slave与Master中的数据保持一致只要该线程与I/O线程保持一致中继日志通常会在OS的缓存中所以中继日志的开销很小。
五、复制过程的限制
1、MySQL5.6之前的版本复制操作在slave上执行的是串行化的也就是Master上的并行更新会导致数据复制延迟
2、所有MySQL服务器的版本都要高于3.2还有一个基本的原则就是从服务器的数据库版本可以高于主服务器数据库的版本但是不可以低于主服务器的数据库版本
六、部署MySQL主从异步复制
在所有机器上安装mysql或mariadb yum install -y mariadb mariadb-devel mariadb-server1、配置mysql master服务器
在/etc/my.cnf中修改或者增加如下内容
vim /etc/my.cnf添加内容如下
server-id1
log-binmysql-binlog
log-slave-updatestrue重启mysql服务器
systemctl restart mariadb查看监听
netstat -anptu | grep 33062、创建Replication用户
grant replication slave on *.* to myslave192.168.1.% identified by 123123.coM;Replication slave用于复制性从属服务器从主服务器中读取二进制日志文件权限 这条命令是MySQL中的授权语句用于给用户 myslave 授予在任何数据库和任何表上进行复制操作的权限并使用密码 123123.coM 进行身份验证。该用户是通过 IP 地址范围为 192.168.1.% 的连接进行授权的这意味着只有以该 IP 地址开头的客户端才能使用这个用户进行复制操作。 注创建完成记得刷新配置
flush privileges;3、 获得Master DB的相关信息
show master status;供slave连接使用记录下File和Position的值。 4、备份Master原有数据 如果在生产环境中Master服务器已经运行一段时间或者Master服务器上已经存在数据为了保证所有数据的一致性需要先将Master目前已有的数据全部导给Slave服务器。 备份的方法有很多可以直接备份数据文件也可以使用mysqldump工具。全新搭建的环境不存在数据备份问题。
mysqldump -uroot -p --all-databases /root/alldbbackup.sql将备份的数据传输给从服务器
scp /root/alldbbackup.sql root192.168.1.101:/root/scp /root/alldbbackup.sql root192.168.1.102:/root/5、在MySQL Slave上的配置
导入Master的备份脚本刚刚传输的
systemctl start mysqldmysql -uroot -p /root/alldbbackup.sql从库连接主库进行测试如果连接成功说明主库配置成功
mysql -u myslave -p123123.coM -h 192.168.1.100修改MySQL从服务器配置文件
vim /etc/my.cnfserver-id2
relay-logrelay-log-bin
relay-log-indexslave-relay-bin.index配置多个从服务器时依次设置server-id号 重启服务
systemctl restart mariadb在Slave服务器授权启动从库进行主从库数据同步
stop slave;CHANGE MASTER TO MASTER_HOST192.168.1.100,MASTER_USERmyslave,MASTER_PASSWORD123123.coM,MASTER_LOG_FILEmysql-binlog.000001,MASTER_LOG_POS479;这是MySQL中用于配置从服务器的语句用于指定主服务器的相关信息以便从服务器可以连接到主服务器并开始复制数据。命令含义如下 - CHANGE MASTER TO: 告诉MySQL服务器要更改从服务器的配置。 - MASTER_HOST192.168.1.100: 指定主服务器的IP地址或主机名为 192.168.1.100表示从服务器将连接到该主服务器。 - MASTER_USERmyslave: 指定从服务器连接主服务器时要使用的用户名为 myslave这是在前面的授权命令中创建的用户。 - MASTER_PASSWORD123123.coM: 指定从服务器连接主服务器时使用的密码为 123123.coM这是在前面的授权命令中设置的密码。 - MASTER_LOG_FILEmysql-binlog.000001: 指定从服务器开始复制的主服务器二进制日志文件名此处为 mysql-binlog.000001。这表示从该文件开始复制数据。 - MASTER_LOG_POS479: 指定从服务器复制的主服务器二进制日志文件的位置此处为 479。这表示从该位置开始复制数据。 此命令的目的是配置从服务器连接到指定的主服务器并从指定的二进制日志文件和位置开始复制数据。 如果出现问题 1.使用 find / -iname auto.cnf 命令查找你数据库的auto.cnf 配置文件。 find / -iname auto.cnf2.把查询到的文件删除系统将重新自动分配 rm -rf 查询到的文件目录 3.登录mysql重启slave再次验证 stop slave;
start slave;
show slave status\G; 如果还未成功 Slave_I0_Runing:NO 一般是事务回滚造成的 stop slave;
set GLOBAL SQL_SLAVE_SKIP_COUNTER1;
start slave; 这是MySQL中的一个命令用于跳过从服务器上的一个事务并继续执行后续的事务。具体来说该命令的含义是 SET GLOBAL SQL_SLAVE_SKIP_COUNTER1: 设置全局变量 SQL_SLAVE_SKIP_COUNTER 的值为 1。该变量用于指定从服务器跳过的事务数量。 这个命令通常在从服务器上执行用于处理复制过程中的错误或跳过某些无法执行的事务。通过将 SQL_SLAVE_SKIP_COUNTER 设置为一个正整数可以告诉从服务器跳过指定数量的事务并继续执行后续的事务。 start slave;
flush privileges;查看 参数说明 CHANGE MASTER TO MASTER_HOSTmaster_host_name, #主服务器的IP地址 MASTER_USERreplication_user_name, #主服务器授权的用户 MASTER_PASSWORDreplication_password, #主服务器授权的密码 MASTER_LOG_FILErecorded_log_file_name, #主服务器二进制日志的文件名 MASTER_LOG_POSrecorded_log_position; #日志文件的开始位置 6、测试复制是否成功 在Master服务器上创建一个数据库或者表到Slave服务器上查看如果配置成功就可以成功同步。 主服务器创建数据库
mysql -uroot -p123123create database a2; 从服务器登录查看数据库列表
mysql -u myslave -p123123.coM -h 192.168.1.100show databases;可以查询到说明主从数据库创建成功。 主从服务器可以进行通联。 报以下错误的解决方法 数据不同步解决方法 基于Amoeba读写分离 七、概述 在实际的生产环境中如果对数据库的读和写都在同一个数据库服务器中操作无论是安全性高可用还是并发等各个方面都不能完全满足实际需求的因此一般来说都是通过主从复制的方式来同步数据再通过读写分离来提供数据的高并发负载能力这样的方案来进行部署。 简单来说读写分离就是只在主服务器上写只在从服务器上读基本的原理是让主数据库处理事务性查询而从数据库处理select查询数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库。
1、主从复制 通过主从复制技术将数据库的写操作insert、update、delete全部集中在主服务器上然后将主服务器的写操作日志传输到从服务器上进行执行以保持从服务器的数据与主服务器一致。主服务器负责处理写操作从服务器负责处理读操作。
2、数据同步 主从服务器之间需要保持数据的一致性。当主服务器上的数据发生变化时会将变更日志传输给从服务器从服务器通过执行变更日志来同步数据。
3、读写分离规则 应用程序通过对数据库连接的配置将读操作的请求发送到从服务器将写操作的请求发送到主服务器。这样可以实现读操作的负载均衡和写操作的集中处理。 八、常见的MySQL读写分离
1、基于程序代码内部实现 在代码中根据selectinsert进行路由分类这类方法也是目前大型生产环境应用最广泛的优点是性能最好因为在程序代码中实现不需要增加额外的设备作为硬件开支缺点是需要开发人员来实现运维人员无从下手
2、基于中间代理层实现 代理一般位于客户端和数据库服务器之间代理服务器接到客户端请求后通过判断转发到后端数据库代表性程序 1mysql-proxy为mysql开发早期开源项目通过其自带的lua脚本进行SQL判断虽然是mysql的官方产品但是mysql官方不建议将其应用到生产环境。 2Amoeba变形虫该程序由java语言及逆行开发阿里巴巴将其应用于生产环境它不支持事物和存储过程。 Amoeba变形虫项目开源框架于2008年发布一款Amoeba for mysql软件这个软件致力于mysql的分布式数据库前端代理层主要为应用层访问mysql的时候充当SQL路由功能并具有负载均衡高可用性SQL过滤读写分离可路由到相关的目标数据库可并发请求多台数据库通过Amoeba能够完成多数据源的高可用负载均衡数据切片的功能目前Amoeba已经在很多企业的生产线上使用。
九、实验
在配置读写分离前配置各机器ip MySQL Master IP192.168.1.100 MySQL Slave1 IP192.168.1.101 MySQL Slave2 IP192.168.1.102 MySQL Amoeba IP192.168.1.103 MySQL Client IP192.168.1.104 1、在主机Amoeba上安装java环境
JAVA官网下载地址Java 归档下载 - Java SE 6 |甲骨文中国 (oracle.com)
Amoeba变形虫下载地址阿米巴 - 浏览 SourceForge.net 的文件
因为Amoeba是基于jdk1.5版本开发的所以官方推荐使用1.5或者1.6版本高版本不建议使用。
查看Java版本
java -version查看路径
which java删除查找出来的Java目录
rm -rf /usr/bin/java下载Java二进制包并按照提示安装Java环境包 ./jdk-6u14-linux-x64.bin 移动目录赋予执行权限
mv jdk1.6.0_14/ /usr/local/jdk1.6chmod x /usr/local/jdk1.6/2、安装并配置amoeba赋予权限
mkdir /usr/local/amoebatar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/chmod -R 755 /usr/local/amoeba/设置环境变量java、amoeba 使配置文件生效
source /etc/profile检查java版本
java -version检查环境变量
echo $PATH3、配置Amoeba读写分离两个Slave读负载均衡
在Master、Slave1、Slave2服务器中配置Amoeba的访问授权
grant all on *.* to test192.168.1.% identified by 123123.coM;flush privileges;编辑amoeba.xml配置文件 vim /usr/local/amoeba/conf/amoeba.xml需要更改的内容,仅供参考30 property nameuseramoeba/property31 32 property namepassword123123.coM/property115 property namedefaultPoolmaster/property
116 property namewritePoolmaster/property
117 property namereadPoolslaves/property编辑dbServers.xml配置文件
vim /usr/local/amoeba/conf/dbServers.xml需要更改的内容,仅供参考21 22 !-- mysql schema --23 property nameschematest/property24 25 !-- mysql user --26 property nameuserroot/property27 28 !-- mysql password --29 property namepassword123123.coM/property46 factoryConfig47 !-- mysql ip --48 property nameipAddress192.168.1.100/property49 /factoryConfig50 /dbServer51 52 dbServer nameslave1 parentabstractServer53 factoryConfig54 !-- mysql ip --55 property nameipAddress192.168.1.101/property56 /factoryConfig57 /dbServer58 59 dbServer nameslave2 parentabstractServer60 factoryConfig61 !-- mysql ip --62 property nameipAddress192.168.1.102/property63 /factoryConfig64 /dbServer66 poolConfig classcom.meidusa.amoeba.server.MultipleServerPool67 !-- Load balancing strategy: 1ROUNDROBIN , 2WEIGHTBASED , 3HA--68 property nameloadbalance1/property69 70 !-- Separated by commas,such as: server1,server2,server1 --71 property namepoolNamesslave1,slave2/property72 /poolConfig73 /dbServer 3.1、配置无误后启动Amoeba软件默认端口是TCP协议8066
/usr/local/amoeba/bin/amoeba start netstat -anptu | grep 8066netstat -anpt | grep 33063.2、在Client上进行访问测试
mysql -uamoeba -p123123.coM -h 192.168.1.103 -P 8066在MySQL主服务器上创建一个表会自动同步到各个从服务器上然后关掉各个服务器上的Slave功能在分别插入语句测试。
在主服务器上插入内容
insert into a1 values(1,zn);从两台从服务器查看
select * from a1;查询得知已有数据库数据表关闭从服务器服务 从服务器1 从服务器2 从客户端查看
select * from a1;3.3、测试写操作
在从服务器1上插入一条语句
insert into a1 values(2,zm);客户端检查验证 在从服务器2上插入一条语句
insert into a1 values(3,zm);客户端检查验证 上述操作对应的是MySQL数据库中的负载均衡 在客户端插入内容
insert into a1 values(4,za);客户端查看验证 经过查询并未发现编号为4的数据
主服务器端进行查看验证
select * from a1;此类操作对应的正是MySQL数据库中的读写分离 总结
在本次实验中有几个需要注意的地方
1.在配置amoeba变形虫是要注意我们的Java版本是否符合然后就是安装amoeba不论是哪个都需要注意路径在两者操作结束后修改配置文件/etc/profile然后输入source /etc/profile使配置文件生效。
2.然后我们注意要去每个主从服务器里为amoeba用户进行授权不然无法进行访问
3.测试阶段可以通过slave功能的启停来理解什么事读写分离、负载均衡。