9 Amoeba和mycat分别实现mysql读写分离

读写分离简介:

生产环境中一般都是主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力

读写分离工作原理:

基本的原理是通过中间件让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作(主库写从库读)。

9 Amoeba和mycat分别实现mysql读写分离

数据内部交换图解:

9 Amoeba和mycat分别实现mysql读写分离

读写分离的优点

分担负载压力,实现高并发
主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
提升查询性能以及节约系统开销
增加冗余,提高可用性

tips:
X锁:排它锁(写锁),自己拿到读写锁,其他人不能拿到其他的锁
S锁:共享锁(读锁),自己和其他人能拿到读锁,但是不能拿到写锁

读写分离的方式

程序内部实现(开发时)
	优点
		减少了中间件的使用,访问压力在一定级别以下,性能更好
	缺点
		架构一旦调整,代码要跟着变
		难以实现高级应用,如自动分库,分表
		不够灵活,无法适用大型应用场景
中间件层实现
	常见的中间件程序:cobar、mycat、atlas、MMM、Amoeba
	不足之处:
	优点
		架构设计更灵活
		可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控
		对业务代码的影响小,同时也安全

mycat实现读写分离

mycat简介

优点
一个彻底开源的,面向企业应用开发的大数据库集群
支持事务、ACID、可以替代MySQL的加强版数据库
一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

mycat实现读写分离架构

9 Amoeba和mycat分别实现mysql读写分离

实验前提条件:安装mysql5.7

使用yum安装mysql5.7

配置YUM源,下载mysql源安装包
yum -y install wget
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
安装mysql源
yum -y localinstall mysql57-community-release-el7-8.noarch.rpm
检查mysql源是否安装成功
yum repolist enabled | grep "mysql.-community."

安装MySQL
yum -y install mysql-community-server --nogpgcheck
mysqld -V

9 Amoeba和mycat分别实现mysql读写分离

systemctl start mysqld
systemctl status mysqld
systemctl enable mysqld

登陆并修改密码
mysql5.7安装时会产生一个默认的密码,查看此密码的文件一般存在于/var/log/mysqld.log上

查看密码并登录
grep 'temporary password' /var/log/mysqld.log
mysql -uroot -p'密码'

9 Amoeba和mycat分别实现mysql读写分离

修改密码
命令:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
mysql> flush privileges;

可选操作:修改新密码规范
mysql5.7会安装validate_password这个插件,对密码进新规范
用该密码登录到服务端后,必须马上修改密码,不然会报如下错误:

9 Amoeba和mycat分别实现mysql读写分离

如果只是修改为一个简单的密码,会报以下错误:

9 Amoeba和mycat分别实现mysql读写分离

这个其实与validate_password_policy的值有关。validate_password_policy有以下取值:

9 Amoeba和mycat分别实现mysql读写分离

刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。有时候,只是为了自己测试,不想密码设置得那么复杂,譬如说,我只想设置root的密码为1234

修改validate_password_policy参数的值
set global validate_password_policy=0;

这样,判断密码的标准就基于密码的长度了。,这个由validate_password_length参数来决定,validate_password_length参数默认为8,它有最小值的限制,最小值为:其中,validate_password_number_count指定了密码中数据的长度,validate_password_special_char_count指定了密码中特殊字符的长度,validate_password_mixed_case_count指定了密码中大小字母的长度。如果修改了validate_password_number_count,validate_password_special_char_count,validate_password_mixed_case_count中任何一个值,则validate_password_length将进行动态修改。

select @@validate_password_length;

9 Amoeba和mycat分别实现mysql读写分离

validate_password_length最小只能设置为4
set global validate_password_length=1; select @@validate_password_length;

再设置数字,特殊字符和大小字母至少为0个就好
set global validate_password_number_count=0;
select @@validate_password_number_count;

9 Amoeba和mycat分别实现mysql读写分离

