centos7.2下mysql的主从复制与读写分离:
1.为什么要配置数据库集群和主从复制
一些大型的项目,由于访问并发量的增多会导致数据库的压力倍增,利用redis缓存减少数据库的压力,从而提升数据库的效率单个数据库同时负责读写任务,底层可能会出现锁的现象:同步锁,事务锁,乐观锁,悲观锁,单个数据库同时负责读写,效率还是不高;配置主从可以分担数据库的压力,进行读写分离,所有的数据库插入,修改等写入操作从主库进行,所有的数据查询等读取操作走从库,这样就分担了单一数据库的运行压力。
2.实现原理:
配置主从结构先在主上打开一个二进制日志的文件(Binary.log),在master写操作时,就会把写的命令存入到这个二进制文件中(insert,update,delete),slave开启一个IO线程,线程定时读取主节点的二进制文件,将新的命令抓取过来
存放到本地一个中继日志中(relay.log);slave上还有一个定时启动的线程叫sql,监控本地的中继日志,一旦有新的命令发现,将会把中继日志中的命令执行一遍。这样一来,主从结构就完成了数据的备份;
3.安装linux的mysql(percona
1.安装cmake(如果使用虚拟机镜像无需本步操作)
#yum -y install cmake
2.更新yum
3.安装
yum install Percona-Server-client-56 Percona-Server-server-56
安装如果有冲突,之前已经安装过mysql,则需要卸载
rpm -qa | grep mysql
如果有mysql软件的话,将其删除,执行
yum remove .....将软件包全部都删除掉。
4.安装完成后检查两点,一个是/etc/my.cnf存在不存在,一个是/var/lib/mysql目录中有没有mysql数据文件,如果有,那么基本上安装成功了。
5.启动mysql服务
运行命令:systemctl start mysql.service
成功后,查看mysql运行状态,systemctl status mysql.service后如下图:
6.修改mysql的密码
此时mysql并没有设置初始密码,所以先设置密码,进入mysql中(终端直接输入mysql即可):
mysql> use mysql;
mysql> update user set password=password('123') where user='root' and host='localhost';
mysql> flush privileges;
然后重启mysql服务,重新登录
mysql -uroot -p123 即可。
7.开启远程连接mysql服务器
a.开启之前一定要确定自己开放了3306端口,或者完全关闭掉防火墙,否则远程无法连接。(关闭防火墙或者开放端口,请百度)
b.创建数据库文件,例如,这里直接导入一个sql文件(之后主从复制会用到,导入sql文件,在mysql下直接输入命令,source 路径/xx.sql)
c.默认安装的msql没有开启远程访问,所以要设置一个权限。
mysql>grant all on *.* to 'root'@'%' identified by 'root';
执行成功后,就可以在远程客户端连接试试看了,这里我使用的是mysqlworkbeach,如下:
以上操作,分别在两台虚拟机中进行,操作一模一样。
8.配置数据库的主从关系
配置主服务器
编辑主master服务器配置文件/etc/my.cnf
在[mysqld]节点下加入两句话
server-id=1
log-bin=mysql-bin #启用二进制日志;
然后重启服务:systemctl restart mysql.service
登录mysql:mysql –uroot -proot
mysql>flush tables with read lock; #数据库锁表,不让写数据;这步骤可不做
对于当前环境的mysql无需使用lock命令,因为没有人操作,但是生产环境中必须这样做
mysql>show master status; #查看MASTER状态(这两个值File和Position)其中的file就是二进制文件,position记录当前操作sql的步骤数(注意一条sql包含多步,所以不是sql语句的条数)
因为我对数据库主从已经操作过了,所以会记录一些步骤数,一般情况下,第一次显示position的数量是120
配置从服务器
修改/etc/my.cnf增加一行
server-id=2
然后重启服务器
systemctl restart mysql.service
通过mysql命令配置同步日志的指向:
mysql>change master to master_host=‘192.168.41.41’, master_port=3306,
master_user='root',master_password='root',
master_log_file='mysql-bin.000001',
master_log_pos=120;
master_host 主服务器的IP地址(内网地址)
master_port 主服务器的PORT端口
master_log_file 和主服务器show master status中的File字段值相同
master_log_pos 和主服务器show master status中的Position字段值相同
mysql>start slave; #stop slave;停止服务,出错时先停止,再重新配置
mysql>show slave status\G; #查看SLAVE状态,\G结果纵向显示。必须大写,这个命令无法再sqlyog中使用
systemctl restart mysql.service #重启服务
9.此时主从复制就配好了,现在来测试一下吧!!
第一步:在主表中创建一个数据表(表名什么都可以,测试用嘛),然后插入数据,如下:
此时观察从表,刷新,哎,卧槽,有数据了,说明从库已经从主库读取并写入了。
第二步:在主表和从表中插入一样的数据,例如在主,从表分别中插入:id =3 name=clearlove,然后查看,嗯,全部都插入成功了,此时再看从表slave状态,卧槽??挂了?
此时,slave_io_running成no了,挂了。为什么?
因为从表要从主表读取数据,主从都有了,我还读你xxx啊?
此时,再改主表数据也没用了,主从都挂了,能有用吗?怎么办?重新挂接呗!!
错误数据必须清除否则继续主从失效,查看主节点中的二进制文件名称pos,但是先停止从节点的从状态stop slave
1.查看主节点中二进制文件pos,怎么查看呢?这样show master status;
2.在从节点中把查询出来的最新数据放到命令里挂接主节点
启动从节点的slave
start slave
此时再看下:ok!!!
但是这个时候发现id为3的对应b1字段的值没有改。所以mysql虽然支持主从关系但是并没有维护读写分离的状态。
10.安装配置amoeba
步骤1: 安装jdk
amoeba基于jdk环境所以需要安装jdk(网上百度吧!!)
步骤2:安装amoeba
wget https://jaist.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.0.1-BETA.tar.gz
然后解压: tar -xf amoe......
步骤3: 配置读写分离
1.配置conf/dbService.xml
修改用户名和密码
配置主从的名称和ip地址
配置负载均衡的策略
这个xml文件配置基本结束了,接下来配置amoeba.xml,核心的配置文件,将要加载dbServer.xml才能使用其中的配置,才能使负载均衡有效果
2.配置amoeba.xml
配置ip地址;(192.168.41.41为你主机的ip地址,amoeba主从主需要配置一台即可)
写上root密码
继续配置写池使用master,读池使用multiPool
注意:此时基本上配置完了,但是amoeba基于java做的,对java有个小要求,最少的stack size太少栈的size太小java默认128K,所以还要修改下栈的size,修改启动文件/bin/amoeba,修改为256.如下:
这样就配置完成了。启动下吧!!
输入 ./amoeba start
最后,本地连接下吧!!
ok,全部配置成功了!!注意,要开启8066端口或者要关闭防火墙,否则外面访问不到啊!!