目录
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 process,Binlog dump process会从Master的二进制日志中读取操作事件,如果已经跟Master达到一致状态,它会催眠并等待Master产生新的操作事件,I/O线程将这些改变数据的事件写入自己的中继日志。
3、SQL Slave Thread(SQL工作线程)是处理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-server
1、配置mysql master服务器
在/etc/my.cnf中修改或者增加如下内容:
vim /etc/my.cnf
添加内容如下:
server-id=1
log-bin=mysql-binlog
log-slave-updates=true
重启mysql服务器
systemctl restart mariadb
查看监听
netstat -anptu | grep 3306
2、创建Replication用户
grant replication slave on *.* to 'myslave'@'192.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 root@192.168.1.101:/root/
scp /root/alldbbackup.sql root@192.168.1.102:/root/
5、在MySQL Slave上的配置
导入Master的备份脚本(刚刚传输的)
systemctl start mysqld
mysql -uroot -p < /root/alldbbackup.sql
从库连接主库进行测试,如果连接成功说明主库配置成功
mysql -u myslave -p123123.coM -h 192.168.1.100
修改MySQL从服务器配置文件
vim /etc/my.cnf
server-id=2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
配置多个从服务器时依次设置server-id号
重启服务
systemctl restart mariadb
在Slave服务器授权,启动从库,进行主从库数据同步
stop slave;
CHANGE MASTER TO MASTER_HOST='192.168.1.100',MASTER_USER='myslave',MASTER_PASSWORD='123123.coM',MASTER_LOG_FILE='mysql-binlog.000001',MASTER_LOG_POS=479;
这是MySQL中用于配置从服务器的语句,用于指定主服务器的相关信息,以便从服务器可以连接到主服务器并开始复制数据。命令含义如下:
- `CHANGE MASTER TO`: 告诉MySQL服务器要更改从服务器的配置。
- `MASTER_HOST='192.168.1.100'`: 指定主服务器的IP地址或主机名为 '192.168.1.100',表示从服务器将连接到该主服务器。
- `MASTER_USER='myslave'`: 指定从服务器连接主服务器时要使用的用户名为 'myslave',这是在前面的授权命令中创建的用户。
- `MASTER_PASSWORD='123123.coM'`: 指定从服务器连接主服务器时使用的密码为 '123123.coM',这是在前面的授权命令中设置的密码。
- `MASTER_LOG_FILE='mysql-binlog.000001'`: 指定从服务器开始复制的主服务器二进制日志文件名,此处为 'mysql-binlog.000001'。这表示从该文件开始复制数据。
- `MASTER_LOG_POS=479`: 指定从服务器复制的主服务器二进制日志文件的位置,此处为 479。这表示从该位置开始复制数据。
此命令的目的是配置从服务器连接到指定的主服务器,并从指定的二进制日志文件和位置开始复制数据。
如果出现问题
1.使用 find / -iname "auto.cnf" 命令查找你数据库的auto.cnf 配置文件。
find / -iname "auto.cnf"
2.把查询到的文件删除,系统将重新自动分配
rm -rf 查询到的文件目录
3.登录mysql,重启slave,再次验证
stop slave; start slave; show slave status\G;
如果还未成功( Slave_I0_Runing:NO )一般是事务回滚造成的:
stop slave; set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave;
这是MySQL中的一个命令,用于跳过从服务器上的一个事务并继续执行后续的事务。具体来说,该命令的含义是:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1
: 设置全局变量SQL_SLAVE_SKIP_COUNTER
的值为 1。该变量用于指定从服务器跳过的事务数量。这个命令通常在从服务器上执行,用于处理复制过程中的错误或跳过某些无法执行的事务。通过将
SQL_SLAVE_SKIP_COUNTER
设置为一个正整数,可以告诉从服务器跳过指定数量的事务,并继续执行后续的事务。
start slave;
flush privileges;
查看
参数说明:
CHANGE MASTER TO
MASTER_HOST='master_host_name', #主服务器的IP地址
MASTER_USER='replication_user_name', #主服务器授权的用户
MASTER_PASSWORD='replication_password', #主服务器授权的密码
MASTER_LOG_FILE='recorded_log_file_name', #主服务器二进制日志的文件名
MASTER_LOG_POS=recorded_log_position; #日志文件的开始位置
6、测试复制是否成功
在Master服务器上创建一个数据库或者表,到Slave服务器上查看,如果配置成功就可以成功同步。
主服务器创建数据库
mysql -uroot -p123123
create database a2;
从服务器登录查看数据库列表
mysql -u myslave -p123123.coM -h 192.168.1.100
show databases;
可以查询到,说明主从数据库创建成功。 主从服务器可以进行通联。
报以下错误的解决方法:
数据不同步解决方法:
基于Amoeba读写分离
七、概述
在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是安全性,高可用还是并发等各个方面都不能完全满足实际需求的,因此一般来说都是通过主从复制的方式来同步数据,再通过读写分离来提供数据的高并发负载能力这样的方案来进行部署。
简单来说,读写分离就是只在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库。
1、主从复制
通过主从复制技术,将数据库的写操作(insert、update、delete)全部集中在主服务器上,然后将主服务器的写操作日志传输到从服务器上进行执行,以保持从服务器的数据与主服务器一致。主服务器负责处理写操作,从服务器负责处理读操作。
2、数据同步
主从服务器之间需要保持数据的一致性。当主服务器上的数据发生变化时,会将变更日志传输给从服务器,从服务器通过执行变更日志来同步数据。
3、读写分离规则
应用程序通过对数据库连接的配置,将读操作的请求发送到从服务器,将写操作的请求发送到主服务器。这样可以实现读操作的负载均衡和写操作的集中处理。
八、常见的MySQL读写分离
1、基于程序代码内部实现
在代码中根据select,insert进行路由分类,这类方法也是目前大型生产环境应用最广泛的,优点是性能最好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手
2、基于中间代理层实现
代理一般位于客户端和数据库服务器之间,代理服务器接到客户端请求后通过判断转发到后端数据库,代表性程序:
(1)mysql-proxy为mysql开发早期开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境。
(2)Amoeba(变形虫)该程序由java语言及逆行开发,阿里巴巴将其应用于生产环境,它不支持事物和存储过程。
Amoeba(变形虫)项目开源框架于2008年发布一款Amoeba for mysql软件,这个软件致力于mysql的分布式数据库前端代理层,主要为应用层访问mysql的时候充当SQL路由功能,并具有负载均衡,高可用性,SQL过滤,读写分离,可路由到相关的目标数据库,可并发请求多台数据库,通过Amoeba能够完成多数据源的高可用,负载均衡,数据切片的功能,目前Amoeba已经在很多企业的生产线上使用。
九、实验
在配置读写分离前配置各机器ip
MySQL Master IP:192.168.1.100
MySQL Slave1 IP:192.168.1.101
MySQL Slave2 IP:192.168.1.102
MySQL Amoeba IP:192.168.1.103
MySQL Client IP:192.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.6
chmod +x /usr/local/jdk1.6/
2、安装并配置amoeba,赋予权限
mkdir /usr/local/amoeba
tar 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 $PATH
3、配置Amoeba读写分离,两个Slave读负载均衡
在Master、Slave1、Slave2服务器中配置Amoeba的访问授权
grant all on *.* to 'test'@'192.168.1.%' identified by '123123.coM';
flush privileges;
编辑amoeba.xml配置文件
vim /usr/local/amoeba/conf/amoeba.xml
需要更改的内容,仅供参考!
30 <property name="user">amoeba</property>
31
32 <property name="password">123123.coM</property>
115 <property name="defaultPool">master</property>
116 <property name="writePool">master</property>
117 <property name="readPool">slaves</property>
编辑dbServers.xml配置文件
vim /usr/local/amoeba/conf/dbServers.xml
需要更改的内容,仅供参考!
21
22 <!-- mysql schema -->
23 <property name="schema">test</property>
24
25 <!-- mysql user -->
26 <property name="user">root</property>
27
28 <!-- mysql password -->
29 <property name="password">123123.coM</property>
46 <factoryConfig>
47 <!-- mysql ip -->
48 <property name="ipAddress">192.168.1.100</property>
49 </factoryConfig>
50 </dbServer>
51
52 <dbServer name="slave1" parent="abstractServer">
53 <factoryConfig>
54 <!-- mysql ip -->
55 <property name="ipAddress">192.168.1.101</property>
56 </factoryConfig>
57 </dbServer>
58
59 <dbServer name="slave2" parent="abstractServer">
60 <factoryConfig>
61 <!-- mysql ip -->
62 <property name="ipAddress">192.168.1.102</property>
63 </factoryConfig>
64 </dbServer>
66 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
67 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
68 <property name="loadbalance">1</property>
69
70 <!-- Separated by commas,such as: server1,server2,server1 -->
71 <property name="poolNames">slave1,slave2</property>
72 </poolConfig>
73 </dbServer>
3.1、配置无误后,启动Amoeba软件,默认端口是TCP协议8066
/usr/local/amoeba/bin/amoeba start &
netstat -anptu | grep 8066
netstat -anpt | grep 3306
3.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功能的启停来理解什么事读写分离、负载均衡。