• 企业架构LNMP学习笔记40


    框架配置实现读写分离:

    1)修改项目配置文件

    1. return [
    2. // 数据库类型
    3. 'type' => 'mysql',
    4. // 服务器地址
    5. // 1、主从数据库的连接地址 主在前 从在后
    6. 'hostname' => '192.168.17.100,192.168.17.105',
    7. // 2、主从数据库的名称、用户、密码一样的话,只配置一份即可。如果不一样,按照先后顺序,逗号分隔
    8. // 数据库名
    9. 'database' => 'tp5shop',
    10. // 用户名
    11. 'username' => 'tp5shop',
    12. // 密码
    13. 'password' => '$Abc3721',
    14. // 端口
    15. 'hostport' => '3306',
    16. // 连接dsn
    17. 'dsn' => '',
    18. // 数据库连接参数
    19. 'params' => [],
    20. // 数据库编码默认采用utf8
    21. 'charset' => 'utf8',
    22. // 数据库表前缀
    23. 'prefix' => 'tpshop_',
    24. // 数据库调试模式
    25. 'debug' => true,
    26. // 3、项目框架的业务代码实现读写分离,使用的是分布式(主从服务器) 配置为1
    27. // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    28. 'deploy' => 1,
    29. // 4、数据库读写分离是业务代码实现的,配置为true
    30. // 数据库读写是否分离 主从式有效
    31. 'rw_separate' => true,
    32. // 读写分离后 主服务器数量
    33. 'master_num' => 1,
    34. // 指定从服务器序号
    35. 'slave_no' => '',
    36. // 是否严格检查字段是否存在

    可以问软件开发工程师,看主从复制是怎么配置处理的。

    测试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目录下。

    1. shell > tar xvf jdk-8u192-linux-x64.tar.gz
    2. shell > mv jdk1.8.0_192 /usr/local/java
    3. 配置环境变量:
    4. #追加环境变量
    5. shell > echo "PATH=/usr/local/java/bin:$PATH" >> /etc/profile
    6. shell > source /etc/profile
    7. #检测java环境变量 如果看到版本信息即为成功
    8. 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
    1. [root@server07 bin]# nohup ./mycat console &
    2. [1] 15897
    3. [root@server07 bin]# nohup: ignoring input and appending output to ‘nohup.out’

    注意:如果启动不成功,可能是由于没有解析主机名称,需要在hosts文件中进行解析。

    域名解析暂时失败。

    配置读写分离:

    读写分离的配置文件:

     Mycat是由java开发,java开发的软件大部分配置文件是xml格式。注意它的基本格式。

    1. xml格式注意点:
    2. 1、xml声明信息
    3. 2、具有一个根标签
    4. 3、双标签和单标签格式
    5. 4、注意闭合标签
    6. 5、注释格式为

    查看server.xml:

    默认server.xml可以不用修改。

    1. /usr/local/mycat/conf
    2. 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

    1. [root@server07 conf]# cat schema.xml
    2. "1.0"?>
    3. "schema.dtd">
    4. "http://io.mycat/">
    5. "TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    6. "dn1" dataHost="localhost1" database="tp5shop" />
    7. "localhost1" maxCon="1000" minCon="10" balance="0"
    8. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    9. select user()
    10. "hostM1" url="192.168.17.108:3306" user="tp5shop" password="$Abc3721">
    11. "hostS2" url="192.168.17.112:3306" user="tp5shop" password="$Abc3721" />

     然后再运行mycat进行下测试:

    启动mycat服务器:

    1. /usr/local/mycat/bin/mycat start
    2. netstat -atunlp |grep 8066 
    1. [root@server07 bin]# ./mycat start
    2. Starting Mycat-server...
    3. [root@server07 bin]# ps aux |grep mycat
    4. 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
    5. 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
    6. root 1530 0.0 0.0 112812 972 pts/0 S+ 10:50 0:00 grep --color=auto mycat
    1. [root@server07 bin]# netstat -atunlp |egrep "8066|9066"
    2. tcp6 0 0 :::9066 :::* LISTEN 1492/java
    3. 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

    执行管理命令查看:

    1. mysql > show @@help; //查看管理监控端的所有帮助命令
    2. mysql > show @@heartbeat; //查看服务器状态

    show @@help

    show @@heartbeat 

    1. mysql> show @@help;
    2. +------------------------------------------+--------------------------------------------+
    3. | STATEMENT | DESCRIPTION |
    4. +------------------------------------------+--------------------------------------------+
    5. | show @@time.current | Report current timestamp |
    6. | show @@time.startup | Report startup timestamp |
    7. | show @@version | Report Mycat Server version |
    8. | show @@server | Report server status |
    9. | show @@threadpool | Report threadPool status |
    10. | show @@database | Report databases |
    11. | show @@datanode | Report dataNodes |
    12. | show @@datanode where schema = ? | Report dataNodes |
    13. | show @@datasource | Report dataSources |
    14. | show @@datasource where dataNode = ? | Report dataSources |
    15. | show @@datasource.synstatus | Report datasource data synchronous |
    16. | show @@datasource.syndetail where name=? | Report datasource data synchronous detail |
    17. | show @@datasource.cluster | Report datasource galary cluster variables |
    18. | show @@processor | Report processor status |
    19. | show @@command | Report commands status |
    20. | show @@connection | Report connection status |
    21. | show @@cache | Report system cache usage |
    22. | show @@backend | Report backend connection status |
    23. | show @@session | Report front session details |
    24. | show @@connection.sql | Report connection sql |
    25. | show @@sql.execute | Report execute status |
    26. | show @@sql.detail where id = ? | Report execute detail status |
    27. | show @@sql | Report SQL list |
    28. | show @@sql.high | Report Hight Frequency SQL |
    29. | show @@sql.slow | Report slow SQL |
    30. | show @@sql.resultset | Report BIG RESULTSET SQL |
    31. | show @@sql.sum | Report User RW Stat |
    32. | show @@sql.sum.user | Report User RW Stat |
    33. | show @@sql.sum.table | Report Table RW Stat |
    34. | show @@parser | Report parser status |
    35. | show @@router | Report router status |
    36. | show @@heartbeat | Report heartbeat status |
    37. | show @@heartbeat.detail where name=? | Report heartbeat current detail |
    38. | show @@slow where schema = ? | Report schema slow sql |
    39. | show @@slow where datanode = ? | Report datanode slow sql |
    40. | show @@sysparam | Report system param |
    41. | show @@syslog limit=? | Report system mycat.log |
    42. | show @@white | show mycat white host |
    43. | show @@white.set=?,? | set mycat white host,[ip,user] |
    44. | show @@directmemory=1 or 2 | show mycat direct memory usage |
    45. | switch @@datasource name:index | Switch dataSource |
    46. | kill @@connection id1,id2,... | Kill the specified connections |
    47. | stop @@heartbeat name:time | Pause dataNode heartbeat |
    48. | reload @@config | Reload basic config from file |
    49. | reload @@config_all | Reload all config from file |
    50. | reload @@route | Reload route config from file |
    51. | reload @@user | Reload user config from file |
    52. | reload @@sqlslow= | Set Slow SQL Time(ms) |
    53. | reload @@user_stat | Reset show @@sql @@sql.sum @@sql.slow |
    54. | rollback @@config | Rollback all config from memory |
    55. | rollback @@route | Rollback route config from memory |
    56. | rollback @@user | Rollback user config from memory |
    57. | reload @@sqlstat=open | Open real-time sql stat analyzer |
    58. | reload @@sqlstat=close | Close real-time sql stat analyzer |
    59. | offline | Change MyCat status to OFF |
    60. | online | Change MyCat status to ON |
    61. | clear @@slow where schema = ? | Clear slow sql by schema |
    62. | clear @@slow where datanode = ? | Clear slow sql by datanode |
    63. +------------------------------------------+--------------------------------------------+
    64. 58 rows in set (0.00 sec)
    65. mysql> show @@heartbeat;
    66. +--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
    67. | NAME | TYPE | HOST | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME | STOP |
    68. +--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
    69. | hostM1 | mysql | 192.168.17.108 | 3306 | 1 | 0 | idle | 0 | 1,1,1 | 2023-09-14 11:23:42 | false |
    70. | hostS2 | mysql | 192.168.17.112 | 3306 | 1 | 0 | idle | 0 | 1,0,0 | 2023-09-14 11:23:42 | false |
    71. +--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
    72. 2 rows in set (0.01 sec)

    业务代码配置:

    使用数据库中间件服务器实现读写分离和后端真实数据库的管理。对于前端业务来说,数据操作需要连接的是数据库中间件服务器,操作连接的是数据库中间件服务器,而不直接连接多实例的真实服务器。

    修改项目数据库文件:

    vim /usr/local/nginx/html/tp5shop/application/database.php
    1. return [
    2. // 数据库类型
    3. 'type' => 'mysql',
    4. // 服务器地址
    5. // 1、连接mycat数据库中间件服务器
    6. 'hostname' => '192.168.17.106',
    7. // 2、mycat对外映射的数据库名称
    8. // 数据库名
    9. 'database' => 'TESTDB',
    10. // 3、mycat对外映射的用户
    11. // 用户名
    12. 'username' => 'root',
    13. // 4、mycat对外映射的密码和端口
    14. // 密码
    15. 'password' => '123456',
    16. // 端口
    17. 'hostport' => '8066',
    18. // 连接dsn
    19. 'dsn' => '',
    20. // 数据库连接参数
    21. 'params' => [],
    22. // 数据库编码默认采用utf8
    23. 'charset' => 'utf8',
    24. // 数据库表前缀
    25. 'prefix' => 'tpshop_',
    26. // 数据库调试模式
    27. 'debug' => true,
    28. // 5、使用数据库中间件,对于前端业务服务器来说,属于使用集中式单一服务器 配置为0
    29. // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    30. 'deploy' => 0,
    31. // 6、集中式单一服务器 不在业务代码进行读写分离,交由数据库中间件去做 配置为false
    32. // 数据库读写是否分离 主从式有效
    33. 'rw_separate' => false,
    34. // 读写分离后 主服务器数量
    35. 'master_num' => 1,
    36. // 指定从服务器序号
    37. 'slave_no' => '',
    38. // 是否严格检查字段是否存在

  • 相关阅读:
    【Java高级】一篇文章带你搞懂线程
    【web前端期末大作业】html网上在线书城大学生静态网页 大学生html当当书城仿站 网上书城购物网页作业HTML
    如何在spark中使用scikit-learn和tensorflow等第三方python包
    从零开始在window10系统下mysql5.7安装审计插件(亲测绝对可用)
    使用go开发的小tips
    MES系统究竟有何独特之处?
    qt中怎么在鼠标停留的位置上显示该点的坐标位置
    APScheduler包——python tornado框架中实现定时任务
    安卓APP源码和设计报告——麻雀笔记
    Cloud Keys Delphi Edition安全地存储
  • 原文地址:https://blog.csdn.net/chang_chunhua/article/details/132847304