目录
前言
一、主从复制原理
1.1 MySQL的复制类型
1.2 mysql主从复制的工作原理
1.3 MySQL主从复制延迟
1.4 MySQL四种同步方式
1.5 MySQL支持的复制类型
二、 MySQL应用场景
三、主从复制实验
3.1 MySQL主从服务器时间同步
3.1.1 安装ntp、修改配置文件
3.1.2 两台SLAVE服务器配置
3.2 配置主从同步
3.2.1 master服务器修改配置文件
3.2.2 从服务器配置
3.3 测试数据同步
四、MySQL 读写分离
4.1 MySQL读写分离原理
4.2 读写分离存在意义
4.3 常见的两种 MySQL 读写分离分
4.3.1 基于程序代码内部实现
4.3.2 基于中间代理层实现
4.3.3 Amoeba
4.4 MySQL读写分离原理
五、MySQL四种同步方式
5.1 异步复制(Async Replication)
5.2 同步复制(Sync Replication)
5.3 半同步复制(Semi-Sync Replication)
5.4 增强半同步复制(lossless Semi-Sync Replication、无损复制)
六、搭建 MySQL 读写分离
6.1 Amoeba服务器配置
6.2 配置 Amoeba读写分离,两个 Slave 读负载均衡
6.3 回到amoeba服务器配置amoeba服务
6.4 修改数据库配置文件
6.5 测试读写分离
在企业应用中,成熟的业务通常数据量都比较大 单台MySQL在安全性、 高可用性和高并发方面都无法满足实际的需求 配置多台主从数据库服务器以实现读写分离
【两个日志,三个线程】
两个日志:Binary log:二进制日志;relay log:中继日志
三个线程:从服务器的I/O线程、SQL线程、主服务器的dump线程
Binary log:二进制日志;relay log:中继日志
主服务器会把数据写进二进制文件里面---》
然后从服务器的i/o线程向dump发出同步请求,dump把数据发送给i/o线程,然后i/o写入到本地的中继日志---》
然后通过mysql从服务器的sql线程来读取中继日志,实现`重放`的功能,同步到自己的数据库中
最终实现mysql主从复制同步
问题解决方法
异步复制(asynchronous)
主服务器不需要等待从服务器是否把二进制文件拷入到中继日志中,就开始读取新的请求了。
同步复制(sync replication)
主服务器需要等待从服务器把二进制文件拷入到中继日志中,并且还要从库中执行完成,主服务器才能开始读取新的请求了。
半同步复制(Semi synchronous)
主服务器需要等待从服务器是否把二进制文件拷入到中继日志中,不管你是否在从库中执行完成,就开始读取新的请求了。
增强版的半同步复制(lossless replication)
数据零丢失,无损复制,性能好,mysql5.7诞生
mysql架构演变的方向:
主机 | 操作系统 | IP地址 | 所需工具/软件/安装包 |
Master | CentOS7 | 192.168.19.3 | ntp 、 mysql-boost-5.7.20.tar.gz |
Slave1 | CentOS7 | 192.168.19.6 | ntp 、ntpdate 、mysql-boost-5.7.20.tar.gz |
Slave2 | CentOS7 | 192.168.19.7 | ntp 、ntpdate 、 mysql-boost-5.7.20.tar.gz |
Amoeba | CentOS7 | 192.168.19.4 | jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz |
客户端 | CentOS7 | 192.168.19.5 |
yum -y install ntp
vim /etc/ntp.conf
末尾添加
server 127.127.19.0 #设置本地是时钟源,注意修改网段
fudge 127.127.19.0 stratum 10 #设置时间层级为10(限制在15内)
yum install ntp ntpdate -y
ntpdate 192.168.19.3
crontable -e
*/10 * * * * /usr/sbin/ntpdate 192.168.19.3
两台从服务器配置相同
vim /etc/my.cnf
#在mysqld模块下修改一下内容
#开启二进制日志文件(之后生成的日志名为master-bin)
log_bin=master-bin
#开启从服务器日志同步
log_slave-updates=true
#主服务器id为1(不可重复)
server_id = 1
--------》wq
重启服务
配置规则
mysql -uroot -p
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.19.%' IDENTIFIED BY '123456';
刷新权限表
flush privileges;
查看master数据库状态
show master status;
vim /etc/my.cnf
server-id = 2 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #添加,定义中继日志文件的位置和名称
relay_log_recovery = 1 #选配项
#当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 master 上获取日志,这样就保证了relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。
systemctl restart mysqld
mysql -u root -p
change master to master_host='192.168.19.3' , master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1311;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致,这里的是例子,每个人的都不一样
start slave; #启动同步,如有报错执行 reset slave;
show slave status\G #查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程
在主服务器上创建一个数据库
在两台从服务器上直接查看数据库列表
Amoeba(192.168.19.4)
因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
将jdk-6u14-linux-x64.bin 和 amoeba-mysql-binary-2.2.0.tar.gz.0 上传到/opt目录下。
cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
按空格到最后一行
按yes,按enter
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile
java -version
##安装 Amoeba软件##
mkdir /usr/local/amoeba
tar zxvf /opt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
//如显示amoeba start|stop 说明安装成功
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
vim amoeba.xml #修改amoeba配置文件
30修改
amoeba
32修改
123456
115修改
master
117去掉注释–
master
slaves
cp dbServers.xml dbServers.xml.bak
vim dbServers.xml #修改数据库配置文件
23注释掉
作用:默认进入test库 以防mysql中没有test库时,会报错
26修改
test
28-30去掉注释
123456
45修改,设置主服务器的名Master
48修改,设置主服务器的地址
192.168.223.10
52修改,设置从服务器的名slave1
55修改,设置从服务器1的地址
192.168.223.9
58复制上面6行粘贴,设置从服务器2的名slave2和地址
192.168.223.11
65修改
71修改
slave1,slave2
/usr/local/amoeba/bin/amoeba start& #启动Amoeba软件,按ctrl+c 返回
netstat -anpt | grep java #查看8066端口是否开启,默认端口为TCP 8066
在客户端服务器上进行测试:
使用yum快速安装MySQL虚拟客户端
通过amoeba服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从服务器
在主服务器上:
use db_test;
create table test (id int(10),name varchar(10),address varchar(20));
在两台从服务器上:
stop slave; #关闭同步
use db_test;
//在slave1上:
insert into test values('1','zhangsan','this_is_slave1');
//在slave2上:
insert into test values('2','lisi','this_is_slave2');
//在主服务器上:
insert into test values('3','wangwu','this_is_master');
//在客户端服务器上:
use db_test;
select * from test; //客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据
insert into test values('4','qianqi','this_is_client'); //只有主服务器上有此数据
//在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据
start slave;