文章目录
一 摆设原由
1.1 原由概述:
- 在企业应用中,成熟的业务通常数据量都比力大单台MySQL在安全性,高可用性和高并发方面都无法满足实际的需求配置多台主从数据库服务器以实现读写分离(基于主从复制)
复制代码 二 摆设前置知识点
2.1 MySQL主从复制原理
2.1.1 MySQL的复制范例
2.1.2 MySQL主从复制的工作过程
2.1.3 复制的基本过程如下:
- 1. Master将用户对数据库更新的操纵以二进制格式生存到Binary Log日志文件中2. Slave上面的IO进程毗连上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;IO进程:从数据库复制主数据库上二进制日志的进程3.Master吸收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave的IO进程。返回信息中除了日志所包罗的信息之外,还包罗本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;4.Slave的IO进程吸收到信息后,将吸收到的日志内容依次添加到Slave端的relay-log文件的最末了,并将读取到的Master端的bin-log的文件名和位置纪录到master-info文件中,以便在下一次读取的时候可以或许清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”5. Slave的Sql进程检测到relay-log中新增加了内容后,会立刻剖析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行.Sql进程:将二进制日志内容翻译成SQL语句写进从数据库
复制代码 2.2 MySQL读写分离原理
- 1.只在主服务器上写,只在从服务器上读2.主数据库处理事务性查询,从数据库处理SELECT查询3.数据库复制用于将事务性查询的变动同步到集群中的从数据库4.读写分离方案 基于程序代码内部实现 基于中间代理层实现 MySQL-Proxy Amoeba
复制代码
三 摆设操纵
3.1 摆设原理:
- 主从数据库之间先时间同步,后主从复制,amoeba配置读写分离,授权。最后客户机登录验证
复制代码 3.2 摆设准备
1.设备:
- MySQL主数据库:20.0.0.10MySQL从数据库1:20.0.0.11MySQL从数据库2:20.0.0.12Amoeba:20.0.0.13客户端:20.0.0.14
复制代码 2.重定名
- [root@server1 ~]# hostnamectl set-hostname master[root@server1 ~]# bash[root@server2 ~]# hostnamectl set-hostname slave1[root@server2 ~]# bash[root@client1 ~]# hostnamectl set-hostname slave2[root@client1 ~]# bash[root@server1 ~]# hostnamectl set-hostname amoeba[root@server1 ~]# bash[root@localhost ~]# hostnamectl set-hostname client[root@localhost ~]# bash
复制代码 3.关闭防火墙
面向所有设备
- [root@master ~]# systemctl stop firewalld[root@master ~]# setenforce 0[root@master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config [root@master ~]# grep -v "#" /etc/selinux/config
复制代码
3.3 摆设流程
3.3.1 先设置主从数据库时间同步
在主数据库上
1.设置时间同步
- [root@master ~]# vi /etc/resolv.conf 编辑配置文件添加nameserver 8.8.8.8[root@master ~]# yum -y install ntpdate ntp 安装ntp软件[root@master ~]# ntpdate ntp.aliyun.com 时间同步[root@master ~]# date 检察当前日期[root@master ~]# vi /etc/ntp.conf 编辑配置文件添加修改 8 restrict default nomodify 界说默认访问规则,nomodify克制远程主机修改本地服务器配置 17 restrict 20.0.0.0 mask 255.255.255.0 nomodify notrap从20.0.0.1-20.0.0.254的主机都可以使用我们的ntp服务来时间同步21 fudge 127.127.1.0 stratum 10设置本机的时间层级为10级,0级体现时间层级为0级,是向其他服务器提供时间同步源的意思,不要设置为0级22 server 127.127.1.0 设置本机为时间同步源
复制代码
- [root@master ~]# systemctl restart ntpd 重启服务[root@master ~]# netstat -anptu | grep ntpd 检察端口状态
复制代码
2.摆设任务筹划
- [root@master ~]# crontab -e*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com每隔30分钟进行一次同步对象为阿里云时钟网站的时间同步[root@master ~]# date 检察当前日期
复制代码
在从数据库1,2上
- [root@slave1 ~]# yum -y install ntpdate 安装ntp[root@slave1 ~]# ntpdate 20.0.0.10 设置同步源[root@slave1 ~]# date 检察当前日期[root@slave1 ~]# crontab -e 摆设任务筹划*/3 * * * * /usr/sbin/ntpdate 20.0.0.10每隔3分钟进行一次同步对象为20.0.0.10(主数据库)的时间同步[root@slave1 ~]# date 检察当前日期
复制代码
以上主从时间同步设置完成
3.3.2 开始配置主从复制
在主数据库上
- [root@master ~]# vi /etc/my.cnf 开启二进制日志[root@master ~]# systemctl restart mysqld 重启服务添加log_bin=master_bin 同步的二进制日志开启前缀log_slave_updates=true 允许日志同步给从数据库
复制代码
- [root@master ~]# mysql -uroot -pabc123 登录数据库mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by 'abc123'; 设置授权grant replication slave 授权复制权限从数据库 on *.* :可复制所有库,所有表,'myslave'@'20.0.0.%' :授权用户,用户登录范围,网段,identified by : 识别暗码mysql> flush privileges; 刷新权限mysql> show master status; 检察主数据库状态信息
复制代码
在从数据库1上
编辑配置文件
- [root@slave1 ~]# vi /etc/my.cnf[root@slave1 ~]# systemctl restart mysqld添加修改server-id = 2 服务id为2relay_log=relay-log-bin 二进制日志的中继日志前缀relay_log_index=slave-relay-bin.index 中继日志索引
复制代码
- [root@slave1 ~]# mysql -uroot -pabc123 登录数据库mysql> change master to master_host='20.0.0.10',master_user='myslave',master_password='abc123',master_log_file='master_bin.000001',master_log_pos=599;master_host='20.0.0.10':主数据库ip地点master_user='myslave':主数据库授权用户名master_password='abc123':授权暗码master_log_file='master_bin.000001':主从同步日志文件master_log_pos=599:日志开始路径,主从复制位置mysql> start slave; 开启从状态mysql> show slave status\G 检察从数据库状态信息
复制代码
3.3.2.1 剖析线程错误:
- 1.I/0线程显示为NO:主库与从库网络不通、主库未授权给从库若从库检察毗连主库I/0线程状态为conneting,-直是这个状态,思量双方的防火墙是否开启。2.SQL线程显示为NO:从库日志和位置点与主不同步
复制代码 在主数据库上
- [root@master ~]# mysql -uroot -pabc123mysql> show master status; 检察主数据库状态信息是否发生变革
复制代码
在从数据库2上同理配置
- [root@slave2 ~]# vi /etc/my.cnf添加修改server-id = 3 服务id为2relay_log=relay-log-bin 二进制日志的中继日志前缀relay_log_index=slave-relay-bin.index 中继日志索引[root@slave2 ~]# systemctl restart mysqld[root@slave2 ~]# mysql -uroot -pabc123mysql> change master to master_host='20.0.0.10',master_user='myslave',master_password='abc123',master_log_file='master_bin.000001',master_log_pos=599;mysql> start slave;mysql> show slave status\G
复制代码
以上完成主从复制配置
3.3.3 进行主从测试
在主数据库上
- mysql> show databases; 检察数据库信息mysql> create database apple; 创建新的数据库applemysql> show databases; 检察数据库信息
复制代码
在从数据库上进行检察是否新生成apple库
- mysql> show databases; 检察库信息
复制代码
因为ameoba用户授权给用户时默认的数据库为test
所以在主数据库时创建数据库test
- mysql> create database test;mysql> show databases;
复制代码
3.3.4 开始设置读写分离
在前端数据库ameoba上
时间同步
- [root@amoeba ~]# yum -y install ntpdate 安装ntp软件[root@amoeba ~]# ntpdate 20.0.0.10 设置同步源[root@amoeba ~]# crontab -e 设置任务筹划*/3 * * * * /usr/sbin/ntpdate 20.0.0.10添加jdk安装包[root@amoeba ~]# ls -lh[root@amoeba ~]# tar zxvf jdk-8u91-linux-x64.tar.gz 解压缩
复制代码
- [root@amoeba ~]# cp -rv jdk1.8.0_91/ /usr/local/java -rv:递归,显示过程[root@amoeba ~]# vi /etc/profile 设置情况变量末了添加export JAVA_HOME=/usr/local/java 设置java根目录为全局变量export JRE_HOME=/usr/local/java/jre export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin 情况变量,在PATH情况变量中添加JAVA根目录下bin子目录export CLASSPATH=./:$JAVA_HOME/lib:$JRE_HOME/lib 类路径
复制代码
- [root@amoeba ~]# source /etc/profile 设置生效[root@amoeba ~]# echo $PATH 输出情况信息[root@amoeba ~]# echo $CLASSPATH 输出类路径信息[root@amoeba ~]# java -version 检察版本
复制代码
安装amoeba管理软件
1,。添加 amoeba-mysql-3.0.5-RC-distribution.zip
- [root@amoeba ~]# ls -lh[root@amoeba ~]# unzip amoeba-mysql-3.0.5-RC-distribution.zip 解压缩[root@amoeba ~]# mv amoeba-mysql-3.0.5-RC/ /usr/local/amoeba 剪贴[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/ 授权[root@amoeba ~]# vi /usr/local/amoeba/jvm.properties 编辑配置文件在32行下添加,并注释32行数据JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k" 缓存空间大小设置
复制代码


