在企业网站中,Mysql数据库只有一台时,会有以下问题:
·单点故障,服务不可用
·无法处理大量的并发数据请求
·数据一旦丢失就是大灾难
改造办法:
·增加MySQL数据库服务器,对数据库进行备份,形成主备
·确保主备MySQL数据库服务器数据是一样的
·主服务器宕机了,备份服务器继续工作,数据有保障
更高级的解决方案:
·通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力
MySQL主从复制的类型
·基于语句的复制(默认):在主服务器上执行的语句,从服务器执行同样的语句
·基于行的复制:把改变的内容复制到从服务器
·混合类型的复制:一旦发现基于语句无法精确复制时,就会采用基于行的复制
MySQL主从复制的工作过程
MySQL主服务器将数据写入二进制文件Binary log,从服务器的I/O线程读取Binary log里的数据将其写入Relay log中继日志文件中,然后从服务器的SQL线程从Relay log读取数据。
MySQL读写分离原理
·只在主服务器上写,只在从服务器上读
·主数据库处理事务性查询,从数据库处理SELECT查询
·数据库复制用于将事务性查询的变更同步到集群中的从数据库
·读写分离方案:
(1)基于程序代码内部实现
(2)基于中间代理层实现
·MySQL-Proxy
·Amoeba(MyCat)
MySQL主从复制、读写分离案例
设备:
MySQL主服务器:1台(IP:20.0.0.31)
MySQL从服务器:2台(slave1 IP:20.0.0.32 、 slave2 IP:20.0.0.33)
amoeba:1台(IP:20.0.0.100)
测试客户端:1台(IP:20.0.0.111)
MySQL主服务器配置:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
hostnamectl set-hostname master
ntpdate ntp1.aliyun.com
date -R (以RFC-2822兼容日期格式显示时间)
vim /etc/my.cnf
service mysqld restart
ls /usr/local/mysql/data/ (图中是服务器的日志文件)
mysql -u root -p
grant replication slave on . to ‘myslave’@‘20.0.0.%’ identified by ‘abc123’;
flush privileges;
show master status;
select host,user from mysql.user;
MySQL从服务器slave1配置:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
hostnamectl set-hostname slave1
su
ntpdate ntp1.aliyun.com
date -R
vim /etc/my.cnf
service mysqld restart
mysql -uroot -p
master_host=’20.0.0.31’,master_user=’myslave’,master_password=’abc123’,master_log_file=’master-bin.000001’,master_log_pos=599;
start slave;
show slave status\G;
MySQL从服务器slave2配置:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
hostnamectl set-hostname slave2
su
ntpdate ntp1.aliyun.com
date -R
vim /etc/my.cnf
service mysqld restart
mysql -uroot -p
change master to master_host=’20.0.0.31’,master_user=’myslave’,master_password=’abc123’,master_log_file=’master-bin.000001’,master_log_pos=599;
start slave;
show slave status\G;
测试一下主从复制:
amoeba服务器配置:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum -y install lrzsz
cd /opt
chmod a+x jdk-6u14-Linux-x64.bin
./jdk-6u14-Linux-x64.bin
ls
mv jdk1.6.0_14/ /usr/local/jdk1.6
cd /usr/local/jdk1.6/
ls
cd bin/
ls
vim /etc/profile (如果出现bash报错,yum -y install vim 安装一下即可)
将以下内容插入配置文件末尾:
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
source /etc/profile
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
(如果显示amoeba start|stop说明安装成功)
在三台mysql服务器上添加权限开放给amoeba访问:
grant all on . to test@‘20.0.0.%’ identified by ‘abc123’;
flush privileges;
配置amoeba配置文件:
vim /usr/local/amoeba/conf/amoeba.xml
(shift+冒号,输入set nu 显示行号)
:wq保存退出
vim /usr/local/amoeba/conf/dbServers.xml
:wq保存退出
启动amoeba:
/usr/local/amoeba/bin/amoeba start &
前台的方式启动,会输出启动时的信息,检查没有错误信息后,中断,并后台运行。
输入不了命令,可以再连接一个ssh窗口:
测试客户端:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum -y install mariadb-server
连接amoeba服务器:
mysql -u amoeba -pabc123 -h 20.0.0.100 -P8066
客户端进行读写分离测试:
切换到master主服务器:
切换到slave1从服务器:
切换到slave2从服务器:
分别在slave1和slave2上:
stop slave;
show slave status\G;
切换到客户端: