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

MySQL主从复制与读写分离

时间:2018-07-16 19:27:00      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:修改   proxy   eid   erp   安装mysql   mysl   版本   iptable   服务   

在实际的生产环境中,由单台Mysql作为独立的数据库并在上面进行读和写操作是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。因此一般来说,通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。

工作原理如下图所示:
技术分享图片

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

(1)MySQL-Proxy。MySQL-Proxy为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是MySQL官方并不建议将MySQL-Proxy用到生产环境。

(2)Amoeba。这个软件致力于MySQL的分布式数据库前端代理层,它主要为应用层访问MySQL时充当SQL路由,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由到相关目标数据库、可并发请求多台数据库。它不支持事务和存储过程。

通过程序代码实现MySQL读写分离是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,一般会考虑使用代理层来实现。


实验环境:

主机 操作系统 IP地址 主要软件
Master CentOS7.4 x86_64 192.168.113.164 mysql-5.7.17.tar.gz
Slave1 CentOS7.4 x86_64 192.168.113.171 mysql-5.7.17.tar.gz
Slave2 CentOS7.4 x86_64 192.168.113.172 mysql-5.7.17.tar.gz
Amoeba CentOS7.4 x86_64 192.168.113.173 jdk-6u14-linux-x64.bin / amoeba-mysql-binary-2.2.0.tar.gz
客户端 Redhat6.5 x86_64 192.168.113.174

实验操作步骤:

1.搭建MySQL主从复制

(1)建立时间同步环境,在主节点上搭建时间同步服务器。

1)安装NTP。
yum -y install ntp
2)配置NTP。
vim /etc/ntp.conf       #添加如下两行
   server 127.127.113.0                    #本地是时钟源
   fudge 127.127.113.0 stratum 8 
3)重启服务
service ntpd start

(2)在从节点上进行时间同步。

yum install ntp ntpdate -y
service ntpd start
/usr/sbin/ntpdate 192.168.113

(3)在每台服务器上关闭iptables,关闭安全性策略。

systemctl stop firewalld.service
setenforce 0

(4)安装MySQL数据库。在Master、Slave 1、slave 2上安装。

安装详细步骤参考Linux平台上安装MySQL服务之新版本mysql5.7的安装。

(5)配置MySQL Master主服务器

1)在/etc/my.cnf中修改或者增加以下内容。
vim /etc/my.cnf
  server-id       = 11                       //修改
  log-bin=master-bin                         //主服务器日志文件
  log-slave-updates=true                     //从服务器更新二进制日志 
2)重启MySQL 服务
systemctl restrat mysqld.service
3)登录MySQL程序,给从服务器授权,并查看日志和偏移量。
[root@promote ~]# mysql -uroot -pabc123
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘myslave‘@‘192.168.113.%‘ IDENTIFIED BY ‘123456‘;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      604 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

其中File列显示日志名,Position列显示偏移量,这两个值在后面配置从服务器会用到。Slave应从该点在Master上进行新的更新。

(6)配置从服务器。

1)在/etc/my.cnf中修改或者增加以下内容。
vim /etc/my.cnf

    server-id       = 22                 //修改
    relay-log=relay-log-bin                         //从主服务器上同步日志文件记录到本地//
    relay-log-index=slave-relay-bin.index           //定义relay-log的位置和名称//

这里要注意server-id不能与主服务器相同,每台服务器的server-id都不能相同。

2)重启MySQL 服务
systemctl restrat mysqld.service
3)登录MySQL程序,配置同步。
[root@promote ~]# mysql -uroot -pabc123
mysql> change master to
        -> master_host=‘192.168.113.164‘,
        -> master_user=‘myslave‘,
        -> master_password=‘123456‘,
        -> master_log_file=‘master-bin.000001‘,
        -> master_log_pos=604;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

按照主服务器结果更改下面命令中master_log_file和master_log_pos的参数。

4)启动同步。
mysql> start slave;
5)查看slave状态,确保以下两个值为YES。

技术分享图片

(7)验证主从复制效果。

1)在主服务器上新建数据库dba.
mysql> create database dba;
Query OK, 1 row affected (0.11 sec)
2)在主、从服务器上分别查看数据库,显示数据库相同,则主从复制成功。

技术分享图片
技术分享图片
技术分享图片

2.搭建MySQL读写分离

(1)在主机Amoeba上安装Java环境。

因为Amoeba是基于jdk1.5开发的,所以官方推荐使用jdk1.5或1.6版本,高版本不建议使用。

[root@localhost ~]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@localhost ~]# cd /usr/local
[root@localhost local]# ./jdk-6u14-linux-x64.bin  //安装jdk ,根据提示按enter键完成即可
[root@localhost local]# mv jdk1.6.0_14/ /usr/local/jdk1.6

