mysql之读写分离

一,mysql-proxy实现读写分离

mysql-proxy



--------------------------------------------------------------------------------------------------
client mysql master write
\ / |
mysql-proxy-------- / \
/ \ / \
client mysql mysql slave read
---------------------------------------------------------------------------------------------------

实验:
两台mysql服务器:
192.168.1.251 mysql-server master write
192.168.1.254 mysql-server slave read

#yum install mysql mysql-server mysql-devel -y
#/etc/init.d/mysqld start
#mysql
mysql> grant all on *.* to wing@'%' identified by '123';
mysql> flush privileges;

一台proxy服务器:
192.168.1.250 mysql-proxy

安装lua环境
#yum install lua*i686* lua -y
安装mysql-proxy
# tar xvzf mysql-proxy-0.8.0-linux-rhel5-x86-32bit.tar.gz
# cd mysql-proxy-0.8.0-linux-rhel5-x86-32bit
# \cp -r ./* /usr/

使用lua脚本指定读写机器

#mysql-proxy -r 192.168.1.254:3306 -b 192.168.1.251:3306 -s /usr/share/doc/mysql-proxy/rw-splitting.lua --log-level=info --log-file=/var/log/mysql-proxy.log

测试:
#mysql -u wing -p123 -h 192.168.1.250 -P4040
创建数据库db1

单独连接到mysql服务器发现251上有数据(write),254没数据(read)

二,amoeba实现读写分离

环境:
代理: proxy.up.com 192.168.100.109
写: master.up.com 192.168.122.185
读: slave.up.com 192.168.122.186

软件:
amoeba-mysql-binary-2.2.0.tar.gz
jdk-7u67-linux-x64.tar.gz

注意:selinux iptables 时间同步
生产服务器上master和slave先实现AB复制,但是做读写分离的实验为了看到效果,可以先关掉AB复制

配置:

两台mysql服务器配置:
创建测试库和给amoeba使用的帐号:
mysql>create database db1;
mysql> grant all on *.* to wing@'%' identified by '123';

amoeba代理服务器配置:
安装jdk环境:
#tar xvzf jdk-7u67-linux-x64.tar.gz
#mv jdk1.7.0_67/ /usr/local/jdk

安装amoeba:
#mkdir /usr/local/amoeba
#tar xvzf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/

配置环境变量:
#vim /etc/profile.d/amoeba.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:/usr/local/amoeba/bin:$JAVA_HOME/bin
#. /etc/profile.d/amoeba.sh
#echo $PATH
#which amoeba

配置amoeba:
配置amoeba如何连接mysql:
注意:按行号来找配置行即可
#vim /usr/local/amoeba/conf/dbServers.xml
//配置amoeba连接mysql时需要的端口、数据库、用户名和密码,要保证主从一致
19 <!-- mysql port -->
20 <property name="port">3306</property>
21
22 <!-- mysql schema -->
23 <property name="schema">db1</property>
24
25 <!-- mysql user -->
26 <property name="user">wing</property>
27
28 <property name="password">123</property>
29 <!-- mysql password
30 <property name="password">password</property>
31 -->
//配置amoeba要代理的数据库的主机名称和IP,如果还有更多服务器可复制模板添加
46 <dbServer name="master.up.com" parent="abstractServer">
47 <factoryConfig>
48 <!-- mysql ip -->
49 <property name="ipAddress">192.168.122.185</property>
50 </factoryConfig>
51 </dbServer>
52
53 <dbServer name="slave.up.com" parent="abstractServer">
54 <factoryConfig>
55 <!-- mysql ip -->
56 <property name="ipAddress">192.168.122.186</property>
57 </factoryConfig>
58 </dbServer>
//配置负载均衡池内的主机,如果有多个用逗号隔开
60 <dbServer name="multiPool" virtual="true">
61 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
62 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
63 <property name="loadbalance">1</property>
64
65 <!-- Separated by commas,such as: server1,server2,server1 -->
66 <property name="poolNames">slave.up.com</property>
67 </poolConfig>
68 </dbServer>

配置读写机器

#vim /usr/local/amoeba/conf/amoeba.xml
//配置amoeba监听的端口,为了方便测试,这里设置成和mysql一样的端口
9 <service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">
10 <!-- port -->
11 <property name="port">3306</property>
12
13 <!-- bind ipAddress -->
14 <!--
15 <property name="ipAddress">127.0.0.1</property>
16 -->
//配置访问amoeba服务器的帐号和密码
27 <property name="authenticator">
28 <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
29
30 <property name="user">amoeba</property>
31
32 <property name="password">amoeba</property>
33
//配置默认连接的mysql服务器和负责读写的服务器分别是谁
115 <property name="defaultPool">master.up.com</property>
116 <property name="writePool">master.up.com</property>
117 <property name="readPool">multiPool</property>
118
119 <!--
120 <property name="writePool">server1</property>
121 <property name="readPool">server1</property>
122 -->

启动amoeba服务:
#amoeba start
log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2015-07-09 08:16:37,213 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
2015-07-09 08:16:37,749 INFO net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:3306.
2015-07-09 08:16:37,761 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:15827.
测试:
proxy机器上:
[root@proxy ~]#yum install mysql -y
[root@proxy ~]# mysql -u amoeba -pamoeba -h 192.168.100.109
mysql> select * from db1.t1;
+------+
| id |
+------+
| 1 |
+------+
mysql> insert into t1 set id=2; //写是185提供的服务,所以写到了185机器上
Query OK, 1 row affected (0.01 sec)

mysql> select * from db1.t1; //读是186提供的服务,因为没有做AB复制,他又只做读操作,所以他没有数据
+------+
| id |
+------+
| 1 |
+------+

常见错误:
错误1:
Amoeba启动错误:
#amoeba start
The stack size specified is too small, Specify at least 160k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

解决方法
打开bin目录下 的amoeba启动文件
# vim amoeba
修改58行的Xss参数:
DEFAULT_OPTS="-server -Xms1024m -Xmx1024m -Xss128k"

修改为:
DEFAULT_OPTS="-server -Xms1024m -Xmx1024m -Xss256k"

错误2:
连接不上mysql服务器
java.net.NoRouteToHostException: 没有到主机的路由

解决方法:
原因于amoeba连接不上mysql 所以防火墙 selinux关掉

三,mycat(读写分离)

Mycat 数据库中间件

========================================================
MyCat M-M-S-S
准备一台新的主机放到两台MM机器的前面做代理

client(任何使用Mysql的应用)
|
vip

mycat---mycat
|
------------
| |
M M
------------
|
------------
| |
s s

一、配置 Java环境:



1.删除openjdk(可选):
# yum erase `rpm -qa | grep jdk`

2.安装oracle官方jdk:
[root@mycat ~]# tar xvzf jdk-7u67-linux-x64.tar.gz -C /usr/local/
[root@mycat ~]# cd /usr/local/
[root@mycat local]# mv jdk1.7.0_67/ jdk

3.设置环境变量:
[root@mycat local]# vim /etc/profile.d/jdk.sh
JAVA_HOME=/usr/local/jdk
PATH=$PATH:$JAVA_HOME/bin

[root@mycat local]# source /etc/profile.d/jdk.sh

4.测试java:
[root@mycat local]# java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

二、下载安装Mycat

下载:
官方网站:http://www.mycat.io/
安装:
[root@mycat local]# tar xvzf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

三、配置mycat:
server.xml
配置client如何访问Mycat(用户名和密码)
配置schema名称

schema.xml
配置数据库节点和库

配置server.xml:
授权新账户(在任何一台master上):
mysql> grant all on *.* to 'wing'@'%' identified by '123';
mysql> flush privileges;

在其他所有机器测试账户是否同步成功:
mysql> show grants for wing@'%';
+-----------------------------------------------+
| Grants for wing@% |
+-----------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'wing'@'%' |
+-----------------------------------------------+

#vim /usr/local/mycat/conf/server.xml
80 <user name="root">
81 <property name="password">123</property>
82 <property name="schemas">dbname1</property>
//schemas的名字可以写多个,拿逗号隔开 比如db1,db2

修改配置文件schema.xml :
#vim /usr/local/mycat/conf/schema.xml
1 <?xml version="1.0"?>
2 <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
3 <mycat:schema xmlns:mycat="http://io.mycat/">
4
5 <schema name="dbname1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> //中间原来有好多表的配置,统统干掉
6 </schema>
//上面的schema标签可以写多个,每个对应一个datanode
7 <dataNode name="dn1" dataHost="localhost1" database="dbname1" />
//上面的datanode可以写多个,每个对应一个数据库
8 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
9 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
10 <heartbeat>select user()</heartbeat>
11 <writeHost host="master1" url="master1:3306" user="wing"
12 password="123">
13 <readHost host="slave1" url="slave1:3306" user="wing" password="123" />
14 <readHost host="slave2" url="slave2:3306" user="wing" password="123" />
15 </writeHost>
16 <writeHost host="master2" url="master2:3306" user="wing"
17 password="123">
18 <readHost host="slave1" url="slave1:3306" user="wing" password="123" />
19 <readHost host="slave2" url="slave2:3306" user="wing" password="123" />
20 </writeHost>
21 </dataHost>
22
23 </mycat:schema>

balance 属性(读写分离机制)
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1", 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2
互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
4. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
5. balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType 属性
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准.
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。

balance=1
writeType=0

m1 写
m2 读

启动服务:
#/usr/local/mycat/bin/mycat start

[root@mycat conf]# jps
2118 WrapperSimpleApp
2153 Jps

mycat默认端口:8066

客户端连接Mycat
#mysql -uroot -p123 -h mycat -P8066    //这里的mycat是域名解析





















































====================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值