千家信息网

利用Amoeba实现MySQL主从复制和读写分离

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,在实际生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(Master-Slave)
千家信息网最后更新 2024年09月22日利用Amoeba实现MySQL主从复制和读写分离

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

1、 MySQL主从复制原理

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

(1) MySQL支持的复制类型

  • 1) 基于语句的复制。在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
  • 2) 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行以便。
  • 3) 混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

    (2) 复制的工作过程

  • 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的缓存中,所以中继日志的开销很小。
    复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作。

    2、 MySQL读写分离的原理

    简单来说,读写分离就是只在主服务器上写,只在从服务器上读。基本原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库。
    基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户端请求通过判断后转发到后端数据库,有两个代表性程序。

  • (1)MySQL-Proxy。MySQL-Proxy为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是MySQL官方并不建议将MySQL用到生产环境。
  • (2)Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。
    -经过上述简单的比较,通过程序代码实现MySQL读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。所以,像这种应用一般会考虑使用代理层来实现。

实验拓扑图

实验环境

主机操作系统IP地址主要软件
MasterCentOS 7.3192.168.100.137mysql-5.5.24.tar.gz
Slave1CentOS 7.3192.168.100.132mysql-5.5.24.tar.gz
Slave2CentOS 7.3192.168.100.149mysql-5.5.24.tar.gz
AmoebaCentOS 7.3192.168.100.150amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin
客户端CentOS 7.3192.168.100.148mysql-5.5.24.tar.gz

实验部署

一. 搭建MySQL主从复制

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

1) 安装NTP

#yum -y install ntp

2) 配置NTP

#vim /etc/ntp.conf    server 127.127.100.0                    //本地是时钟源fudge 127.127.100.0 stratum 8          //设置时间层级为8(限制在15内)

3)重启服务并关闭防火墙和增强安全设置

#service ntpd restart#systemctl stop firewalld.service#setenforce 0

(2)在从节点上进行时间同步并关闭防火墙及增强安全功能

#yum install ntpd start#systemctl stop firewalld.service#setenforce 0#/usr/sbin/ntpdate 192.168.100.137              //进行时间同步

(3)在Master、Slave1、Slave2上安装MySQL数据库,具体过程在这就不详述了。

(4)配置MySQL主服务器

1)在/etc/my.cnf中修改或者增加以下内容并重启服务

#vim /etc/my.cnfserver-id       = 11log-bin=master-bin                         //主服务器日志文件log-slave-updates=true                     //从服务器更新二进制日志#systemctl restart mysqld.service

2)登录MySQL,给从服务器授权

#mysql -u root -pmysql>GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.100.%' IDENTIFIED BY '123456';mysql>FLUSH PRIVILEGES;mysql>show master status;+-------------------+----------+--------------+------------------+| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |+-------------------+----------+--------------+------------------+| master-bin.000001 |      339 |              |                  |+-------------------+----------+--------------+------------------+1 row in set (0.00 sec)

(5)配置从服务器(Slave1,Slave2)

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

#vim /etc/my.cnfserver-id       =22                         //这里注意server-id不能与主服务器相同relay-log=relay-log-bin                         //从主服务器上同步日志文件记录到本地relay-log-index=slave-relay-bin.index           //定义relay-log的位置和名称

2)重启MySQL服务

#systemctl restart mysqld.service

3)登录MySQL,配置同步。按主服务器结果更改下面命令中master_log_file和master_log_pos的参数

#mysql -u root -pmysql>change master to master_host='192.168.100.137',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=339;

4)启动同步,查看Slave状态,确保以下两个值为YES。

mysql>start slave;

(6)测试主从复制效果

1)在主服务器上新建数据库db_test。

mysql>create database db_test;

2)在主、从服务器上分别查看数据库,显示数据库相同,则主从复制成功

二、搭建MySQL读写分离

