在实际的生产环境中,如果对数据库的读写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(Master–Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案来进行部署与实施的。
MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展。多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能。
如图所示,一台主 MySQL 服务器带两台从 MySQL 服务器做数据复制,前端应用在进行数据库写操作时,对主服务器进行操作,在进行数据库读操作时,对两台从服务器进行操作,这样大量减轻了对主服务器的压力。 客户机写入数据时,Amoeba 会将数据路由到 Master 上进行存储,客户机读取数据时,Amoeba会将读的请求一轮询的方式发给slaves组,实现读写分离。 Master 和 Slaves 间配置了主从复制,保证了数据的一致性。
注意:
当做读写分离的时候才需要对 Amoeba 做操作,做读写分离前提需要搭建主从复制。实验所需软件包从这个链接下载:https://pan.baidu.com/s/1ZzgOI339r_bj_FZlYkkHnA提取码:wlks挂载光盘,并配置yum源
[root@Master ~]# yum -y install ntp [root@Master ~]# sed -i '/^server/s/^/#/g' /etc/ntp.conf [root@Master ~]# cat <<END >>/etc/ntp.conf server 127.127.1.0 fudge 127.127.1.0 stratum 8 END [root@Master ~]# systemctl restart ntpd #重启ntpd [root@Master ~]# systemctl enable ntpd #设置开机自启 [root@Master ~]# netstat -anpu | grep ntp #查看状态挂光盘,并配置yum源
[root@Slave1 ~]# yum -y install ntpdate [root@Slave1 ~]# /usr/sbin/ntpdate 192.168.1.1Master和两台Slave操作一致
[root@Master ~]# yum -y install ncurses-devel [root@Master ~]# ls anaconda-ks.cfg cmake-2.8.6.tar.gz mysql-5.6.36.tar.gz [root@Master ~]# tar zxf cmake-2.8.6.tar.gz -C /usr/src/ [root@Master ~]# cd /usr/src/cmake-2.8.6/ [root@master cmake-2.8.6]# ./configure && gmake && gmake install解压 MySQL 软件包,并进行配置,编译,安装
[root@Master ~]# tar zxf mysql-5.6.36.tar.gz -C /usr/src/ [root@Master ~]# cd /usr/src/mysql-5.6.36/ [root@Master ~]# cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DSYSCONFDIR=/etc/ && make && make install主从密码一致即可
[root@Master ~]# /etc/init.d/mysqld start #启用mysql数据库 [root@Master ~]# mysqladmin -u root password '123' #设置密码为123MySQL 主从复制是指数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
MySQL 服务器的抗压能力有限。假设一台服务器最多能够接受的并发请求数是500个。当并发超过500的时候,很显然一台服务器就不能正常工作了,就需要更多的服务器来支持。保证服务器之间的数据及时同步,需要使用主从的技术解决方案实现数据同步。
MySQL 的主从复制和MySQL 的读写分离 两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
注意:如果Mysql重启较慢,可以使用kill终止掉mysql进程号,再启用
两台从服务器操作稍有不同
[root@Slave1 ~]# vim /etc/my.cnf 在[mysqld]下添加: server-id = 22 #Slave2 将 22 改为 33 即可 relay-log=relay-log-bin #将主服务器上同步日志文件记录到本地 relay-log-index=slave-relay-bin.index #定义relay-log的位置和名称 [root@Slave1 ~]# /etc/init.d/mysqld restart #重启mysqld服务 [root@Slave1 ~]# mysql -u root -p123 mysql> change master to master_host='192.168.1.1', master_user='myslave', master_password='123', master_log_file='master-bin.000001', master_log_pos=400; mysql> start slave; #启用从服务器同步功能 mysql> show slave status\G; #查看从服务器状态当在主 MySQL 开启日志,并在从 MySQL 开启日志后,进行同步时;明明没有报错但还是同步失败
原因是从在向主同步时,File的及Position的值给的不对。2. 分别在两个从服务器进行查看,同步过来说明主从复制成功。
mysql> show databases;
为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器;第二台数据库服务器,主要进行读的操作。
在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
简单来说,读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理 select 查询。数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库。 目前较为常见的 MySQL 读写分离分为两种。
基于程序代码内部实现:在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户端的请求后通过判断后转发到后端数据库,有两个代表性程序。
MySQL-Proxy:MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行 SQL 判断,虽然是 MySQL 官方产品,但是 MySQL 官方并不建议将 MySQL-Proxy 用到生产环境。Amoeba(变形虫):由陈思儒开发,其曾就职于阿里巴巴。该程序用 Java 语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。挂光盘,并配置yum源
[root@Amoeba ~]# yum -y remove java #删除掉默认安装的java [root@Amoeba ~]# rz #上传软件包 #如果没有rz工具需 yum -y install lrzsz 安装 z waiting to receive.**B0100000023be50 [root@Amoeba ~]# ls amoeba-mysql-binary-2.2.0.tar.gz anaconda-ks.cfg jdk-6u14-linux-x64.bin [root@Amoeba ~]# chmod +x jdk-6u14-linux-x64.bin #添加可执行权限 [root@Amoeba ~]# ./jdk-6u14-linux-x64.bin 一直按空格,等显示输入 yes 或 no 时输入-------- yes [root@Amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6 [root@Amoeba ~]# 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@Amoeba ~]# source /etc/profile #执行该脚本 [root@Amoeba ~]# java -version #查看java版本编辑 dbServers.xml 配置文件。 [root@Amoeba ~]# vim /usr/local/amoeba/conf/dbServers.xml
启动 Amoeba 软件,端口为 8066。 [root@Amoeba ~]# /usr/local/amoeba/bin/amoeba start & [root@Amoeba ~]# netstat -anpt | grep java
在客户机上操作: 挂光盘,并配置yum源
[root@Client ~]# yum -y install mysql #直接使用yum安装mysql就行 [root@Client ~]# mysql -u amoeba -p123456 -h 192.168.1.140 -P8066 #远程登陆amoeba的数据库 MySQL [(none)]> create database zhangsan; MySQL [(none)]> create table zhangsan.test (id int(10),name varchar(10),address varchar(20));在从 MySQL 上查看结果:
[root@Slave1 ~]# mysql -u root -p123 mysql> use zhangsan mysql> show tables; 分别关闭 slave1,2 的复制功能。 mysql> stop slave; 在 master,slave 上创建不同的数据。master: slave1: slave2:
在客户端上验证读: 客户端上验证写:master:
