Rhel6-moosefs分布式存储配置文档
MFS 特性:
1. Free(GPL)
2. 通用文件系统,不需要修改上层应用就可以使用
3. 可以在线扩容,体系架构可伸缩性极强。
4. 部署简单。
5. 高可用,可设置任意的文件冗余程度(提供比 raid1+0 更高的冗余级别,而绝对不会影响读或 写的性能,只会加速!)
6. 可回收在指定时间内删除的文件(“回收站”提供的是系统级别的服务,不怕误操作了,提供类 似 oralce 的闪回等高级 dbms 的即时回滚特性!)
7. 提供 netapp,emc,ibm 等商业存储的 snapshot 特性。(可以对整个文件甚至在正在写入的文 件创建文件的快照)
8. google filesystem 的一个 c 实现。
9. 提供 web gui 监控接口。
10. 提高随机读或写的效率。
11. 提高海量小文件的读写效率。
可能的瓶颈:
1.
master 本身的性能瓶颈。mfs
系统 master
存在单点故障如何解决?moosefs+drbd+heartbeat
来保证
master
单点问题?不过在使用过程中不可能完全不关机和间歇性的网络中断!
2.
体系架构存储文件总数的可遇见的上限。(mfs
把文件系统的结构缓存到
master
的内存中,文
件越多,master
的内存消耗越大,8g
对应
2500w
的文件数,2
亿文件就得
64GB
内存
)。
master
服务器
CPU
负载取决于操作的次数,内存的使用取决于文件和文件夹的个数。
MFS
文件系统结构:
包含
4 种角色:
管理服务器
managing server
(master)
元数据日志服务器
Metalogger
server(Metalogger)
数据存储服务器
data servers
(chunkservers)
客户机挂载使用
client
computers
各种角色作用:
1. 管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷 贝。
2. 元数据日志服务器: 负责备份 master 服务器的变化日志文件,文件类型为 changelog_ml.*.mfs,以便于在 master server 出问题的时候接替其进行工作。
3. 数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数 据传输。
4. 客户端: 通过 fuse 内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文 件系统和本地 unix 文件系统使用一样的效果。
MFS 读写原理:
原始的读/写速度很明显是主要取决于所使用的硬盘的性能、网络的容量和拓扑结构的,使用的硬 盘和网络的吞吐量越好,整个系统的性能也就会越好.
系统环境:
rhel6 x86_64 iptables
and selinux disabled
主机:
192.168.122.112 server12.example.com Master server
192.168.122.234 server34.example.com Master server
192.168.122.20 server20.example.com Chunk
servers
192.168.122.205 server5.example.com Chunk
servers
192.168.122.77 server77.example.com Client
所需的包:
mfs-1.6.27.tar.gz
#安装配置Master
server(主控服务器)
以下步骤在server12上实施:
[root@server12
~]# yum install rpm-build -y
[root@server12
~]# rpmbuild -tb mfs-1.6.27.tar.gz
此时会出现如下错误:
(1)error:
Failed build dependencies:
fuse-devel
is needed by mfs-1.6.27-2.x86_64
zlib-devel
is needed by mfs-1.6.27-2.x86_64
(2)configure:
error: no acceptable C compiler found in $PATH
(3)/var/tmp/rpm-tmp.zJWron:
line 47: make: command not found
解决方法如下:
(1)
[root@server12 ~]# yum install fuse-devel zlib-devel -y
(2)
[root@server12 ~]# yum install gcc -y
(3)
[root@server12 ~]# yum install make -y
[root@server12
~]# cd ~/rpmbuild/RPMS/x86_64/
[root@server12
x86_64]# rpm -ivh mfs-master-1.6.27-2.x86_64.rpm
mfs-cgi-1.6.27-2.x86_64.rpm mfs-cgiserv-1.6.27-2.x86_64.rpm
[root@server12
x86_64]# cd /etc/mfs/
[root@server12
mfs]# cp mfsmaster.cfg.dist mfsmaster.cfg
此文件中凡是用#注释掉的变量均使用其默认值,基本不需要就可以工作:
#WORKING_USER
和
WORKING_GROUP:是运行
master server
的用户和组;
#SYSLOG_IDENT:是
master server 在
syslog 中的标识;
#LOCK_MEMORY:是否执行
mlockall()以避免
mfsmaster
进程溢出(默认为
0);
#NICE_LEVE:运行的优先级(如果可以默认是
-19; 注意:
进程必须是用
root 启动);
#EXPORTS_FILENAME:被挂接目录及其权限控制文件的存放位置
#TOPOLOGY_FILENAME
: 定义
MFS 网络拓扑结构的文件位置
#DATA_PATH:数据存放路径,此目录下大致有三类文件,changelog,sessions
和
stats;
#BACK_LOGS:metadata
的改变
log 文件数目(默认是
50);
#BACK_META_KEEP_PREVIOUS:保存以前
mfs
元数据的文件数,默认值是
1;
#REPLICATIONS_DELAY_INIT:延迟复制的时间(默认是
300s);
#REPLICATIONS_DELAY_DISCONNECT:chunkserver
断开的复制延迟(默认是
3600);
#
MATOML_LISTEN_HOST:metalogger 监听的
IP 地址(默认是*,代表任何
IP);
#
MATOML_LISTEN_PORT:metalogger 监听的端口地址(默认是
9419);
#
MATOCS_LISTEN_HOST:用于
chunkserver 连接的
IP 地址(默认是*,代表任何
IP);
#
MATOCS_LISTEN_PORT:用于
chunkserver
连接的端口地址(默认是
9420);
#
MATOCU_LISTEN_HOST/MATOCL_LISTEN_HOST:用于客户端挂接连接的
IP 地址(默认是*,
代表任何
IP);
#
MATOCU_LISTEN_PORT/MATOCL_LISTEN_PORT:用于客户端挂接连接的端口地址(默认
是
9421);
#CHUNKS_LOOP_CPS:chunks
的回环每秒检查的块最大值,默认
100000;
#
CHUNKS_LOOP_TIME :chunks 的回环频率(默认是:300
秒);
#
CHUNKS_SOFT_DEL_LIMIT :一个
chunkserver
中可以删除
chunks 的最大数,软限
(默认:
10)
#CHUNKS_HARD_DEL_LIMIT:一个
chunkserver
中可以删除
chunks 的最大数,硬限
(默认:
25)
#
REPLICATIONS_DELAY_DISCONNECT:chunkserver 断开后的复制延时(默认:3600
秒)
#
CHUNKS_WRITE_REP_LIMIT:在一个循环里复制到一个
chunkserver 的最大
chunk 数目(默
认是
2)
#
CHUNKS_READ_REP_LIMIT :在一个循环里从一个
chunkserver
复制的最大
chunk 数目(默
认是
10)
#
REJECT_OLD_CLIENTS:弹出低于
1.6.0 的客户端挂接(0
或
1,默认是
0)
#
deprecated:
#
CHUNKS_DEL_LIMIT - use CHUNKS_SOFT_DEL_LIMIT instead
#
LOCK_FILE - lock system has been changed, and this option is used
only to search for old
lockfile
[root@server12
mfs]# cp mfsexports.cfg.dist mfsexports.cfg
该文件每一个条目分为三部分:
第一部分:客户端的
ip 地址
第二部分:被挂接的目录
第三部分:客户端拥有的权限
地址可以指定的几种表现形式:
*
所有的
ip 地址
A.B.C.D
单个
ip 地址
A.B.C.D/BITS
IP 网络地址/位数掩码
A.B.C.D/E.F.G.H
IP 网络地址/子网掩码
A.B.C.D-E.F.G.H
IP 地址范围
目录部分需要注意两点:
/
标识
MooseFS 根;
.
表示
MFSMETA 文件系统
权限部分:
ro
只读模式共享
rw
读写方式共享
alldirs
许挂载任何指定的子目录
maproot
映射为
root,还是指定的用户
password
指定验证密码,客户端挂载时使用
[root@server12
mfs]# cp mfstopology.cfg.dist mfstopology.cfg
[root@server12
mfs]# chown nobody.nobody /var/lib/mfs/ -R
[root@server12
mfs]# cd /var/lib/mfs/
[root@server12
mfs]# cp -a metadata.mfs.empty metadata.mfs
[root@server12
mfs]# mfsmaster (注:关闭为mfsmaster
stop)
working
directory: /var/lib/mfs
lockfile
created and locked
initializing
mfsmaster modules ...
loading
sessions ... file not found
if
it is not fresh installation then you have to restart all active
mounts !!!
exports
file has been loaded
mfstopology:
incomplete definition in line: 7
mfstopology:
incomplete definition in line: 7
mfstopology:
incomplete definition in line: 22
mfstopology:
incomplete definition in line: 22
mfstopology:
incomplete definition in line: 28
mfstopology:
incomplete definition in line: 28
topology
file has been loaded
loading
metadata ...
create
new empty filesystemmetadata file has been loaded
no
charts data file - initializing empty charts
master
<-> metaloggers module: listen on *:9419
master
<-> chunkservers module: listen on *:9420
main
master server module: listen on *:9421
mfsmaster
daemon initialized properly
注:出现类似如上输出说明成功.
此时进入/var/lib/mfs
可以看到
moosefs 所产生的数据:
.mfsmaster.lock
文件记录正在运行的
mfsmaster 的主进程
metadata.mfs,
metadata.mfs.back MooseFS 文件系统的元数据
metadata 的镜像
changelog.*.mfs
是
MooseFS
文件系统元数据的改变日志(每一个小时合并到
metadata.mfs
中一次)
Metadata
文件的大小是取决于文件数的多少(而不是他们的大小)。changelog
日志的大小是取决
于每小时操作的数目,但是这个时间长度(默认是按小时)是可配置的。
#启动CGI监控服务
[root@server12
mfs]# cd /usr/share/mfscgi/
[root@server12
mfscgi]# chmod +x *.cgi
[root@server12
mfscgi]# mfscgiserv
lockfile
created and locked
starting
simple cgi server (host:
any , port: 9425 , rootpath: /usr/share/mfscgi)
看到如下页面说明配置成功
#安装配置Chunk servers(存储块服务器)
以下步骤在server12上实施:
[root@server12 ~]# cd ~/rpmbuild/RPMS/x86_64/
[root@server12 x86_64]# scp mfs-chunkserver-1.6.27-2.x86_64.rpm root@192.168.122.20:/root/
[root@server12 x86_64]# scp mfs-chunkserver-1.6.27-2.x86_64.rpm root@192.168.122.205:/root/
以下步骤在server20和server5上实施:
[root@server20
~]# rpm -ivh mfs-chunkserver-1.6.27-2.x86_64.rpm
[root@server20
~]# cd /etc/mfs/
[root@server20
mfs]# cp mfschunkserver.cfg.dist mfschunkserver.cfg
#
WORKING_USER = nobody
#
WORKING_GROUP =
#
SYSLOG_IDENT = mfschunkserver
#
LOCK_MEMORY = 0
#
NICE_LEVEL = -19
#
DATA_PATH = /var/lib/mfs
#
MASTER_RECONNECTION_DELAY = 5:在失去连接之后延迟多少秒重新连接
master
#
BIND_HOST = *:本地地址用于连接
mfsmaster(默认值是*,即默认的本地地址)
#
MASTER_HOST = mfsmaster:master 服务器的主机名或是
ip 地址。
#
MASTER_PORT = 9420
#
MASTER_TIMEOUT = 60
#
CSSERV_LISTEN_HOST = *:允许挂载的客户端连接的
IP 地址(*允许全部)
#
CSSERV_LISTEN_PORT = 9422:允许挂载的客户端连接的端口
#
HDD_CONF_FILENAME = /etc/mfshdd.cfg:分配给
MFS
使用的磁盘空间配置文件的位置
#
HDD_TEST_FREQ = 10:块的测试期(单位为秒)
#
deprecated, to be removed in MooseFS 1.7
#
LOCK_FILE = /var/run/mfs/mfschunkserver.lock
#
BACK_LOGS = 50
#
CSSERV_TIMEOUT = 5
[root@server20
mfs]# cp mfshdd.cfg.dist mfshdd.cfg
[root@server20
mfs]# vim mfschunkserver.cfg
MASTER_HOST
= 192.168.122.112
(此处填写Master的IP,或直接在/etc/hosts中写解析即可)
[root@server20
mfs]# vim mfshdd.cfg
/mnt/chunk1
#定义mfs共享点
[root@server20
mfs]# mkdir /var/lib/mfs
[root@server20
mfs]# mkdir /mnt/chunk1
[root@server20
mfs]# chown nobody.nobody /var/lib/mfs/ /mnt/chunk1/ -R
[root@server20
mfs]# mfschunkserver (注:关闭为mfschunkserver
stop)
working
directory: /var/lib/mfs
lockfile
created and locked
initializing
mfschunkserver modules ...
hdd
space manager: path to scan: /mnt/chunk1/
hdd
space manager: start background hdd scanning (searching for available
chunks)
main
server module: listen on *:9422
no
charts data file - initializing empty charts
mfschunkserver
daemon initialized properly
注:出现类似如上输出说明启动成功!
并点击Servers和Disks可以看到如下页面:
#安装配置Client(客户端)
以下步骤在server12上实施:
[root@server12 ~]# cd ~/rpmbuild/RPMS/x86_64/
[root@server12 x86_64]# scp mfs-client-1.6.27-2.x86_64.rpm root@192.168.122.77:/root/
以下步骤在server77上实施:
[root@server77
~]# yum localinstall mfs-client-1.6.27-2.x86_64.rpm -y
[root@server77
~]# cd /etc/mfs/
[root@server77
mfs]# cp mfsmount.cfg.dist mfsmount.cfg
[root@server77
mfs]# vim mfsmount.cfg #定义客户端默认挂载
/mnt/mfs
mfsmaster=192.168.122.112
[root@server77
mfs]# mkdir /mnt/mfs
[root@server77
mfs]# mfsmount
mfsmaster
accepted connection with parameters: read-write,restricted_ip ; root
mapped to root:root
注:出现类似如上输出说明并且df
-h可查看到类似如下内容则说明成功:
192.168.122.112:9421
6.4G 320K 6.4G 1% /mnt/mfs
并点击Mounts可以看到如下页面:
测试:进入到/mnt/mfs中,建立dir1和dir2两个目录,执行mfssetgoal -r 2 dir2/,然后随意的往dir1和dir2中写入数据(例如:创建文件),然后分别mfsfileinfo查看两个录入中的文件,会发现dir1中的文件只保存一份,而dir2中的文件保存了两份.
相关命令:
mfsgetgoal dir2/ #查看dir2中文件存储份数
mfssetgoal
-r 2 dir2/ #设置在dir2
中文件存储份数为两个,默认是一个
对一个目录设定“goal”,此目录下的新创建文件和子目录均会继承此目录的设定,但不会改变已
经存在的文件及目录的 copy
份数.但使用-r
选项可以更改已经存在的
copy 份数.
mfsfileinfo
passwd #查看文件信息
附:
1.当在写入的时候master
server挂掉了,如何重新启动
以下步骤在server12上实施:
[root@server12
~]# mfsmetarestore
[root@server12
~]# mfsmaster
2.恢复误删文件
假设误删了dir2中的fstab文件
以下步骤在server77上实施:
[root@server77
mfs]# mfsgettrashtime dir1/
dir1/:
86400
文件删除后存放在“
垃圾箱”中的时间称为隔离时间,
这个时间可以用
mfsgettrashtime
命令来查
看,用
mfssettrashtime
命令来设置,单位为秒,默认为
86400
秒。
[root@server77
mfs]# mkdir /mnt/mfsmeta
[root@server77
mfs]# mfsmount -m /mnt/mfsmeta/ -H 192.168.122.112
mfsmaster
accepted connection with parameters: read-write,restricted_ip
注:此处用df
-h查看不到是否已经挂载,可直接进入挂载点/mnt/mfsmeta/看是否有reserved和trash两个目录,有的话即挂载成功.
挂载
MFSMETA
文件系统,它包含目录
trash
(包含仍然可以被还原的删除文件的信息)和
trash/undel
(用于获取文件)。
[root@server77
mfs]# cd /mnt/mfsmeta/trash/
[root@server77
trash]# mv 00000009\|dir2\|fstab undel/
将要恢复的文件直接移入undel中即可恢复误删的文件.
注:在
MFSMETA
的目录里,除了
trash
和
trash/undel
两个目录,还有第三个目录reserved,该目
录内有已经删除的文件,但却被其他用户一直打开着。在用户关闭了这些被打开的文件后,
reserved 目录中的文件将被删除,文件的数据也将被立即删除。此目录不能进行操作
#Master
server的热备
(iscsi+corosync+pacemaker)
此处省略对iscsi的配置
corosync和pacemaker的安装可以参照文档Rhel6-pacemaker+drbd.pdf
#配置iscsi
要将/var/lib/mfs/中的所有文件复制到通过iscsi分享出来的磁盘中,并注意所有文件的所属主和组均必须为nobody.
#配置corosync
以下步骤server12和server34上实施:
[root@server12
~]# vim /etc/corosync/corosync.conf
#
Please read the corosync.conf.5 manual page
compatibility:
whitetank
totem
{
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 192.168.122.0
mcastaddr: 226.94.1.1
mcastport: 5405
ttl: 1
}
}
logging
{
fileline: off
to_stderr: yes
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf
{
mode: disabled
}
service
{
ver: 0
name: pacemaker
use_mgmtd: yes
}
#mfs启动脚本
[root@server12
~]# vim /etc/init.d/mfsd
#!/bin/bash
#
#
Init file for the MooseFS master service
#
#
chkconfig: - 92 84
#
#
description: MooseFS master
#
#
processname: mfsmaster
#
Source function library.
#
Source networking configuration.
.
/etc/init.d/functions
.
/etc/sysconfig/network
#
Source initialization configuration.
#
Check that networking is up.
[
"${NETWORKING}" == "no" ] && exit 0
[
-x "/usr/sbin/mfsmaster" ] ||
exit 1
[
-r "/etc/mfs/mfsmaster.cfg" ]
|| exit 1
[
-r "/etc/mfs/mfsexports.cfg" ]
|| exit 1
RETVAL=0
prog="mfsmaster"
datadir="/var/lib/mfs"
mfsbin="/usr/sbin/mfsmaster"
mfsrestore="/usr/sbin/mfsmetarestore"
start
() {
echo
-n $"Starting $prog: "
$mfsbin
start >/dev/null 2>&1
if
[ $? -ne 0 ];then
$mfsrestore
-a >/dev/null 2>&1 && $mfsbin start >/dev/null
2>&1
fi
RETVAL=$?
echo
return
$RETVAL
}
stop
() {
echo
-n $"Stopping $prog: "
$mfsbin
-s >/dev/null 2>&1 || killall -9 $prog #>/dev/null 2>&1
RETVAL=$?
echo
return
$RETVAL
}
restart
() {
stop
start
}
reload
() {
echo
-n $"reload $prog: "
$mfsbin
reload >/dev/null 2>&1
RETVAL=$?
echo
return
$RETVAL
}
restore
() {
echo
-n $"restore $prog: "
$mfsrestore
-a >/dev/null 2>&1
RETVAL=$?
echo
return
$RETVAL
}
case
"$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
restore)
restore
;;
status)
status
$prog
RETVAL=$?
;;
*)
echo
$"Usage: $0 {start|stop|restart|reload|restore|status}"
RETVAL=1
esac
exit
$RETVAL
#配置pacemaker
以下步骤在server12或server34上实施:
[root@server12
~]# crm
crm(live)#
configure
crm(live)configure#
primitive vip ocf:heartbeat:IPaddr2 params ip=192.168.122.2
cidr_netmask=32 op monitor interval=30s
crm(live)configure#
property no-quorum-policy=ignore
crm(live)configure#
primitive mfsdata ocf:heartbeat:Filesystem params device=/dev/sda1
directory=/var/lib/mfs fstype=ext4
crm(live)configure#
primitive mfsmaster lsb:mfsd op monitor interval=1min
crm(live)configure#
location masternode vip 10: server12.example.com
crm(live)configure#
order mfsmaster-after-mfsdata inf: mfsdata mfsmaster
crm(live)configure#
group mfs vip mfsdata mfsmaster
crm(live)configure#
order mfsmaster-after-mfsdata inf: mfsdata mfsmaster
crm(live)configure#
commit
crm(live)configure#
quit
注:存储块服务器(Chunk
server)/etc/mfs/mfschunkserver.cfg中的MASTER_HOST选项和客户端(client)/etc/mfs/mfsmount.cfg中的mfsmaster选项均指向虚拟IP地址,并重启存储块服务器(通过mfschunkserver
stop和mfschunkserver)
Rhel6-moosefs分布式存储配置文档的更多相关文章
- hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
本文档主要内容有: 1.hadoop 2.2.0 集群安装与部署 2.HBase 0.96 集群安装与部署 3.Zookeeper 3.4.5集群安装部署 备注:安装文档可能有所遗漏,后续将持续更新. ...
- airflow2.0.2分布式安装文档
需要安装的组件 组件 功能 Airflow Webserver 查询元数据以监控和执行DAGs的web界面. Airflow Scheduler 它检查元数据数据库中的DAG和任务的状态,在必要时创建 ...
- Citus 11(分布式 PostgreSQL) 文档贡献与本地运行
Citus 可以使用分片跨多台计算机来水平缩放查询. 其查询引擎会将这些服务器的传入 SQL 查询并行化,加快大型数据集上的响应. 它为需要比其他部署选项更大规模和更高性能的应用程序提供服务:通常,工 ...
- Rhel6-DM多路经存储配置文档
系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 主机 网卡 软件 server21.example.com eth0:192.168.122. ...
- 【转】Jmeter分布式部署文档
很多时候,我们测试时,如果进行大数据量的并发测试时,单个电脑的CPU和内存可能无法承受,这个时候,我们需要进行一个分布式的测试,比如10000个并发,使用三台电脑来进行并发,Jmeter提供了这种功能 ...
- springcloud+zuul+swagger 分布式接口文档
https://gitee.com/didispace/swagger-butler 1.引用上面项目中的swagger 工具包 2.zuul 网关配置 zuul.routes.api-apiserv ...
- RHEL6.2的安装文档
1 Installing RHEL 6.2 1.1 开始安装 选择“Install or upgrade an existing system”: 1.2 光盘检测 选择“Skip”跳过安装介质的检查 ...
- Greenplum/Deepgreen(集群/分布式)安装文档
Deepgreen分布式安装文档 环境准备 1.安装VMware虚拟机软件,然后在VMware安装三台Linux虚拟机(使用centos7版本) 2.使用的虚拟机如下: 192.168.136.155 ...
- Elasticsearch配置详解、文档元数据
目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch配置文件详解 a. 在上面博客中,我们已经安装并且成功 ...
随机推荐
- python 清楚数组重复字符串元素
l1 = ['bb','c','d','bb','c','a','a'] l2 = {}.fromkeys(l1).keys() print (l2)
- RobotFrameWork http/https oauth接口测试 (二)
在RobotFrameWork http/https oauth接口测试 (一)中,大致介绍了相关的概念,终于可以步入正题了~~~ 先介绍下项目背景: 公司的项目采用的授权模式是第三种resource ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数·简明中文手册 总览
<zw版·Halcon-delphi系列原创教程> Halcon分类函数·简明中文手册 总览 Halcon函数库非常庞大,光HALCONXLib_TLB.pas文件,源码就要7w多行,但核 ...
- mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...
总结写在前面, 总结: 当Java通过jdbc链接mysql插入中文时,要保证程序可以正常执行,而且插入的中文不会乱码, mysql服务器端,对数据表(不是数据库)的编码设置,要保证是支持中文的,例如 ...
- 提高mysql插入性能
参考地址:http://blog.jobbole.com/29432/ 参数优化: 1. SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_p ...
- Android中插件开发篇之----应用换肤原理解析
一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转 ...
- 参考:(Java Selenium)Element is not visible to clcik
1.The element is not visible to click. Use Actions or JavascriptExecutor for making it to click. By ...
- 第 十一 天 Flagmeng 和动画
1.flagment 的使用,生命周期. 传递数据. 2. 基本动画的使用. 3. 对话框的使用. 4.样式和主题.
- Oracle的多表查询
多表查询概念: 所谓多表查询,又称表联合查询,即一条语句涉及到的表有多张,数据通过特定的连接进行联合显示. 基本语法: select column_name,.... from table1,tabl ...
- hosts代理
hosts代理文件:C:\Windows\System32\drivers\etc\HOSTS 内容如下: # Copyright (c) -, racaljk. # https://github.c ...