MMM双主-双从读写分离部署
原文转自:https://www.cnblogs.com/itzgr/p/10233932.html
作者:木二
目录
- 一 前期规划
- 1.1 主机规划
- 1.2 虚拟IP规划
- 1.3 用户列表
- 1.4 整体架构
- 1.4 hosts修改
- 1.5 NTP配置
- 二 部署MySQL
- 2.1 安装MySQL
- 三 双主复制部署
- 3.1 master01 my.cf配置
- 3.2 Master02 my.cf配置
- 3.4 Master02创建账号
- 3.5 启动双主复制
- 3.3 启动Master02的slave功能
- 四 其他节点配置
- 4.1 所有Slave节点配置配置
- 4.2 所有Slave节点创建账号
- 4.2 Slave节点配置Master01为主
- 五 安装MMM组件
- 5.1 监控Monitor节点安装MMM
- 5.2 其他节点安装MMM
- 附1 添加安装Perl脚本
- 附2 编译安装
- 5.3 目录构成
- 六 配置MMM
- 6.1 Master01的mmm_agent配置
- 6.2 Master01的mmm_common配置
- 6.3 Master01的mysql-mmm-agent配置
- 6.4 其他节点配置
- 6.5 管理Monitor节点配置
- 七 MMM集群的启动
- 7.1 管理监控Monitor节点启动
- 7.2 所有agent节点启动
- 八 MMM基本维护
- 8.1 MMM常见命令
- 8.2 查看集群状态
- 8.3 查看集群运行模式
- 8.4 检查节点情况
- 8.5 日志文件
- 九 测试MMM
- 9.1 测试集群复制功能
- 9.2 读写分离测试
- 9.3 故障转移测试
- 十 MMM总结
一 前期规划
1.1 主机规划
功能
|
IP
|
主机名
|
server id
|
应用属性
|
VIP
|
MySQL版本
|
Monitor
|
172.24.8.20
|
Monitor
|
——
|
监控
|
——
|
——
|
Master01
|
172.24.8.10
|
Master01
|
1
|
写-writer
|
172.24.8.100
|
MySQL 5.6.37
|
Master02
|
172.24.8.11
|
Master02
|
2
|
读-reader
写-writer
|
172.24.8.101
172.24.8.102
172.24.8.103
172.24.8.104
|
|
Slave01
|
172.24.8.12
|
Slave01
|
3
|
读-reader
|
||
Slave02
|
172.24.8.13
|
Slave02
|
4
|
读-reader
|
1.2 虚拟IP规划
VIP
|
备注
|
172.24.8.100
|
Master01主库写操作
Master01正常时候,Master02的vip对外提供只读服务;
Master01出现故障时候,Master02接替Master01对外提供读写服务。
|
172.24.8.101
|
只读,读查询VIP,每个数据节点一个读VIP,
可搭配LVS,HAProxy等负载均衡软件对读VIP进行负载均衡。
|
172.24.8.102
|
|
172.24.8.103
|
|
172.24.8.104
|
1.3 用户列表
角色
|
权限
|
描述
|
monitor
|
replication client
|
mmm监控MySQL服务健康
|
agent user
|
SUPER, REPLICATION CLIENT, PROCESS
|
mmm代理用来更改只读模式、复制的主服务器等
|
replication user
|
replication slave
|
用于复制
|
1.4 整体架构
1.4 hosts修改
1 [root@localhost ~]# vi /etc/sysconfig/network
2 NETWORKING=yes
3 HOSTNAME=Master01
4 [root@Master01 ~]# vi /etc/hosts
5 Master01 172.24.8.10
6 Master02 172.24.8.11
7 Slave01 172.24.8.12
8 Slave02 172.24.8.13
9 Monitor 172.24.8.20
1.5 NTP配置
二 部署MySQL
2.1 安装MySQL
三 双主复制部署
3.1 master01 my.cf配置
1 [root@Master01 ~]# vi /etc/my.cnf
2 [mysqld]
3 ……
4 server-id=1 #设置主服务器master的id
5 log-bin=mysql-bin #配置二进制变更日志命名格式
6 replicate-wild-ignore-table=mysql.%
7 replicate-wild-ignore-table=test.%
8 replicate-wild-ignore-table=information_schema.%
9 sync-binlog=1 #每条自动更新,安全性高,默认是0
10 auto_increment_increment=2 #字段一次递增多少
11 auto_increment_offset=1 #自增字段的起始值
12 log_slave_updates #当一个主故障,另一个立即接管
13 read_only=1
1 # 不同步哪些数据库
2 binlog-ignore-db = mysql
3 binlog-ignore-db = test
4 binlog-ignore-db = information_schema
5 # 只同步哪些数据库,除此之外,其他不同步
6 binlog-do-db = mysqltest
1 replicate-wild-ignore-table=mysql.% #从库配置不同步表
2 replicate-wild-do-table=test.% #从库配置需要同步的表
提示:不要在主库使用binlog-ignore-db和binlog-do-db,也不要在从库使用replicate-wild-ignore和replicate-wild-do-table。
3.2 Master02 my.cf配置
1 [root@Master01 ~]# service mysqld start
2 [root@Master01 ~]# mysql -uroot -px120952576
3 mysql> grant replication slave on *.* to 'repl_user'@'172.24.8.%' identified by 'x12345678';
#创建用于复制的账号
4 mysql> grant replication client on *.* to 'mmm_monitor'@'172.24.8.%' identified by 'x12345678';
#创建用于监控MySQL服务健康的账号
5 mysql> grant super,replication client,process on *.* to 'mmm_agent'@'172.24.8.%' identified by 'x12345678';
#创建用于切换只读模式、同步Master信息的账号
6 mysql> grant select,insert,update,delete,create,drop on *.* to 'mmm_test'@'172.24.8.%' identified by 'x120952576' with grant option; #创建之后用于读写分离测试的账号
7 mysql> flush privileges;
8 [root@Master01 ~]# service mysqld restart
9 [root@Master01 ~]# mysql -uroot -px120952576
10 mysql> show master status;
3.4 Master02创建账号
1 [root@Master01 ~]# service mysqld restart
2 [root@Master01 ~]# mysql -uroot -px120952576
3 mysql> show master status;
3.5 启动双主复制
1 [root@Master01 ~]# mysql -uroot -px120952576
2 Enter password:
3 mysql> change master to master_host='172.24.8.11',
4 -> master_user='repl_user',
5 -> master_password='x12345678',
6 -> master_log_file='mysql-bin.000001',
7 -> master_port=3306,
8 -> master_log_pos=120;
9 mysql> start slave;
10 mysql> show slave status\G #查看slave状态
3.3 启动Master02的slave功能
1 [root@Master02 ~]# mysql -uroot -px120952576
2 mysql> change master to master_host='172.24.8.10',
3 -> master_user='repl_user',
4 -> master_password='x12345678',
5 -> master_log_file='mysql-bin.000001',
6 -> master_log_pos=120;
7 mysql> start slave;
8 mysql> show slave status\G #查看slave状态
四 其他节点配置
4.1 所有Slave节点配置配置
1 [root@Master01 ~]# scp /etc/my.cnf root@172.24.8.12:/etc/
2 [root@Master01 ~]# scp /etc/my.cnf root@172.24.8.13:/etc/
3 [root@Slave01 ~]# vi /etc/my.cnf
4 [mysqld]
5 ……
6 server-id=3 #设置主服务器Slave01的id
7 [root@Slave02 ~]# vi /etc/my.cnf
8 [mysqld]
9 ……
10 server-id=4 #设置主服务器Slave02的id
4.2 所有Slave节点创建账号
1 [root@Slave01 ~]# service mysqld start
2 [root@Slave01 ~]# mysql -uroot -px120952576
3 mysql> grant replication slave on *.* to 'repl_user'@'172.24.8.%' identified by 'x12345678'; #创建用于复制的账号
4 mysql> grant replication client on *.* to 'mmm_monitor'@'172.24.8.%' identified by 'x12345678'; #创建用于监控MySQL服务健康的账号
5 mysql> grant super,replication client,process on *.* to 'mmm_agent'@'172.24.8.%' identified by 'x12345678';
#创建用于切换只读模式、同步Master信息的账号
6 mysql> grant select,insert,update,delete,create,drop on *.* to 'mmm_test'@'172.24.8.%' identified by 'x120952576' with grant option; #创建之后用于读写分离测试的账号
7 mysql> flush privileges;
4.2 Slave节点配置Master01为主
1 [root@Slave01 ~]# service mysqld restart
2 [root@Slave01 ~]# mysql -uroot -px120952576
3 mysql> change master to master_host='172.24.8.10',
4 -> master_user='repl_user',
5 -> master_password='x12345678',
6 -> master_log_file='mysql-bin.000001',
7 -> master_log_pos=120;
8 mysql> start slave;
9 mysql> show slave status\G #查看slave状态
五 安装MMM组件
5.1 监控Monitor节点安装MMM
1 [root@Monitor tmp]# wget http://mirrors.ustc.edu.cn/epel/epel-release-latest-6.noarch.rpm
2 [root@Monitor tmp]# rpm -ivh epel-release-latest-6.noarch.rpm
3 [root@Monitor ~]# yum -y install mysql-mmm*
5.2 其他节点安装MMM
1 [root@Master01 ~]# wget http://mirrors.ustc.edu.cn/epel/epel-release-latest-6.noarch.rpm
2 [root@Master01 ~]# rpm -ivh epel-release-latest-6.noarch.rpm
3 [root@Master01 ~]# yum -y install mysql-mmm-agent
- MMM组件在常规YUM中不包含,需要安装epel源;
- 除monitor节点外其他节点只需要安装mysql-mmm-agent即可。
提示:若yum安装出现以下报错,建议在所有节点改用编译安装,操作见附1-附2:
附1 添加安装Perl脚本
1 [root@Master01 ~]# cat install.sh
2 #!/bin/bash
3 wget http://xrl.us/cpanm --no-check-certificate
4 mv cpanm /usr/bin
5 chmod 755 /usr/bin/cpanm
6 cat > /root/list << EOF
7 install Algorithm::Diff
8 install Class::Singleton
9 install DBI
10 install DBD::mysql
11 install File::Basename
12 install File::stat
13 install File::Temp
14 install Log::Dispatch
15 install Log::Log4perl
16 install Mail::Send
17 install Net::ARP
18 install Net::Ping
19 install Proc::Daemon
20 install Thread::Queue
21 install Time::HiRes
22 EOF
23 for package in `cat /root/list`
24 do
25 cpanm $package
26 done
附2 编译安装
1 [root@Master01 tmp]# wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz
2 [root@Master01 tmp]# mv \:mmm2\:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz
3 [root@Master01 tmp]# tar -zxvf mysql-mmm-2.2.1.tar.gz
4 [root@Master01 tmp]# cd mysql-mmm-2.2.1/
5 [root@Master01 mysql-mmm-2.2.1]# make install
5.3 目录构成
目录
|
介绍
|
/usr/lib/perl5/vendor_perl/5.8.8/MMM
|
MMM使用的主要perl模块
|
/usr/lib/mysql-mmm
|
MMM使用的主要脚本
|
/usr/sbin
|
MM使用的主要命令的路径
|
/etc/init.d/
|
MMM的agent和monitor启动服务的目录
|
/etc/mysql-mmm
|
MMM配置文件的路径,默认所以的配置文件
|
/var/log/mysql-mmm
|
默认的MMM保存日志的位置
|
六 配置MMM
6.1 Master01的mmm_agent配置
1 [root@Master01 ~]# vi /etc/mysql-mmm/mmm_agent.conf
2 include mmm_common.conf
3 this db1
6.2 Master01的mmm_common配置
1 [root@Master01 ~]# vi /etc/mysql-mmm/mmm_common.conf
2 active_master_role writer
3 #当设置为writer的时候,需要在所有MySQL节点设置“read_only=1”,则MMM会本剧每个节点的角色进行动态判断,当MMM的角色设置<role writer>时候,则会自动添加“set global read_only=0”操作,即打开写权限。
4 <host default>
5 cluster_interface eth0 #设置网络接口,不能为子接口。
6 pid_path /var/run/mysql-mmm/mmm_agentd.pid #设定PID文件路径
7 bin_path /usr/libexec/mysql-mmm/ #设置MMM可执行文件路径
8 replication_user repl_user #设置复制的用户名
9 replication_password x12345678 #设置复制的用户名的密码
10 agent_user mmm_agent #设置更改只读操作的用户
11 agent_password x12345678 #设置更改只读操作用户的密码
12 </host>
13
14 <host db1> #设置db1的配置信息,此db1名字可自定义,但必须和mmm_agent.conf中一致。
16 ip 172.24.8.10 #设置db1的物理IP
17 mode master #设置db1角色为Master
18 peer db2 #设置db1对等的主机名,即db2和db1均为Master
19 </host>
20
21 <host db2> #类似db1的设置
22 ip 172.24.8.11
23 mode master
24 peer db1
25 </host>
26
27 <host db3> #类似db1的设置
28 ip 172.24.8.12
29 mode slave #设置db3的角色为Slave
30 </host>
31
32 <host db4> #类似db1的设置
33 ip 172.24.8.13
34 mode slave #设置db4的角色为Slave
35 </host>
36
37 <role writer> #设置可写角色
38 hosts db1, db2 #设置可执行写操作的主机
39 ips 172.24.8.100 #设置可写的虚拟IP
40 mode exclusive #设置角色的模式为互斥,互斥角色只有一个IP,并且同一时间只能分配一个主机。
41 </role>
42
43 <role reader> #设置只读角色
44 hosts db1, db2, db3, db4 #设置只读角色的主机
45 ips 172.24.8.101, 172.24.8.102, 172.24.8.103, 172.24.8.104
46 #设置可读的虚拟IP,可以有多个。
47 mode balanced
#设置角色的模式为负载均衡,在负载均衡角色中,可以有多个IP,这些IP被均衡地、动态地分配给多个MySQL主机。
49 </role>
6.3 Master01的mysql-mmm-agent配置
1 [root@Master01 ~]# vi /etc/default/mysql-mmm-agent
2 ENABLED=1
6.4 其他节点配置
1 [root@Master01 ~]# scp /etc/mysql-mmm/mmm_common.conf root@172.24.8.11:/etc/mysql-mmm/
2 [root@Master01 ~]# scp /etc/mysql-mmm/mmm_common.conf root@172.24.8.12:/etc/mysql-mmm/
3 [root@Master01 ~]# scp /etc/mysql-mmm/mmm_common.conf root@172.24.8.13:/etc/mysql-mmm/
4 [root@Master01 ~]# scp /etc/default/mysql-mmm-agent root@172.24.8.11://etc/default/
5 [root@Master01 ~]# scp /etc/default/mysql-mmm-agent root@172.24.8.12://etc/default/
6 [root@Master01 ~]# scp /etc/default/mysql-mmm-agent root@172.24.8.13://etc/default/
1 [root@Master02 ~]# vi /etc/mysql-mmm/mmm_agent.conf
2 include mmm_common.conf
3 this db2
4 [root@Slave01 ~]## vi /etc/mysql-mmm/mmm_agent.conf
5 include mmm_common.conf
6 this db3
7 [root@Slave02 ~]## vi /etc/mysql-mmm/mmm_agent.conf
8 include mmm_common.conf
9 this db4
6.5 管理Monitor节点配置
2 include mmm_common.conf
3 <monitor>
4 ip 127.0.0.1 #为了安全,只设置本机监听,mmm_mond默认监听的端口为9988
6 pid_path /var/run/mysql-mmm/mmm_mond.pid #设置mmm_mond进程pid文件位置
8 bin_path /usr/libexec/mysql-mmm #mmm可执行文件路径
10 status_path /var/lib/mysql-mmm/mmm_mond.status #mmm集群的状态文件
12 ping_ips 172.24.8.10, 172.24.8.11, 172.24.8.12, 172.24.8.13
13 #用于测试的IP,只要其中有一个地址能ping通,代表网络正常,不要写入本机(即Monitor)IP。
14 auto_set_online 60 #设置是否自动上线,若大于0,抖动的主机在抖动时间范围过后,自动上线。
16 ……
17 </monitor>
18
19 <host default>
20 monitor_user mmm_monitor #设置mmm_monitor账号。
22 monitor_password x12345678 #设置mmm_monitor密码。
24 </host>
25 debug 0 #mmm管理器的运行模式,1为debug模式,0为正常模式。
七 MMM集群的启动
7.1 管理监控Monitor节点启动
1 [root@Monitor ~]# /etc/init.d/mysql-mmm-monitor start
2 [root@Monitor ~]# chkconfig mysql-mmm-monitor on
7.2 所有agent节点启动
1 [root@Master01 ~]# /etc/init.d/mysql-mmm-agent start
2 [root@Master01 ~]# chkconfig mysql-mmm-agent on
3 [root@Master02 ~]# /etc/init.d/mysql-mmm-agent start
4 [root@Master02 ~]# chkconfig mysql-mmm-agent on
5 [root@Slave01 ~]# /etc/init.d/mysql-mmm-agent start
6 [root@Slave01 ~]# chkconfig mysql-mmm-agent on
7 [root@Slave02 ~]# /etc/init.d/mysql-mmm-agent start
8 [root@Slave02 ~]# chkconfig mysql-mmm-agent on
八 MMM基本维护
8.1 MMM常见命令
2 Valid commands are:
3 help - show this message #显示帮助信息
4 ping - ping monitor #测试网络运行状态
5 show - show status #显示MMM集群节点状态
6 checks [<host>|all [<check>|all]] - show checks status #显示MMM集群中指定(所有)节点的详细状态
8 set_online <host> - set host <host> online #将MMM集群中的节点设置为online状态
10 set_offline <host> - set host <host> offline #将MMM集群中的节点设置为offline状态
12 mode - print current mode. #显示MMM集群当前的运行模式,有active(默认)、manual和passive三种模式。
14 set_active - switch into active mode.
15 set_manual - switch into manual mode.
16 set_passive - switch into passive mode. #切换MMM集群到以上三种模式。
18 move_role [--force] <role> <host> - move exclusive role <role> to host <host>
19 #在互斥模式下切换角色
20 (Only use --force if you know what you are doing!)
21 set_ip <ip> <host> - set role with ip <ip> to host <host>
22 #用来在被动模式下操纵角色
8.2 查看集群状态
1 [root@Monitor ~]# mmm_control show
8.3 查看集群运行模式
1 [root@Monitor ~]# mmm_control mode
8.4 检查节点情况
1 [root@Monitor ~]# mmm_control checks all
8.5 日志文件
九 测试MMM
9.1 测试集群复制功能
1 [root@Client ~]# mysql -uroot -px120952576 -h172.24.8.100
2 mysql> show variables like "%hostname%";
3 mysql> show variables like "%server_id%";
1 mysql> create database mysqltest;
2 mysql> use mysqltest;
3 mysql> create table user(id int(5),name char(10));
4 mysql> insert into user values (00001,'zhangsan');
1 [root@Master02 ~]# mysql -uroot -px120952576
2 mysql> show databases;
3 mysql> select * from mysqltest.user;
9.2 读写分离测试
1 [root@Client ~]# mysql -ummm_test -px120952576 -h172.24.8.101
2 mysql> use mysqltest;
3 mysql> create table test_mmm(id int,email varchar(100));
9.3 故障转移测试
1 [root@Monitor ~]# mmm_control show #查看现有集群情况
1 [root@Master01 ~]# service mysqld stop #停止Master01节点
2 [root@Monitor ~]# mmm_control show #再次查看集群节点情况
1 [root@Master01 ~]# service mysqld start #再次启动Master01节点
2 [root@Monitor ~]# mmm_control show
1 [root@Monitor ~]# mmm_control move_role writer db1
2 [root@Monitor ~]# mmm_control show
1 [root@Slave01 ~]# service mysqld stop
2 [root@Monitor ~]# mmm_control show
1 [root@Slave01 ~]# service mysqld start
2 [root@Monitor ~]# mmm_control show
十 MMM总结
- Master02节点宕机不影响集群的状态,只是移除了Master02节点的读状态;
- Master01主节点宕机,由Master02主节点接管写角色,Slave01、Slave02指向新Master02主库进行复制,Slave01、Slave02会自动change master到Master02;
- MMM架构需要多个节点、多个IP,对服务器数量有要求;
- 在读写非常繁忙的业务系统下表现不是很稳定,可能会出现复制延时、切换失效等问题;
- MMM方案并不太适应于对数据安全性要求很高,并且读、写繁忙的环境中
MMM双主-双从读写分离部署的更多相关文章
- Mysql + keepalived 实现双主热备读写分离【转】
Mysql + keepalived 实现双主热备读写分离 2013年6月16日frankwong发表评论阅读评论 架构图 系统:CentOS6.4_X86_64软件版本:Mysql-5.6.12 ...
- mycat结合双主复制实现读写分离模式
简介:应用程序仅需要连接mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制. 本次实验环境架构图 服务器主机规划 主机名 IP 功能 备注 lin ...
- Mysql双主加Keepalived+读写分离
一.MySQL于keepalived简介** 前言: 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要 ...
- MySQL自动化安装(双主多从读写分离)
shell #!/bin/bash # Create by # version 1.0 # // # # check out lockfile whether or not exist IsInput ...
- mycat 1.6.6.1安装以及配置docker 安装mysql 5.7.24 双主多从读写分离主主切换
mycat和mysql的高可用参考如下两个图 简介:应用程序仅需要连接HAproxy或者mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制. 服务器 ...
- MySQL集群系列2:通过keepalived实现双主集群读写分离
在上一节基础上,通过添加keepalived实现读写分离. 首先关闭防火墙 安装keepalived keepalived 2台机器都要安装 rpm .el6.x86_64/ 注意上面要替换成你的内核 ...
- 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变
[Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...
- 高可用Mysql架构_Mycat集群部署(HAProxy + 两台Mycat+Mysql双主双从)
既然大家都知道了Mysql分布式在大型网站架构中的作用,在这里就不再阐述.本片博客文章是基于我曾经搭建过的一个Mysql集群基础上实现的,实现过双主热备.读写分离.分库分表. 博客链接:http:// ...
- Centos6.9下RocketMQ3.4.6高可用集群部署记录(双主双从+Nameserver+Console)
之前的文章已对RocketMQ做了详细介绍,这里就不再赘述了,下面是本人在测试和生产环境下RocketMQ3.4.6高可用集群的部署手册,在此分享下: 1) 基础环境 ip地址 主机名 角色 192. ...
- Docker 部署 RocketMQ 双主双从模式( 版本v4.7.0)
文章转载自:http://www.mydlq.club/article/96/ 系统环境: 系统版本:CentOS 7.8 RocketMQ 版本:4.7.0 Docker 版本:19.03.13 一 ...
随机推荐
- java实现自动静默打印功能
最近接到一个需求,要求实现自动打印功能,一般网页打印pdf需要借助浏览器的pdf组件,而且还要弹出打印窗口,再点击打印才能实现. 那么如何实现自动打印了,从点击自己网页上3次缩减到点击一次了? 一 ...
- Java字节码增强技术
简单介绍下几种java字节码增强技术. ASM ASM是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能.ASM可以直接产生class文件,也可以在类被加载入Java虚拟机之前动态 ...
- Python自动化测试面试题-编程篇
目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...
- 18Oracle入门
1 Oracle的服务 Oracle的监听服务:OralceOraDB12Home1TNSListener 需要通过程序链接数据库进行开发的时候,此服务必须打开,如果只是在本机使用,此服务可不启动 O ...
- 为ScrollView增加圆角的三种方式,及自定义属性【在Linearlayout中新增ScrollView支持滚动 后续】
获取圆角的几种方案如下:方案一:通过shape来实现,给scrollView增加背景来实现方案二:通过自定义ScrollView,还要自定义属性,在dispatchDraw中不停的裁剪方案三:用And ...
- Solon 1.5.22 发布
Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...
- i春秋“百度杯”CTF比赛 十月场-Vld(单引号逃逸+报错注入)
题目源代码给出了提示index.php.txt,打开拿到了一段看不太懂得东西. 图片标注的有flag1,flag2,flag3,同时还有三段字符,然后还出现了_GET,脑洞一一点想到访问 ?flag1 ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案
2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...
- SpringBoot开发十六-帖子详情
需求介绍 实现帖子详情,在帖子标题上增加访问详情页面的链接. 代码实现 开发流程: 首先在数据访问层新增一个方法 实现查看帖子的方法 业务层同理增加查询方法 最后在表现层处理查询请求 数据访问层增加根 ...
- iOS-block循环引用详解和应用
Block循环引用 什么情况下block会造成循环引用 ARC 情况下 block为了保证代码块内部对象不被提前释放,会对block中的对象进行强引用,就相当于持有了其中的对象,而如果此时block中 ...