(1)关闭防火墙及增强安全功能
#systemctl stop firewalld.service#setenforce 0
(2)复制jdk软件包及安装
#cp jdk-6u14-linux-x64.bin /usr/local/#cd /usr/local#./jdk-6u14-linux-x64.bin                   //yes之后enter
(3)修改jdk目录名称
#mv jdk1.6.0_14/ /usr/local/jdk1.6
(4)添加jdk、jre、amoeba环境变量
#vi /etc/profileexport JAVA_HOME=/usr/local/jdk1.6export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/libexport PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/binexport AMOEBA_HOME=/usr/local/amoebaexport PATH=$PATH:$AMOEBA_HOME/bin
(5)刷新环境变量
#source /etc/profile
(6)创建amoeba工作目录
#mkdir /usr/local/amoeba
(7)解压amoeba软件包至工作目录下
#tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
(8)修改amoeba目录权限
#chmod -R 755 /usr/local/amoeba/
(9)验证amoeba是否安装成功
#/usr/local/amoeba/bin/amoeba           //若显示amoeba start|stop说明安装成功
(10)在Master、Slave1、Slave2中开放权限给Amoeba访问
mysql>grant all on *.* to test@'192.168.100.%' identified by '123.com';
(11)回到amoeba服务器,修改amoeba.xml配置文件
#cd /usr/local/amoeba#vim conf/amoeba.xml---30行--amoeba     //访问amoeba的用户名----32行---------123456     //密码---117-去掉注释-master  //默认为主服务器master        //写入为主服务器slaves         //读取为slaves池,现有slave1、slave2服务器
(12)修改dbServers.xml配置文件
--26-29--去掉注释-- test 123.com-----42-主服务器地址--- 192.168.100.137--52-从服务器主机名---55-从服务器地址- 192.168.100.132--57-从服务器主机名---60-从服务器地址- 192.168.100.149  --末尾--slave1,slave2 
(13)启动amoeba服务
#/usr/local/amoeba/bin/amoeba start&
(14)查看java端口开启情况,其默认端口为tcp8066
# netstat -anpt | grep java
(15)在客户端上安装MySQL,并登陆amoeba服务器(关闭防火墙和增强安全设置)
#yum install -y mysql#mysql -u amoeba -p123456 -h 192.168.100.100 -P8066#systemctl stop firewalld.service#setenforce 0
(16)测试读写分离

1)在Master上创建一个表,同步到各从服务器上,然后关闭各从服务器的Slave功能,再插入区别语句

#mysql -u root -pmysql>use db_test;mysql>create table zang (id int(10),name varchar(10),address varchar(20));      //主服务器mysql>stop slave;                   //从服务器mysql>insert into zang values('1','zhang','this_is_master');        //主服务器上,内容不会同步

2) 从服务器上同步了表,手动插入其他内容

mysql>use db_test;          //从服务器1mysql>insert into zang values('2','zhang','this_is_slave1');mysql>use db_test;          //从服务器2mysql>insert into zang values('3','zhang','this_is_slave2');

3)测试读操作

4)测试写操作
在Client主机上插入一条语句:

mysql>insert into zang values('5','zhang','write_test');

但在Client查询不到,最终只有在Master上才能查看到这条语句内容,说明写操作在Master服务器上。


服务 服务器 数据 数据库 同步 日志 语句 主从 线程 环境 内容 配置 安全 事务 程序 过程 主机 事件 二进制 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全最好的是什么 文件没有同步到当前服务器 浪潮服务器怎么重启bmc 四川 软件开发 中国物联网络技术有限公司 网络安全教育体会心得九十字 湖南网络技术 通信网络技术岗要做什么呢 软件开发怎样做的 郑州金水发票服务器地址 软件开发的知识产权年限 服务器内存条带马甲的怎么还便宜 cmc服务器 抗击疫情中的网络技术 巅峰战舰怎么设置服务器 软件开发监理需要什么资质 速达电脑怎么换服务器 新软件开发有限公司怎么样 数据库学生信息管理系统参考文献 华为电信招标服务器 网络技术服务开票税点 电子资源数据库有哪些搜索方式 江苏品质软件开发销售公司 服务器电源改快充 苏州档案管理软件开发 云计算中心和网络安全的关系 微信软件开发类图片素材 网络安全重点保障工作 吉林运营网络技术服务怎么样 周鸿祎+两会+网络安全
0