码迷,mamicode.com
首页 > 数据库 > 详细

Mysql主从复制与读写分离

时间:2018-09-10 00:52:35      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:工作   path   网盘   需求   语句   一个数据库   myisam   ini   主服务器   

在实际生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性,高可用性,还是高并发等各方面都是完全不能满足实际需求的,因此一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案来进行部署与实施。

在企业网站中,后端MySQL数据库只有一台时,会有以下问题:
1.单点故障,服务不可用
2.无法处理大量的并发数据请求
3.数据丢失------大灾难


改造办法:
1.增加MySQL数据库服务器,对数据进行备份,形成主备。
2.确保主备MySQL数据库服务器数据是一样的。
3.主服务器宕机了,备份服务器继续工作,数据有保障。
MySQL主从复制与读写分离是密切相关的。


如下图所示:一台主mysql带两台从mysql进行了数据复制,前端应用在进行数据库写操作时,对主设备进行操作,在进行数据库读操作时,对两台从设备进行操作,这样大量减轻了对主设备的压力。
技术分享图片


mysql的主从复制和mysql的读写分离有着紧密的联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
技术分享图片


mysql复制的工作原理及过程:

  1. 在每个事务更新数据完成之前,Master在二进制日志记录这些变化。写入二进制日志完成后,Master通知存储引擎提交事务。
    2.Slave将Master的Binary log复制到其中继日志。首先,Slave开始一个工作线程---I/O线程,I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待Master产生新的事件。I/O线程将这些事件写入中继日志。
    3.SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

mysql读写分离原理:
技术分享图片
mysql读写分离的实现方式:
技术分享图片

技术分享图片


接下来实验部署:

首先先搞明白实验环境拓扑 其中:
1.mysql数据库服务器master-slave身份验证,设置主从同步之间的身份授权验证。
2.amoeba--->mysql,设置amoeba代理服务访问mysql服务的身份授权验证。
3.client---->amoeba,设置前端客户client访问amoeba代理服务的身份授权验证。

技术分享图片

实验环境:全都基于centos7上
1.Master主数据库服务器 、ip地址:192.168.48.133 、安装软件: mysql-5.5.24.tar.gz
2.Slave1从数据库服务器、ip地址:192.168.48.129、安装软件: mysql-5.5.24.tar.gz
3..Slave2从数据库服务器、ip地址:192.168.48.130、安装软件: mysql-5.5.24.tar.gz
4.Amoeba代理服务器、ip地址:192.168.48.134、安装软件: jdk-6u14-linux-x64.bin, amoeba-mysql-binary-2.2.0.tar.gz
5.Client 客户端、ip地址:192.168.48.128 、 使用yum安装mysql进行远程测试
百度网盘免费提供源码包:

jdk-6u14-linux-x64.bin:https://pan.baidu.com/s/16VpIUCD2-KH-dblAQrSbSA
amoeba-mysql-binary-2.2.0.tar.gz: https://pan.baidu.com/s/14KFbeGYgNdDQd5OiWv8YMA
mysql-5.5.24.tar.gz: https://pan.baidu.com/s/1VGEebdZ5bobKnKD5HNxbZQ


接下来搭建mysql主从复制:

建立时间同步环境,NTP时间同步协议图解:
技术分享图片


主服务器master设置:
yum install ntp -y
vim /etc/ntp.conf
server 127.127.48.0 //本地是时钟源//
fudge 127.127.48.0 stratum 8 //设置时间层级为8//
service ntpd start


在从服务器slave上进行时间同步:
yum install ntp ntpdate -y
service ntpd start
/usr/sbin/ntpdate 192.168.48.133 //进行时间同步//


所有的主机都关闭防火墙,关闭增强型功能
systemctl stop firewalld.service
setenforce 0


接下来手工编译安装mysql数据库。在Master,Slave1,Slave2上安装。步骤如下:

编译安装mysql:
yum -y install ncurses-devel cmake gcc gcc-c++ ncurses bison libaio-devel //ncurses是字符终端下屏幕控制的基本库//
tar xzvf mysql-5.5.24.tar.gz
cd mysql-5.5.24
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \

-DSYSCONFDIR=/etc \

-DMYSQL_DATADIR=/home/mysql/ \

-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_ARCHIVE_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DENABLED_LOCAL_INFILE=1 \

-DWITH_SSL=system \

-DMYSQL_TCP_PORT=3306 \

-DENABLE_DOWNLOADS=1 \

-DWITH_SSL=bundled


make && make install


优化调整:
cp support-files/my-medium.cnf /etc/my.cnf

cp support-files/mysql.server /etc/init.d/mysqld

chmod +x /etc/init.d/mysqld

chkconfig --add mysqld

chkconfig --level 35 mysqld on
echo "PATH=$PATH:/usr/local/mysql/bin/" >> /etc/profile. /etc/profile (注意:"."后面有空格)


初始化数据库:
useradd -s /sbin/nologin mysql

chown -R mysql.mysql /usr/local/mysql

