读写分离简介:
生产环境中一般都是主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力
读写分离工作原理:
基本的原理是通过中间件让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作(主库写从库读)。
数据内部交换图解:
读写分离的优点
分担负载压力,实现高并发
主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
提升查询性能以及节约系统开销
增加冗余,提高可用性
tips:
X锁:排它锁(写锁),自己拿到读写锁,其他人不能拿到其他的锁
S锁:共享锁(读锁),自己和其他人能拿到读锁,但是不能拿到写锁
读写分离的方式
程序内部实现(开发时)
优点
减少了中间件的使用,访问压力在一定级别以下,性能更好
缺点
架构一旦调整,代码要跟着变
难以实现高级应用,如自动分库,分表
不够灵活,无法适用大型应用场景
中间件层实现
常见的中间件程序:cobar、mycat、atlas、MMM、Amoeba
不足之处:
优点
架构设计更灵活
可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控
对业务代码的影响小,同时也安全
mycat实现读写分离
mycat简介
优点
一个彻底开源的,面向企业应用开发的大数据库集群
支持事务、ACID、可以替代MySQL的加强版数据库
一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
mycat实现读写分离架构
实验前提条件:安装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
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'密码'
修改密码
命令:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
mysql> flush privileges;
可选操作:修改新密码规范
mysql5.7会安装validate_password这个插件,对密码进新规范
用该密码登录到服务端后,必须马上修改密码,不然会报如下错误:
如果只是修改为一个简单的密码,会报以下错误:
这个其实与validate_password_policy的值有关。validate_password_policy有以下取值:
刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。有时候,只是为了自己测试,不想密码设置得那么复杂,譬如说,我只想设置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;
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;
set global validate_password_special_char_count=0;
select @@validate_password_special_char_count;
set global validate_password_mixed_case_count=0;
select @@validate_password_mixed_case_count;
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
配置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
修改server.xml
cd /usr/local/mycat
vim conf/server.xml
解释:读写通过root用户,并配置密码和逻辑库名;只读通过mycat用户访问,并配置密码和逻辑库名。
配置详解:
修改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>
详解(不要参考图示参数,按照上面的参数):
主从库授权(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
修改日志级别
vim /usr/local/mycat/conf/log4j2.xml
查看逻辑数据库
mysql -uroot -p123 -h 127.0.0.1 -P9066
show datasource;
从逻辑端口登录访问:
mysql -uroot -p123 -h 127.0.0.1 -P8066
show databases;
use school;
select * from students;
监控日志,测试读写分离
tail -f /usr/local/mycat/logs/wrapper.log
use school;
create table ceshi(id int,name varchar(20));
insert into ceshi values(1,'xiaoming'),(2,'xiaohong');
select * from ceshi;
查看一下读写负载
最后检查一下主从是否同步即可
Amoeba中间件实现读写分离
简介
中间件:一种提供在不同技术、不同的软件之间共享资源的程序,更大化了利用了数据库的性能,可以无限扩展(注:真实环境中并非如此)
实验
实验环境
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
12:
vim /etc/my.cnf
log-bin=mysql-bin
server-id=12
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;
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
测试
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;
use school;
stop slave;
insert into students values(3,'wangwu');
select * from students;
配置amoeba(10端)
导入包,安装相关依赖
cd
amoeba-n.zip
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
source /etc/profile
java -version
安装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>
修改脚本
vim bin/amoeba
检测脚本
/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;
开启amoeba
nohup bash -x /usr/local/amoeba/bin/amoeba &
或者是
/usr/local/amoeba/bin/amoeba start &
netstat -anpt | grep 8066
登陆本机进行操作
mysql -uamoeba -p123 -P8066 -h192.168.1.10
测试轮询
测试高可用
关闭12端的mariadb服务,压力全都在11端
开启12端服务,关闭11端服务,压力全都在12端
发布者:LJH,转发请注明出处:https://www.ljh.cool/6609.html