mysql+三种复制⽅式_MySQL主从复制+读写分离原理及配置
实例
博⽂⼤纲:
⼀、MySQL主从复制原理
⼆、MySQL读写分离原理
三、搭建MySQL主从复制及读写分离
⼀、MySQL主从复制原理:
MySQL的主从复制和MySQL的读写分离两者不分家,基于主从复制的架构才可实现数据的读写分离。
1、MySQL⽀持的复制类型:
(1)基于语句的复制。顾名思义就是在主服务器上执⾏的SQL语句,在从服务器上执⾏同样的语句。MySQL默认采⽤这种⽅式的复制,效率⽐较⾼。
(2)基于⾏的复制。把改变的内容复制过去,⽽不是把命令再从主服务器上执⾏⼀遍。
(3)混合类型的复制。默认采⽤基于语句的复制,⼀旦发现基于语句⽆法精确复制时,就会采⽤基于⾏的复制。
以上三种复制类型,不需要⼈为⼲预,MySQL数据库会⾃动控制。
2、复制的⼯作过程,如下图所⽰:
(1)在每个事物更新数据完成之前,master在⼆进制⽇志记录这些改变。写⼊⼆进制⽇志完成后,master通知存储引擎提交事务。
(2)slave将master的Binary log复制到其中继⽇志。⾸先slave开始⼀个⼯作线程——I/O线程,I/O线程在master上打开⼀个普通的连接,然后开始Binlog dump process(Binlog转储过程),Binlog dump process从master的⼆进制⽇志中读取事件,如果已经跟上master,它会睡眠并等待master产⽣新的事件。I/O线程将这些事件写⼊中继⽇志。
(3)SQL slave thread(SQL从线程)处理该过程的最后⼀步。SQL线程从中继⽇志读取事件,并重放其中的事件⽽更新slave的数据,使其与master中的数据⼀致。只要该线程与I/O现场曾保持⼀致,中继⽇志通常存在系统的缓存中,所以中继⽇志的开销很⼩。
复制过程有⼀个很重要的限制,就是在slave上的复制是串⾏化的,master上时并⾏化的。说⽩了就是,有可能⼀些数据更新是多条SQL语句同时在master上进⾏的,但slave进⾏复制时,只能⼀条⼀条的执⾏SQL语句进⾏数据同步。
⼆、MySQL读写分离原理:
简单来说,就如下图⼀样,就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理数据写⼊、更新操作,⽽从数据库处理select查询操作。
较为常见的MySQL读写分离分为两种:
1、基于程序代码内部实现:在代码中根据select、insert语句进⾏路由分类,这类⽅法⽬前在⽣产环境中应⽤最⼴泛。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开⽀;缺点是需要开发⼈员来实现,我们运维⽆从下⼿。
2、基于中间代理实现:代理位于客户端和MySQL服务器之间,代理服务器接到客户端的请求后通过判断后转发到后端数据库。中间代理有两个代表性程序:MySQL-Proxy和amoeba(变形⾍)。
⼆者区别如下:
MySQL-Proxy是MySQL开源项⽬,通过⾃带的lua脚本进⾏SQL判断,虽然是MySQL官⽅产品,但是MySQL官⽅并不建议将其应⽤到⽣产环境。
amoeba使⽤Java语⾔进⾏开发,阿⾥巴巴将其⽤于⽣产环境,它不⽀持事务和存储过程。
虽然通过程序代码实现MySQL读写分离是⼀个很好的选择,但并不是所有的应⽤都适合在程序代码中实现读写分离,⼀些⼤型复杂的Java 应⽤,如果在程序代码中实现读写分离对代码的改动就⽐较⼤。所以,⼤型复杂的应⽤⼀般都会考虑使⽤代理层来实现。
三、搭建MySQL主从复制及读写分离
环境如下:
html空格不占位1、部署前准备:
(1)我这⾥所有服务器均使⽤centos 7。
(2)下载部署MySQL所需软件包:下载链接,提取码:2z5k
(3)准备系统映像,⾃⾏配置本地yum仓库。下载搭建读写分离所需软件:下载amoeba及JDK链接,提取码:ulz3 。
(4)应⽤客户端为了测试效果,必须可以使⽤mysql命令,所以也需要安装mysql,为了⽅便,安装系统映像⾃带的mysql即可。
(5)⾃⾏配置⽹络环境,确保⽹络互通,防⽕墙放⾏相关端⼝的流量,我这⾥为了⽅便,直接关闭了防⽕墙。
2、部署MySQL数据库(在主/从节点共三台服务器上都需要部署MySQL数据库,将以下部署过程分别在三台服务器上执⾏⼀遍)
(1)为了避免发⽣程序冲突、端⼝冲突等问题,可以先执⾏以下命令,进⾏删除系统⾃带的mysql程序:
[root@localhost ~]# yum -y erase mysql
(2)挂载centos系统盘,安装ncurses-devel包:
[root@localhost ~]# mount /dev/cdrom /media
[root@localhost ~]# cd /media/Packages/
[root@localhost Packages]# rpm -ivh ncurses-devel-5.9-14.20130511.el7_4.x86_64.rpm
(3)由于mysql 5.x系列版本需要cmake编译安装,所以继续安装cmake包:
[root@localhost media]# tar zxf cmake-2.8. -C /tmp #解包
[root@localhost media]# cd /tmp/cmake-2.8.6/
[root@localhost cmake-2.8.6]# ./configure && gmake && gmake install #配置,编译安装
(4)创建专门⽤来运⾏mysql服务的⽤户,此⽤户不需要直接登录到系统:
[root@localhost cmake-2.8.6]# groupadd mysql
[root@localhost cmake-2.8.6]# useradd -M -s /sbin/nologin mysql -g mysql
mysql怎么读英语(5)将下载的mysql源码包解压,并进⾏配置,编译及安装(千万要注意⼤⼩写,不要打错配置项,就算错误也可以继续后续的安装,但是,最后服务是⽆法启动的,千万不要打错字母,千万不要打错字母,千万不要打错字母,重要的事情说三遍):
[root@localhost media]#tar zxf mysql-5.6. -C /tmp #解压⾄/tmp⽬录
[root@localhost cmake-2.8.6]# cd /tmp/mysql-5.6.36 #切换⾄展开后的源码⽬录
[root@localhost mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
win10安装git教程-DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all
[root@localhost mysql-5.6.36]# make && make install #编译并安装
(6)对数据库⽬录进⾏权限设置:
[root@localhost mysql-5.6.36]# chown -R mysql:mysql /usr/local/mysql
(7)建⽴配置⽂件:
centos 7系统下默认⽀持MariaDB数据库,因此系统默认的/etc/myf配置⽂件中是MariaDB的配置⽂件,⽽在mysql的源码⽬录中提供了mysql数据库默认的样本配置⽂件,在启动mysql数据库之前,需要先将原有的myf⽂件替换为mysql提供的配置⽂件内容。
[root@localhost mysql-5.6.36]# rm -rf /etc/myf #删除原有配置⽂件
[root@localhost mysql-5.6.36]# cp support-files/my-defaultf /etc/myf
#复制源码包中的配置⽂件到/etc/下
(8)初始化数据库(若数据库初始化时配置错误的话,将mysql安装⽬录中的data⽬录删掉后重新初始化即可):
[root@localhost mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db --user=mysql
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
(9)设置环境变量(为了⽅便在任何⽬录下使⽤mysql命令):
[root@localhost mysql-5.6.36]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@localhost mysql-5.6.36]# . /etc/profile #⽴即⽣效
(10)当对/usr/local/mysql/bin/mysqld.sh 赋予执⾏权限后,继续以下操作:
[root@localhost mysql-5.6.36]# cp support-files/mysql.server /usr/local/mysql/bin/mysqld.sh
#复制到安装⽬录中
[root@localhost mysql-5.6.36]# chmod +x /usr/local/mysql/bin/mysqld.sh
#赋予执⾏权限
[root@localhost mysql-5.6.36]# cp /usr/local/mysql/bin/mysqld.sh /etc/init.d/mysqld
[root@localhost mysql-5.6.36]# vim /etc/init.d/mysqld
修改后,保存退出。继续执⾏如下命令:
[root@localhost mysql-5.6.36]# chkconfig --add mysqld #添加为系统服务
11、启动服务并查看mysql服务器状态:
[root@localhost mysql-5.6.36]# systemctl start mysqld #启动服务
[root@localhost mysql-5.6.36]# systemctl status mysqld #查看服务状态是否正常
3、开始搭建MySQL主从复制:
(1)建⽴时间同步环境:
①在MySQL主服务器上搭建时间同步服务器(关于ntp时间同步,安装系统时,⼀般都安装了该服务,可以在执⾏下⾯的yum操作之前,主服务器使⽤rpm -qa | grep ntp进⾏查询,从服务器使⽤rpm -qa | grep ntpdate查询,若已安装,则可省略下⾯的yum安装步骤)。
[root@master ~]# yum -y install ntp #安装ntp
#若服务器可连接Internet,直接yum安装即可;
#若⽆法连接,⾃⾏配置本地yum仓库,系统盘有相关软件包。
[root@master ~]# vim /f #添加下⾯两⾏配置,从⽽设置时区。
server 127.127.1.0 #添加到任意位置即可
fudge 127.127.1.0 stratum 8
#添加后,保存退出即可。
[root@master ~]# systemctl restart ntpd #重启服务
[root@master ~]# systemctl enable ntpd #设置开机⾃启动
②在slave1和slave2分别执⾏以下操作,从⽽配置时间同步。(由于两台从节点有很多相同的配置,为了⽅便,我会将两台从节点⼀样的配置,只写⼀遍,⾃⾏在两台服务器上分别配置即可)。
[root@slave1 ~]# yum -y install ntpdate #安装ntpdate。
[root@slave1 ~]# ntpdate 192.168.1.1
(2)配置MySQL master主服务器:
[root@master ~]# vim /etc/myf #编辑MySQL主配置⽂件,修改或增加下⾯配置
log_bin = master-bin #修改
log-slave-updates = true #增加
server_id = 11 #修改
[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -u root -p #登录MySQL
Enter password: #输⼊密码
mysql> grant replication slave on *.* to 'myslave'@'192.168.1.%' identified by '123456';
#授权⼀个账户,以便从服务器连接使⽤
mysql> flush privileges;
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
php常见算法题+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 410 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
springboot主要注解#其中file列显⽰⽇志名,Position列显⽰偏移量,这两个值在后⾯配置从服务器时使⽤。
#这两个值还需根据⾃⼰查询出来的实际来变,你们可能和我这⾥查询出的不⼀样。
(3)分别配置slave1和slave2从服务器(两台slave服务器都执⾏⼀遍以下的操作):
静态网站开发步骤[root@slave1 ~]# vim /etc/myf #更改或增加以下内容
server_id = 22 #修改,该id号不可和其他主/从服务器重复,另⼀从服务器我配置成“33”了
relay-log=relay-log-bin #增加
relay-log-index=slave-relay-bin.index #增加
#编辑好上⾯三号,保存退出即可。
[root@slave1 ~]# systemctl restart mysqld #重启MySQL
[root@slave1 ~]# mysql -u root -p #登录到数据库
Enter password: #输⼊密码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论