框架配置实现读写分离:
1)修改项目配置文件:
- return [
- // 数据库类型
- 'type' => 'mysql',
- // 服务器地址
- // 1、主从数据库的连接地址 主在前 从在后
- 'hostname' => '192.168.17.100,192.168.17.105',
- // 2、主从数据库的名称、用户、密码一样的话,只配置一份即可。如果不一样,按照先后顺序,逗号分隔
- // 数据库名
- 'database' => 'tp5shop',
- // 用户名
- 'username' => 'tp5shop',
- // 密码
- 'password' => '$Abc3721',
- // 端口
- 'hostport' => '3306',
- // 连接dsn
- 'dsn' => '',
- // 数据库连接参数
- 'params' => [],
- // 数据库编码默认采用utf8
- 'charset' => 'utf8',
- // 数据库表前缀
- 'prefix' => 'tpshop_',
- // 数据库调试模式
- 'debug' => true,
- // 3、项目框架的业务代码实现读写分离,使用的是分布式(主从服务器) 配置为1
- // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
- 'deploy' => 1,
- // 4、数据库读写分离是业务代码实现的,配置为true
- // 数据库读写是否分离 主从式有效
- 'rw_separate' => true,
- // 读写分离后 主服务器数量
- 'master_num' => 1,
- // 指定从服务器序号
- 'slave_no' => '',
- // 是否严格检查字段是否存在
可以问软件开发工程师,看主从复制是怎么配置处理的。
测试down主库,看从库是否可以访问。thinkphp5中,如果slave宕机,master提供读服务。这个对用更友好一点。从压力大。
等学到PHP的时候,可以看看这部分内容。
MyCAT实现读写分离:
介绍:
数据库中间件:对前端服务器来说,只有一台。
准备一台服务器,作为数据库的中间件服务器,配置基本环境、网卡、FQDN。
server07 mycat 192.168.17.107
MyCat 数据库中间件。
国内最活跃、性能最好的开源数据库中间件。
因为MyCat是java语言开发的,必须使用java的运行环境启动和操作。
JDK安装:
java静态编译的编程语言,代码编译成机器码 执行机器码输出结果。
编译JDK(JAVA DEVELOPMENT KIT java开发工具包) javac编译java代码。
运行jre,编译好的机器代码(可执行文件)java。
实际业务环境中,如果存在需要编译的情况,就选择JDK。
JRE java解释运行环境,一般情况编译过的可执行的java程序,jre就够用了。
公司代码在服务器上进行编译,是因为服务器性能好。有些包本地没有,在公司服务器上。
下载JDK:
选择下载X64的tar.gz的包:
上传mycat和jdk到soft目录下。
- shell > tar xvf jdk-8u192-linux-x64.tar.gz
- shell > mv jdk1.8.0_192 /usr/local/java
-
-
- 配置环境变量:
- #追加环境变量
- shell > echo "PATH=/usr/local/java/bin:$PATH" >> /etc/profile
- shell > source /etc/profile
- #检测java环境变量 如果看到版本信息即为成功
- shell > java -version
MyCat 安装测试:
1)解压安装MyCat:
tar xvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local
实际解压到目录即可,无需安装。
启动MyCat:
默认情况下,启动MyCat是可以启动的:
# 通过控制台,进行前端启动,可以看到执行过程。
/usr/local/mycat/bin/mycat console
- [root@server07 bin]# nohup ./mycat console &
- [1] 15897
- [root@server07 bin]# nohup: ignoring input and appending output to ‘nohup.out’
注意:如果启动不成功,可能是由于没有解析主机名称,需要在hosts文件中进行解析。
域名解析暂时失败。
配置读写分离:
读写分离的配置文件:
Mycat是由java开发,java开发的软件大部分配置文件是xml格式。注意它的基本格式。
- xml格式注意点:
-
- 1、xml声明信息
-
- 2、具有一个根标签
-
- 3、双标签和单标签格式
-
- 4、注意闭合标签
-
- 5、注释格式为
查看server.xml:
默认server.xml可以不用修改。
- /usr/local/mycat/conf
- vim server.xml
修改server.xml
配置mycat对外的使用用户信息:
root是对外使用的用户名,123456是对外使用的密码,TESTDB是对外使用的数据库。
修改schema.xml:
schema标签里配置name的server.xml里的虚拟数据库名称,dataNode 填写后面使用的dataNode名称
dataNode标签和dataHost指定配置使用
dataHost标签里配置writeHost和readHost(密码,地址,用户名称)
schema=>dataNode=>dataHost=>writeHost=>readHost
- [root@server07 conf]# cat schema.xml
- "1.0"?>
- "schema.dtd">
"http://io.mycat/"> -
-
"TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> -
"dn1" dataHost="localhost1" database="tp5shop" /> -
"localhost1" maxCon="1000" minCon="10" balance="0" - writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
-
select user() -
-
"hostM1" url="192.168.17.108:3306" user="tp5shop" password="$Abc3721"> -
-
"hostS2" url="192.168.17.112:3306" user="tp5shop" password="$Abc3721" /> -
-
然后再运行mycat进行下测试:
启动mycat服务器:
- /usr/local/mycat/bin/mycat start
-
- netstat -atunlp |grep 8066
- [root@server07 bin]# ./mycat start
- Starting Mycat-server...
- [root@server07 bin]# ps aux |grep mycat
- root 1490 0.0 0.0 17864 748 ? Sl 10:50 0:00 /usr/local/mycat/bin/./wrapper-linux-x86-64 /usr/local/mycat/conf/wrapper.conf wrapper.syslog.ident=mycat wrapper.pidfile=/usr/local/mycat/logs/mycat.pid wrapper.daemonize=TRUE wrapper.lockfile=/var/lock/subsys/mycat
- root 1492 12.9 11.7 6928724 239192 ? Sl 10:50 0:01 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/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/mysql-binlog-connector-java-0.6.0.jar:lib/netty-common-4.1.9.Final.jar:lib/leveldb-0.7.jar:lib/sequoiadb-driver-1.12.jar:lib/kryo-2.10.jar:lib/jsr305-2.0.3.jar:lib/commons-collections-3.2.1.jar:lib/mysql-connector-java-5.1.35.jar:lib/disruptor-3.3.4.jar:lib/log4j-1.2-api-2.5.jar:lib/velocity-1.7.jar:lib/Mycat-server-1.6.5-release.jar:lib/libwrapper-linux-x86-64.so:lib/dom4j-1.6.1.jar:lib/minlog-1.2.jar:lib/asm-4.0.jar:lib/netty-buffer-4.1.9.Final.jar -Dwrapper.key=pC2d0REJJQ5SznBy -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=1490 -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
- root 1530 0.0 0.0 112812 972 pts/0 S+ 10:50 0:00 grep --color=auto mycat
- [root@server07 bin]# netstat -atunlp |egrep "8066|9066"
- tcp6 0 0 :::9066 :::* LISTEN 1492/java
- tcp6 0 0 :::8066 :::* LISTEN 1492/java
如果配置之后,不能启动mycat,不能够启动。
通过查看/usr/local/mycat/logs/wrapper.log。
最好是启动console,查看console日志,检查没问题了,然后再进行配置:
mycat客户端:
在server07的机器上还是需要安装mysql软件:
然后使用mysql客户端连接mycat客户端:
mysql -h 127.0.0.1 -uroot -p -P 8066
执行查询命令查看结果:
mycat管理端:
连接mycat管理端:
mysql -h127.0.0.1 -uroot -p123456 -P9066
执行管理命令查看:
- mysql > show @@help; //查看管理监控端的所有帮助命令
- mysql > show @@heartbeat; //查看服务器状态
show @@help
show @@heartbeat
- mysql> show @@help;
- +------------------------------------------+--------------------------------------------+
- | STATEMENT | DESCRIPTION |
- +------------------------------------------+--------------------------------------------+
- | show @@time.current | Report current timestamp |
- | show @@time.startup | Report startup timestamp |
- | show @@version | Report Mycat Server version |
- | show @@server | Report server status |
- | show @@threadpool | Report threadPool status |
- | show @@database | Report databases |
- | show @@datanode | Report dataNodes |
- | show @@datanode where schema = ? | Report dataNodes |
- | show @@datasource | Report dataSources |
- | show @@datasource where dataNode = ? | Report dataSources |
- | show @@datasource.synstatus | Report datasource data synchronous |
- | show @@datasource.syndetail where name=? | Report datasource data synchronous detail |
- | show @@datasource.cluster | Report datasource galary cluster variables |
- | show @@processor | Report processor status |
- | show @@command | Report commands status |
- | show @@connection | Report connection status |
- | show @@cache | Report system cache usage |
- | show @@backend | Report backend connection status |
- | show @@session | Report front session details |
- | show @@connection.sql | Report connection sql |
- | show @@sql.execute | Report execute status |
- | show @@sql.detail where id = ? | Report execute detail status |
- | show @@sql | Report SQL list |
- | show @@sql.high | Report Hight Frequency SQL |
- | show @@sql.slow | Report slow SQL |
- | show @@sql.resultset | Report BIG RESULTSET SQL |
- | show @@sql.sum | Report User RW Stat |
- | show @@sql.sum.user | Report User RW Stat |
- | show @@sql.sum.table | Report Table RW Stat |
- | show @@parser | Report parser status |
- | show @@router | Report router status |
- | show @@heartbeat | Report heartbeat status |
- | show @@heartbeat.detail where name=? | Report heartbeat current detail |
- | show @@slow where schema = ? | Report schema slow sql |
- | show @@slow where datanode = ? | Report datanode slow sql |
- | show @@sysparam | Report system param |
- | show @@syslog limit=? | Report system mycat.log |
- | show @@white | show mycat white host |
- | show @@white.set=?,? | set mycat white host,[ip,user] |
- | show @@directmemory=1 or 2 | show mycat direct memory usage |
- | switch @@datasource name:index | Switch dataSource |
- | kill @@connection id1,id2,... | Kill the specified connections |
- | stop @@heartbeat name:time | Pause dataNode heartbeat |
- | reload @@config | Reload basic config from file |
- | reload @@config_all | Reload all config from file |
- | reload @@route | Reload route config from file |
- | reload @@user | Reload user config from file |
- | reload @@sqlslow= | Set Slow SQL Time(ms) |
- | reload @@user_stat | Reset show @@sql @@sql.sum @@sql.slow |
- | rollback @@config | Rollback all config from memory |
- | rollback @@route | Rollback route config from memory |
- | rollback @@user | Rollback user config from memory |
- | reload @@sqlstat=open | Open real-time sql stat analyzer |
- | reload @@sqlstat=close | Close real-time sql stat analyzer |
- | offline | Change MyCat status to OFF |
- | online | Change MyCat status to ON |
- | clear @@slow where schema = ? | Clear slow sql by schema |
- | clear @@slow where datanode = ? | Clear slow sql by datanode |
- +------------------------------------------+--------------------------------------------+
- 58 rows in set (0.00 sec)
-
- mysql> show @@heartbeat;
- +--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
- | NAME | TYPE | HOST | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME | STOP |
- +--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
- | hostM1 | mysql | 192.168.17.108 | 3306 | 1 | 0 | idle | 0 | 1,1,1 | 2023-09-14 11:23:42 | false |
- | hostS2 | mysql | 192.168.17.112 | 3306 | 1 | 0 | idle | 0 | 1,0,0 | 2023-09-14 11:23:42 | false |
- +--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
- 2 rows in set (0.01 sec)
-
业务代码配置:
使用数据库中间件服务器实现读写分离和后端真实数据库的管理。对于前端业务来说,数据操作需要连接的是数据库中间件服务器,操作连接的是数据库中间件服务器,而不直接连接多实例的真实服务器。
修改项目数据库文件:
vim /usr/local/nginx/html/tp5shop/application/database.php
- return [
- // 数据库类型
- 'type' => 'mysql',
- // 服务器地址
- // 1、连接mycat数据库中间件服务器
- 'hostname' => '192.168.17.106',
- // 2、mycat对外映射的数据库名称
- // 数据库名
- 'database' => 'TESTDB',
- // 3、mycat对外映射的用户
- // 用户名
- 'username' => 'root',
- // 4、mycat对外映射的密码和端口
- // 密码
- 'password' => '123456',
- // 端口
- 'hostport' => '8066',
- // 连接dsn
- 'dsn' => '',
- // 数据库连接参数
- 'params' => [],
- // 数据库编码默认采用utf8
- 'charset' => 'utf8',
- // 数据库表前缀
- 'prefix' => 'tpshop_',
- // 数据库调试模式
- 'debug' => true,
- // 5、使用数据库中间件,对于前端业务服务器来说,属于使用集中式单一服务器 配置为0
- // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
- 'deploy' => 0,
- // 6、集中式单一服务器 不在业务代码进行读写分离,交由数据库中间件去做 配置为false
- // 数据库读写是否分离 主从式有效
- 'rw_separate' => false,
- // 读写分离后 主服务器数量
- 'master_num' => 1,
- // 指定从服务器序号
- 'slave_no' => '',
- // 是否严格检查字段是否存在