MySQL主从复制与读写分离

一、实验环境

二、实验步骤

先部署主从复制,只有主从复制完成了,才能在此基础上进行读写分离。

MySQL支持的复制类型:

基于语句复制在主服务器上执行sql语句,在从服务器上执行同样的语句,MySQL默认采用基于语句的复制,效率较高。

基于行复制把改变的复制过去而不是把命令在服务器上执行一遍

混合类型复制:默认采用基于语句复制,一旦发现基于语句无法精确复制时,就会采用基于行复制。、

MySQL读写分离分为两种:

基于程序代码内部实现:在代码中根据selectinsert进行路由分类,这类方法也是目前生产环境应用广泛的。优点:性能好,不需要增加额外的设备作为硬件开支。缺点:需要开发人员来实现,运维人员无从下手。

基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接收到客户端请求后,通过判断后转发到后端数据库,有两个代理程序。

1)MySQL-ProxyMySQL-ProxyMySQL的开源项目。通过自带的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数据库,在MasterSlave 1Slave 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 1Slave 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数据库主从复制与读写分离介绍到此结束。