/usr/local/mysql/scripts/mysql_install_db \

--user=mysql \

--ldata=/var/lib/mysql \

--basedir=/usr/local/mysql \

--datadir=/home/mysql

ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock

vi /etc/init.d/mysqld

basedir=/usr/local/mysql

datadir=/home/mysql


启动mysql服务,设置mysql用户密码:
service mysqld start

mysqladmin -uroot -p password ‘123123‘


配置MySQL主服务器master,在配置文件中修改或增加以下选项:
vim /etc/my.cnf

server-id = 11 //修改id
log-bin=master-bin //增加主服务器日志文件//
log-slave-updates=true //增加从服务器更新二进制日志//

service mysqld restart
登录mysql程序,给从服务器授权:
grant replication slave on . to ‘myslave‘@‘192.168.48.%‘ identified by ‘123123‘; #进行授权
flush privileges; //刷新授权设置
show master status; //查看master状态


配置MySQL从服务器slave01、slave02,在配置文件中修改或增加以下选项:
vim /etc/my.cnf

[mysqld]

server-id = 22 #另一台id不一样

relay-log=relay-log-bin //从主服务器上同步日志文件记录到本地//

relay-log-index=slave-relay-bin.index //定义relay-log的位置和名称//

service mysqld restart
登录mysql配置同步,按主服务器结果更改下面命令中的master_log_file和master_log_pos的参数
change master to master_host=‘192.168.48.133‘,master_user=‘myslave‘,master_password=‘123123‘,master_log_file=‘mysql-bin.000011‘,master_log_pos=267;
start slave; //启动同步

show slave status \G; //查看slave状态,确保以下两个值为yes

.............

Slave_IO_Running: Yes #这两个必须为yes

Slave_SQL_Running: Yes


验证:

在主服务器master上新建数据库school, 在主,从服务器上分别查看数据库,都可以看到master新建的数据库school,则主从复制成功。
接下来搭建mysql读写分离:
amoeba服务器配置:
1.在主机amoeba上安装java环境,因为amoeba是基于jdk1.5开发的,所以官方推荐使用jdk1.5或1.6版本,高版本不建议使用。
service iptables stop
setenforce 0
cp jdk-6u14-linux-x64.bin /usr/local/
./jdk-6u14-linux-x64.bin

yes
按enter

mv jdk1.6.0_14/ /usr/local/jdk1.6
2.添加java环境变量:
vi /etc/profile
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
3.安装并配置amoeba软件:
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说明安装成功
4.配置amoeba读写分离,两个slave读负载均衡,在master,slave1,slave2上登录mysql添加权限开放给amoeba访问:
grant all on . to test@‘192.168.48.%‘ identified by ‘123.com‘;
5.回到amoeba服务器,编辑amoeba.xml配置文件,设置前端客户client访问amoeba代理服务的身份授权验证:
cd /usr/local/amoeba
修改后的内容为带加粗的部分,注意删除注释:
vim conf/amoeba.xml

---30行--

<property name="user">amoeba</property>
----32行---------
<property name="password">123456</property>

---117-去掉注释-
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
编辑dbServers.xml 配置文件,设置amoeba代理服务访问mysql服务的身份授权验证:
vim conf/dbServers.xml

--26-29--去掉注释--
<property name="user">test</property>
<property name="password">123.com</property>

-----42-主服务器地址---
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.48.133</property>
--52-从服务器主机名-
<dbServer name="slave1" parent="abstractServer">
--55-从服务器地址-
<property name="ipAddress">192.168.48.129</property>

<dbServer name="slaves" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

--末尾--
<property name="poolNames">slave1,slave2</property>
</poolConfig>
配置无误后,可以启动amoeba软件,其默认端口为tcp 8066:
/usr/local/amoeba/bin/amoeba start& //开启amoeba服务

netstat -anpt | grep java //查看端口


到此全部配置完成,在Client主机上进行测试:

客户端:
yum install -y mysql
mysql -u amoeba -p123456 -h 192.168.48.134 -P8066 //通过amoeba代理访问mysql
然后可以创建新的表、内容。关闭slave功能(stop slave;)后,无论在哪台服务器上进入数据库只能读取查看到两台slave从服务器写入的内容。这说明读操作在slave服务器上。
无论进哪台服务器包括客户端,只要是写进数据库的内容只有在master服务器上才能查看到。这就说明写操作在master服务器上。


本章总结:

1.MySQL的主从复制和MySQL的读写分离两者有着紧密的联系。首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
2.MySQL支持的复制类型有三种:基于语句的复制、基于行的复制和混合类型的复制。
3.通过程序代码实现MySQL读写分离是一个不错的选择,但是并不是所有的应用都适合程序代码中实现读写分离,像一些大型复杂的Java应用,一般会考虑使用代理层来实现。

Mysql主从复制与读写分离

标签:工作   path   网盘   需求   语句   一个数据库   myisam   ini   主服务器   

原文地址:http://blog.51cto.com/13721050/2172853

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!