Linux使用Mycat进行数据库的读写分离实例讲解.docx
Linux使用Mycat进行数据库的读写分离实例讲解今天给大家分享一下用Mycat进行数据库的读写分离,本篇文章是基于上一篇的mysql 主从复制。Linux上实现Mysql的主从复制(为Mycat读写分离作准备)服务器1: centos7. 3, mysql5. 6服务器 2: centos7. 3, mysql5. 6接下来,我们来看一下实现读写分离的方法和优缺点。1 .读写分离的思路原理顾名思义,读写分离基本的原理是让主数据库处理事务性增、改、删操作,而从数据库 处理查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。1. 2实现方式实现方式有很多,但是不外乎分为内部配置和使用中间件,下面列举几个常用的方法:1,配置多个数据源,根据业务需求访问不同的数据,指定对应的策略:增加,删除,修 改操作访问对应数据,查询访问对应数据,不同数据库做好的数据一致性的处理。由于此方 法相对易懂,简单,不做过多介绍。2 .动态切换数据源,根据配置的文件,业务动态切换访问的数据库:此方案通过Spring 的AOP, AspactJ来实现动态织入,通过编程继承实现Spring中的 AbstractRoutingDataSource,来实现数据库访问的动态切换,不仅可以方便扩展,不影响现 有程序,而且对于此功能的增删也比较容易。3 .通过mycat来实现读写分离:使用mycat提供的读写分离功能,mycat连接多个数据 库,数据源只需要连接mycat,对于开发人员而言他还是连接了一个数据库(实际是mysql 的mycat中间件),而且也不需要根据不同业务来选择不同的库,这样就不会有多余的代码 产生。每个方法都有优缺点,我们选择对程序代码改动最小(只改数据源)的方法三,讲解 mycat的配置和使用。2. Mycat安装和配置.1安装步骤1#安装Java环境(mycat基于java)2yum install java-1.8.0-openjdk.x86_643# 下载 mycat4wget5https:/dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-li 6nux.tar.gz 7#解压8tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz 9#剪切到/usr/local下 lmv mycat /usr/local/0#创建专门运行mycat账号 adduser mycat1#切换到mycat文件夹路径下 led /usr/local2#将文件权限赋给mycat账号 lchown mycat:mycat -R mycat3#配置环境变量并添加 export 3AVA_H0ME=/usr export lMYCAT_HOME=/usr/local/mycat (如下图所示)4vim /etc/profile 1 5 1 6按Esc,输入:wq保存退出1#刷新环境变量文件2source /etc/profile3#切换mycat用户4su mycat5#切换目录6cd /usr/local/mycat/bin/7#启动 mycat8 ./mycat start好了,mycat启动成功,我们来看一下读写分离的配置和mycat的连接配置!3.配置Mycat的读写分离1 Mycat的目录结构根目录进到conf文件夹里面查看配置文件:root(aVM_0_13_redhat mycat# cd confroot(aVM 0 13 redhat conf# 1122:00 autopartition-long.txt22:00 auto-sharding-long.txt22:00 auto-sharding-rang-mod.txt22:00 cacheservice.properties22:00 dbseq.sql19:49 dnindex.properties22:00 ehcache.xnl22:00 index_to_charset.properties2016 Log4j2.xml22:00 migrateTables.properties22:00 myid.properties22:00 partition-hash-int.txt22:00 partition-range-mod.txt22:00 rule. xml21:49 schema.xml22:00 sequence_conf.properties22:00 sequencedbconf.properties22:00 sequencedistributedconf.pr22:00 sequence_time_conf.propertie21:26 server.xml22:00 sharding-by-enum.txt22:05 wrapper.conf18:40 zkconf18:40 zkdovfl.oadtotal 108-rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rw-r-r- 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1-rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxrwxrwx 1 -rwxr-xr-x 1 -rwxrwxrwx 1 -rwxrwxrwx 1 drwxrwxrwx 2 drwxrwxrwx 2 root root root root root root root root root root root root root root root root root root root root root root root root root root root root mycat mycat root root root root root root root root root root root root root root root root root root88 Jan 2248 Jan 2262 Jan 22334 Jan 223244 Jan 2251 Jun 10439 Jan 222132 Jan 221253 Dec 1178 Jan 22262 Jan 2215 Jan 22102 Jan 224794 Jan 222913 Jun 11413 Jan 2275 Jan 2227 Jan 2251 Jan 224738 Jun 1116 Jan 224186 Jan 224096 Jun 104096 Jun 10root(aVM 0 13 redhat conf#3. 2配置读写分离信息1#进入配置文件vi /usr/local/mycat/conf/schema.xml以下是两种配置方式和配置说明1 .提供一个数据库内所有表的权限:<!DOCTYPE nycat:schema SYSTEM<Mycat:scheaa n . :a ht|sche«a 工i<11' 3,<!«- <dataNode name="dnl$0-743- dataHost«"localhostl" database="db$0-743" /> - -> 个schema相,“I广个数据陈:name:设轼库名:dataNode:对人;x/sche«a2dataNode> 的 name<dataNode =/><dataNod© «»/> dataHost:i<dataHost>ffjname: database:在正要使用的数据牌名称<dataNode »«41, c > is< */><!-<dataNode nam©s-dn4" dataHostsMsequoiadbls databases"SAMPLE" /><dataNode name=" Jdbjdnl" dataHosts<> jdbchost* database=",dbl'> /><dataNode name="jdbc_dn2" dataHost«"jdbchosf database-*db2" /><dataNode name="jdbc dn3- dataHost«"jdbchost" databas®="db3" /> -><dataHost =1 > maxCon:iii大连接数:minCon:G小连按数:switchType:为1时会在仃多个从时进打轮训我的<beartbeat>select user()</heartbeat> heartbeat:、工花数扑":是;一:勺 J < 八"一,一会 |一力二个vwriteHost><!- can have multi writ© hosts -> vwriteHost>叮操作的数据库:host:数据座ip: url:IP+端I】:user,password:账<readHost>读操作的数据陈,可以岂多个,其余同上<writeHost = ><! can have multi read hosts -> <readHost<ZwriteHost><writeHost =' us =p-o =/><!- <writeHost host«"hostM2" url«"localhost:3316- user="root-</dataHo»t>一备用读数据库(第个writeHost挂掉使川这个可闻置多个) password="123456"/> -><dataHost name=*'sequoiadblH maxCon="1006- iiinCon*-1" balance="6" dbType="s©quoiadb" dbOrlven*-Jdbc-><heartboat></heartbeat><writ©Host host«"hostMl- url-"sequoiadb:/:11926/SAMPLE- user="jlfeng" password="jifGng-x/writ©Host></dataHost><dataHost name="oraclel" maxCon="1609" «inCon="l- balance="6" writeType="6" dbType="oracle- dt)Oriver="jdbc"> <heartbeat>select 1 fro* dual</heartbe.<connectionInitSql>alter session set nls_datG_format='yyyy-mm-dd hh24:ai:ss'</connectionInitSql><writ©Host host="hostMl- url="jdbc:oracle:thin:0127.6.6.1:1521:nange" user="baseB password="123456" > </writeHost> </dataHost><dataHost name="jdbchost" maxCon="ie66"«inCon="l- balanc©="6" writeType="e" dblypenongodb" dbDriver="jdbc"><heartbeat>selec t user()</heartbeat>cwriteHost host="hostM" url-niongodb:/2. 168.6.99/t©sf user="admin- password=N 123456* x/writeHost> </dataHost>ascheMa.xMl* 56L, 2913C5,2-92 .只显示一个数据库的指定表:<?xal version»-1.8*?><!DOCTYPE mycat:schema SYSTEM><$chema tADSHOW* cMckSOLch"Ml”* "HKtgAt-* 1B6,>在schema标签里面配置<table>参数.每个 table是你想要显示的表:name:你想要显示的 真实表名(数据库不存在会出错):dataNode:对应 < data Node >ffj name;其他不变.< iy :schema > :t =><!- auto sharding by id (long)-> (table =/>Stable =/><table ='111 > = fi<lf I < , ; !><childTabl© =p<irei ' Key« > <ChildTabl© ,i'll = or .l-i _ . , * ' " JoinKt ,=: 1 . :,p i, , Kt-.= I /> </childTablG> <childTable = /> </table><!- <table name="oc_calf primaryKey="ID" dataNode="dnl$0-743- rule="latest- month-calldate" /> -></scnema><!- - <dataNode name="dnl$e-743- dataHost="localhost1" database="db$8-743,<dataNode=/><dataNodo =. u ,=1=/><dataNode=/><! -<dataNode nan»e="dn4" dataHost="sequoiadbl* database="SAMPLE- /><dataNode name="jdbcdnl" dataHost="jdbchost" databasesdbl" /><dataNode namG="jdbc_dn2- dataHost="Jdbchost" database="db2" />cdataNodp namp=" jdbjdn?"dataHost=" jdbchost- databas©=Mdbl- /> -><dataHost =! i= t =1<heartbeat>select user()</heartbeat> <- can have multi write hosts -> <writeHost .,=<!- can have multi read hosts -><readHost =1</writeHost><writeHost »os )«* .4 u «schema.xml- 66L, 356ICSSH2 xterm r 171x428,17这样对于数据库的读写信息就配置完成了; 一般刚开始做,先使用第一种方法。4.配置Mycat的连接信息(账号密码)#进入配置文件2vi/usr/local/mycat/conf/server.xml设置端口和mycat连接信息-UnlQss required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under th© License.<!DOCTYPE mycat:server SYSTEM>v iyc -' :server 、:i =><system><property name= nonePasswordLogir >0</property> <!- 8为葡要密码登陆、1为不漏要密码登陆,默认为设置为1则福彩指定默认账户 <property =>l</property><property - useSqlSt >0</property> <! - 1 为开启实时统计、。为关闭<property n- isc ob e ble( her k">6</property> <! - - 1 为开启全加班一致性检测、。为关闭-><property r :i =ndlerType">2</property>property<property naproperty>3310</property>>96bb</property>>false</proDertv> <!-子查询中存在关联查询的情况下,检查关联字段中是否有分片字段.默认false端口设置为3310<! - - <property name="useCompression->l</property>- -> v! - T为开启mysql压缩协议-a<! - <property name="fakeMySQLVersion">5.6.26</property>-> v!-设置模拟的MySQL版本号<!- <property name="processorBufferChunk->40960</property> -><property nam©="processors">l</property><property name="processorExecutor">32</property>v!-默认为typo 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -><property<property>0</property>默认是65535 64K用于sql解析时最大文本长度->-<property -<property -<property -<property -<property-<property -<property -<property -<property -<propertyname="maxStringLiteralLength">65535</property>-> name=BsequnceHandl.erType">0</property>-> name="backSocketNoDel.ayH>l</property>->name="frontSocketNoDelay">l</property>-> name="processorExecutor">16</property>-><property nam©="serverPort">8066</property> <property nam©="managerPorf'>9066</property><property name="idl.eTimeouf>360000</property> <property name="bindlp">6.0.0.9</property><property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> ->v!-分布式事务开关,。为不过滤分布式事务,1为过谑分布式事务(如果分布式事务内只涉及全局表,则不过漉),2为不过建分布式事务,但是记录分布式事务日志<property name= c diole ns:;- o s >6</property>off heap for merge/order/group/limitoff heap for merge/order/group/limit1开启。关闭https:blog. csdn.罪§/却_359929呗对于标签,它里面重要的参数列举如下:balance指的负载均衡类型,目前的取值有4种:1. balance二" 0",不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。2. balance二" 1",全部的 readHost 与 stand bywriteHost 参与 select 语句的负载均 衡,简单的说,当双主双从模式(Ml->S1, M2->S2,并且Ml与M2互为主备),正常情况下, M2, SI, S2都参与select语句的负载均衡。3. balance二" 2",所有读操作都随机的在writeHost、readhost上分发。4. balance=" 3",所有读请求随机的分发到wiriterHost对应的readhost执行, writerHost不负担读压力注意:balance=3只在1.4及其以后版本有,1.3没有。writeType 属性:1. writeType=" 0",所有写操作发送到配置的第一个writeHost,第一个挂了切到还生 存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件 中:dnindex.properties.2. writeType二"1”,所有写操作都随机地发送到配置的writellost, 1. 5以后废弃不推荐。switchType指的是切换的模式,目前的取值也有4种:1. switchType='T'表示不自动切换2. switchType='1'默认值,表示自动切换3. switchType='2'基于MySQL主从同步的状态决定是否切换,心跳语句为show slave status4. switchType=3'基于 MySQLgalary cluster 的切换机制(适合集群)(1.4.1), 心跳语句为 show status like 'wsrep%'。注意:估计MycatL 4才开始支持switchType。1. 3版本配置该属性的话,日志里会报 错:org. xml. sax. SAXParseException;lineNumber: 61; columnNumber: 86; Attribute “switchType“ must bedeclared for element type “dataHost” 。MyCAT心跳检查询句配置为show slave status , dataHost上定义两个新属性: switchType-' 2”与slaveThreshold=" 100",此时意味着开启MySQL主从复制状态绑定 的读写分离与切换机制,Mycat心跳机制通过检测show slave status中的Seconds_Behind_Master,?, v Slave_IO_Running? , S1 ave_SQL_Running三个字段来确 定当前主从同步的状态及Seconds_Behind_Master主从复制时延,当Seconds Behind Master>slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防 止读到很久以前的旧数据,当主节点宕机后,切换逻辑会检查Slave上的Seconds Behind Master是否为0,为0时则表示主仅同步,可安全切换,否则不会切换。Mycat的配置到这里就算完成了,现在我们重启Mycat并连接测试 1#切换路径2cd /usr/local/mycat/bin3#重启4./mycat restart测试连接:口 mycat腾讯云(2核2g)203.195.20,连接显性X常规 高级 SSL SSH HTTP。名:mycat® 汛云(9 2g)203.195.203.主机名或IP地址:j203.195203,»:3310 |用户名:一定码:_连接测试确定取消项目开发中,我们只需要将mysql的连接地址换成mycat的地址即可,无需任何其余操 作,更不会造成多余的业务逻辑,好了,mycat的简单配置和使用就介绍到这里了!