set global validate_password_special_char_count=0;
select @@validate_password_special_char_count;

9 Amoeba和mycat分别实现mysql读写分离

set global validate_password_mixed_case_count=0;
select @@validate_password_mixed_case_count;

9 Amoeba和mycat分别实现mysql读写分离

mycat环境配置

环境准备

192.168.1.10 mycat mycat中间件
192.168.1.11 mysql-01 主库
192.168.1.12 mysql-02 从库

实验前准备

下载包
下载jdk1.7以上版本
下载mycat包

安装jdk(这里源码方式安装,yum方式更加便捷)
mkdir /usr/java
tar xvf jdk-8u60-linux-x64.tar.gz -C /usr/java/
做环境变量
vim /etc/profile

JAVA_HOME=/usr/java/jdk1.8.0_60
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH

source /etc/profile
java -version

9 Amoeba和mycat分别实现mysql读写分离

配置hosts
hostnamectl set-hostname mycat;bash
hostnamectl set-hostname mysql-master;bash
hostnamectl set-hostname mysql-slave;bash
vim /etc/hosts

192.168.1.10 mycat
192.168.1.11 mysql-master
192.168.1.12 mysql-slave

mycat操作

安装包
tar xvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
useradd -M -s /sbin/nolgin mycat
chown -R mycat:mycat /usr/local/mycat/

添加环境变量
 vim /etc/profile.d/mycat.sh

export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin

source /etc/profile.d/mycat.sh
mycat --version

9 Amoeba和mycat分别实现mysql读写分离

修改server.xml
cd /usr/local/mycat
vim conf/server.xml

9 Amoeba和mycat分别实现mysql读写分离
9 Amoeba和mycat分别实现mysql读写分离

解释:读写通过root用户,并配置密码和逻辑库名;只读通过mycat用户访问,并配置密码和逻辑库名。

配置详解:

9 Amoeba和mycat分别实现mysql读写分离

修改schema.xml
cd conf
cp -a schema.xml schema.xml.bak
vim schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="school" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>
                <dataNode name="dn1" dataHost="localhost1" database="school" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="192.168.1.11" url="192.168.1.11:3306" user="root" password="123">
                        <readHost host="192.168.1.12" url="192.168.1.12:3306" user="root" password="123" />
                </writeHost>
        </dataHost>
</mycat:schema>

详解(不要参考图示参数,按照上面的参数):

9 Amoeba和mycat分别实现mysql读写分离

主从库授权(11、12)

grant all on *.* to mycat@'192.168.1.10' identified by '123';flush privileges;

启动mycat
mycat start

查看mycat日志
cat /usr/local/mycat/logs/wrapper.log | grep successful

9 Amoeba和mycat分别实现mysql读写分离

修改日志级别
vim /usr/local/mycat/conf/log4j2.xml

9 Amoeba和mycat分别实现mysql读写分离

查看逻辑数据库
mysql -uroot -p123 -h 127.0.0.1 -P9066
show datasource;

9 Amoeba和mycat分别实现mysql读写分离

从逻辑端口登录访问:
mysql -uroot -p123 -h 127.0.0.1 -P8066
show databases;

9 Amoeba和mycat分别实现mysql读写分离

use school;
select * from students;

9 Amoeba和mycat分别实现mysql读写分离

监控日志,测试读写分离
tail -f /usr/local/mycat/logs/wrapper.log
use school;
create table ceshi(id int,name varchar(20));

9 Amoeba和mycat分别实现mysql读写分离

insert into ceshi values(1,'xiaoming'),(2,'xiaohong');
select * from ceshi;

9 Amoeba和mycat分别实现mysql读写分离

查看一下读写负载

9 Amoeba和mycat分别实现mysql读写分离

最后检查一下主从是否同步即可

Amoeba中间件实现读写分离

简介

中间件:一种提供在不同技术、不同的软件之间共享资源的程序,更大化了利用了数据库的性能,可以无限扩展(注:真实环境中并非如此)

