3M 高可用架构----拓展
3M 高可用架构
一、MMM
1. MMM的概述
MMM(Master-Master replication manager for MySQL,MySQL主主复制管理器)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要从来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具也可以实现多个Slave的read负载均衡。
2. MMM的应用场景
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全保证数据的一致性,所以MMM适用于对数据的一致性要求不是很高的,但是又想最大程度地保证业务可用性的场景。对于那些对数据的一致性要求很高的业务,非常不建议采用MMM这种高可用架构。
3. MMM的特点
● MMM是一套灵活的脚本程序
● 基于perl语言实现
● 用来对mysql replication进行监控和故障迁移
● 管理MySQL Master-Master复制的配置
4. 关于MMM高可用架构的说明

● mmm_mon:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监管机上运行。
● mmm_agent:运行在每个MySQL服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。
● mmm_control:一个简单的脚本,提供管理mmm_mond进程的命令。
● mysql-mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用MySQL之上,当某一台MySQL宕机时,监管会将VIP迁移至其他MySQL。
5. 用户及授权
在整个监管过程中,需要在MySQL中添加相关授权yoghurt,以便让MySQL可以支持监理机的维护。授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用MMM的备份工具则还需要添加一个mmm_tools用户。
二、案例环境
1. 服务器配置
| 服务器 | 主机名 | 操作系统 | IP地址 | 主要软件 |
|---|---|---|---|---|
| Master1服务器 | master1 | CentOS 7.4 | 192.168.122.10 | MySQL 5.7、MySQL-MMM |
| Master2服务器 | master2 | CentOS 7.4 | 192.168.122.11 | MySQL 5.7、MySQL-MMM |
| Slave1服务器 | slave1 | CentOS 7.4 | 192.168.122.100 | MySQL 5.7、MySQL-MMM |
| Slave2服务器 | slave2 | CentOS 7.4 | 192.168.122.101 | MySQL 5.7、MySQL-MMM |
| Monitor服务器 | monitor | CentOS 7.4 | 192.168.122.12 | MySQL-MMM |
2. 服务器环境
| systemctl stop firewalld | |
| systemctl disable firewalld | |
| setenforce 0 |
3. 修改主机名称
Master1服务器(192.168.122.10)
[root@localhost ~]# hostnamectl set-hostname master1
Master2服务器(192.168.122.11)
[root@localhost ~]# hostnamectl set-hostname master2
Slave1服务器(192.168.122.100)
[root@localhost ~]# hostnamectl set-hostname slave1
Slave2服务器(192.168.122.101)
[root@localhost ~]# hostnamectl set-hostname slave2
Monitor服务器(192.168.122.12)
[root@localhost ~]# hostnamectl set-hostname monitor
三、案例实施
1. 搭建MySQL多主多从架构
1.1 master1、master2、slave1、slave2节点上安装mysql5.7
刷下列脚本,过程忽略
| #!/bin/bash | |
| systemctl stop firewalld | |
| systemctl disable firewalld | |
| setenforce 0 | |
| #--------mysql-------- | |
| #安装依赖包 | |
| yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake | |
| #配置软件模块 | |
| cd /opt/ | |
| tar zxvf mysql-5.7.17.tar.gz | |
| tar zxvf boost_1_59_0.tar.gz | |
| mv boost_1_59_0 /usr/local/boost | |
| cd /opt/mysql-5.7.17/ | |
| cmake \ | |
| -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ | |
| -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ | |
| -DSYSCONFDIR=/etc \ | |
| -DSYSTEMD_PID_DIR=/usr/local/mysql \ | |
| -DDEFAULT_CHARSET=utf8 \ | |
| -DDEFAULT_COLLATION=utf8_general_ci \ | |
| -DWITH_EXTRA_CHARSETS=all \ | |
| -DWITH_INNOBASE_STORAGE_ENGINE=1 \ | |
| -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ | |
| -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ | |
| -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ | |
| -DMYSQL_DATADIR=/usr/local/mysql/data \ | |
| -DWITH_BOOST=/usr/local/boost \ | |
| -DWITH_SYSTEMD=1 | |
| #编译安装 | |
| make -j 2 && make install | |
| #创建mysql用户 | |
| useradd -M -s /sbin/nologin mysql | |
| #修改mysql 配置文件 | |
| echo '[client] | |
| port = 3306 | |
| default-character-set=utf8 | |
| socket=/usr/local/mysql/mysql.sock | |
| [mysql] | |
| port = 3306 | |
| default-character-set=utf8 | |
| socket = /usr/local/mysql/mysql.sock | |
| auto-rehash | |
| [mysqld] | |
| user = mysql | |
| basedir=/usr/local/mysql | |
| datadir=/usr/local/mysql/data | |
| port = 3306 | |
| character-set-server=utf8 | |
| pid-file = /usr/local/mysql/mysqld.pid | |
| socket=/usr/local/mysql/mysql.sock | |
| bind-address = 0.0.0.0 | |
| skip-name-resolve | |
| max_connections=2048 | |
| default-storage-engine=INNODB | |
| max_allowed_packet=16M | |
| server-id = 1 | |
| sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES' > /etc/my.cnf | |
| #更改mysql安装目录和配置文件的属主属组 | |
| chown -R mysql:mysql /usr/local/mysql/ | |
| chown mysql:mysql /etc/my.cnf | |
| #设置路径环境变量 | |
| echo 'export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile | |
| source /etc/profile | |
| #初始化数据库 | |
| cd /usr/local/mysql/bin/ | |
| ./mysqld \ | |
| --initialize-insecure \ | |
| --user=mysql \ | |
| --basedir=/usr/local/mysql \ | |
| --datadir=/usr/local/mysql/data | |
| #添加mysqld系统服务 | |
| cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ | |
| systemctl daemon-reload | |
| systemctl start mysqld.service | |
| systemctl enable mysqld | |
| yum -y install expect | |
| mima () { | |
| passwd=$1 | |
| /usr/bin/expect <<-EOF | |
| spawn mysqladmin -u root -p password $passwd | |
| expect "Enter password:" | |
| send "\r" | |
| expect eof | |
| EOF | |
| } | |
| mima "123456" | |
| dl () { | |
| /usr/bin/expect <<-EOF | |
| spawn mysql -u root -p | |
| expect "Enter password:" {send "123456\r"} | |
| expect "mysql>" {send "grant all privileges on *.* to 'root'@'%' identified by '123456';\r"} | |
| expect "mysql>" {send "quit\r"} | |
| expect eof | |
| EOF | |
| } | |
| dl |
1.2 修改master1配置文件
Master1服务器(192.168.122.10)
| [root@master1 ~]# vim /etc/my.cnf | |
| ...... | |
| [mysqld] | |
| user = mysql | |
| basedir = /usr/local/mysql | |
| datadir = /usr/local/mysql/data | |
| port = 3306 | |
| character_set_server=utf8 | |
| pid-file = /usr/local/mysql/mysqld.pid | |
| socket = /usr/local/mysql/mysql.sock | |
| server-id = 1 | |
| #每台 Mysql 主机的 server-id 不能相同 | |
| log-error=/usr/local/mysql/data/mysql_error.log | |
| #错误日志 | |
| general_log=ON | |
| #通用查询日志 | |
| general_log_file=/usr/local/mysql/data/mysql_general.log | |
| slow_query_log=ON | |
| #慢查询日志 | |
| slow_query_log_file=mysql_slow_query.log | |
| long_query_time=5 | |
| binlog-ignore-db=mysql,information_schema | |
| #不需要同步的库名 | |
| log_bin=mysql_bin | |
| #开启二进制日志用于主从数据复制 | |
| log_slave_updates=true | |
| #允许slave从master复制数据时可以写入到自己的二进制日志 | |
| sync_binlog=1 | |
| #"双1设置",MySQL 在每写一次二进制日志时都会同步到磁盘中去 | |
| innodb_flush_log_at_trx_commit=1 | |
| #"双1设置",每次事务提交时MySQL都会把缓存的数据写入日志文件,并且刷到磁盘中去 | |
| auto_increment_increment=2 | |
| #自增字段一次递增多少 | |
| auto_increment_offset=1 | |
| #自增字段的起始值 | |
| [root@master1 ~]# systemctl restart mysqld |
1.3 把配置文件复制到其他3台数据库服务器并重启mysql服务器
注意:配置文件中的server-id不可相同,需要修改。
| [root@master1 ~]# scp /etc/my.cnf root@192.168.122.11:/etc/ | |
| [root@master1 ~]# scp /etc/my.cnf root@192.168.122.100:/etc/ | |
| [root@master1 ~]# scp /etc/my.cnf root@192.168.122.101:/etc/ |
1.4 配置主主复制,两台主服务器相互复制
1.4.1 在两台主服务器上都执行授予从的权限,从服务器上不需要执行
Master1服务器(192.168.122.10)
| [root@master1 ~]# mysql -u root -p | |
| Enter password: | |
| mysql> grant replication slave on *.* to 'replication'@'192.168.122.%' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.00 sec) |
Master2服务器(192.168.122.11)
| [root@master2 ~]# mysql -u root -p | |
| Enter password: | |
| mysql> grant replication slave on *.* to 'replication'@'192.168.122.%' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.00 sec) |
1.4.2 在两台主服务器上查看
Master1服务器(192.168.122.10)
| mysql> show master status; | |
| +------------------+----------+--------------+--------------------------+-------------------+ | |
| | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | | |
| +------------------+----------+--------------+--------------------------+-------------------+ | |
| | mysql_bin.000001 | 154 | | mysql,information_schema | | | |
| +------------------+----------+--------------+--------------------------+-------------------+ | |
| 1 row in set (0.00 sec) |
Master2服务器(192.168.122.11)
| mysql> show master status; | |
| +------------------+----------+--------------+--------------------------+-------------------+ | |
| | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | | |
| +------------------+----------+--------------+--------------------------+-------------------+ | |
| | mysql_bin.000001 | 154 | | mysql,information_schema | | | |
| +------------------+----------+--------------+--------------------------+-------------------+ | |
| 1 row in set (0.00 sec) |
1.4.3 在master1上配置同步
Master1服务器(192.168.122.10)
| mysql> change master to | |
| -> master_host='192.168.122.11', | |
| -> master_user='replication', | |
| -> master_password='123456', | |
| -> master_log_file='mysql_bin.000001', | |
| -> master_log_pos=154; | |
| Query OK, 0 rows affected, 2 warnings (0.00 sec) | |
| mysql> start slave; | |
| Query OK, 0 rows affected (0.00 sec) | |
| mysql> show slave status\G | |
| *************************** 1. row *************************** | |
| Slave_IO_State: Waiting for master to send event | |
| Master_Host: 192.168.122.11 | |
| Master_User: replication | |
| Master_Port: 3306 | |
| Connect_Retry: 60 | |
| Master_Log_File: mysql_bin.000001 | |
| Read_Master_Log_Pos: 154 | |
| Relay_Log_File: master1-relay-bin.000002 | |
| Relay_Log_Pos: 320 | |
| Relay_Master_Log_File: mysql_bin.000001 | |
| Slave_IO_Running: Yes | |
| Slave_SQL_Running: Yes | |
| Replicate_Do_DB: | |
| Replicate_Ignore_DB: | |
| Replicate_Do_Table: | |
| Replicate_Ignore_Table: | |
| Replicate_Wild_Do_Table: | |
| Replicate_Wild_Ignore_Table: | |
| Last_Errno: 0 | |
| Last_Error: | |
| Skip_Counter: 0 | |
| Exec_Master_Log_Pos: 154 | |
| Relay_Log_Space: 529 | |
| Until_Condition: None | |
| Until_Log_File: | |
| Until_Log_Pos: 0 | |
| Master_SSL_Allowed: No | |
| Master_SSL_CA_File: | |
| Master_SSL_CA_Path: | |
| Master_SSL_Cert: | |
| Master_SSL_Cipher: | |
| Master_SSL_Key: | |
| Seconds_Behind_Master: 0 | |
| Master_SSL_Verify_Server_Cert: No | |
| Last_IO_Errno: 0 | |
| Last_IO_Error: | |
| Last_SQL_Errno: 0 | |
| Last_SQL_Error: | |
| Replicate_Ignore_Server_Ids: | |
| Master_Server_Id: 2 | |
| Master_UUID: 51f017b7-0fe5-11ec-a583-000c299463f1 | |
| Master_Info_File: /usr/local/mysql/data/master.info | |
| SQL_Delay: 0 | |
| SQL_Remaining_Delay: NULL | |
| Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates | |
| Master_Retry_Count: 86400 | |
| Master_Bind: | |
| Last_IO_Error_Timestamp: | |
| Last_SQL_Error_Timestamp: | |
| Master_SSL_Crl: | |
| Master_SSL_Crlpath: | |
| Retrieved_Gtid_Set: | |
| Executed_Gtid_Set: | |
| Auto_Position: 0 | |
| Replicate_Rewrite_DB: | |
| Channel_Name: | |
| Master_TLS_Version: | |
| 1 row in set (0.00 sec) |
1.4.4 在master2上配置同步
Master2服务器(192.168.122.11)
| mysql> change master to | |
| -> master_host='192.168.122.10', | |
| -> master_user='replication', | |
| -> master_password='123456', | |
| -> master_log_file='mysql_bin.000001', | |
| -> master_log_pos=154; | |
| Query OK, 0 rows affected, 2 warnings (0.02 sec) | |
| mysql> start slave; | |
| Query OK, 0 rows affected (0.00 sec) | |
| mysql> show slave status\G | |
| *************************** 1. row *************************** | |
| Slave_IO_State: Waiting for master to send event | |
| Master_Host: 192.168.122.10 | |
| Master_User: replication | |
| Master_Port: 3306 | |
| Connect_Retry: 60 | |
| Master_Log_File: mysql_bin.000001 | |
| Read_Master_Log_Pos: 154 | |
| Relay_Log_File: master2-relay-bin.000002 | |
| Relay_Log_Pos: 320 | |
| Relay_Master_Log_File: mysql_bin.000001 | |
| Slave_IO_Running: Yes | |
| Slave_SQL_Running: Yes | |
| Replicate_Do_DB: | |
| Replicate_Ignore_DB: | |
| Replicate_Do_Table: | |
| Replicate_Ignore_Table: | |
| Replicate_Wild_Do_Table: | |
| Replicate_Wild_Ignore_Table: | |
| Last_Errno: 0 | |
| Last_Error: | |
| Skip_Counter: 0 | |
| Exec_Master_Log_Pos: 154 | |
| Relay_Log_Space: 529 | |
| Until_Condition: None | |
| Until_Log_File: | |
| Until_Log_Pos: 0 | |
| Master_SSL_Allowed: No | |
| Master_SSL_CA_File: | |
| Master_SSL_CA_Path: | |
| Master_SSL_Cert: | |
| Master_SSL_Cipher: | |
| Master_SSL_Key: | |
| Seconds_Behind_Master: 0 | |
| Master_SSL_Verify_Server_Cert: No | |
| Last_IO_Errno: 0 | |
| Last_IO_Error: | |
| Last_SQL_Errno: 0 | |
| Last_SQL_Error: | |
| Replicate_Ignore_Server_Ids: | |
| Master_Server_Id: 1 | |
| Master_UUID: 7587444a-0fe5-11ec-ac87-000c2959bebe | |
| Master_Info_File: /usr/local/mysql/data/master.info | |
| SQL_Delay: 0 | |
| SQL_Remaining_Delay: NULL | |
| Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates | |
| Master_Retry_Count: 86400 | |
| Master_Bind: | |
| Last_IO_Error_Timestamp: | |
| Last_SQL_Error_Timestamp: | |
| Master_SSL_Crl: | |
| Master_SSL_Crlpath: | |
| Retrieved_Gtid_Set: | |
| Executed_Gtid_Set: | |
| Auto_Position: 0 | |
| Replicate_Rewrite_DB: | |
| Channel_Name: | |
| Master_TLS_Version: | |
| 1 row in set (0.00 sec) |
1.5 配置主从复制,在两台从服务器上做
Slave1服务器(192.168.122.100)
| [root@slave1 ~]# mysql -u root -p | |
| Enter password: | |
| mysql> change master to | |
| -> master_host='192.168.122.10', | |
| -> master_user='replication', | |
| -> master_password='123456', | |
| -> master_log_file='mysql_bin.000001', | |
| -> master_log_pos=154; | |
| Query OK, 0 rows affected, 2 warnings (0.01 sec) | |
| mysql> start slave; | |
| Query OK, 0 rows affected (0.00 sec) | |
| mysql> show slave status\G | |
| *************************** 1. row *************************** | |
| Slave_IO_State: Waiting for master to send event | |
| Master_Host: 192.168.122.10 | |
| Master_User: replication | |
| Master_Port: 3306 | |
| Connect_Retry: 60 | |
| Master_Log_File: mysql_bin.000001 | |
| Read_Master_Log_Pos: 154 | |
| Relay_Log_File: slave1-relay-bin.000002 | |
| Relay_Log_Pos: 320 | |
| Relay_Master_Log_File: mysql_bin.000001 | |
| Slave_IO_Running: Yes | |
| Slave_SQL_Running: Yes | |
| Replicate_Do_DB: | |
| Replicate_Ignore_DB: | |
| Replicate_Do_Table: | |
| Replicate_Ignore_Table: | |
| Replicate_Wild_Do_Table: | |
| Replicate_Wild_Ignore_Table: | |
| Last_Errno: 0 | |
| Last_Error: | |
| Skip_Counter: 0 | |
| Exec_Master_Log_Pos: 154 | |
| Relay_Log_Space: 528 | |
| Until_Condition: None | |
| Until_Log_File: | |
| Until_Log_Pos: 0 | |
| Master_SSL_Allowed: No | |
| Master_SSL_CA_File: | |
| Master_SSL_CA_Path: | |
| Master_SSL_Cert: | |
| Master_SSL_Cipher: | |
| Master_SSL_Key: | |
| Seconds_Behind_Master: 0 | |
| Master_SSL_Verify_Server_Cert: No | |
| Last_IO_Errno: 0 | |
| Last_IO_Error: | |
| Last_SQL_Errno: 0 | |
| Last_SQL_Error: | |
| Replicate_Ignore_Server_Ids: | |
| Master_Server_Id: 1 | |
| Master_UUID: 7587444a-0fe5-11ec-ac87-000c2959bebe | |
| Master_Info_File: /usr/local/mysql/data/master.info | |
| SQL_Delay: 0 | |
| SQL_Remaining_Delay: NULL | |
| Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates | |
| Master_Retry_Count: 86400 | |
| Master_Bind: | |
| Last_IO_Error_Timestamp: | |
| Last_SQL_Error_Timestamp: | |
| Master_SSL_Crl: | |
| Master_SSL_Crlpath: | |
| Retrieved_Gtid_Set: | |
| Executed_Gtid_Set: | |
| Auto_Position: 0 | |
| Replicate_Rewrite_DB: | |
| Channel_Name: | |
| Master_TLS_Version: | |
| 1 row in set (0.00 sec) |
Slave2服务器(192.168.122.101)
| [root@slave2 ~]# mysql -u root -p | |
| Enter password: | |
| mysql> change master to | |
| -> master_host='192.168.122.10', | |
| -> master_user='replication', | |
| -> master_password='123456', | |
| -> master_log_file='mysql_bin.000001', | |
| -> master_log_pos=154; | |
| Query OK, 0 rows affected, 2 warnings (0.01 sec) | |
| mysql> start slave; | |
| Query OK, 0 rows affected (0.00 sec) | |
| mysql> show slave status\G | |
| *************************** 1. row *************************** | |
| Slave_IO_State: Waiting for master to send event | |
| Master_Host: 192.168.122.10 | |
| Master_User: replication | |
| Master_Port: 3306 | |
| Connect_Retry: 60 | |
| Master_Log_File: mysql_bin.000001 | |
| Read_Master_Log_Pos: 154 | |
| Relay_Log_File: slave2-relay-bin.000002 | |
| Relay_Log_Pos: 320 | |
| Relay_Master_Log_File: mysql_bin.000001 | |
| Slave_IO_Running: Yes | |
| Slave_SQL_Running: Yes | |
| Replicate_Do_DB: | |
| Replicate_Ignore_DB: | |
| Replicate_Do_Table: | |
| Replicate_Ignore_Table: | |
| Replicate_Wild_Do_Table: | |
| Replicate_Wild_Ignore_Table: | |
| Last_Errno: 0 | |
| Last_Error: | |
| Skip_Counter: 0 | |
| Exec_Master_Log_Pos: 154 | |
| Relay_Log_Space: 528 | |
| Until_Condition: None | |
| Until_Log_File: | |
| Until_Log_Pos: 0 | |
| Master_SSL_Allowed: No | |
| Master_SSL_CA_File: | |
| Master_SSL_CA_Path: | |
| Master_SSL_Cert: | |
| Master_SSL_Cipher: | |
| Master_SSL_Key: | |
| Seconds_Behind_Master: 0 | |
| Master_SSL_Verify_Server_Cert: No | |
| Last_IO_Errno: 0 | |
| Last_IO_Error: | |
| Last_SQL_Errno: 0 | |
| Last_SQL_Error: | |
| Replicate_Ignore_Server_Ids: | |
| Master_Server_Id: 1 | |
| Master_UUID: 7587444a-0fe5-11ec-ac87-000c2959bebe | |
| Master_Info_File: /usr/local/mysql/data/master.info | |
| SQL_Delay: 0 | |
| SQL_Remaining_Delay: NULL | |
| Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates | |
| Master_Retry_Count: 86400 | |
| Master_Bind: | |
| Last_IO_Error_Timestamp: | |
| Last_SQL_Error_Timestamp: | |
| Master_SSL_Crl: | |
| Master_SSL_Crlpath: | |
| Retrieved_Gtid_Set: | |
| Executed_Gtid_Set: | |
| Auto_Position: 0 | |
| Replicate_Rewrite_DB: | |
| Channel_Name: | |
| Master_TLS_Version: | |
| 1 row in set (0.00 sec) |
1.6 测试主主、主从同步情况
Master1服务器(192.168.122.10)
| mysql> create database test; | |
| Query OK, 1 row affected (0.00 sec) | |
| mysql> show databases; | |
| +--------------------+ | |
| | Database | | |
| +--------------------+ | |
| | information_schema | | |
| | mysql | | |
| | performance_schema | | |
| | sys | | |
| | test | | |
| +--------------------+ | |
| 5 rows in set (0.00 sec) |
Master2服务器(192.168.122.11)
| mysql> show databases; | |
| +--------------------+ | |
| | Database | | |
| +--------------------+ | |
| | information_schema | | |
| | mysql | | |
| | performance_schema | | |
| | sys | | |
| | test | | |
| +--------------------+ | |
| 5 rows in set (0.00 sec) |
Slave1服务器(192.168.122.100)
| mysql> show databases; | |
| +--------------------+ | |
| | Database | | |
| +--------------------+ | |
| | information_schema | | |
| | mysql | | |
| | performance_schema | | |
| | sys | | |
| | test | | |
| +--------------------+ | |
| 5 rows in set (0.00 sec) |
Slave2服务器(192.168.122.101)
| mysql> show databases; | |
| +--------------------+ | |
| | Database | | |
| +--------------------+ | |
| | information_schema | | |
| | mysql | | |
| | performance_schema | | |
| | sys | | |
| | test | | |
| +--------------------+ | |
| 5 rows in set (0.00 sec) |
2. 安装配置MySQL-MMM
2.1 在所有服务器上安装MySQL-MMM
Master1服务器(192.168.122.10)
| [root@master1 ~]# yum -y install epel-release | |
| [root@master1 ~]# yum -y install mysql-mmm* |
Master2服务器(192.168.122.11)
| [root@master2 ~]# yum -y install epel-release | |
| [root@master2 ~]# yum -y install mysql-mmm* |
Slave1服务器(192.168.122.100)
| [root@slave1 ~]# yum -y install epel-release | |
| [root@slave1 ~]# yum -y install mysql-mmm* |
Slave2服务器(192.168.122.101)
| [root@slave2 ~]# yum -y install epel-release | |
| [root@slave2 ~]# yum -y install mysql-mmm* |
Monitor服务器(192.168.122.12)
| [root@monitor ~]# yum -y install epel-release | |
| [root@monitor ~]# yum -y install mysql-mmm* |
注:若本地仓库中无以上软件,需先为各服务器配置在线源仓库。
2.2 阿里云源仓库配置方法
| wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo | |
| #将阿里云镜像下载到/etc/yum.repos.d/目录下 | |
| yum clean all && yum makecache | |
| #清理缓存并且生成新的缓存 |
2.3 在master1上对MySQL-MMM进行配置
Master1服务器(192.168.122.10)
| [root@master1 ~]# cd /etc/mysql-mmm/ | |
| [root@master1 mysql-mmm]# cp mmm_common.conf mmm_common.conf.bak | |
| #修改配置文件前,先备份 | |
| [root@master1 mysql-mmm]# vim mmm_common.conf | |
| active_master_role writer | |
| <host default> | |
| cluster_interface ens33 | |
| pid_path /run/mysql-mmm-agent.pid | |
| bin_path /usr/libexec/mysql-mmm/ | |
| replication_user replication | |
| ##指定主主、主从复制用户,要与前面一致 | |
| replication_password 123456 | |
| agent_user mmm_agent | |
| ##指定monitor代理进程的用户名 | |
| agent_password 123456 | |
| </host> | |
| <host db1> | |
| ip 192.168.122.10 | |
| mode master | |
| peer db2 | |
| ##peer设置同级数据库 | |
| </host> | |
| <host db2> | |
| ip 192.168.122.11 | |
| mode master | |
| peer db1 | |
| </host> | |
| <host db3> | |
| ip 192.168.122.100 | |
| mode slave | |
| </host> | |
| <host db4> | |
| ip 192.168.122.101 | |
| mode slave | |
| </host> | |
| <role writer> | |
| hosts db1, db2 | |
| ips 192.168.122.200 | |
| ##设定写VIP | |
| mode exclusive | |
| #只有一个 host 可以进行写操作模式 | |
| </role> | |
| <role reader> | |
| hosts db3, db4 | |
| ips 192.168.122.201, 192.168.122.202 | |
| ##设定读VIP | |
| mode balanced | |
| ##多个 slave 主机可以进行读操作模式 | |
| </role> |
2.4 把配置文件复制到其他4台主机
所有主机该配置文件内容都是相同的
Master1服务器(192.168.122.10)
| [root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.11:/etc/mysql-mmm/ | |
| [root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.100:/etc/mysql-mmm/ | |
| [root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.101:/etc/mysql-mmm/ | |
| [root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.12:/etc/mysql-mmm/ |
注:因为scp将直接覆盖原配置文件,所以建议先将配置文件做好备份
2.5 修改所有数据库服务器的代理配置文件mmm_agent.conf
Master1服务器(192.168.122.10)
| [root@master1 ~]# vim /etc/mysql-mmm/mmm_agent.conf | |
| include mmm_common.conf | |
| this db1 | |
| ##根据不同的主机分别修改为db1/db2/db3/db4,默认配置为db1,因此master1无需修改 |
Master2服务器(192.168.122.11)
| [root@master2 ~]# vim /etc/mysql-mmm/mmm_agent.conf | |
| include mmm_common.conf | |
| this db2 |
Slave1服务器(192.168.122.100)
| [root@slave ~]# vim /etc/mysql-mmm/mmm_agent.conf | |
| include mmm_common.conf | |
| this db3 |
Slave2服务器(192.168.122.101)
| [root@slave2 ~]# vim /etc/mysql-mmm/mmm_agent.conf | |
| include mmm_common.conf | |
| this db4 |
2.6 在monitor监控服务器上修改监控配置文件mmm_mon.conf
Monitor服务器(192.168.122.12)
| [root@monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf | |
| include mmm_common.conf | |
| <monitor> | |
| ip 127.0.0.1 | |
| pid_path /run/mysql-mmm-monitor.pid | |
| bin_path /usr/libexec/mysql-mmm | |
| status_path /var/lib/mysql-mmm/mmm_mond.status | |
| ping_ips 192.168.122.10,192.168.122.11,192.168.122.100,192.168.122.101 | |
| ##指定所有数据库服务器的IP | |
| auto_set_online 10 | |
| ##指定自动上线时间 | |
| # The kill_host_bin does not exist by default, though the monitor will | |
| # throw a warning about it missing. See the section 5.10 "Kill Host | |
| # Functionality" in the PDF documentation. | |
| # | |
| # kill_host_bin /usr/libexec/mysql-mmm/monitor/kill_host | |
| # | |
| </monitor> | |
| <host default> | |
| monitor_user mmm_monitor | |
| ##指定mmm_monitor的用户名 | |
| monitor_password 123456 | |
| ##指定mmm_monitor的密码 | |
| </host> | |
| debug 0 |
2.7 在所有数据库上为 mmm_agent(代理进程)授权
Master1服务器(192.168.122.10)
| [root@master1 ~]# mysql -u root -p | |
| Enter password: | |
| mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.01 sec) |
Master2服务器(192.168.122.11)
| [root@master2 ~]# mysql -u root -p | |
| Enter password: | |
| mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.00 sec) | |
Slave1服务器(192.168.122.100)
| [root@slave1 ~]# mysql -u root -p | |
| Enter password: | |
| mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.00 sec) |
Slave2服务器(192.168.122.101)
| [root@slave2 ~]# mysql -u root -p | |
| Enter password: | |
| mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.00 sec) |
注:
| 权限 | 功能 |
|---|---|
| process | 显示或杀死属于其他用户的服务线程 |
| super | 允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS |
| replication client | 查询主服务器、从服务器状态 |
2.8 在所有数据库上为mmm_monitor(监控进程)授权
Master1服务器(192.168.122.10)
| mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.01 sec) | |
| mysql> flush privileges; | |
| Query OK, 0 rows affected (0.01 sec) |
Master2服务器(192.168.122.11)
| mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.01 sec) | |
| mysql> flush privileges; | |
| Query OK, 0 rows affected (0.01 sec) |
Slave1服务器(192.168.122.100)
| mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.01 sec) | |
| mysql> flush privileges; | |
| Query OK, 0 rows affected (0.01 sec) |
Slave2服务器(192.168.122.101)
复制
| mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.01 sec) | |
| mysql> flush privileges; | |
| Query OK, 0 rows affected (0.01 sec) |
2.8 在所有数据库服务器上启动mysql-mmm-agent
Master1服务器(192.168.122.10)
| [root@master1 ~]# systemctl start mysql-mmm-agent.service | |
| [root@master1 ~]# systemctl enable mysql-mmm-agent.service | |
| Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service. |
Master2服务器(192.168.122.11)
| [root@master2 ~]# systemctl start mysql-mmm-agent.service | |
| [root@master2 ~]# systemctl enable mysql-mmm-agent.service | |
| Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service. |
Slave1服务器(192.168.122.100)
| [root@slave1 ~]# systemctl start mysql-mmm-agent.service | |
| [root@slave1 ~]# systemctl enable mysql-mmm-agent.service | |
| Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service. |
Slave2服务器(192.168.122.101)
| [root@slave2 ~]# systemctl start mysql-mmm-agent.service | |
| [root@slave2 ~]# systemctl enable mysql-mmm-agent.service | |
| Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service. | |
2.9 在monitor服务器上启动mysql-mmm-monitor
Monitor服务器(192.168.122.12)
复制[root@monitor ~]# systemctl start mysql-mmm-monitor.service
2.10 在monitor服务器上测试群集
2.10.1 查看各节点的情况
Monitor服务器(192.168.122.12)
| [root@monitor ~]# mmm_control show | |
| db1(192.168.122.10) master/ONLINE. Roles: writer(192.168.122.200) | |
| db2(192.168.122.11) master/ONLINE. Roles: | |
| db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202) | |
| db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201) |
2.10.2 检测监控功能是否完善
Monitor服务器(192.168.122.12)
| [root@monitor ~]# mmm_control checks all | |
| db4 ping [last change: 2021/09/08 02:05:52] OK | |
| db4 mysql [last change: 2021/09/08 02:10:38] OK | |
| db4 rep_threads [last change: 2021/09/08 02:25:20] OK | |
| db4 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null | |
| db2 ping [last change: 2021/09/08 02:05:52] OK | |
| db2 mysql [last change: 2021/09/08 02:10:38] OK | |
| db2 rep_threads [last change: 2021/09/08 02:25:20] OK | |
| db2 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null | |
| db3 ping [last change: 2021/09/08 02:05:52] OK | |
| db3 mysql [last change: 2021/09/08 02:10:38] OK | |
| db3 rep_threads [last change: 2021/09/08 02:25:20] OK | |
| db3 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null | |
| db1 ping [last change: 2021/09/08 02:05:52] OK | |
| db1 mysql [last change: 2021/09/08 02:10:38] OK | |
| db1 rep_threads [last change: 2021/09/08 02:25:20] OK | |
| db1 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null |
2.10.3 指定绑定VIP的主机
Monitor服务器(192.168.122.12)
| [root@monitor ~]# mmm_control move_role writer db2 | |
| OK: Role 'writer' has been moved from 'db1' to 'db2'. Now you can wait some time and check new roles info! | |
| [root@monitor ~]# mmm_control show | |
| db1(192.168.122.10) master/ONLINE. Roles: | |
| db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200) | |
| db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202) | |
| db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201) | |
| [root@monitor ~]# mmm_control move_role writer db1 | |
| OK: Role 'writer' has been moved from 'db2' to 'db1'. Now you can wait some time and check new roles info! | |
| [root@monitor ~]# mmm_control show | |
| db1(192.168.122.10) master/ONLINE. Roles: writer(192.168.122.200) | |
| db2(192.168.122.11) master/ONLINE. Roles: | |
| db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202) | |
| db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201) |
3. 故障测试
3.1 模拟master宕机以及恢复
3.1.1 停止master1的mysql服务
Master1服务器(192.168.122.10)
复制[root@master1 ~]# systemctl stop mysqld
3.1.2 查看VIP漂移情况
Monitor服务器(192.168.122.12)
| [root@monitor ~]# mmm_control show | |
| db1(192.168.122.10) master/HARD_OFFLINE. Roles: | |
| db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200) | |
| db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202) | |
| db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201) |
VIP成功漂移至master2,且master1显示HARD_OFFLINE
3.1.3 重启master1的mysql服务
Master1服务器(192.168.122.10)
复制[root@master1 ~]# systemctl start mysqld
3.1.4 查看master1是否恢复
Monitor服务器(192.168.122.12)
| [root@monitor ~]# mmm_control show | |
| db1(192.168.122.10) master/AWAITING_RECOVERY. Roles: | |
| db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200) | |
| db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202) | |
| db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201) |
显示等待恢复,等待数秒后重新查看,发现Master1在线,但未能获得VIP
| [root@monitor ~]# mmm_control show | |
| db1(192.168.122.10) master/ONLINE. Roles: | |
| db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200) | |
| db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202) | |
| db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201) |
3.2 模拟从服务器宕机以及恢复
3.2.1 停止slave1的mysql服务
Slave1服务器(192.168.122.100)
复制[root@slave1 ~]# systemctl stop mysqld
3.2.2 查看VIP漂移情况
Monitor服务器(192.168.122.12)
| [root@monitor ~]# mmm_control show | |
| db1(192.168.122.10) master/ONLINE. Roles: | |
| db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200) | |
| db3(192.168.122.100) slave/HARD_OFFLINE. Roles: | |
| db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201), reader(192.168.122.202) |
slave1所对应的的VIP对slave2成功接管
3.2.3 重启slave1的mysql服务
Slave1服务器(192.168.122.100)
复制[root@slave1 ~]# systemctl start mysqld
3.2.4 查看slave1是否恢复
| [root@monitor ~]# mmm_control show | |
| db1(192.168.122.10) master/ONLINE. Roles: | |
| db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200) | |
| db3(192.168.122.100) slave/AWAITING_RECOVERY. Roles: | |
| db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201), reader(192.168.122.202) | |
| [root@monitor ~]# mmm_control show | |
| db1(192.168.122.10) master/ONLINE. Roles: | |
| db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200) | |
| db3(192.168.122.100) slave/ONLINE. Roles: | |
| db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201), reader(192.168.122.202) | |
| [root@monitor ~]# mmm_control show | |
| db1(192.168.122.10) master/ONLINE. Roles: | |
| db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200) | |
| db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202) | |
| db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201) |
在短暂的交接后,slave1重新获取到VIP,继续工作
3.3 客户端测试
3.3.1 在master1服务器上为monitor服务器地址授权登录
Master1服务器(192.168.122.10)
| [root@master1 ~]# mysql -u root -p | |
| Enter password: | |
| mysql> grant all on *.* to 'test'@'192.168.122.12' identified by '123456'; | |
| Query OK, 0 rows affected, 1 warning (0.00 sec) | |
| mysql> flush privileges; | |
| Query OK, 0 rows affected (0.00 sec) |
3.3.2 在monitor服务器上使用VIP登录
Monitor服务器(192.168.122.12)
| [root@monitor ~]# yum install -y mariadb-server mariadb | |
| [root@monitor ~]# systemctl start mariadb.service | |
| [root@monitor ~]# mysql -u test -p -h 192.168.122.200 | |
| Enter password: | |
| ##登录成功 | |
| MySQL [(none)]> |
3.3.3 客户端创建数据,测试同步情况
Monitor服务器(192.168.122.12)
| MySQL [(none)]> create database client_test; | |
| Query OK, 1 row affected (0.00 sec) | |
| MySQL [(none)]> show databases; | |
| +--------------------+ | |
| | Database | | |
| +--------------------+ | |
| | information_schema | | |
| | client_test | | |
| | mysql | | |
| | performance_schema | | |
| | sys | | |
| | test | | |
| +--------------------+ | |
| 6 rows in set (0.00 sec) |
Master1服务器(192.168.122.10)
| mysql> show databases; | |
| +--------------------+ | |
| | Database | | |
| +--------------------+ | |
| | information_schema | | |
| | client_test | | |
| | mysql | | |
| | performance_schema | | |
| | sys | | |
| | test | | |
| +--------------------+ | |
| 6 rows in set (0.00 sec) |
Master2服务器(192.168.122.11)
| mysql> show databases; | |
| +--------------------+ | |
| | Database | | |
| +--------------------+ | |
| | information_schema | | |
| | client_test | | |
| | mysql | | |
| | performance_schema | | |
| | sys | | |
| | test | | |
| +--------------------+ | |
| 6 rows in set (0.00 sec) |
Slave1服务器(192.168.122.100)
| mysql> show databases; | |
| +--------------------+ | |
| | Database | | |
| +--------------------+ | |
| | information_schema | | |
| | client_test | | |
| | mysql | | |
| | performance_schema | | |
| | sys | | |
| | test | | |
| +--------------------+ | |
| 6 rows in set (0.00 sec) |
Slave2服务器(192.168.122.101)
| mysql> show databases; | |
| +--------------------+ | |
| | Database | | |
| +--------------------+ | |
| | information_schema | | |
| | client_test | | |
| | mysql | | |
| | performance_schema | | |
| | sys | | |
| | test | | |
| +--------------------+ | |
| 6 rows in set (0.00 sec) |
3M 高可用架构----拓展的更多相关文章
- MySQL 高可用架构之MMM
简介 MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序.MMM使用Perl语言开发,主要用来监控和管理My ...
- 【转】单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构
此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...
- MySQL数据库的优化(下)MySQL数据库的高可用架构方案
MySQL数据库的优化(下)MySQL数据库的高可用架构方案 2011-03-09 08:53 抚琴煮酒 51CTO 字号:T | T 在上一篇MySQL数据库的优化中,我们跟随笔者学习了单机MySQ ...
- 数据库高可用架构(MySQL、Oracle、MongoDB、Redis)
一.MySQL MySQL小型高可用架构 方案:MySQL双主.主从 + Keepalived主从自动切换 服务器资源:两台PC Server 优点:架构简单,节省资源 缺点:无法线性扩展,主从失 ...
- 【亲述】Uber容错设计与多机房容灾方案 - 高可用架构系列
此文是根据赵磊在[QCON高可用架构群]中的分享内容整理而成.转载请事先联系赵磊及相关编辑. 赵磊,Uber高级工程师,08年上海交通大学毕业,曾就职于微软,后加入Facebook主要负责Messen ...
- Redis Sentinel高可用架构
Redis目前高可用的架构非常多,比如keepalived+redis,redis cluster,twemproxy,codis,这些架构各有优劣,今天暂且不说这些架构,今天主要说说redis se ...
- [MongoDB] 高可用架构方案
一.缘由: 众所周知,Mongodb是在高速发展期,一些特性架构难免会发生变化.这里就总结下,我目前所知道的Mongodb 的高可用架构都有哪些.目前Mongodb版本3.2. 二.结构介绍: 1.R ...
- 分布式架构高可用架构篇_07_MySQL主从复制的配置(CentOS-6.7+MySQL-5.6)
参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...
- [转]数据库高可用架构(MySQL、Oracle、MongoDB、Redis)
一.MySQL MySQL小型高可用架构 方案:MySQL双主.主从 + Keepalived主从自动切换 服务器资源:两台PC Server 优点:架构简单,节省资源 缺点:无法线性扩展,主从失 ...
随机推荐
- RabbitMQ使用 prefetch_count优化队列的消费,使用死信队列和延迟队列实现消息的定时重试,golang版本
RabbitMQ 的优化 channel prefetch Count 死信队列 什么是死信队列 使用场景 代码实现 延迟队列 什么是延迟队列 使用场景 实现延迟队列的方式 Queue TTL Mes ...
- [ flask ] flask-restful 实现嵌套的有关系的输出字段
问题描述: 1. 先说明数据关系:有用户,和菜谱.一个用户可以拥有多个菜谱:一对多的关系 2. resources/users.py 的输出字段: user_fields = { 'id':fiel ...
- Windows alias 给cmd命令起别名
场景: Linux的alias命令是个非常实用的工具,任何命令通过alias可以精简到很短,比如:alias l='ls -l' Windows也有alias类似的命令,就是:doskey,开启方法也 ...
- spring的返回json数据给前端注意事项
1. 记得加入SpringJSON解析包,否则spring无法将返回的pojo类解析成json数据 maven则加上下面的依赖包 <!-- SpringJSON解析包--> <jac ...
- JSP页面隐藏了哪些对象
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6513312446378148356/ 1.<JSP页面实际上就是Servlet> 2.<JSP页 ...
- 使用nexus搭建一个maven私有仓库
使用nexus搭建一个maven私有仓库 大家好,我是程序员田同学.今天带大家搭建一个maven私有仓库. 很多公司都是搭建自己的Maven私有仓库,今天就带大家使用nexus搭建一个自己的私有仓库, ...
- “伏魔”赏金 | WebShell检测之「模拟污点引擎」首次公测,邀你来战!
安全是一个动态的过程,攻防对抗如同在赛博世界里降妖伏魔,其要义是:取彼之长,补己之短.--伏魔引擎的诞生 伏魔引擎挑战赛 注册时间: 2022.01.10 00:00:00 - 2022.01.24 ...
- 【C++】类-派生和继承
类-派生和继承 目录 类-派生和继承 1.基本概念 2. 语法 3. 继承方式 4. 类型转换 5. 派生类的构造.析构函数 构造函数 复制构造函数 析构函数 1.基本概念 继承:保持已有类的特性而构 ...
- X架构键盘选购指南
X架构键盘 联想 JME8002(未知) JME7597(推荐) 据说是ThinkPAD键盘的血统. Thinkapad 小红点键盘,据说腿撑容易坏 明基 明基精钢侠 海湾海贝(键程长,不累手,但不易 ...
- Cesium源码剖析---Post Processing之物体描边(Silhouette)
Cesium在1.46版本中新增了对整个场景的后期处理(Post Processing)功能,包括模型描边.黑白图.明亮度调整.夜视效果.环境光遮蔽等.对于这么炫酷的功能,我们绝不犹豫,先去翻一翻它的 ...