目录
一.MySQL主从复制
1.主从复制原理
1.mysql支持的复制类型
- 基于语句的复制
- 基于行的复制
- 混合类型的复制
2.mysql主从复制的工作原理
- 主服务器 master 记录数据库通过 dump 线程将操作记录到 Binary log
- 从服务器开启 I/O 线程向主服务器发送同步日志请求
- 主服务器把二进制日志内容发送给从服务器
- 从服务器将二进制日志记录的操作同步到relay log (中继日志) (存在从服务器的缓存中)
- 从服务器中的sql线程将relay log日志记录的操作在从服务器执行后写入从服务器数据库
主节点dump Thread
从节点I/O Thread SQL Thread
3.MySOL主从复制延迟
- master服务器高并发,形成大量事务
- 网络延迟
- 主从硬件设备导致 cpu主频、内存io、硬盘io
- 本来就不是同步复制、而是异步复制
- 从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysgl内存中完成,减少磁盘操作。从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。从库使用SSD磁盘 网络优化,避免跨机房实现同步
4.复制的作用
-
数据分布
-
负载均衡读操作
-
备份
-
高可用和故障切换
-
MySQL升级测试
2.具体操作
主服务器:192.168.68.200
从服务器1:192.168.68.30
从服务器2:192.168.69.105
1.主服务器192.168.68.200
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y ntp ##安装主服务器时间同步
[root@localhost ~]# vim /etc/ntp.conf
server 127.127.68.0
fudge 127.127.68.0 stratum 8
[root@localhost ~]# systemctl start ntpd
[root@localhost ~]# vim /etc/my.cnf
server-id = 1
log-bin=master-bin
binlog_format=MIXED
log-slave-updates=true
[root@localhost ~]# systemctl restart mysqld.service
[root@localhost ~]# mysql -u root -p123123 ##进入数据库
mysql> grant replication slave on *.* to 'myslave'@'192.168.68.%' identified by '123456';
mysql> flush privileges;
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 603 | | | |
+-------------------+----------+--------------+------------------+-------------------+
[root@localhost ~]# vim /etc/ntp.conf
127.127.68.0 要在自己网段上
[root@localhost ~]# vim /etc/my.cnf
2.从服务器192.168.68.30
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y ntp ntpdate.x86_64
[root@localhost ~]# service ntpd start
[root@localhost ~]# /usr/sbin/ntpdate 192.168.68.200
##创建定时任务
[root@localhost ~]# crontab -e
*/30 * * * * /bin/sbin/ntpdate 192.168.68.200
[root@localhost ~]# vim /etc/my.cnf
server-id = 2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
[root@localhost ~]# systemctl restart mysqld.service
[root@localhost ~]# mysql -u root -padmin123
mysql> change master to master_host='192.168.68.200',master_user='myslave',master_password='123456'23456',master_log_file='master-bin.000001',master_log_pos=603;
mysql> start slave;
mysql> show slave status\G
[root@localhost ~]# crontab -e
命令要写绝对路径,用which+命令就可以知道该命令的绝对路径了
[root@localhost ~]# vim /etc/my.cnf
3.从服务器192.168.68.105
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y ntp ntpdate.x86_64
[root@localhost ~]# service ntpd start
[root@localhost ~]# /usr/sbin/ntpdate 192.168.68.200
##创建定时任务
[root@localhost ~]# crontab -e
*/30 * * * * /bin/sbin/ntpdate 192.168.68.200
[root@localhost ~]# vim /etc/my.cnf
server-id = 3
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
[root@localhost ~]# systemctl restart mysqld.service
[root@localhost ~]# mysql -u root -pa123123
mysql> change master to master_host='192.168.68.200',master_user='myslave',master_password='123456'23456',master_log_file='master-bin.000001',master_log_pos=603;
mysql> start slave;
mysql> show slave status\G
[root@localhost ~]# crontab -e
命令要写绝对路径,用which+命令就可以知道该命令的绝对路径了
[root@localhost ~]# vim /etc/my.cnf
4.测试
主服务器192.168.68.200
从服务器192.168.68.30
从服务器192.168.68.105
二.读写分离
1.mysql读写分离的概念
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。
数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
2.mysql读写分离的原理
读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。
3. MySQL 读写分离的方式
1.基于程序代码内部实现
性能较好
需要开发人员来实现,运维人员无从下手
2.基于中间代理层实现
一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
(1)MySQL-Proxy
(2)Atlas
(3)Amoeba
4.读写分类的作用
因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。
但是数据库的“读”(读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。
5.什么时候要读写分离
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。
利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。
6.搭建Amoeba 实现读写分离操作
主服务器:192.168.68.200
从服务器1:192.168.68.30
从服务器2:192.168.68.105
amoeba:192.168.68.40
客户端:192.168.68.10
1.amoeba:192.168.68.40
[root@localhost opt]# rz -E
rz waiting to receive.
[root@localhost opt]# ls
jdk-6u14-linux-x64.bin Python-3.7.7 Python-3.7.7_.tgz rh
[root@localhost opt]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@localhost opt]# cd /usr/local/
[root@localhost local]# chmod +x jdk-6u14-linux-x64.bin
[root@localhost local]# ./jdk-6u14-linux-x64.bin
[root@localhost local]# mv jdk1.6.0_14/ jdk1.6
[root@localhost local]# 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
[root@localhost local]# source /etc/profile
[root@localhost local]# java -version
[root@localhost local]# mkdir amoeba
[root@localhost local]# cd /opt/
[root@localhost opt]# ls
amoeba-mysql-binary-2.2.0.tar.gz Python-3.7.7 rh
jdk-6u14-linux-x64.bin Python-3.7.7_.tgz
[root@localhost opt]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@localhost amoeba]# chmod -R 755 /usr/local/amoeba/
[root@localhost amoeba]# /usr/local/amoeba/bin/amoeba
amoeba start|stop
[root@localhost amoeba]# amoeba
amoeba start|stop
安装java环境,将jdk-6u14-linux-x64.bin拖到/opt目录下
最后出现done就说明安装好了
将jdk1.6.0_14/移动到 /usr/local/并修改名称为:jdk1.6
[root@localhost local]# vim /etc/profile 在最后加入以下配置
解压amoeba
赋予权限并运行
在Master、slave1和slave2服务器开启amoeba访问
2.master:192.168.68.200
3.amoeba:192.168.68.40
Amoeba服务器设置amoeba服务
[root@localhost ~]# cd /usr/local/amoeba/conf/
[root@localhost conf]# cp amoeba.xml amoeba.xml.bak
[root@localhost conf]# vim amoeba.xml
30 <property name="user">amoeba</property> ##设置登录用户名
32 <property name="password">123456</property> ##设置密码
115<property name="defaultPool">master</property> ##设置默认池为master
将117行的注释删掉
118<property name="writePool">master</property> ##设置写池
119<property name="readPool">slaves</property> ##设置读池
[root@localhost conf]# cp dbServers.xml dbServers.xml.bak
[root@localhost conf]# vim dbServers.xm
23 <!-- <property name="schema">test</property> --> ##将23行注释掉
26 <property name="user">test</property> ##设置登录用户
29 <property name="password">123123</property> ##删掉28和30行,并设置密码
45 <dbServer name="master" parent="abstractServer">
46 <factoryConfig>
47 <!-- mysql ip -->
48 <property name="ipAddress">192.168.68.200</property>
49 </factoryConfig>
50 </dbServer>
51
52 <dbServer name="slave1" parent="abstractServer">
53 <factoryConfig>
54 <!-- mysql ip -->
55 <property name="ipAddress">192.168.68.30</property>
56 </factoryConfig>
57 </dbServer>
58 <dbServer name="slave2" parent="abstractServer">
59 <factoryConfig>
60 <!-- mysql ip -->
61 <property name="ipAddress">192.168.68.105</property>
62 </factoryConfig>
63 </dbServer>
65 <dbServer name="slaves" virtual="true">
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>
[root@localhost conf]# amoeba start &
[root@localhost conf]# netstat -natp |grep java
[root@localhost conf]# vim amoeba.xml 全局配置
[root@localhost conf]# vim dbServers.xm
4.客户端192.168.68.10
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y mariadb mariadb-server
[root@localhost ~]# mysql -uamoeba -p123123 -h 192.168.68.40 -P8066
7.验证轮询读写分离
1.轮询
在两台从服务器上关掉主从复制
在slave1上
在slave2上
在客户机上
2.读写分离
在master,slave1,slave2,amoeba服务器上
在主从服务器上
在slave1从服务器上
在客户端上
在主从服务器上
在slave1从服务器上
此时读写分离已经完成