MySQL主从复制与读写分离
一、实验环境
二、实验步骤
先部署主从复制,只有主从复制完成了,才能在此基础上进行读写分离。
MySQL支持的复制类型:
基于语句复制:在主服务器上执行sql语句,在从服务器上执行同样的语句,MySQL默认采用基于语句的复制,效率较高。
基于行复制:把改变的复制过去而不是把命令在服务器上执行一遍。
混合类型复制:默认采用基于语句复制,一旦发现基于语句无法精确复制时,就会采用基于行复制。、
MySQL读写分离分为两种:
基于程序代码内部实现:在代码中根据select,insert进行路由分类,这类方法也是目前生产环境应用广泛的。优点:性能好,不需要增加额外的设备作为硬件开支。缺点:需要开发人员来实现,运维人员无从下手。
基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接收到客户端请求后,通过判断后转发到后端数据库,有两个代理程序。
1)MySQL-Proxy。MySQL-Proxy为MySQL的开源项目。通过自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是MySQL并不建议应用到生产环境。
2)Amoeba。有陈思儒开发,该程序有java语言开发,阿里巴巴用于生产环境。不支持事务和存储过程。
搭建MySQL主从复制
1、在Master上搭建时间同步服务器,建立时间同步环境
安装NTP
#yum -y install ntp
配置NTP
#vim /etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
#service ntpd restart
2、在从节点上进行时间同步
#yum -y install ntpdate
#/usr/sbin/ntpdate 192.168.1.8
3、在每台服务器上关闭iptables或者指定端口进行开放。
#service iptables stop
#chkconfig iptables off
4、安装MySQL数据库,在Master,Slave 1,Slave 2上安装。
编译安装MySQL数据库。
#yum install -y ncurses-devel gcc gcc-c++
#cd /usr/src
#tar zxf cmake-2.8.6.tar.gz
#cd cmake-2.8.6
#./configure && gmake && gmake install
#cd /usr/src
#tar zxf mysql-5.5.22.tar.gz
#cd mysql-5.5.22
#cmake -DCMAKE-INSTALL-PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
#make && make install
优化调整
#cp support-files/my-medium.cnf /etc/my.cnf
#cp support-files/mysql.server /etc/rc.d/init.d/mysqld
#chmod +x /etc/rc.d/init.d/mysqld
#chkconfig --add mysqld
#echo “PATH=$PATH:/usrlocal/mysql/bin” >> /etc/profile
#. /etc/profile
初始化数据库
#groupadd mysql
#useradd -M -s /sbin/nologin -g mysql mysql
#chown -R mysql:mysql /usr/local/mysql
#/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
启动MySQL服务
#service mysqld start
#chkconfig mysqld on
#mysqladmin -u root password ‘pwd123’
5、配置MySQL Master 主服务器
在/etc/my.cnf中修改或者添加下面内容
#vim /etc/my.cnf
server-id = 11 修改
log-bin=master-bin 修改
log-slave-updates=true 增加
重启MySQL服务
#service mysqld restart
登录mysql程序,给从服务器授权。
File列:显示日志名。
Postion:显示偏移量。
6、配置各从服务器。
在/etc/my.cnf中修改或者增加下面内容
#vim /etc/my.cnf
server-id = 22 修改
relay-log=relay-log-bin 增加
relay-log-index=slave-relay-bin.index 增加
注意:server-id不能与主服务器相同
重启MySQL服务
#service mysqld restart
登录MySQL,配置同步
按主服务器结果更改下面命令中master_log_file和master_log_pos参数。
#mysql -u root -p
注意:如果Slave_IO_Running:NO并且报错
解决办法从服务器先停止slave
mysql> slave stop;
到master服务器登录mysql:
记录master的bin的位置,
例如:mysql> show master status;
日志为master-bin.000001
刷新日志:mysql> flush logs;
因为刷新日志file的位置会+1,即file成为:master-bin.000002
到从服务器执行
解决完毕!!!
7、验证主从复制效果。
在主、从服务器登录MySQL。
#mysql -u root -p
Mysql> show databases;
两台数据库执行结果应该相同。
在主服务器上新建数据库zc。
mysql> create database zc;
在主,从服务器上分别查看数据库,显示数据库相同,则主从复制成功。
搭建MySQL读写分离
Amoeba(变形虫):为应用层访问MySQL充当SQL的路由功能,并具有负载均衡,高可用,SQL过滤,读写分离,数据切片的功能,可并发请求多台数据库。
在主机Amoeba上安装java环境。
#chmod +x jdk-6u14-linux-x64.bin
#./jdk-6u14-linux-x64.bin 根据提示按Enter键完成即可或按yes
#mv jdk1.6.0_14/ /usr/local/jdk1.6
#vim /etc/profile
#source /etc/profile
#java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
Java环境配置成功。
安装并配置Amoeba软件
#mkdir /usr/local/amoeba
#tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
#chmod 755 /usr/local/amoeba/
#/usr/local/amoeba/bin/amoeba
amoeba start|stop 显示此内容说明Amoeba安装成功。
配置Amoeba读写分离,两个Slave读负载均衡。
Master、Slave 1、Slave 2中开放权限给Amoeba访问。
mysql > grant all on *.* to identified by ‘123.com’;
编辑amoeba.xml配置文件
#vim /usr/local/amoeba/conf/amoeba.xml
修改后的内容为黑体字的部分
修改后的内容为黑体字的部分,注意删除注释。
编辑dbServer.xml配置文件
#vim /usr/local/amoeba/conf/dbServer.xml
修改后的为黑体字的部分
修改后如图所示配置主、从服务器
配置无误后,可启动Amoeba软件,其默认端口为tcp 8066.
#/usr/local/amoeba/bin/amoeba start&
在client主机上测试:
#yum install -y mysql
然后可以通过代理访问MySQL
#mysql -u amoeba -p 123456 -h 192.168.1.12 -P 8066
mysql>
在master上创建一个表,同步到各服务器上,然后关掉各从服务器的Slave功能,再插入其他语句。
分别在两台服务器上;
mysql > stop slave;
然后在主服务器上插入一行
从服务器上同步了表,手动插入其他内容。
Slave 1:
Slave 2:
测试读操作
在client主机上三次查询的结果如图所示:
测试写操作:
在client主机上插入一条语句:
但在client上查询不到,最终在Master上才能看到下面这条语句内容,说明写操作在maste服务器上
MySQL数据库主从复制与读写分离介绍到此结束。