MySQL代理实现方式
代理技术
代理简介
-
名词
- DB Proxy,数据库中间件
-
功能
-
读写分离 M-S-S M-M-S-S
-
负载均衡 Galera Cluster
-
支持数据的分片自动路由与聚合(分库分表)
如果数据表数据量庞大,记录多,列数多的时候,可把数据表进行裁开,放在不同的表上
这些都是代理解决的
-
产品
- MySQL Proxy MySQL官方
- Atlas 奇虎360
- DBProxy 美团点评
- Amoeba 早期阿里巴巴
- cober 阿里巴巴
- MyCat 阿里巴巴
Mycat实战
架构
- 请准备好域名解析
- MyCat
- 192.168.229.59 mycat
- M-M-S-S
- 192.168.229.19 master1
- 192.168.229.29 master2
- 192.168.229.39 slave1
- 192.168.229.49 slave2
案例1:
1、配置 Java环境
- 下载jdk图示
JAVA
-
mycat服务器(59)解压java软件开发工具包
-
# ls anaconda-ks.cfg jdk-8u411-linux-x64.tar.gz # tar -zxf jdk-8u411-linux-x64.tar.gz -C /usr/local/
-
-
给目录创建一个软连接
ln -s /usr/local/jdk1.8.0_411/ /usr/local/java
-
tail -3 /etc/profile
-
添加三行 设置JAVA变量,便于JAVA调用
vim /etc/profile
-
JAVA_HOME=/usr/local/java PATH=$JAVA_HOME/bin:$PATH export JAVA_HOME PATH
-
执行环境变量配置文件
source /etc/profile
-
可以查看关于java的环境变量
env |grep JAVA
-
-
java -version
- 查询到版本。说明jdk安装成功
2、配置Mycat
- 下载mycat
-
-
mycat虽然已经推出2.0版本。但是语言繁琐,使用率不高。1.6的版本才是企业常用的版本。
-
# ls anaconda-ks.cfg jdk-8u411-linux-x64.tar.gz Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz #tar xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /usr/local
-
ls /usr/local/mycat/
-
-
配置mycat前端
-
vim /usr/local/mycat/conf/server.xml
-
注释掉多余用户
-
-
- 115行-119行
-
启动mycat管理员
配置mycat后端
-
请备份该文件
-
vim /usr/local/mycat/conf/schema.xml
-
代码
-
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="mydb2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="localhost1" database="mydb2" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="master1" url="master1:3306" user="mycatproxy" password="Lixinyi@123"> <readHost host="slave1" url="slave1:3306" user="mycatproxy" password="Lixinyi@123" /> </writeHost> <writeHost host="master2" url="master2:3306" user="mycatproxy" password="Lixinyi@123"> <readHost host="slave2" url="slave2:3306" user="mycatproxy" password="Lixinyi@123" /> </writeHost> </dataHost> </mycat:schema>
注释:
checkSQLschema 校验数据库 sqlMaxLimit 每秒最大连接数 dataNode 关联前方的登录主机和后方的集群 dataHost 集群 maxCon 最大和后面的设备产生多少的连接 writeType
-
-
-
-
-
注释
-
schema name:mycat维护的集群名称。 datanode:后方节点群的名称。 datahost:后方节点群的主机名称。 writehost:写主机 readhost:读主机 倒着看。
-
在本例中switchType值设置为1,表示自动切换,某些对主从数据一致要求较高的场景,建议使用2判断主从状态后再切换 切换的触发条件为主节点mysql服务崩溃或停止 slaveThreshold 主从的延迟在多少秒以内,则把读请求分发到这个从节点,否则不往这个节点分发,假设生产环境能容忍的主从延时为60秒,则设置此值为60,此例中设置值为100
-
-
-
-
关于属性的介绍
-
balance 类型
- balance指的负载均衡类型,目前的取值有4种: - balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。 - balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡, - 简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。 - balance="2",所有读操作都随机的在writeHost、readhost上分发。 - balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
-
writeType 属性
-
备份型
1. writeType="0", 所有写操作发送到配置的第一个 writeHost, 第一个挂了切到还生存的第二个writeHost, 重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
-
负载型
2. writeType="1",所有写操作都随机的发送到配置的 writeHost。
-
-
switchType 模式
- switchType指的是切换的模式,目前的取值也有4种:
-
- switchType=‘-1’ 负1表示不自动切换
-
- switchType=‘1’ 默认值,表示根据延时自动切换
-
- switchType=‘2’ 根据MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
-
slaveThreshold=“100”,此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制
1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,
配置如下:
MyCAT心跳检查语句配置为 show slave status ,
dataHost 上定义两个新属性: switchType=”2” 与 slaveThreshold=”100”,此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机制通过检测 show slave status 中的 “Seconds_Behind_Master”, “Slave_IO_Running”, “Slave_SQL_Running” 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延,
当Seconds_Behind_Master>slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据
而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则表示主从同步,可以安全切换,否则不会切换。
-
3、配置mysql群
-
M-M-S-S 准备Mycat连接的用户及权限
-
例如master1
-
mysql> create user 'mycatproxy'@'192.168.145.145' identified by 'Lixinyi@123';
-
mysql> grant all on *.* to 'mycatproxy'@'192.168.145.145' ;
- 192.168.229.59是mycat服务器的IP
-
flush privileges;
-
4、启动Mycat
-
在mycat服务器上
-
mycat1.6和mysql8的版本问题(如果使用的是mycat1.6和mysql5.*则跳过这个步骤
-
mysql-master1服务器上需要修改用户的加密方式
-
mysql> ALTER USER 'mycatproxy'@'192.168.145.145' IDENTIFIED WITH mysql_native_password BY 'Lixinyi@123';
-
mysql> ALTER USER 'mycatproxy'@'192.168.145.145' IDENTIFIED BY 'Lixinyi@123' PASSWORD EXPIRE NEVER;
flush privileges;
下面是了解的
-
增加mysql尝试连接的限制
-
刷新mysql连接池
-
mysqladmin flush-hosts -uroot -p'Lixinyi@123'
-
-
修改mysql配置文件,在[mysqld]下面添加
max_connect_errors=1000
-
-
Mycat服务器:
/usr/local/mycat/bin/mycat start
- Starting Mycat-server… 启动成功,否则就是配置Mycat后端语法错误。
-
监测端口是否启动(mycat默认端口8066)
netstat -anpt | grep java
[root@localhost ~]# netstat -anpt | grep java tcp 0 0 127.0.0.1:32000 0.0.0.0:* LISTEN 3487/java tcp6 0 0 :::1984 :::* LISTEN 3487/java tcp6 0 0 :::8066 :::* LISTEN 3487/java tcp6 0 0 :::59268 :::* LISTEN 3487/java tcp6 0 0 :::9066 :::* LISTEN 3487/java tcp6 0 0 :::44500 :::* LISTEN 3487/java tcp6 0 0 127.0.0.1:31000 127.0.0.1:32000 ESTABLISHED 3487/java
-
检测进程是否启动
ps aux | grep mycat
root 3487 4.0 35.4 6473184 172568 ? Sl 23:36 0:03 java -DMYCAT_HOME=. -server -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx4G -Xms1G -Djava.library.path=lib -classpath lib/wrapper.jar:conf:lib/zookeeper-3.4.6.jar:lib/jline-0.9.94.jar:lib/ehcache-core-2.6.11.jar:lib/log4j-1.2.17.jar:lib/fastjson-1.2.12.jar:lib/curator-client-2.11.0.jar:lib/joda-time-2.9.3.jar:lib/log4j-slf4j-impl-2.5.jar:lib/libwrapper-linux-x86-32.so:lib/netty-3.7.0.Final.jar:lib/druid-1.0.26.jar:lib/log4j-api-2.5.jar:lib/mapdb-1.0.7.jar:lib/slf4j-api-1.6.1.jar:lib/univocity-parsers-2.2.1.jar:lib/hamcrest-core-1.3.jar:lib/Mycat-server-1.6-RELEASE.jar:lib/objenesis-1.2.jar:lib/leveldb-api-0.7.jar:lib/hamcrest-library-1.3.jar:lib/wrapper.jar:lib/commons-lang-2.6.jar:lib/reflectasm-1.03.jar:lib/mongo-java-driver-2.11.4.jar:lib/guava-19.0.jar:lib/curator-recipes-2.11.0.jar:lib/curator-framework-2.11.0.jar:lib/libwrapper-linux-ppc-64.so:lib/log4j-core-2.5.jar:lib/leveldb-0.7.jar:lib/sequoiadb-driver-1.12.jar:lib/mysql-binlog-connector-java-0.4.1.jar:lib/kryo-2.10.jar:lib/jsr305-2.0.3.jar:lib/commons-collections-3.2.1.jar:lib/disruptor-3.3.4.jar:lib/log4j-1.2-api-2.5.jar:lib/velocity-1.7.jar:lib/libwrapper-linux-x86-64.so:lib/dom4j-1.6.1.jar:lib/minlog-1.2.jar:lib/asm-4.0.jar -Dwrapper.key=cECV31vA3vcZHrvr -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=3485 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp io.mycat.MycatStartup start
如果启动失败:
ls /usr/local/mycat/logs
查看mycat.log或者wrapper.log 这里面存储着失败日志记录
-
安装客户端
mycat下操作:
yum install -y mariadb
mariadb只是一个客户端
如果安装的是mariadb-server ,那么该服务器就是一个数据库服务器了
-
mycat登录测试
mysql -hmycat -uroot -p123456 -P8066 mycat的工作端口是8066
-
查看数据库
mysql>show databases;
MySQL [(none)]> show databases; +----------+ | DATABASE | +----------+ | mydb2 | +----------+ 1 row in set (0.01 sec)
- 看到的数据库是虚拟的。
- 注意后方mysql群中应该创建该库
-
-
在mysql-master1上创库创表
-
create database mydb2;
-
create table mydb2.t1 (id int);
-
5、Mycat使用后方数据库
-
在mycat上
-
select * from mydb2.t1;
-
insert into mydb2.t1 values(3);
-
-
在mysql集群能 查询到数据。实验完成。
案例2
- 多库时如何设置mycat
原文地址:https://blog.csdn.net/l_789rty/article/details/140503981
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!