Atalas
这个是很老的了,了解即可。
wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
#安装后的目录
cd /usr/local/mysql-proxy
配置
/usr/local/mysql-proxy/bin/encrypt root
vim /usr/local/mysql-proxy/conf/test.cnf
#配置Atlas用户
# 管理接口的用户名
admin-username = root
# 管理接口的密码
admin-password = root
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 172.17.187.78:3306
#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 172.17.187.78:3306@1,172.17.187.79:3306@2
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码
pwds = root:qyMGHucYPhGZnKb0g+dxdA==
#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234
#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345
#启动
/usr/local/mysql-proxy/bin/mysql-proxyd test start
#登录
mysql -h127.0.0.1 -P2345 -uroot -p=root
#查看主机名 一主两从的化可以读节点 会相互切换
select @@hostname
Mcat
vim server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
<property name="processorBufferPoolType">0</property>
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
<!--
off heap for merge/order/group/limit 1开启 0关闭
-->
<property name="useOffHeapForMerge">1</property>
<!--
单位为m
-->
<property name="memoryPageSize">64k</property>
<!--
单位为k
-->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!--
单位为m
-->
<property name="systemReserveMemorySize">384m</property>
<!--是否采用zookeeper协调切换 -->
<property name="useZKSwitch">false</property>
<!-- XA Recovery Log日志路径 -->
<!--<property name="XARecoveryLogBaseDir">./</property>-->
<!-- XA Recovery Log日志名称 -->
<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
<property name="serverPort">8066</property>
</system>
<!-- 重点关注这里配置的schemas 就是数据库 也在这里配置了数据库的密码-->
<user name="root" defaultAccount="true">
<property name="password">654321</property>
<property name="schemas">hello</property>
</user>
<user name="user">
<property name="password">654321</property>
<property name="schemas">hello</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--对应前面的模式-->
<schema name="hello" checkSQLschema="true" sqlMaxLimit="100">
<!--要操作的表-->
<table name="user" dataNode="dn1" />
</schema>
<dataNode name="dn1" dataHost="host1" database="hello" />
<!--配置节点 这里要注意顺序一定要是 dataHost heartbeat writeHost 否则会报错-->
<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 配置了一主两从 -->
<writeHost host="hostW" url="127.0.0.1:3306" user="root" password="654321">
<readHost host="hostR1" url="127.0.0.1:13306" user="root" password="654321" />
<readHost host="hostR2" url="127.0.0.1:23306" user="root" password="654321" />
</writeHost>
</dataHost>
</mycat:schema>
#这里特别特别要注意,由于我前面使用的是docker 去搭建mysql集群,但是我的mycat安装在宿主机上
#所以这里我连接mycat的时候需要使用docker0网卡的ip
mysql -uroot -p654321 -h172.17.0.1 -P8066
#接着我们执行下面这条指令 看master的ID
SELECT @@server_id;
可以看到完全对上了:
至此使用mycat 搭建读写分离就完成了,这里要注意是基于已经搭建好的一主两从,如果之前没有搭建虽然实现了读写分离,但是主库的数据不会同步。一主两从的搭建可以参考我这篇博客
MySQL-Proxy
不推荐使用,使用MySQL Router代替
wget https://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
#创建配置文件
[mysql-proxy]
user=root # 运行mysql-proxy用户
admin-username=root # 主从mysql共有的用户
admin-password=654321# admin密码
proxy-address=ip:4040 # mysql-proxy运行ip和端口,不加端口,默认4040
proxy-backend-addresses=ip:3306 # 指定后端主master写入数据
proxy-read-only-backend-addresses=ip:3306 # 指定后端从slave读取数据
proxy-lua-script=./share/doc/mysql-proxy/rw-splitting.lua # lua位置,参见上面的版本信息
log-file=./logs/mysql-proxy.log # 日志文件存储路径
log-level=debug
keepalive=true # 保持连接启动进程会有2个, 一号进程用来监视二号进程
daemon=true # mysql-proxy以守护进程方式运行
chmod 660 mysql-proxy.conf
#新建一个lua脚本
vim share/doc/mysql-proxy/rw-splitting.lua
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, # 默认超过4个连接数时,才开始读写分离,改为1 测试需要
max_idle_connections = 1, # 默认8,改为1测试需要
is_debug = false
}
end
启动命令
nohup bin/mysql-proxy --defaults-file=mysql-proxy.conf > mysql-proxy.out 2 > &1&
mysql -uroot -proot -hip -P4040
MySQL Router
MySQL Router最早是作为MySQL-Proxy的替代方案出现的。
wget http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-Router/mysql-router-8.0.20-el7-x86_64.tar.gz
配置
[logger]
#配置日志级别
level = INFO
#配置读
[routing:secondary]
#这里需要注意我生产环境中不能这么配置需要配置网段
bind_address = 0.0.0.0
bind_port = 7001
destinations = 127.0.0.1:23306,127.0.0.1:13306
routing_strategy = round-robin
#配置写
[routing:primary]
bind_address = 0.0.0.0
bind_port = 7002
destinations = 127.0.0.1:3306
routing_strategy = first-available
关于routing_strategy
- round-robin:每个新连接都以循环方式连接到下一个可用的服务器,以实现负载平衡。
- round-robin-with-fallback:用于InnoDB Cluster。每个新的连接都以循环方式连接到下一个可用的secondary服务器。如果secondary服务器不可用,则以循环方式使用primary服务器。
- first-available:新连接从目标列表路由到第一个可用服务器。如果失败,则使用下一个可用的服务器,如此循环,直到所有服务器都不可用为止。
- next-available:与first-available类似,新连接从目标列表路由到第一个可用服务器。与firstavailable不同的是,如果一个服务器被标记为不可访问,那么它将被丢弃,并且永远不会再次用作目标。重启Router后,所有被丢弃服务器将再次可选。
./bin/mysqlrouter -c ./conf/mysqlrouter.conf &
mysqlrouter 的原理为:访问7002的时候就转发到写mysql服务,7001转发到读服务
#这里同样我使用的是docker 172.17.0.1是docker0的ip
mysql -uroot -p654321 -h172.17.0.1 -P7002
#执行这个命令
select @@server_id