2.创建启动脚本
- [root@amoeba ~]# vi /etc/init.d/amoeba[root@amoeba ~]# chmod 755 /etc/init.d/amoeba 添加权限[root@amoeba ~]# chkconfig --add amoeba 加入系统管理[root@amoeba ~]# chkconfig --list 查询系统服务的默认启动状态[root@amoeba ~]# systemctl start amoeba 重启服务[root@amoeba ~]# netstat -anpt | grep 8066 检察端口状态tcp6 0 0 :::8066 :::* LISTEN 1017/java #!/bin/bash#chkconfig: 35 20 90 运行级别export JAVA_HOME=/usr/local/java 运行情况export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/binNAME=Amoeba 变量名AMOEBA_BIN=/usr/local/amoeba/bin/launcher 二进制文件启动脚本SHUTDOWN_BIN=/usr/local/amoeba/bin/shutdown 二进制文件关闭脚本PIDFILE=/usr/local/amoeba/Amoeba-MySQL.pid SCRIPTNAME=/etc/init.d/amoeba 脚本文件case "$1" instart)echo -n "Staring $NAME..." 提示$AMOEBA_BIN 启动echo "done" 输出信息;;stop)echo -n "Stopping $NAME..."$SHUTDOWN_BINrm -rf $PIDFILE 删除进程文件echo "done";;restart) 重启$SHUTDOWN_BIN 先执行关闭sleep 1 延时1秒$AMOEBA_BIN 后关闭;;*)echo "Usage:$SCRIPTNAME {start|stop|restart}"exit 1esac
复制代码
3.3.4.1 在主从数据库上进行授权配置
主从数据库都设置
- mysql> grant all privileges on *.* to 'test'@'20.0.0.%' identified by '123.com';mysql> flush privileges;
复制代码
3.3.4.2 在前端上授权客户端登录时用户名和暗码
编辑配置文件
- [root@amoeba ~]# vi /usr/local/amoeba/conf/amoeba.xml 设置客户端毗连amoeba前端服务器时使用的用户名和暗码 amoeba 123456
复制代码
3.3.4.3 设置读与写数据库的池
- master默认池删除注释 master 主数据库负责写 slaves 从数据库负责读
复制代码
编辑配置文件
- [root@amoeba ~]# vi /usr/local/amoeba/conf/dbServers.xml [root@amoeba ~]# systemctl restart amoeba.service 重启服务[root@amoeba ~]# netstat -anpt | grep 8066 检察8066端口状态tcp6 0 0 :::8066 :::* LISTEN 1017/java
复制代码
界说amoeba登录上数据库的授权用户名与暗码
设置主服务,地点
- 40行 20.0.0.10 设置从服务器1,地点50行 20.0.0.11复制从服务器1,地点配置数据设置从服务器2,地点 20.0.0.12
复制代码
设置界说池
完成以上配置
3.3.5 开始设置客户机
- [root@client ~]# yum -y install mariadb* 安装软件[root@client ~]# systemctl start mariadb.service 启动服务[root@client ~]# mysql 登录数据库MariaDB [(none)]> exit 退出[root@client ~]# mysql -uamoeba -p123456 -h 20.0.0.13 -P8066 登录前端数据库用户名amoeba,暗码123456,ip地点20.0.0.13,端标语8066
复制代码
3.4 测试摆设效果读写分离
3.4.1 测试读写分离
在客户端上
- [root@client ~]# mysql -uamoeba -p123456 -h 20.0.0.13 -P8066MySQL [(none)]> use test; 使用数据库MySQL [test]> create table tree(id int(10),name varchar(128),guanli varchar(128)); 创建表treeMySQL [test]> insert into tree values(1,'zhangsan','this is master'); 插入数据纪录
复制代码 在master主数据库上创建的数据库或者表,两个从数据库会同步----通过amoeba操纵的
在主从数据库上分别检察
在主数据库上
- [root@master ~]# mysql -uroot -pabc123mysql> use test; 使用数据库mysql> select * from tree; 查询所有内容字段
复制代码
在从数据库上
从数据库1
- [root@slave1 ~]# mysql -uroot -pabc123mysql> select * from test.tree;
复制代码
从数据库2
3.4.2 关闭主从同步复制,检察情况
主从复制关闭,再次添加数据,此时因为主数据库负责写操纵,从数据库负责读操纵,所以此时应只有主数据库上可以检察到新增的数据,从数据库上无变革
在客户端添加数据纪录
- MySQL [test]> insert into tree values(2,'dao','that was master2');
复制代码
从数据库上
- mysql> stop slave; 关闭主从同步
复制代码 在客户端再次添加数据纪录
- MySQL [test]> insert into tree values(3,'small','this is master3');
复制代码 在主数据库上检察
- mysql> select * from tree;
复制代码
在从数据库上
- mysql> select * from test.tree;
复制代码
3.4.3 写入不同的数据,检察客户端读取时情况
在从数据库上
写入不同的数据,检察客户端读取时情况
在从数据库1上
- mysql> delete from test.tree; 删除test库中的表treemysql> select * from test.tree; 检察test库中的表tree中的所有内容mysql> insert into test.tree values(10,'wang','this is slave1');插入数据纪录mysql> select * from test.tree; 检察所有内容
复制代码
在从数据库2上
- mysql> delete from test.tree;mysql> select * from test.tree;mysql> insert into test.tree values(20,'dao','this is slave2');mysql> select * from test.tree;
复制代码
在客户端进行读取检察
- MySQL [test]> select * from test.tree;
复制代码 发现数据在从数据库1与从数据库2上以轮询的方式显示数据
说明客户机提供Amoeba写入数据,写在主数据库上,从Amoeba中读取数据库信息,是从从数据库中读取的
此时在主数据库上检察日志状态信息
- mysql> show master status;检察主数据库的状态信息
复制代码
3.4.4 规复从数据库1与主数据库的主从同步
在从数据库1上
- mysql> change master to master_host='20.0.0.10',master_user='myslave',master_password='abc123',master_log_file='master_bin.000001',master_log_pos=2421;mysql> start slave; 开启从状态mysql> show slave status\G 检察从数据库状态信息
复制代码
从数据库2上
检察从数据库状态信息
- mysql> show slave status\G
复制代码 |