常见的MySQL读写分离分为以下两种
代理
),外号变
单点故障
),则会有MHA解决这个问题客户端client(测试) | IP地址 |
---|---|
mysql-master | 192.168.10.131 |
mysql-slave1 | 192.168.10.132 |
mysql-slave2 | 192.168.10.136 |
mysql-amoeb | 192.168.10.133 |
因为amoeba是基于jdk1.5开发的,所以官方推荐使用jkd1.5/jdk1.6,高版本不建议使用
)将amoeba-mysql-binary-2.2.0.tar.gz和jdk-6u14-linux-x64.bin上传到opt目录下
[root@amoeba opt]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@amoeba opt]# chmod +x jdk-6u14-linux-x64.bin
[root@amoeba opt]# ./jdk-6u14-linux-x64.bin ##enter往下翻页--yes--enter
mv jdk1.6.0_14/ /usr/local/jdk1.6 ##重命名为了便于环境变量的设置
[root@amoeba local]# 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
[root@amoeba local]# source /etc/profile
[root@amoeba local]# echo $PATH
/usr/local/jdk1.6/lib:/usr/local/jdk1.6/jre/bin/:/usr/java/jdk1.8.0_201-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/amoeba/bin
vim /etc/profile
unset i
unset -f pathmunge
export JAVA_HOME=/usr/local/jdk1.6 ##指定jdk的位置
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 ##amoeba文件的位置
export PATH=$PATH:$AMOEBA_HOME/bin ##调用家目录识别amoeba的bin文件
source /etc/profile
java -version
[root@amoeba local]# mkdir /usr/local/amoeba
[root@amoeba local]# cd /opt
[root@amoeba opt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@amoeba opt]# chmod -R 755 /usr/local/amoeba/
[root@amoeba opt]# /usr/local/amoeba/bin/amoeba
amoeba start|stop
4.1三台数据库服务器进行提权
mysql> grant all on *.* to test@'192.168.10.%' identified by '123.com';
Query OK, 0 rows affected (0.01 sec)
#放权给amoeba进行访问
myslave ——》用于slave来同步
test ——》用于amoeba访问数据库
amoeba ——》用于client端访问amoeba的身份
[root@amoeba conf]# cd /usr/local/amoeba/conf
[root@amoeba conf]# cp amoeba.xml amoeba.xml.bak #修改配置文件记得先备份
[root@amoeba conf]# ls
access_list.conf amoeba.xml dbserver.dtd function.dtd log4j.dtd rule.dtd rule.xml
amoeba.dtd amoeba.xml.bak dbServers.xml functionMap.xml log4j.xml ruleFunctionMap.xml
[root@amoeba /opt]# cd /usr/local/amoeba/conf/
[root@amoeba amoeba]# vim amoeba.xml
<property name="user">amoeba</property>
#30行,这里是外部访问amoeba服务器时使用的账号
<property name="password">123123</property>
#32行,这里是数据库或者外部访问amoeba服务器时使用账号时用的密码
<property name="defaultPool">master</property> #修改默认池
<!-- --> #17添加-->,删掉下面那个-->,取消注释的作用
<property name="writePool">master</property>
<property name="readPool">slaves</property> #119行设置读写的两个账户名
<property name="needParse">true</property>
cp dbServers.xml dbServers.xml.bak ##备份数据库配置文件
vim dbServers. xml ##修改数据库配置文件
23 <property name="schema">mysql</property> ##将text修改为mysql;Mysql所有数据库信息( show databases )
26 <property name="user">test</property> ##amoeba访 问三台mysql数据库的账户和密码(账户为test)
29 <property name="password">123456</property> ##取消注释,修改访问数据库的密码
45 <dbServer name="master" parent="abstractServer"> ##修改数据库主服务器名/地址
48 <property name="ipAddress">192.168.35.40</property> ##修改master服务器ip
52 <dbServer name="slave1" parent="abstractServer"> ##修改从服务器名slave1
55 <property name="ipAddress">192.168.35.10</property> ##修改从服务器地址
紧接复制52-57行,粘贴,添加第二台服务器名
59 <dbServer name="slave2" parent="abstractServer"> ##修改从服务器名为slave2
62 <property name="ipAddress">192.168.35.20</property> ##修改第二台服务器IP
66 <dbServer name="slaves" virtual="true">
这时可以复制会话另开一个页面查看一下配置文件(因为amoeba需要一直开启才能查询到端口
)
vim amoeba.xml
cd /usr/local/amoeba/conf/amoeba.xml ##查询发现端口是8806
netstat -antp | grep 8806
[root@amoeba conf]# /usr/local/amoeba/bin/amoeba start &
[1] 114206
[root@amoeba conf]# log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2020-01-09 09:43:01,367 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
2020-01-09 09:43:01,883 INFO net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:8066.
2020-01-09 09:43:01,918 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:52838.
查看端口验证,8066端口已开
[root@amoeba ~]# netstat -natp | grep java
tcp6 0 0 :::8066 :::* LISTEN 114206/java
①此时确保四台服务器的防火墙已经关闭,然后去client客户端去验证
[root@client ~]# systemctl start firewalld
[root@client ~]# setenforce 0
[root@client ~]# yum install mysql -y
//安装mysql去连接即可,client不需要安装数据库取存储数据
[root@client ~]# mysql -u amoeba -p123123 -h 192.168.10.144 -P8066
//连接amoeba服务器
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 494299142
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
client端远程访问amoeba的地址,并进入数据库创建新的数据库,验证master和slaves是否同步
client端进入数据库创建表aa,发现master+slave1+slave2已同步创建数据表
测试mysql的读写分离,2台从服务器关闭主从同步,在客户端数据库的数据表内插入数据验证amoeba读写分离
stop slave ##2台从服务器关闭主从同步
show slave status\G ##查询从服务器的状态;已是NO
use bb ##client进入数据库
insert into aa values(1); ##client端插入数据
master处理写的任务,可以查询到数据表bb
从服务器处理读的任务,查询看不到数据
在从服务器上更改表数据,使用客户端验证从服务器读,和轮询的方式读
insert into bb values(2); ##slave1插入数据
insert into bb values(3); ##slave2插入数据
MySQL [player]> select * from test; ##client端查询验证轮询
说简单点,就是将数据库的读,写两个操作分开实现。由一台Master服务器来实现MySQL写的操作,由另一台slave服务器来实现MySQL读的操作。
因为在对数据库进行“写”的操作是比较耗时的,但数据库的“读”操作只需要很短的时间,数据库的写入就会很大
程度上影响查询的效率。那么此时就需要通过将数据库的“写”和“读”分开,来减轻数据库的压力,提高性能。