在企业网站中,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;
切换到客户端: