目前有什么优秀的实现mysqlmysql主从读写分离离的方案

雪晖 的BLOG
用户名:雪晖
访问量:6625
注册日期:
阅读量:5863
阅读量:12276
阅读量:314148
阅读量:1028094
51CTO推荐博文
1 程序修改操作类
可以参考,阿权开始的本项目,以程序此需求。
优点:直接和通信,简单快捷的读写分离和随机的方式实现的均衡,独立分配
缺点:自己维护更新,增减在代码处理
参考官网:
优点:直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案
缺点:自己分配账户,和后端数据库权限独立,权限处理不够灵活
优点:直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号
缺点:集问题,lua语言编程,还只是alpha版本,消耗有点高
如果你不能安装来解决读写分离,那可以尝试阿权的项目解决思路。
如果你可以安装软件,那amoeba是不错的,mysql-proxy不太建议,目前只有alpha版本,效率还不太理想,amoeba目前在阿里巴巴是内部项目,正在生产环境使用的。
了这篇文章
类别:未分类┆阅读(0)┆评论(0)在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修改,如果数据库不小心挂掉了,则同时也意味着程序的不可用,而这对很多应用来说,并不能接受。
引入MySQL中间件能很好的对程序端和数据库进行解耦,这样,程序端只需关注数据库中间件的地址,而无需知晓底层数据库是如何提供服务。
作为当前炙手可热的MySQL中间件,MyCAT实现MySQL主从集群的读写分离自是应有之义,其配置也相当简单。
在这里,我用三个实例组成MySQL主从集群,来验证MyCAT的读写分离功能,其实,一主一从就可以满足,之所以用三个,是为了验证MyCAT的分片功能。
集群组成如下:
角色 & & & & & & 主机名 & & & & & & & & & & &主机IP
master & & & &&mysql-server1 & & & & &192.168.244.145
slave & & & & & &mysql-server2 & & & & &192.168.244.146
slave & & & & & &mysql-server3 & & & & &192.168.244.144
在这里,还是使用Travelrecord表进行测试。
首先编辑MyCAT的配置文件schema.xml,关于dataHost的配置信息如下:
&dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1"
slaveThreshold="100"&
&heartbeat&select user()&/heartbeat&
&!-- can have multi write hosts --&
&writeHost host="hostM1" url="localhost:3306" user="root"
password="123456"&
&/writeHost&
&writeHost host="hostS1" url="192.168.244.146:3306" user="root"
password="123456" /&
&writeHost host="hostS2" url="192.168.244.144:3306" user="root"
password="123456" /&
&/dataHost&
这里面,有两个参数需要注意,balance和 switchType。
其中,balance指的负载均衡类型,目前的取值有4种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1-&S1,M2-&S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
3. balance="2",所有读操作都随机的在writeHost、readhost上分发。
4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
switchType指的是切换的模式,目前的取值也有4种:
1. switchType='-1' 表示不自动切换
2. switchType='1'&默认值,表示自动切换
3.&switchType='2'&基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
4. switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。
因此,该配置文件中的balance="1"意味着作为stand by writeHost的hostS1和hostS2将参与select语句的负载均衡,这就实现了主从的读写分离,switchType='-1'意味着当主挂掉的时候,不进行自动切换,即hostS1和hostS2并不会被提升为主,仍只提供读的功能。这就避免了将数据读进slave的可能性,毕竟,单纯的MySQL主从集群并不允许将数据读进slave中,除非配置的是双master。
验证读写分离
下面来验证一下,
创建Travelrecord表
create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);
mysql& insert into travelrecord(id,user_id,traveldate,fee,days)
values(1,@@hostname,,100,10);
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql& insert into travelrecord(id,user_id,traveldate,fee,days)
values(5000001,@@hostname,,100,10);
Query OK, 1 row affected, 1 warning (0.01 sec)
在这里,用了一个取巧的方法,即对user_id插入了当前实例的主机名,这样可直观的观察读写是否分离以及MyCAT的分片功能。能这样做的原因在于我当前的MySQL版本-5.6.26默认是基于statement的复制,如果是基于row的复制,则这个方法将不可取。
mysql& select * from
+---------+---------------+------------+------+------+
| traveldate | fee
+---------+---------------+------------+------+------+
1 | mysql-server2 | 2016-01-01 |
| 5000001 | mysql-server3 | 2016-01-02 |
+---------+---------------+------------+------+------+
2 rows in set (0.01 sec)
mysql& select * from
+---------+---------------+------------+------+------+
| traveldate | fee
+---------+---------------+------------+------+------+
| 5000001 | mysql-server3 | 2016-01-02 |
1 | mysql-server2 | 2016-01-01 |
+---------+---------------+------------+------+------+
2 rows in set (0.02 sec)
mysql& select * from
+---------+---------------+------------+------+------+
| traveldate | fee
+---------+---------------+------------+------+------+
| 5000001 | mysql-server3 | 2016-01-02 |
1 | mysql-server3 | 2016-01-01 |
+---------+---------------+------------+------+------+
2 rows in set (0.01 sec)
mysql& select * from
+---------+---------------+------------+------+------+
| traveldate | fee
+---------+---------------+------------+------+------+
| 5000001 | mysql-server3 | 2016-01-02 |
1 | mysql-server3 | 2016-01-01 |
+---------+---------------+------------+------+------+
2 rows in set (0.01 sec)
mysql& select * from
+---------+---------------+------------+------+------+
| traveldate | fee
+---------+---------------+------------+------+------+
1 | mysql-server2 | 2016-01-01 |
| 5000001 | mysql-server2 | 2016-01-02 |
+---------+---------------+------------+------+------+
从上面的输出结果,可以得出以下两点:
一、该配置已实现读写分离,读出来的数据没有master节点的。
二、MyCAT的随机分发不是基于statement的,即一个select语句查询其中一个节点,另外一个select语句查询另外一个节点。它分发针对的是片的,同一个select语句的结果是有不同dataNode返回的。
不仅如此,从MyCAT日志中也可以获取读写分离的相关信息,当然,前提是MyCAT的日志级别是debug。日志相关信息如下:
验证mater挂了,slave还能提供读的功能
对于MySQL主从集群,我们的需求是master挂了,slave还能提供读的功能。
下面来测试一下
首先,人为的关闭主库
[root@mysql-server1 ~]# /etc/init.d/mysqld stop
[root@mysql-server1 ~]# mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB
mysql& insert into travelrecord(id,user_id,traveldate,fee,days)
values(,@@hostname,,100,10);
ERROR 1184 (HY000): Connection refused
mysql& select * from
+---------+---------------+------------+------+------+
| traveldate | fee
+---------+---------------+------------+------+------+
1 | mysql-server2 | 2016-01-01 |
| 5000001 | mysql-server3 | 2016-01-02 |
+---------+---------------+------------+------+------+
2 rows in set (0.02 sec)
可见无法插入数据,但不影响读取数据。
至此,MyCAT实现MySQL的读写分离部署测试完毕。
1. 其实,刚开始配置的是readHost节点,配置如下:
&dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1"
slaveThreshold="100"&
&heartbeat&select user()&/heartbeat&
&!-- can have multi write hosts --&
&writeHost host="hostM1" url="localhost:3306" user="root"
password="123456"&
&!-- can have multi read hosts --&
&readHost host="hostS1" url="192.168.244.146:3306" user="root" password="123456" /&
&/writeHost&
&/dataHost&
但这种方式有个问题,即master挂了以后,slave也不能提供服务,而这违反了MySQL主从集群的初衷。
2. 如果开启了事务模式,即set autocommit=0,则事务内的读走的是master节点,而不是从节点。
阅读(...) 评论()mysql读写分离实现_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
mysql读写分离实现
上传于||暂无简介
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
你可能喜欢目前有什么优秀的实现mysql读写分离的方案_百度知道
目前有什么优秀的实现mysql读写分离的方案
提问者采纳
然后在程序里面根据读/写情况调用不同数据库即可很简单,建2台服务器,利用SQL自身的同步功能,只写B服务器做从数据库,只读。A服务器做主数据库
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Mysql主从同步及其读写分离的实现过程
Mysql主从同步及其读写分离的实现过程
环境:CentOS release 5.2 、mysql-5.1.55.tar.gz、mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
测试机:172.16.10.11:mysql proxy 及其mysql主数据库
&&&&&&& 172.16.10.12:mysql从数据库
1.编译安装mysql:
a首先yum安装mysql所需要的环境
#yum install&&make&&gcc&gcc-c++&&libxml2 &&libxml2-devel&&libmcrypt &&libmcrypt-devel &&libtool-ltdl &&apr &&apr-* &&ncurses &ncurses-*
b.安装mysql
#/usr/sbin/groupadd mysql
#/usr/sbin/useradd mysql &g mysql
在执行./configure 之前,先执行:
# autoreconf --force --install
# libtoolize --automake --force
# automake --force --add-missing
#./configure --prefix=/opt/mysql --localstatedir=/opt/mysql/data/ --with-server-suffix=-enterprise-gpl --without-debug --with-big-tables&--with-extra-charsets=all --with-pthread --enable-thread-safe-client --enable-static --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --without-ndb-debug&--with-plugins=innobase
#Make install
#scripts/mysql_install_db &-user=mysql (一定要添加)
改权限、主配置文件、环境变量
#chown -R mysql.mysql /opt/mysql/
# cp support-files/f&/f& # chmod 750 /opt/mysql &R&& //-R : 对目前目录下的所有档案与子目录进行相同的权限变更 # chgrp mysql /opt/mysql -R
#/opt/mysql/bin/mysqld_safe &user=mysql &
到此mysql服务器的安装就结束了!
备:在两台服务器上均安装mysql数据库
2 mysql主从同步配置过程
在主服务器上:
修改或添加以下条目
&Log-bin=master-bin&&&& //修改
&Log-bin-index=master-bin.index&//添加
&Server-id=1
重启mysql数据库
添加replication账号
#/opt/mysql/bin/mysql &uroot &p
Mysql&grant replication slave on *.* to &slave&@&172.16.10.12& identified by &123456&;
查看master当前的日志文件及日志位置:
+-------------------+----------+--------------+------------------+
| File&&&&&&&&&&&&& | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |&&&&& 106 |&&&&&&&&&&&&& |&&&&&&&&&&&&&&&&& |
+-------------------+----------+--------------+------------------+
在从的数据库上:
修改或添加以下条目
log-bin=mysql-bin
relay-log=relay-log-bin&& //添加
relay-log-index=slave-relay-bin.index&//添加
server-id=2
注:server-id不能与主服务器的相同
重启mysql服务
#/opt/mysql/bin/mysql &uroot &p
Mysql&change master to master_host=&172.16.10.11&master_port=3306master_user=&slave&master_password=&123456&master_log_file=&master-bin.000001&master_log_pos=106;
Mysql&start slave
Mysql&show slave statusG
出现如下两行&
Slave_IO_Running: Yes&&&&&&&&&&
Slave_SQL_Running: Yes
表示主从mysql服务器配置完成!&&
如果出现no,就将从数据库上述重新操作一遍"stop slave"。
Mysql proxy配置过程:
一、必备软件: 1、LUA && 可以去LUA的官方下载:www.lua.org 2、MySQL Proxy && 这里有好多二进制版本。 &&& http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/ && 或者去MYSQL官方下载源代码。
三、安装体验
1、 LUA的安装
[root@localhost ~]#tar zxvf lua-5.1.2.tar.gz&-C /usr/local
[root@localhost ~]# cd /usr/local/
[root@localhost local]# mv lua-5.1 lua
[root@localhost lua]# cd lua
[root@localhost lua]#
&&& 导出环境变量:
[root@localhostlua]#export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L/usr/local/lib -llua -ldl" LDFLAGS="-lm"
2、MySQL Proxy 安装&&
[root@localhost ~]#tar -zxvf mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz -C /usr/local/mysql/
[root@localhost ~]#cd /usr/local/mysql
[root@localhost mysql]#mv mysql-proxy-0.6.1-linux-rhel4-x86-32bit/ mysql-proxy
[root@localhost sbin]# export PATH=$PATH:/usr/local/mysql/mysql-proxy/sbin/
四、使用MySQL Proxy
mysql proxy就是一个中间层代理,也可以说是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载均衡,对用户来说,mysql proxy完全透明,应用则只需连接到mysql proxy的监听端口即可。 1、查看帮助选项
mysql-proxy --help-all 3
[root@localhost ~]# cd /opt/mysql-proxy/bin
[root@localhost ~]#./mysql-proxy --admin-username=admin --admin-password=admin --proxy-read-only-backend-addresses=172.16.10.12:3306 --proxy-backend-addresses=127.0.0.1:3306 --proxy-lua-script=/usr/local/mysql/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --admin-lua-script=/usr/local/mysql/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon --max-open-files=1500
--daemon 采用daemon方式启动
--admin-address=:4401 指定mysql proxy的管理端口,在这里,表示本机的4401端口
--proxy-address=:4040 指定mysql proxy的监听端口,也可以用 127.0.0.1:4040表示
--proxy-backend-addresses=127.0.0.1:3306 指定mysql主机的端口
--proxy-read-only-backend-addresses=172.16.10.12:3306 指定另一个只读的mysql主机端口
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua 指定lua脚本,在这里,使用的是rw-splitting脚本,用于读写分离
问题:网站在使用mysql proxy连接数据库时网站出现乱码 (不使用时正常)
网友分析:连接上mysql proxy后,执行查询时,随即出现乱码,出现此问题的原因是当我们使用mysql proxy读写分离时,通常会有多个后端服务器,客户端发出查询请求时,一般会先发出一条类似于&SET NAME utf8&的语句来声明客户端编码,然后再发出实际查询的SQL语句 ,但mysql proxy可能会把两条语句分发给不同的后端数据库,于是就出现了乱码。
解决方法:
强制指定后端服务器的字符编码:
init-connect='SET NAME utf8'
default-character-set=utf8
skip-character-set-client-handshake
重启mysql服务
然后用phpmyadmin测试,就可以正常使用了!(phpmyadmin使用的是utf8编码)}

我要回帖

更多关于 mysql主从读写分离 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信