框架配置实现读写分离:
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
select user()
然后再运行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' => '',
// 是否严格检查字段是否存在