当前位置:Gxlcms > 数据库问题 > Mysql高可用集群-解决MMM单点故障

Mysql高可用集群-解决MMM单点故障

时间:2021-07-01 10:21:17 帮助过:1人阅读

目录

  • 一.理论概述
    • 组件介绍
  • 三.部署
  • 四.测试
  • 五.总结

preface:

MMM架构相比于MHA来说各方面都逊色不少,写这篇案例也算是整理下思路吧.

一.理论概述

MMM(Master-Master replication Manager for MySQL)
是一套支持双主日常管理的脚本程序,使用Perl语言开发,主要用来监控和管理MySQL双主库复制,同一时刻只允许一个主库进行写入

方便的是,mmm不但可以为写库配置VIP,而且实现读库VIP,也可以节省一些构建读负载均衡及高可用的资源

实现的功能简单来说就是实现了主库的故障切换功能,同时也可以实现多个slave读操作的负载均衡

不适用的场景:对数据一致性要求很高不适用

组件介绍

  1. mmm-mond程序:监控进程,负责所有的监控工作,在管理服务器上运行
  2. mmm_agentd:运行在每个集群mysql节点上的,完成监控的探针工作和执行简单的远端服务设置
  3. mmm_control:一个简单的管理脚本,用来查看和管理集群运行状态,同时管理mmm_mond进程。

    二.环境

  • 架构拓扑,本案例只针对于数据库集群示范
    技术图片
主机名称 IP地址 角色
master 192.168.111.3 主库,负责写
masterba 192.168.111.4 备用主库,主主同步
slave1 192.168.111.5 从库,读操作
slave2 192.168.111.6 从库,读操作;mmm-monitor
writeVIP 192.168.111.100
readVIP 192.168.111.200

实现思路:先部署主主高可用,安装mmm相关组件