9 Amoeba和mycat分别实现mysql读写分离

实验

实验环境

amoeba:192.168.1.10
主:192.168.1.11
从:192.168.1.12

主从环境搭建

开启bin-log日志
11和12
yum -y install mariadb mariadb-server

11:
vim /etc/my.cnf
log-bin=mysql-bin
server-id=11

9 Amoeba和mycat分别实现mysql读写分离

12:

vim /etc/my.cnf
log-bin=mysql-bin
server-id=12

9 Amoeba和mycat分别实现mysql读写分离

10、11开机自启和启动
systemctl start mariadb;systemctl enable mariadb

11授权

mysql
grant replication slave on *.* to slave@'192.168.1.%' identified by '123';
show master status;
9 Amoeba和mycat分别实现mysql读写分离

12接受授权

mysql
change master to master_user='slave',master_password='123',master_host='192.168.1.11',master_log_file='mysql-bin.000003',master_log_pos=393;
start slave;
show  slave status\G
9 Amoeba和mycat分别实现mysql读写分离

测试
11端

create database school;
use school
create table students(id int,name varchar(10));
insert into students values(1,'zhangsan'),(2,'lisi');

12端
首先测试成功同步,然后插入一条新数据作为判断
select * from school.students;

9 Amoeba和mycat分别实现mysql读写分离
use school;
stop slave;
insert into students values(3,'wangwu');
select * from students;
9 Amoeba和mycat分别实现mysql读写分离

配置amoeba(10端)

导入包,安装相关依赖
cd
amoeba-n.zip

9 Amoeba和mycat分别实现mysql读写分离

yum -y install unzip
yum -y install gcc gcc-c++
unzip amoeba-n.zip

配置jdk
mkdir /amoeba
cd amoeba-n
tar -xf jdk-7u40-linux-x64.gz
cp -a jdk1.7.0_40/ /amoeba/jdk
vim /etc/profile

#java-amoeba
export JAVA_HOME=/amoeba/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/bin/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
9 Amoeba和mycat分别实现mysql读写分离

source /etc/profile
java -version

9 Amoeba和mycat分别实现mysql读写分离