在/etc/profile文件配置Java环境变量:

vim /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

查看Java环境是否配置成功。

[root@localhost local]# 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)

(2)安装并配置Amoeba软件。

[root@localhost ~]# mkdir /usr/local/amoeba/
[root@localhost ~]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ //解压amoeba软件至 /usr/local/amoeba/目录下
[root@localhost ~]# chmod -R 755 /usr/local/amoeba/ //设置权限
[root@localhost ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop   //显示此内容说明Amoeba安装成功

(3)配置Amoeba读写分离,两个Slave读负载均衡。

1)Master、Slave1、Slave2中开放权限给Amoeba访问。
grant all on *.* to test@‘192.168.113.%‘ identified by ‘123.com‘;
2)编辑dbServers.xml配置文件。
[root@localhost ~]# cd /usr/local/amoeba/
[root@localhost amoeba]# vim conf/dbServers.xml 

abstractServer配置:

---23修改----
 <property name="schema">mysql</property>
--26-29--去掉注释--
 <property name="user">test</property>

 <property name="password">123.com</property>

技术分享图片
主从数据库定义


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

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

--末尾--
<property name="poolNames">slave1,slave2</property>
 </poolConfig>

技术分享图片

3)编辑amoeba.xml配置文件。

amoeba连接验证配置

[root@localhost ~]# cd /usr/local/amoeba/
[root@localhost 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>

技术分享图片
技术分享图片

4)配置无误后,可以启动Amoeba软件,其默认端口为tcp8066。
[root@localhost amoeba]# /usr/local/amoeba/bin/amoeba start&
[1] 3257
[root@localhost amoeba]# log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2018-07-16 14:52:37,783 INFO  context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.2.0
log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf
2018-07-16 14:52:38,023 INFO  net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:8066.
2018-07-16 14:52:38,026 INFO  net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:9337.
^C
[root@localhost amoeba]# netstat -ntap | grep java     //查看java端口是否启动
tcp6       0      0 127.0.0.1:9337          :::*                    LISTEN      3257/java           
tcp6       0      0 :::8066                 :::*                    LISTEN      3257/java           
tcp6       0      0 192.168.113.173:57378   192.168.113.171:3306    ESTABLISHED 3257/java           
tcp6       0      0 192.168.113.173:35876   192.168.113.172:3306    ESTABLISHED 3257/java           
tcp6       0      0 192.168.113.173:58654   192.168.113.164:3306    ESTABLISHED 3257/java     

(4)测试。

1)在Client主机上安装mysql。
yum -y install mysql 

可以通过代理访问MySQL:

[root@RedHat6-1 ~]# mysql -u amoeba -p123456 -h 192.168.113.173 -P8066
mysql> 

技术分享图片

2)在Master上创建一个表 ,同步到各从服务器上,然后关闭各从服务器的Slave功能,再插入区别语句。
mysql> use dba;
Database changed
mysql> create table zang (id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.01 sec)

分别在两台从服务器上关闭slave功能:

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

然后在主服务器上插入区别语句:

mysql> insert into zang values(‘1‘,‘zhang‘,‘this_is_master‘);
Query OK, 1 row affected (0.00 sec)
3)从服务器上同步了表,手动插入其他内容。

slave1:

mysql> use dba;
Database changed
mysql> insert into zang values(‘2‘,‘zhang‘,‘this_is_slave1‘);
Query OK, 1 row affected (0.35 sec)

slave2:

mysql> use dba;
Database changed
mysql> insert into zang values(‘3‘,‘zhang‘,‘this_is_slave2‘);
Query OK, 1 row affected (0.01 sec)
4)测试读操作

在Client主机上第一次查询的结果如下:
技术分享图片
第二次查询的结果如下:
技术分享图片
第三次查询的结果如下:
技术分享图片

5)测试写操作:

在Client主机上插入一条语句:

mysql> insert into zang values(‘5‘,‘zhang‘,‘write_test‘);
Query OK, 1 row affected (0.02 sec)

但在Client上查询不到,最终只有在Master上才能查到这条语句内容,说明写操作在Master服务器上。
技术分享图片
技术分享图片
由此验证,MySQL实现了读写分离,目前所有写操作全部在Master主服务器上,避免数据的不同步;所有的读操作都分摊给slave从服务器,分担数据库的压力。

MySQL主从复制与读写分离

标签:修改   proxy   eid   erp   安装mysql   mysl   版本   iptable   服务   

原文地址:http://blog.51cto.com/11134648/2145027

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