三.部署

  • 所有主机安装epel源
  1. <code>下载地址
  2. https://mirrors.tuna.tsinghua.edu.cn/epel//
  3. 然后选择相应的版本下载并安装
  4. yum clean all && yum makecache </code>
  • 基本环境
  1. <code>[root@localhost ~]# vim /etc/hosts
  2. 192.168.111.3 master
  3. 192.168.111.4 masterba
  4. 192.168.111.5 slave1
  5. 192.168.111.6 slave2
  6. [root@localhost ~]# hostname master
  7. [root@localhost ~]# bash
  8. [root@master ~]# bash
  9. [root@master ~]# uname -n
  10. master
  11. #全部修改为对应的</code>
  • 部署二进制包mysql5.7.24
  1. <code>yum -y install libaio
  2. wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
  3. useradd -M -s /sbin/nologin mysql
  4. tar zxf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
  5. mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql
  6. chown -R mysql:mysql /usr/local/mysql
  7. ln -s /usr/local/mysql/bin/* /usr/local/bin/
  8. cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
  9. mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
  10. #记住生成的随机密码待会启动服务之后修改
  11. vim /etc/my.cnf
  12. --------------------111.3--------------------------
  13. [mysqld]
  14. datadir=/usr/local/mysql/data
  15. socket=/tmp/mysql.sock
  16. symbolic-links=0
  17. server-id=1
  18. log-bin=mysql-bin
  19. log_slave_updates=1
  20. #将另一台备主同步数据给自身时,写入到binarylog
  21. auto-increment-increment=2
  22. auto-increment-offset=1
  23. #auto_increment_increment:自增值
  24. #auto_increment_offset:漂移值,也就是步长
  25. [mysqld_safe]
  26. log-error=/usr/local/mysql/data/mysql.log
  27. pid-file=/usr/local/mysql/data/mysql.pid
  28. !includedir /etc/my.cnf.d
  29. --------------------111.4--------------------------
  30. [mysqld]
  31. datadir=/usr/local/mysql/data
  32. socket=/tmp/mysql.sock
  33. symbolic-links=0
  34. server-id=2
  35. log-bin=mysql-bin
  36. log_slave_updates=1
  37. #将另一台备主同步数据给自身时,写入到binarylog
  38. auto-increment-increment=2
  39. auto-increment-offset=2
  40. #auto_increment_increment:自增值
  41. #auto_increment_offset:漂移值,也就是步长
  42. [mysqld_safe]
  43. log-error=/usr/local/mysql/data/mysql.log
  44. pid-file=/usr/local/mysql/data/mysql.pid
  45. !includedir /etc/my.cnf.d
  46. --------------------111.5--------------------------
  47. [mysqld]
  48. datadir=/usr/local/mysql/data
  49. socket=/tmp/mysql.sock
  50. symbolic-links=0
  51. server-id=3
  52. log-bin=mysql-bin
  53. log_slave_updates=1
  54. [mysqld_safe]
  55. log-error=/usr/local/mysql/data/mysql.log
  56. pid-file=/usr/local/mysql/data/mysql.pid
  57. !includedir /etc/my.cnf.d
  58. --------------------111.6--------------------------
  59. [mysqld]
  60. datadir=/usr/local/mysql/data
  61. socket=/tmp/mysql.sock
  62. symbolic-links=0
  63. server-id=4
  64. log_slave_updates=1
  65. log-bin=mysql-bin
  66. [mysqld_safe]
  67. log-error=/usr/local/mysql/data/mysql.log
  68. pid-file=/usr/local/mysql/data/mysql.pid
  69. !includedir /etc/my.cnf.d
  70. [root@masterba ~]# /etc/init.d/mysqld start
  71. [root@master ~]# mysqladmin -u root -p'BZn9B++V06qg' password '123456'
  72. mysqladmin: [Warning] Using a password on the command line interface can be insecure.
  73. Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
  74. #修改默认密码</code>
  • 部署主主同步
  1. <code>--master:
  2. [root@master ~]# mysql -u root -p123456
  3. mysql> grant replication slave on *.* to 'myslave'@'192.168.111.%' identified by'123456';
  4. Query OK, 0 rows affected, 1 warning (0.00 sec)
  5. mysql> flush privileges;
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql> show master status;
  8. +------------------+----------+--------------+------------------+-------------------+
  9. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  10. +------------------+----------+--------------+------------------+-------------------+
  11. | mysql-bin.000002 | 879 | | | |
  12. +------------------+----------+--------------+------------------+-------------------+
  13. 1 row in set (0.00 sec)
  14. --masterba:
  15. [root@masterba ~]# mysql -uroot -p123456
  16. mysql> grant replication slave on *.* to 'myslave'@'192.168.111.%' identified by'123456';
  17. Query OK, 0 rows affected, 1 warning (0.00 sec)
  18. mysql> flush privileges;
  19. Query OK, 0 rows affected (0.01 sec)
  20. mysql> show master status;
  21. +------------------+----------+--------------+------------------+-------------------+
  22. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  23. +------------------+----------+--------------+------------------+-------------------+
  24. | mysql-bin.000002 | 879 | | | |
  25. +------------------+----------+--------------+------------------+-------------------+
  26. 1 row in set (0.00 sec)
  27. --master:
  28. mysql> change master to master_host='192.168.111.4',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=879;
  29. Query OK, 0 rows affected, 2 warnings (0.11 sec)
  30. mysql> start slave;
  31. Query OK, 0 rows affected (0.00 sec)
  32. mysql> show slave status\G;
  33. *************************** 1. row ***************************
  34. Slave_IO_State: Waiting for master to send event
  35. Master_Host: 192.168.111.4
  36. Master_User: myslave
  37. Master_Port: 3306
  38. Connect_Retry: 60
  39. Master_Log_File: mysql-bin.000002
  40. Read_Master_Log_Pos: 879
  41. Relay_Log_File: master-relay-bin.000002
  42. Relay_Log_Pos: 320
  43. Relay_Master_Log_File: mysql-bin.000002
  44. Slave_IO_Running: Yes
  45. Slave_SQL_Running: Yes
  46. Replicate_Do_DB:
  47. Replicate_Ignore_DB:
  48. Replicate_Do_Table:
  49. Replicate_Ignore_Table:
  50. Replicate_Wild_Do_Table:
  51. Replicate_Wild_Ignore_Table:
  52. Last_Errno: 0
  53. Last_Error:
  54. Skip_Counter: 0
  55. Exec_Master_Log_Pos: 879
  56. Relay_Log_Space: 528
  57. Until_Condition: None
  58. Until_Log_File:
  59. Until_Log_Pos: 0
  60. Master_SSL_Allowed: No
  61. Master_SSL_CA_File:
  62. Master_SSL_CA_Path:
  63. Master_SSL_Cert:
  64. Master_SSL_Cipher:
  65. Master_SSL_Key:
  66. Seconds_Behind_Master: 0
  67. Master_SSL_Verify_Server_Cert: No
  68. Last_IO_Errno: 0
  69. Last_IO_Error:
  70. Last_SQL_Errno: 0
  71. Last_SQL_Error:
  72. Replicate_Ignore_Server_Ids:
  73. Master_Server_Id: 2
  74. Master_UUID: 01008194-68b1-11e9-bf0b-000c294b0234
  75. Master_Info_File: /usr/local/mysql/data/master.info
  76. SQL_Delay: 0
  77. SQL_Remaining_Delay: NULL
  78. Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  79. Master_Retry_Count: 86400
  80. Master_Bind:
  81. Last_IO_Error_Timestamp:
  82. Last_SQL_Error_Timestamp:
  83. Master_SSL_Crl:
  84. Master_SSL_Crlpath:
  85. Retrieved_Gtid_Set:
  86. Executed_Gtid_Set:
  87. Auto_Position: 0
  88. Replicate_Rewrite_DB:
  89. Channel_Name:
  90. Master_TLS_Version:
  91. 1 row in set (0.00 sec)
  92. --masterba:
  93. mysql> change master to master_host='192.168.111.3',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=879;
  94. Query OK, 0 rows affected, 2 warnings (0.01 sec)
  95. mysql> start slave;
  96. Query OK, 0 rows affected (0.00 sec)
  97. mysql> show slave status\G;
  98. *************************** 1. row ***************************
  99. Slave_IO_State: Waiting for master to send event
  100. Master_Host: 192.168.111.3
  101. Master_User: myslave
  102. Master_Port: 3306
  103. Connect_Retry: 60
  104. Master_Log_File: mysql-bin.000002
  105. Read_Master_Log_Pos: 1036
  106. Relay_Log_File: masterba-relay-bin.000002
  107. Relay_Log_Pos: 477
  108. Relay_Master_Log_File: mysql-bin.000002
  109. Slave_IO_Running: Yes
  110. Slave_SQL_Running: Yes
  111. Replicate_Do_DB:
  112. Replicate_Ignore_DB:
  113. Replicate_Do_Table:
  114. Replicate_Ignore_Table:
  115. Replicate_Wild_Do_Table:
  116. Replicate_Wild_Ignore_Table:
  117. Last_Errno: 0
  118. Last_Error:
  119. Skip_Counter: 0
  120. Exec_Master_Log_Pos: 1036
  121. Relay_Log_Space: 687
  122. Until_Condition: None
  123. Until_Log_File:
  124. Until_Log_Pos: 0
  125. Master_SSL_Allowed: No
  126. Master_SSL_CA_File:
  127. Master_SSL_CA_Path:
  128. Master_SSL_Cert:
  129. Master_SSL_Cipher:
  130. Master_SSL_Key:
  131. Seconds_Behind_Master: 0
  132. Master_SSL_Verify_Server_Cert: No
  133. Last_IO_Errno: 0
  134. Last_IO_Error:
  135. Last_SQL_Errno: 0
  136. Last_SQL_Error:
  137. Replicate_Ignore_Server_Ids:
  138. Master_Server_Id: 1
  139. Master_UUID: e13f8b12-7bda-11e9-b71b-000c2935c4a6
  140. Master_Info_File: /usr/local/mysql/data/master.info
  141. SQL_Delay: 0
  142. SQL_Remaining_Delay: NULL
  143. Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  144. Master_Retry_Count: 86400
  145. Master_Bind:
  146. Last_IO_Error_Timestamp:
  147. Last_SQL_Error_Timestamp:
  148. Master_SSL_Crl:
  149. Master_SSL_Crlpath:
  150. Retrieved_Gtid_Set:
  151. Executed_Gtid_Set:
  152. Auto_Position: 0
  153. Replicate_Rewrite_DB:
  154. Channel_Name:
  155. Master_TLS_Version:
  156. 1 row in set (0.00 sec)
  157. slave1:
  158. mysql> change master to master_host='192.168.111.4',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=879;
  159. Query OK, 0 rows affected, 2 warnings (0.02 sec)
  160. mysql> start slave;
  161. Query OK, 0 rows affected (0.00 sec)
  162. #slave2一样操作,一同指向masterba
  163. </code>
  • 部署mmm
  1. <code>我们在主库上做授权,由于现在是同步状态,所以授权信息其它数据库也会存在
  2. mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.111.%' identified by '123456';
  3. Query OK, 0 rows affected, 1 warning (0.11 sec)
  4. #监控用户
  5. mysql> grant super,replication client,process on *.* to 'mmm_agent'@'192.168.111.%' identified by '123456';
  6. Query OK, 0 rows affected, 1 warning (0.01 sec)
  7. #agent用户
  8. mysql> grant replication slave on *.* to 'myslave'@'192.168.111.%' identified by '123456';
  9. Query OK, 0 rows affected, 1 warning (0.00 sec)
  10. #复制用户
  11. mysql> flush privileges;
  12. Query OK, 0 rows affected (0.00 sec)
  13. [root@slave2 ~]# vim /etc/mysql-mmm/mmm_common.conf
  14. #该文件所有节点配置都相同
  15. active_master_role writer
  16. <host default>
  17. cluster_interface ens32
  18. pid_path /run/mysql-mmm-agent.pid
  19. bin_path /usr/libexec/mysql-mmm/
  20. replication_user myslave
  21. replication_password 123456
  22. agent_user mmm_agent
  23. agent_password 123456
  24. #刚才所授权用户的账号及密码
  25. </host>
  26. <host db1>
  27. ip 192.168.111.3
  28. mode master
  29. peer db2
  30. </host>
  31. <host db2>
  32. ip 192.168.111.4
  33. mode master
  34. peer db1
  35. </host>
  36. <host db3>
  37. ip 192.168.111.5
  38. mode slave
  39. </host>
  40. <host db4>
  41. ip 192.168.111.6
  42. mode slave
  43. </host>
  44. #每个host是一个节点,按照文件格式配置
  45. <role writer>
  46. hosts db1, db2
  47. ips 192.168.111.100
  48. #写操作服务器的VIP
  49. mode exclusive
  50. #模式:同意时间只有一个节点可以使用资源
  51. </role>
  52. <role reader>
  53. hosts db3, db4
  54. ips 192.168.111.200
  55. #读操作服务器的VIP,可以有多个,逗号分隔
  56. mode balanced
  57. #负载均衡模式
  58. </role>
  59. [root@slave2 ~]# scp /etc/mysql-mmm/mmm_common.conf root@master:/etc/mysql-mmm/
  60. [root@slave2 ~]# scp /etc/mysql-mmm/mmm_common.conf root@masterba:/etc/mysql-mmm/
  61. [root@slave2 ~]# scp /etc/mysql-mmm/mmm_common.conf root@slave1:/etc/mysql-mmm/
  62. 在db1-4上修改mmm_agent.conf,只需要修改db1这里,是哪台就改成哪台,这里只给出db1的
  63. [root@master ~]# vim /etc/mysql-mmm/mmm_agent.conf
  64. include mmm_common.conf
  65. # The 'this' variable refers to this server. Proper operation requires
  66. # that 'this' server (db1 by default), as well as all other servers, have the
  67. # proper IP addresses set in mmm_common.conf.
  68. this db1
  69. 配置监控工作的服务器
  70. [root@slave2 ~]# vim /etc/mysql-mmm/mmm_mon.conf
  71. 8 ping_ips 192.168.111.2
  72. #测试网络可用性的IP地址,一般指定网关
  73. 9 auto_set_online 60
  74. #是否设置自动上线,如果该值大于0,抖动的主机在抖动的时间范围过后,则设置自动上线
  75. 20 monitor_user mmm_monitor
  76. 21 monitor_password 123456
  77. #监控的用户和密码
  78. 全部节点启动agent
  79. [root@master ~]# systemctl start mysql-mmm-agent.service
  80. [root@master ~]# systemctl status mysql-mmm-agent.service
  81. 监控机器启动monitor
  82. [root@slave2 ~]# systemctl start mysql-mmm-monitor.service
  83. [root@slave2 ~]# systemctl status mysql-mmm-monitor.service
  84. #检查集群状态,要全部是ONLINE才正确
  85. [root@slave2 ~]# mmm_control show
  86. db1(192.168.111.3) master/ONLINE. Roles: writer(192.168.111.100)
  87. db2(192.168.111.4) master/ONLINE. Roles:
  88. db3(192.168.111.5) slave/ONLINE. Roles: reader(192.168.111.200)
  89. db4(192.168.111.6) slave/ONLINE. Roles: </code>

四.测试

  • 查看VIP是否正确分配
  1. <code>写:
  2. [root@master ~]# ip a| grep ens32
  3. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  4. inet 192.168.111.3/24 brd 192.168.111.255 scope global noprefixroute ens32
  5. inet 192.168.111.100/32 scope global ens32
  6. 读:
  7. [root@slave1 ~]# ip a| grep ens32
  8. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  9. inet 192.168.111.5/24 brd 192.168.111.255 scope global noprefixroute ens32
  10. inet 192.168.111.200/32 scope global ens32</code>
  • 测试VIP转移
  1. <code>[root@master ~]# /etc/init.d/mysqld stop
  2. Shutting down MySQL............ SUCCESS!
  3. [root@master ~]# ip a| grep ens32
  4. -----写-----
  5. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  6. inet 192.168.111.3/24 brd 192.168.111.255 scope global noprefixroute ens32
  7. [root@masterba ~]# ip a| grep ens32
  8. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  9. inet 192.168.111.4/24 brd 192.168.111.255 scope global noprefixroute ens32
  10. inet 192.168.111.100/32 scope global ens32
  11. -----读-----
  12. [root@slave1 ~]# /etc/init.d/mysqld stop
  13. Shutting down MySQL.... SUCCESS!
  14. [root@slave1 ~]# ip a| grep ens32
  15. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  16. inet 192.168.111.5/24 brd 192.168.111.255 scope global noprefixroute ens32
  17. inet 192.168.111.200/32 scope global ens32
  18. [root@slave1 ~]# ip a| grep ens32
  19. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  20. inet 192.168.111.5/24 brd 192.168.111.255 scope global noprefixroute ens32
  21. inet 192.168.111.200/32 scope global ens32
  22. [root@slave1 ~]# ip a| grep ens32
  23. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  24. inet 192.168.111.5/24 brd 192.168.111.255 scope global noprefixroute ens32
  25. inet 192.168.111.200/32 scope global ens32
  26. [root@slave1 ~]# ip a| grep ens32
  27. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  28. inet 192.168.111.5/24 brd 192.168.111.255 scope global noprefixroute ens32
  29. [root@slave2 ~]# ip a| grep ens32
  30. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  31. inet 192.168.111.6/24 brd 192.168.111.255 scope global noprefixroute ens32
  32. inet 192.168.111.200/32 scope global ens32
  33. #切换的慢
  34. [root@slave2 ~]# mmm_control show
  35. db1(192.168.111.3) master/HARD_OFFLINE. Roles:
  36. db2(192.168.111.4) master/ONLINE. Roles: writer(192.168.111.100)
  37. db3(192.168.111.5) slave/HARD_OFFLINE. Roles:
  38. db4(192.168.111.6) slave/ONLINE. Roles: reader(192.168.111.200)
  39. #离线的已经指明了</code>
  • 修复好的数据库服务器重新加入集群的方法
  1. <code>[root@master ~]# /etc/init.d/mysqld start
  2. #登上两三分钟最多,比较慢,在monitor上查看状态
  3. [root@slave2 ~]# mmm_control show
  4. db1(192.168.111.3) master/ONLINE. Roles:
  5. db2(192.168.111.4) master/ONLINE. Roles: writer(192.168.111.100)
  6. db3(192.168.111.5) slave/HARD_OFFLINE. Roles:
  7. db4(192.168.111.6) slave/ONLINE. Roles: reader(192.168.111.200)</code>
  • 连接数据库VIP测试
  1. <code>mysql> grant all privileges on *.* to root@'192.168.111.%' identified by '123456';
  2. Query OK, 0 rows affected, 1 warning (0.01 sec)
  3. mysql> flush privileges;
  4. Query OK, 0 rows affected (0.10 sec)
  5. #主库上做下授权,从库也会同步授权信息
  6. [root@slave2 ~]# mysql -uroot -p123456 -h'192.168.111.100'
  7. mysql: [Warning] Using a password on the command line interface can be insecure.
  8. Welcome to the MySQL monitor. Commands end with ; or \g.
  9. Your MySQL connection id is 415
  10. Server version: 5.7.24-log MySQL Community Server (GPL)
  11. Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
  12. Oracle is a registered trademark of Oracle Corporation and/or its
  13. affiliates. Other names may be trademarks of their respective
  14. owners.
  15. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  16. mysql>
  17. [root@slave2 ~]# mysql -uroot -p123456 -h'192.168.111.200'
  18. mysql: [Warning] Using a password on the command line interface can be insecure.
  19. Welcome to the MySQL monitor. Commands end with ; or \g.
  20. Your MySQL connection id is 1043
  21. Server version: 5.7.24-log MySQL Community Server (GPL)
  22. Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
  23. Oracle is a registered trademark of Oracle Corporation and/or its
  24. affiliates. Other names may be trademarks of their respective
  25. owners.
  26. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  27. mysql>
  28. #输入的必须都是VIP进行连接</code>

五.总结

  1. 明显的切换速度太慢,案例环境还是没有多少数据的,以及系统环境也不是很复杂,生产环境慎用吧
  2. 可以做写的高可用,也可以用来负载均衡读的服务器
  3. 持之以恒

Mysql高可用集群-解决MMM单点故障

标签:out   pac   选择   多个   有一个   介绍   etc   ddr   emctl   

人气教程排行