安装amoeba
cd /root/amoeba-n
unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba
cd /usr/local/amoeba/
chmod +x bin/*

配置文件
vim conf/amoeba.xml

<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">

	<server>
		<!-- proxy server°ó¶¨µÄ¶Ë¿Ú -->
		<property name="port">8066</property>
		
		<property name="ipAddress">192.168.1.13</property>
		<!-- proxy server net IO Read thread size -->
		<property name="readThreadPoolSize">20</property>
		
		<!-- proxy server client process thread size -->
		<property name="clientSideThreadPoolSize">30</property>
		
		<!-- mysql server data packet process thread size -->
		<property name="serverSideThreadPoolSize">30</property>
		
		<!-- socket Send and receive BufferSize(unit:K)  -->
		<property name="netBufferSize">128</property>
		
		<!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
		<property name="tcpNoDelay">true</property>
		
		<!-- ¶ÔÍâÑéÖ¤µÄÓû§Ãû -->
		<property name="user">amoeba</property>
		
		<!-- ¶ÔÍâÑéÖ¤µÄÃÜÂë -->
		<property name="password">123</property>
		
		<!-- query timeout( default: 60 second , TimeUnit:second) -->
		<property name="queryTimeout">60</property>
	</server>
	
	<!-- 
		ÿ¸öConnectionManager¶¼½«×÷Ϊһ¸öÏß³ÌÆô¶¯¡£
		manager¸ºÔðConnection IO¶Áд/ËÀÍö¼ì²â
	-->
	<connectionManagerList>
		<connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
			<property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>
			
			<!-- 
			  default value is avaliable Processors 
			<property name="processors">5</property>
			 -->
		</connectionManager>
	</connectionManagerList>
	
	<dbServerList>
		<dbServer name="server1">
			<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
				<property name="manager">defaultManager</property>
				<property name="port">3306</property>
				<property name="ipAddress">192.168.1.14</property>
				<property name="schema">school</property>
				<property name="user">abc</property>
				<property name="password">123</property>
			</factoryConfig>
			<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
				<property name="maxActive">200</property>
				<property name="maxIdle">200</property>
				<property name="minIdle">10</property>
				<property name="minEvictableIdleTimeMillis">600000</property>
				<property name="timeBetweenEvictionRunsMillis">600000</property>
				<property name="testOnBorrow">true</property>
				<property name="testWhileIdle">true</property>
			</poolConfig>
		</dbServer>
		<dbServer name="server2">
			<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
				<property name="manager">defaultManager</property>
				<property name="port">3306</property>
				<property name="ipAddress">192.168.1.15</property>
				<property name="schema">school</property>
				<property name="user">abc</property>
				<property name="password">123</property>
			</factoryConfig>
			<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
				<property name="maxActive">200</property>
				<property name="maxIdle">200</property>
				<property name="minIdle">10</property>
				<property name="minEvictableIdleTimeMillis">600000</property>
				<property name="timeBetweenEvictionRunsMillis">600000</property>
				<property name="testOnBorrow">true</property>
				<property name="testWhileIdle">true</property>
			</poolConfig>
		</dbServer>
		
		
		<dbServer name="write" virtual="true">
			<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
				<property name="loadbalance">1</property>
				<property name="poolNames">server1</property>
			</poolConfig>
		</dbServer>
		<dbServer name="read" virtual="true">
			<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
				<property name="loadbalance">1</property>
				<property name="poolNames">server1,server2</property>
			</poolConfig>
		</dbServer>
	</dbServerList>
	
	<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
		<property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>
		<property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>
		<property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
		<property name="LRUMapSize">1500</property>
		<property name="defaultPool">write</property>
		<property name="writePool">write</property>
		<property name="readPool">read</property>
		<property name="needParse">true</property>
	</queryRouter>
</amoeba:configuration>
9 Amoeba和mycat分别实现mysql读写分离
9 Amoeba和mycat分别实现mysql读写分离
9 Amoeba和mycat分别实现mysql读写分离
9 Amoeba和mycat分别实现mysql读写分离
9 Amoeba和mycat分别实现mysql读写分离
9 Amoeba和mycat分别实现mysql读写分离

修改脚本
vim bin/amoeba

9 Amoeba和mycat分别实现mysql读写分离

检测脚本
/usr/local/amoeba/bin/amoeba
终端输出此行用法说明,证明配置无误 --> amoeba start|stop

11、12端授权abc用户

grant all on school.* to abc@'192.168.1.10' identified by '123';

使用10以amoeba用户登录11测试

yum -y install mariadb
mysql -uabc -p123 -h 192.168.1.11

检测一下是否为11的数据库
show databases;

9 Amoeba和mycat分别实现mysql读写分离

开启amoeba
nohup bash -x /usr/local/amoeba/bin/amoeba &
或者是
/usr/local/amoeba/bin/amoeba start &

9 Amoeba和mycat分别实现mysql读写分离

netstat -anpt | grep 8066

9 Amoeba和mycat分别实现mysql读写分离

登陆本机进行操作
mysql -uamoeba -p123 -P8066 -h192.168.1.10

测试轮询

9 Amoeba和mycat分别实现mysql读写分离

测试高可用
关闭12端的mariadb服务,压力全都在11端

9 Amoeba和mycat分别实现mysql读写分离

开启12端服务,关闭11端服务,压力全都在12端

9 Amoeba和mycat分别实现mysql读写分离

发布者:LJH,转发请注明出处:https://www.ljh.cool/6609.html

(1)
上一篇 2020年6月2日 下午3:37
下一篇 2020年6月4日 上午2:43

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注