搜索词>>group by 耗时0.0030
  • Mysql Group By 多个字段

    表数据准备Table: Subject_Selection ​ Subject   Semester   Attendee --------------------------------- ITB001   1         Joh表数据准备Table: Subject_Selection ​ Subject   Semester   Attendee --------------------------------- ITB001   1         John ITB001   1         Bob ITB001   1         Mickey ITB001   2         Jenny ITB001   2         James MKB114   1         John MKB114   1         Erica计每门课程有多少个学生报名应用如下SQL:SELECT Subject, Count(*) FROM Subject_Selection GROUP BY Subject 得到结果:Subject   Count ------------------------------ ITB001     5 MKB114     2表里记录了有5个学生选择ITB001,2个学生选择了MKB114。产生这个结果的原因是:GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里。那么GROUP BY X, Y呢? GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。下面再接着要求统计出每门学科每个学期有多少人选择SQL:SELECT Subject, Semester, Count(*) FROM Subject_Selection GROUP BY Subject, Semester上面SQL的意思是,对Subject_Selection表中的数据进行分组,将具有相同Subject和Semester字段值的记录放到同一个分组里去, 然后对每个分组中的数据应用聚合函数(COUNT,SUM, AVG,etc)。得到的结果是:Subject   Semester   Count ------------------------------ ITB001     1         3 ITB001     2         2 MKB114     1         2从表中的记录我们可以看出这个分组结果是正确的有3个学生在第一学期选择了ITB001, 2个学生在第二学期选择了ITB001,还有两个学生在第一学期选择了MKB114, 没人在第二学期选择MKB114。
  • svn: E165001: Commit blocked by pre-commit hook

    Java编程中,svn提交代码报错svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:解决方法Java编程中,svn提交代码报错<br /> svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:<br /> <br /> 导致问题的原因<br /> comment内容太少<br /> <br /> <br /> 解决办法:comment内容多写点儿。就是提交svn的备注内容写多点儿就搞定。
  • 解决centos系统使用yum安装nginx启动时报错

    [::]:80 failed (97: Address family not supported by protocol)<span style="font-family:微软雅黑">解决centos系统使用yum安装nginx启动时报错[::]:80 failed (97: Address family not supported by protocol)<br /> <br /> 一般默认的使用yum安装的nginx的配置文件位于</span> <pre> <code>/etc/nginx/</code></pre> <span style="font-family:微软雅黑">开始处理问题:<br /> 1.切换至目录:/etc/nginx/conf.d</span> <pre> <code class="language-bash">cd /etc/nginx/conf.d</code></pre> <span style="font-family:微软雅黑">2.编辑默认配置文件:default.conf</span> <pre> <code class="language-bash">vi default.conf </code></pre> 3.注释掉: listen       [::]80 default_server; <pre> <code class="language-bash">#listen [::]80 default_server;</code></pre> <img alt="注释掉: listen       [::]80 default_server;" class="img-thumbnail" src="/assist/images/blog/a4ebeca5-4561-445d-a71f-58cd95c9bdbd.png" style="height:457px; width:618px" title="注释掉: listen       [::]80 default_server;" /><br /> <span style="font-family:微软雅黑"><strong><span style="color:#FF0000">注意操作需要root权限</span></strong></span>
  • FastDFS配置文件详细说明

    FastDFS配置文件详细说明<h2>一、tracker.conf</h2> <pre> <code># 这个配置文件是否无效,false表示有效 # is this config file disabled # false for enabled # true for disabled disabled=false # 是否绑定IP # bind_addr= 后面为绑定的IP地址 (常用于服务器有多个IP但只希望一个IP提供服务)。如果不填则表示所有的(一般不填就OK) # bind an address of this host # empty for bind all addresses of this host bind_addr= # 提供服务的端口 # the tracker server port port=22122 # 连接超时时间,针对socket套接字函数connect # connect timeout in seconds # default value is 30s connect_timeout=30 # tracker server的网络超时,单位为秒。发送或接收数据时,如果在超时时间后还不能发送或接收数据,则本次网络通信失败 # network timeout in seconds # default value is 30s network_timeout=60 # the base path to store data and log files base_path=/home/yuqing/fastdfs # base_path 目录地址(根目录必须存在,子目录会自动创建) # 附目录说明: # tracker server目录及文件结构: # ${base_path} # |__data # | |__storage_groups.dat:存储分组信息 # | |__storage_servers.dat:存储服务器列表 # |__logs # |__trackerd.log:tracker server日志文件 #数据文件storage_groups.dat和storage_servers.dat中的记录之间以换行符(\n)分隔,字段之间以西文逗号(,)分隔。 #storage_groups.dat中的字段依次为: # 1. group_name:组名 # 2. storage_port:storage server端口号 #storage_servers.dat中记录storage server相关信息,字段依次为: # 1. group_name:所属组名 # 2. ip_addr:ip地址 # 3. status:状态 # 4. sync_src_ip_addr:向该storage server同步已有数据文件的源服务器 # 5. sync_until_timestamp:同步已有数据文件的截至时间(UNIX时间戳) # 6. stat.total_upload_count:上传文件次数 # 7. stat.success_upload_count:成功上传文件次数 # 8. stat.total_set_meta_count:更改meta data次数 # 9. stat.success_set_meta_count:成功更改meta data次数 # 10. stat.total_delete_count:删除文件次数 # 11. stat.success_delete_count:成功删除文件次数 # 12. stat.total_download_count:下载文件次数 # 13. stat.success_download_count:成功下载文件次数 # 14. stat.total_get_meta_count:获取meta data次数 # 15. stat.success_get_meta_count:成功获取meta data次数 # 16. stat.last_source_update:最近一次源头更新时间(更新操作来自客户端) # 17. stat.last_sync_update:最近一次同步更新时间(更新操作来自其他storage server的同步) # 系统提供服务时的最大连接数。对于V1.x,因一个连接由一个线程服务,也就是工作线程数。 # 对于V2.x,最大连接数和工作线程数没有任何关系 # max concurrent connections this server supported max_connections=256 # work thread count, should <= max_connections # default value is 4 # since V2.00 # V2.0引入的这个参数,工作线程数,通常设置为CPU数 work_threads=4 # 上传组(卷) 的方式 0:轮询方式 1: 指定组 2: 平衡负载(选择最大剩余空间的组(卷)上传) # 这里如果在应用层指定了上传到一个固定组,那么这个参数被绕过 # the method of selecting group to upload files # 0: round robin # 1: specify group # 2: load balance, select the max free space group to upload file store_lookup=2 # 当上一个参数设定为1 时 (store_lookup=1,即指定组名时),必须设置本参数为系统中存在的一个组名。如果选择其他的上传方式,这个参数就没有效了 # which group to upload file # when store_lookup set to 1, must set store_group to the group name store_group=group2 # 选择哪个storage server 进行上传操作(一个文件被上传后,这个storage server就相当于这个文件的storage server源,会对同组的storage server推送这个文件达到同步效果) # 0: 轮询方式 # 1: 根据ip 地址进行排序选择第一个服务器(IP地址最小者) # 2: 根据优先级进行排序(上传优先级由storage server来设置,参数名为upload_priority) # which storage server to upload file # 0: round robin (default) # 1: the first server order by ip address # 2: the first server order by priority (the minimal) store_server=0 # 选择storage server 中的哪个目录进行上传。storage server可以有多个存放文件的base path(可以理解为多个磁盘)。 # 0: 轮流方式,多个目录依次存放文件 # 2: 选择剩余空间最大的目录存放文件(注意:剩余磁盘空间是动态的,因此存储到的目录或磁盘可能也是变化的) # which path(means disk or mount point) of the storage server to upload file # 0: round robin # 2: load balance, select the max free space path to upload file store_path=0 # 选择哪个 storage server 作为下载服务器 # 0: 轮询方式,可以下载当前文件的任一storage server # 1: 哪个为源storage server 就用哪一个 (前面说过了这个storage server源 是怎样产生的) 就是之前上传到哪个storage server服务器就是哪个了 # which storage server to download file # 0: round robin (default) # 1: the source storage server which the current file uploaded to download_server=0 # storage server 上保留的空间,保证系统或其他应用需求空间。可以用绝对值或者百分比(V4开始支持百分比方式)。 #(指出 如果同组的服务器的硬盘大小一样,以最小的为准,也就是只要同组中有一台服务器达到这个标准了,这个标准就生效,原因就是因为他们进行备份) # reserved storage space for system or other applications. # if the free(available) space of any stoarge server in # a group <= reserved_storage_space, # no file can be uploaded to this group. # bytes unit can be one of follows: ### G or g for gigabyte(GB) ### M or m for megabyte(MB) ### K or k for kilobyte(KB) ### no unit for byte(B) ### XX.XX% as ratio such as reserved_storage_space = 10% reserved_storage_space = 10% # 选择日志级别 #standard log level as syslog, case insensitive, value list: ### emerg for emergency ### alert ### crit for critical ### error ### warn for warning ### notice ### info ### debug log_level=info # 操作系统运行FastDFS的用户组 (不填 就是当前用户组,哪个启动进程就是哪个) #unix group name to run this program, #not set (empty) means run by the group of current user run_by_group= # 操作系统运行FastDFS的用户 (不填 就是当前用户,哪个启动进程就是哪个) #unix username to run this program, #not set (empty) means run by current user run_by_user= # 可以连接到此 tracker server 的ip范围(对所有类型的连接都有影响,包括客户端,storage server) # allow_hosts can ocur more than once, host can be hostname or ip address, # "*" means match all ip addresses, can use range like this: 10.0.1.[1-15,20] or # host[01-08,20-25].domain.com, for example: # allow_hosts=10.0.1.[1-15,20] # allow_hosts=host[01-08,20-25].domain.com allow_hosts=* # 同步或刷新日志信息到硬盘的时间间隔,单位为秒 # 注意:tracker server 的日志不是时时写硬盘的,而是先写内存 # sync log buff to disk every interval seconds # default value is 10 seconds sync_log_buff_interval = 10 # 检测 storage server 存活的时间隔,单位为秒。 # storage server定期向tracker server 发心跳,如果tracker server在一个check_active_interval内还没有收到storage server的一次心跳,那边将认为该storage server已经下线。所以本参数值必须大于storage server配置的心跳时间间隔。通常配置为storage server心跳时间间隔的2倍或3倍 # check storage server alive interval seconds check_active_interval = 120 # 线程栈的大小。FastDFS server端采用了线程方式。tracker server线程栈不应小于64KB # 线程栈越大,一个线程占用的系统资源就越多。如果要启动更多的线程(V1.x对应的参数为max_connections, V2.0为work_threads),可以适当降低本参数值 # thread stack size, should >= 64KB # default value is 64KB thread_stack_size = 64KB # 这个参数控制当storage server IP地址改变时,集群是否自动调整。注:只有在storage server进程重启时才完成自动调整 # auto adjust when the ip address of the storage server changed # default value is true storage_ip_changed_auto_adjust = true # V2.0引入的参数。存储服务器之间同步文件的最大延迟时间,缺省为1天。根据实际情况进行调整 # 注:本参数并不影响文件同步过程。本参数仅在下载文件时,判断文件是否已经被同步完成的一个阀值(经验值) # storage sync file max delay seconds # default value is 86400 seconds (one day) # since V2.00 storage_sync_file_max_delay = 86400 # V2.0引入的参数。存储服务器同步一个文件需要消耗的最大时间,缺省为300s,即5分钟。 # 注:本参数并不影响文件同步过程。本参数仅在下载文件时,作为判断当前文件是否被同步完成的一个阀值(经验值) # the max time of storage sync a file # default value is 300 seconds # since V2.00 storage_sync_file_max_time = 300 # V3.0引入的参数。是否使用小文件合并存储特性,缺省是关闭的 # if use a trunk file to store several small files # default value is false # since V3.00 use_trunk_file = false # V3.0引入的参数。 # trunk file分配的最小字节数。比如文件只有16个字节,系统也会分配slot_min_size个字节 # the min slot size, should <= 4KB # default value is 256 bytes # since V3.00 slot_min_size = 256 # V3.0引入的参数。 # 只有文件大小<=这个参数值的文件,才会合并存储。如果一个文件的大小大于这个参数值,将直接保存到一个文件中(即不采用合并存储方式)。 # the max slot size, should > slot_min_size # store the upload file to trunk file when it's size <= this value # default value is 16MB # since V3.00 slot_max_size = 16MB # V3.0引入的参数。 # 合并存储的trunk file大小,至少4MB,缺省值是64MB。不建议设置得过大 # the trunk file size, should >= 4MB # default value is 64MB # since V3.00 trunk_file_size = 64MB # 是否提前创建trunk file。只有当这个参数为true,下面3个以trunk_create_file_打头的参数才有效 # if create trunk file advancely # default value is false # since V3.06 trunk_create_file_advance = false # 提前创建trunk file的起始时间点(基准时间),02:00表示第一次创建的时间点是凌晨2点 # the time base to create trunk file # the time format: HH:MM # default value is 02:00 # since V3.06 trunk_create_file_time_base = 02:00 # 创建trunk file的时间间隔,单位为秒。如果每天只提前创建一次,则设置为86400 # the interval of create trunk file, unit: second # default value is 38400 (one day) # since V3.06 trunk_create_file_interval = 86400 # 提前创建trunk file时,需要达到的空闲trunk大小 # 比如本参数为20G,而当前空闲trunk为4GB,那么只需要创建16GB的trunk file即可 # the threshold to create trunk file # when the free trunk file size less than the threshold, will create # the trunk files # default value is 0 # since V3.06 trunk_create_file_space_threshold = 20G # trunk初始化时,是否检查可用空间是否被占用 # if check trunk space occupying when loading trunk free spaces # the occupied spaces will be ignored # default value is false # since V3.09 # NOTICE: set this parameter to true will slow the loading of trunk spaces # when startup. you should set this parameter to true when neccessary. trunk_init_check_occupying = false # 是否无条件从trunk binlog中加载trunk可用空间信息 # FastDFS缺省是从快照文件storage_trunk.dat中加载trunk可用空间, # 该文件的第一行记录的是trunk binlog的offset,然后从binlog的offset开始加载 # if ignore storage_trunk.dat, reload from trunk binlog # default value is false # since V3.10 # set to true once for version upgrade when your version less than V3.10 trunk_init_reload_from_binlog = false # 是否使用server ID作为storage server标识 # if use storage ID instead of IP address # default value is false # since V4.00 use_storage_id = false # use_storage_id 设置为true,才需要设置本参数 # 在文件中设置组名、server ID和对应的IP地址,参见源码目录下的配置示例:conf/storage_ids.conf # specify storage ids filename, can use relative or absolute path # since V4.00 storage_ids_filename = storage_ids.conf #文件名中的id类型,有ip和id两种,只有当use_storage_id设置为true时该参数才有效 # id type of the storage server in the filename, values are: ## ip: the ip address of the storage server ## id: the server id of the storage server # this paramter is valid only when use_storage_id set to true # default value is ip # since V4.03 id_type_in_filename = ip # 存储从文件是否采用symbol link(符号链接)方式 # 如果设置为true,一个从文件将占用两个文件:原始文件及指向它的符号链接 # if store slave file use symbol link # default value is false # since V4.01 store_slave_file_use_link = false # 是否定期轮转error log,目前仅支持一天轮转一次 # if rotate the error log every day # default value is false # since V4.02 rotate_error_log = false # error log定期轮转的时间点,只有当rotate_error_log设置为true时有效 # rotate error log time base, time format: Hour:Minute # Hour from 0 to 23, Minute from 0 to 59 # default value is 00:00 # since V4.02 error_log_rotate_time=00:00 # error log按大小轮转 # 设置为0表示不按文件大小轮转,否则当error log达到该大小,就会轮转到新文件中 # rotate error log when the log file exceeds this size # 0 means never rotates log file by log file size # default value is 0 # since V4.02 rotate_error_log_size = 0 # 是否使用连接池 # if use connection pool # default value is false # since V4.05 use_connection_pool = false # 如果一个连接的空闲时间超过这个值将会被自动关闭 # connections whose the idle time exceeds this time will be closed # unit: second # default value is 3600 # since V4.05 connection_pool_max_idle_time = 3600 # 用于提供http服务的端口 # HTTP port on this tracker server http.server_port=8080 # 检查http server是否还在工作的时间间隔,如果该值小于0则永远不检查 # check storage HTTP server alive interval seconds # <= 0 for never check # default value is 30 http.check_alive_interval=30 # 检查http server是否存活的类型,有tcp和http两种 # tcp方式只有http端口被连接 # http方式检查必须返回状态值200 # check storage HTTP server alive type, values are: # tcp : connect to the storge server with HTTP port only, # do not request and get response # http: storage check alive url must return http status 200 # default value is tcp http.check_alive_type=tcp # check storage HTTP server alive uri/url # NOTE: storage embed HTTP server support uri: /status.html http.check_alive_uri=/status.html</code></pre> <h2>二、storage.conf</h2> <pre> <code># 这个配置文件是否无效,false表示有效 # is this config file disabled # false for enabled # true for disabled disabled=false # 指定 此 storage server 所在组(卷) # the name of the group this storage server belongs to group_name=group1 # 是否绑定IP # bind_addr= 后面为绑定的IP地址 (常用于服务器有多个IP但只希望一个IP提供服务)。如果不填则表示所有的(一般不填就OK) # bind an address of this host # empty for bind all addresses of this host bind_addr= # bind_addr通常是针对server的。当指定bind_addr时,本参数才有效。 # 本storage server作为client连接其他服务器(如tracker server、其他storage server),是否绑定bind_addr。 # if bind an address of this host when connect to other servers # (this storage server as a client) # true for binding the address configed by above parameter: "bind_addr" # false for binding any address of this host client_bind=true # storage server服务端口 # the storage server port port=23000 # 连接超时时间,针对socket套接字函数connect # connect timeout in seconds # default value is 30s connect_timeout=30 # storage server 网络超时时间,单位为秒。发送或接收数据时,如果在超时时间后还不能发送或接收数据,则本次网络通信失败。 # network timeout in seconds # default value is 30s network_timeout=60 # 心跳间隔时间,单位为秒 (这里是指主动向tracker server 发送心跳) # heart beat interval in seconds heart_beat_interval=30 # storage server向tracker server报告磁盘剩余空间的时间间隔,单位为秒 # disk usage report interval in seconds stat_report_interval=60 # base_path 目录地址,根目录必须存在 子目录会自动生成 (注 :这里不是上传的文件存放的地址,之前是的,在某个版本后更改了) # the base path to store data and log files base_path=/home/yuqing/fastdfs # 系统提供服务时的最大连接数 # max concurrent connections the server supported # default value is 256 # more max_connections means more memory will be used max_connections=256 # V2.0引入本参数。设置队列结点的buffer大小。工作队列消耗的内存大小 = buff_size * max_connections # 设置得大一些,系统整体性能会有所提升。 # 消耗的内存请不要超过系统物理内存大小。另外,对于32位系统,请注意使用到的内存不要超过3GB # the buff size to recv / send data # this parameter must more than 8KB # default value is 64KB # since V2.00 buff_size = 256KB # 工作线程的数量,工作线程用于处理网络IO,应当小于max_connections的值 # work thread count, should <= max_connections # work thread deal network io # default value is 4 # since V2.00 work_threads=4 # V2.0引入本参数。磁盘IO读写是否分离,缺省是分离的 # if disk read / write separated ## false for mixed read and write ## true for separated read and write # default value is true # since V2.00 disk_rw_separated = true # V2.0引入本参数。针对单个存储路径的读线程数,缺省值为1。 # 读写分离时,系统中的读线程数 = disk_reader_threads * store_path_count # 读写混合时,系统中的读写线程数 = (disk_reader_threads + disk_writer_threads) * store_path_count # disk reader thread count per store base path # for mixed read / write, this parameter can be 0 # default value is 1 # since V2.00 disk_reader_threads = 1 # V2.0引入本参数。针对单个存储路径的写线程数,缺省值为1。 # 读写分离时,系统中的写线程数 = disk_writer_threads * store_path_count # 读写混合时,系统中的读写线程数 = (disk_reader_threads + disk_writer_threads) * store_path_count # disk writer thread count per store base path # for mixed read / write, this parameter can be 0 # default value is 1 # since V2.00 disk_writer_threads = 1 # 同步文件时,如果从binlog中没有读到要同步的文件,休眠N毫秒后重新读取。0表示不休眠,立即再次尝试读取。 # 出于CPU消耗考虑,不建议设置为0。如何希望同步尽可能快一些,可以将本参数设置得小一些,比如设置为10ms # when no entry to sync, try read binlog again after X milliseconds # must > 0, default value is 200ms sync_wait_msec=50 # 同步上一个文件后,再同步下一个文件的时间间隔,单位为毫秒,0表示不休眠,直接同步下一个文件。 # after sync a file, usleep milliseconds # 0 for sync successively (never call usleep) sync_interval=0 # 下面二个一起解释。允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定,相信sa都会明白 # storage sync start time of a day, time format: Hour:Minute # Hour from 0 to 23, Minute from 0 to 59 sync_start_time=00:00 # storage sync end time of a day, time format: Hour:Minute # Hour from 0 to 23, Minute from 0 to 59 sync_end_time=23:59 # 同步完N个文件后,把storage的mark文件同步到磁盘 # 注:如果mark文件内容没有变化,则不会同步 # write to the mark file after sync N files # default value is 500 write_mark_file_freq=500 # 存放文件时storage server支持多个路径(例如磁盘)。这里配置存放文件的基路径数目,通常只配一个目录。 # path(disk or mount point) count, default value is 1 store_path_count=1 # 逐一配置store_path个路径,索引号基于0。注意配置方法后面有0,1,2 ......,需要配置0到store_path - 1。 # 如果不配置base_path0,那边它就和base_path对应的路径一样。 # store_path#, based 0, if store_path0 not exists, it's value is base_path # the paths must be exist store_path0=/home/yuqing/fastdfs #store_path1=/home/yuqing/fastdfs2 # FastDFS存储文件时,采用了两级目录。这里配置存放文件的目录个数 (系统的存储机制,大家看看文件存储的目录就知道了) # 如果本参数只为N(如:256),那么storage server在初次运行时,会自动创建 N * N 个存放文件的子目录。 # subdir_count * subdir_count directories will be auto created under each # store_path (disk), value can be 1 to 256, default value is 256 subdir_count_per_path=256 # tracker_server 的列表 要写端口的哦 (再次提醒是主动连接tracker_server ) # 有多个tracker server时,每个tracker server写一行 # tracker_server can ocur more than once, and tracker_server format is # "host:port", host can be hostname or ip address tracker_server=192.168.209.121:22122 # 日志级别 #standard log level as syslog, case insensitive, value list: ### emerg for emergency ### alert ### crit for critical ### error ### warn for warning ### notice ### info ### debug log_level=info # 操作系统运行FastDFS的用户组 (不填 就是当前用户组,哪个启动进程就是哪个) #unix group name to run this program, #not set (empty) means run by the group of current user run_by_group= # 操作系统运行FastDFS的用户 (不填 就是当前用户,哪个启动进程就是哪个) #unix username to run this program, #not set (empty) means run by current user run_by_user= # 允许连接本storage server的IP地址列表 (不包括自带HTTP服务的所有连接) # 可以配置多行,每行都会起作用 # allow_hosts can ocur more than once, host can be hostname or ip address, # "*" means match all ip addresses, can use range like this: 10.0.1.[1-15,20] or # host[01-08,20-25].domain.com, for example: # allow_hosts=10.0.1.[1-15,20] # allow_hosts=host[01-08,20-25].domain.com allow_hosts=* # 文件在data目录下分散存储策略。 # 0: 轮流存放,在一个目录下存储设置的文件数后(参数file_distribute_rotate_count中设置文件数),使用下一个目录进行存储。 # 1: 随机存储,根据文件名对应的hash code来分散存储。 # the mode of the files distributed to the data path # 0: round robin(default) # 1: random, distributted by hash code file_distribute_path_mode=0 # 当上面的参数file_distribute_path_mode配置为0(轮流存放方式)时,本参数有效。 # 当一个目录下的文件存放的文件数达到本参数值时,后续上传的文件存储到下一个目录中。 # valid when file_distribute_to_path is set to 0 (round robin), # when the written file count reaches this number, then rotate to next path # default value is 100 file_distribute_rotate_count=100 # 当写入大文件时,每写入N个字节,调用一次系统函数fsync将内容强行同步到硬盘。0表示从不调用fsync # call fsync to disk when write big file # 0: never call fsync # other: call fsync when written bytes >= this bytes # default value is 0 (never call fsync) fsync_after_written_bytes=0 # 同步或刷新日志信息到硬盘的时间间隔,单位为秒 # 注意:storage server 的日志信息不是时时写硬盘的,而是先写内存。 # sync log buff to disk every interval seconds # must > 0, default value is 10 seconds sync_log_buff_interval=10 # 同步binglog(更新操作日志)到硬盘的时间间隔,单位为秒 # 本参数会影响新上传文件同步延迟时间 # sync binlog buff / cache to disk every interval seconds # default value is 60 seconds sync_binlog_buff_interval=10 # 把storage的stat文件同步到磁盘的时间间隔,单位为秒。 # 注:如果stat文件内容没有变化,不会进行同步 # sync storage stat info to disk every interval seconds # default value is 300 seconds sync_stat_file_interval=300 # 线程栈的大小。FastDFS server端采用了线程方式。 # 对于V1.x,storage server线程栈不应小于512KB;对于V2.0,线程栈大于等于128KB即可。 # 线程栈越大,一个线程占用的系统资源就越多。 # 对于V1.x,如果要启动更多的线程(max_connections),可以适当降低本参数值。 # thread stack size, should >= 512KB # default value is 512KB thread_stack_size=512KB # 本storage server作为源服务器,上传文件的优先级,可以为负数。值越小,优先级越高。这里就和 tracker.conf 中store_server= 2时的配置相对应了 # the priority as a source server for uploading file. # the lower this value, the higher its uploading priority. # default value is 10 upload_priority=10 # 网卡别名前缀,就像Linux中的eth,可以使用ifconfig -a命令来查看 # 多个别名之间使用逗号分隔,如果不设置这个值表示自动的被系统类型设置 # the NIC alias prefix, such as eth in Linux, you can see it by ifconfig -a # multi aliases split by comma. empty value means auto set by OS type # default values is empty if_alias_prefix= # 是否检测上传文件已经存在。如果已经存在,则不存在文件内容,建立一个符号链接以节省磁盘空间。 # 这个应用要配合FastDHT 使用,所以打开前要先安装FastDHT # 1或yes 是检测,0或no 是不检测 # if check file duplicate, when set to true, use FastDHT to store file indexes # 1 or yes: need check # 0 or no: do not check # default value is 0 check_file_duplicate=0 # 文件去重时,文件内容的签名方式: # hash: 4个hash code # md5:MD5 # file signature method for check file duplicate ## hash: four 32 bits hash code ## md5: MD5 signature # default value is hash # since V4.01 file_signature_method=hash # 当上个参数设定为1 或 yes时 (true/on也是可以的) , 在FastDHT中的命名空间 # namespace for storing file indexes (key-value pairs) # this item must be set when check_file_duplicate is true / on key_namespace=FastDFS # 与FastDHT servers 的连接方式 (是否为持久连接) ,默认是0(短连接方式)。可以考虑使用长连接,这要看FastDHT server的连接数是否够用。 # set keep_alive to 1 to enable persistent connection with FastDHT servers # default value is 0 (short connection) keep_alive=0 # 下面是关于FastDHT servers 的设定 需要对FastDHT servers 有所了解,这里只说字面意思了 # 可以通过 #include filename 方式来加载 FastDHT servers 的配置,装上FastDHT就知道该如何配置啦。 # 同样要求 check_file_duplicate=1 时才有用,不然系统会忽略 # fdht_servers.conf 记载的是 FastDHT servers 列表 # you can use "#include filename" (not include double quotes) directive to # load FastDHT server list, when the filename is a relative path such as # pure filename, the base path is the base path of current/this config file. # must set FastDHT server list when check_file_duplicate is true / on # please see INSTALL of FastDHT for detail ##include /home/yuqing/fastdht/conf/fdht_servers.conf # 是否将文件操作记录到access log # if log to access log # default value is false # since V4.00 use_access_log = false # 是否定期轮转access log,目前仅支持一天轮转一次 # if rotate the access log every day # default value is false # since V4.00 rotate_access_log = false # access log定期轮转的时间点,只有当rotate_access_log设置为true时有效 # rotate access log time base, time format: Hour:Minute # Hour from 0 to 23, Minute from 0 to 59 # default value is 00:00 # since V4.00 access_log_rotate_time=00:00 # 是否定期轮转error log,目前仅支持一天轮转一次 # if rotate the error log every day # default value is false # since V4.02 rotate_error_log = false # error log定期轮转的时间点,只有当rotate_error_log设置为true时有效 # rotate error log time base, time format: Hour:Minute # Hour from 0 to 23, Minute from 0 to 59 # default value is 00:00 # since V4.02 error_log_rotate_time=00:00 # access log按文件大小轮转 # 设置为0表示不按文件大小轮转,否则当access log达到该大小,就会轮转到新文件中 # rotate access log when the log file exceeds this size # 0 means never rotates log file by log file size # default value is 0 # since V4.02 rotate_access_log_size = 0 # error log按文件大小轮转 # 设置为0表示不按文件大小轮转,否则当error log达到该大小,就会轮转到新文件中 # rotate error log when the log file exceeds this size # 0 means never rotates log file by log file size # default value is 0 # since V4.02 rotate_error_log_size = 0 # 文件同步的时候,是否忽略无效的binlog记录 # if skip the invalid record when sync file # default value is false # since V4.02 file_sync_skip_invalid_record=false # 是否使用连接池 # if use connection pool # default value is false # since V4.05 use_connection_pool = false # 如果一个连接的空闲时间超过这个值将会被自动关闭 # connections whose the idle time exceeds this time will be closed # unit: second # default value is 3600 # since V4.05 connection_pool_max_idle_time = 3600 # storage server上web server域名,通常仅针对单独部署的web server。这样URL中就可以通过域名方式来访问storage server上的文件了, # 这个参数为空就是IP地址的方式。 # use the ip address of this storage server if domain_name is empty, # else this domain name will ocur in the url redirected by the tracker server http.domain_name= # web server的端口 # the port of the web server on this storage server http.server_port=8888</code></pre> <h2>三、client.conf</h2> <pre> <code># 连接超时时间,针对socket套接字函数connect # connect timeout in seconds # default value is 30s connect_timeout=30 # client的网络超时,单位为秒。发送或接收数据时,如果在超时时间后还不能发送或接收数据,则本次网络通信失败 # network timeout in seconds # default value is 30s network_timeout=60 # 存储日志的根目录 # the base path to store log files base_path=/home/yuqing/fastdfs # tracker_server 的列表 要写端口 # tracker_server can ocur more than once, and tracker_server format is # "host:port", host can be hostname or ip address tracker_server=192.168.0.197:22122 # 日志的级别 #standard log level as syslog, case insensitive, value list: ### emerg for emergency ### alert ### crit for critical ### error ### warn for warning ### notice ### info ### debug log_level=info # 是否使用连接池 # if use connection pool # default value is false # since V4.05 use_connection_pool = false # 如果一个连接的空闲时间超过这个值将会被自动关闭 # connections whose the idle time exceeds this time will be closed # unit: second # default value is 3600 # since V4.05 connection_pool_max_idle_time = 3600 # 是否从FastDFS的tracker server加载参数 # if load FastDFS parameters from tracker server # since V4.05 # default value is false load_fdfs_parameters_from_tracker=false 是否使用storage ID 代替IP,只有当load_fdfs_parameters_from_tracker为false时才有效 # if use storage ID instead of IP address # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # default value is false # since V4.05 use_storage_id = false # 指定storage_ids的路径,可以使用绝对路径和相对路径,只有当load_fdfs_parameters_from_tracker为false时才有效 # specify storage ids filename, can use relative or absolute path # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # since V4.05 storage_ids_filename = storage_ids.conf #tracker server的http端口 #HTTP settings http.tracker_server_port=8080 #use "#include" directive to include HTTP other settiongs ##include http.conf</code></pre>
  • 黑/群晖RAID 10配置图文详解

    一.黑/群晖RAID 10配置准备1.黑群晖/白群晖设备一台;2.群晖系统中空闲未使用的硬盘4快(RAID 10 至少需要4快盘);二.黑/群晖RAID 10操作步骤2.1 打开存储空间管理员套件 ​选择RAID Group​点击新增​下一一.黑/群晖RAID 10配置准备1.黑群晖/白群晖设备一台;2.群晖系统中空闲未使用的硬盘4快(RAID 10 至少需要4快盘);二.黑/群晖RAID 10操作步骤2.1 打开存储空间管理员套件 ​选择RAID Group​点击新增​下一步,选择RAID 10​选择需要组RAID 10的硬盘,并拖到右边​这里选择了4快​​​硬盘检查,如果是新盘就不用检查。老盘看自己心情,硬盘检查很慢。这里就选择否了​点击应用即可完成RAID10创建​可以看到RAID Group2  RAID 10正在初始化...三.使用RAID 10创建存储空间 ​点击新增​点击确定按钮即可创建完成​这里我们就看到了创建的RAID 10的存储空间四.挂载黑/白群晖RAID 10 到目录 点击控制面板,然后选择第一个共享文件夹​点击新增​填写文件夹名称/描述以及选择文件夹的存储空间为刚才创建的RAID10存储空间​点击下一步继续​加密不设置,点击下一步继续​高级设置,默认即可,下一步继续​点击应用完成创建​可以看到共享文件夹中有新创建的raid10共享文件夹了,接下来就是去File Station中愉快的使用了​
  • 分布式文件系统FastDFS详解

    分布式文件系统FastDFS详解<h2>为什么要使用分布式文件系统呢?</h2> <p>嗯,这个问题问的好,使用了它对我们有哪些好处?带着这个问题我们来往下看:</p> <h3>单机时代</h3> <p>初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分。例如: <code>resources\static\file</code>、 <code>resources\static\img</code>等。</p> <p><strong>优点</strong>:这样做比较便利,项目直接引用就行,实现起来也简单,无需任何复杂技术,保存数据库记录和访问起来也很方便。</p> <p><strong>缺点</strong>:如果只是后台系统的使用一般也不会有什么问题,但是作为一个前端网站使用的话就会存在弊端。一方面,文件和代码耦合在一起,文件越多存放越混乱;另一方面,如果流量比较大,静态文件访问会占据一定的资源,影响正常业务进行,不利于网站快速发展。</p> <h3>独立文件服务器</h3> <p>随着公司业务不断发展,将代码和文件放在同一服务器的弊端就会越来越明显。为了解决上面的问题引入独立图片服务器,工作流程如下:项目上传文件时,首先通过ftp或者ssh将文件上传到图片服务器的某个目录下,再通过ngnix或者apache来访问此目录下的文件,返回一个独立域名的图片URL地址,前端使用文件时就通过这个URL地址读取。</p> <p><strong>优点</strong>:图片访问是很消耗服务器资源的(因为会涉及到操作系统的上下文切换和磁盘I/O操作),分离出来后,Web/App服务器可以更专注发挥动态处理的能力;独立存储,更方便做扩容、容灾和数据迁移;方便做图片访问请求的负载均衡,方便应用各种缓存策略(HTTP Header、Proxy Cache等),也更加方便迁移到CDN。</p> <p><strong>缺点</strong>:单机存在性能瓶颈,容灾、垂直扩展性稍差</p> <h3>分布式文件系统</h3> <p>通过独立文件服务器可以解决一些问题,如果某天存储文件的那台服务突然down了怎么办?可能你会说,定时将文件系统备份,这台down机的时候,迅速切换到另一台就OK了,但是这样处理需要人工来干预。另外,当存储的文件超过100T的时候怎么办?单台服务器的性能问题?这个时候我们就应该考虑分布式文件系统了。</p> <p>业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。分布式文件系统,一般分为三块内容来配合,服务的存储、访问的仲裁系统,文件存储系统,文件的容灾系统来构成,仲裁系统相当于文件服务器的大脑,根据一定的算法来决定文件存储的位置,文件存储系统负责保存文件,容灾系统负责文件系统和自己的相互备份。</p> <p><strong>优点</strong>:扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行</p> <p><strong>缺点</strong>:系统复杂度稍高,需要更多服务器</p> <h2>FastDFS</h2> <p>毫无疑问FastDFS就属于我们上面介绍的分布式文件系统,下面我们来详细了解一下:</p> <h3>什么是FastDFS</h3> <p>FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。在UC基于FastDFS开发向用户提供了:网盘,社区,广告和应用下载等业务的存储服务。</p> <p>FastDFS是一款开源的轻量级分布式文件系统纯C实现,支持Linux、FreeBSD等UNIX系统类google FS,不是通用的文件系统,只能通过专有API访问,目前提供了C、Java和PHP API为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性FastDFS可以看做是基于文件的key value pair存储系统,称作分布式文件存储服务更为合适。</p> <h3>FastDFS相关概念</h3> <p>FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。</p> <p><strong>tracker server</strong>:跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的master更为精简,不记录文件索引信息,占用的内存量很少。</p> <p>Tracker是FastDFS的协调者,负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。</p> <p>Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。</p> <p><strong>storage server</strong>:存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。</p> <p>Storage server(后简称storage)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。</p> <p>以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group内storage server数量即为该group的副本数),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡;缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内地其他机器,使得恢复时间会很长。</p> <p>group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在 <code>/data/disk1-/data/disk10</code>,则可将这10个目录都配置为storage的数据存储目录。</p> <p>storage接受到写文件请求时,会根据配置好的规则(后面会介绍),选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。</p> <p><strong>client</strong>:客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。</p> <p>另外两个概念:</p> <p><strong>group</strong> :组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。</p> <p><strong>meta data</strong> :文件相关属性,键值对( Key Value Pair) 方式,如:width=1024,heigth=768 。</p> <p><img alt="1" class="img-thumbnail" src="/assist/images/blog/8bcde557864841f88b181d6ec4a4ebd4.png" /></p> <p>Tracker相当于FastDFS的大脑,不论是上传还是下载都是通过tracker来分配资源;客户端一般可以使用ngnix等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷于卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。</p> <h3>上传机制</h3> <p>首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。</p> <p><img alt="2" class="img-thumbnail" src="/assist/images/blog/622336b2401b41308372ec762d517c71.png" /></p> <p>内部机制如下:</p> <p><strong>1、选择tracker server</strong></p> <p>当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。 选择存储的group 当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:</p> <ul> <li> <p>1、Round robin,所有的group间轮询</p> </li> <li> <p>2、Specified group,指定某一个确定的group</p> </li> <li> <p>3、Load balance,剩余存储空间多多group优先</p> </li> </ul> <p><strong>2、选择storage server</strong></p> <p>当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:</p> <ul> <li> <p>1、Round robin,在group内的所有storage间轮询</p> </li> <li> <p>2、First server ordered by ip,按ip排序</p> </li> <li> <p>3、First server ordered by priority,按优先级排序(优先级在storage上配置)</p> </li> </ul> <p><strong>3、选择storage path</strong></p> <p>当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:</p> <ul> <li> <p>1、Round robin,多个存储目录间轮询</p> </li> <li> <p>2、剩余存储空间最多的优先</p> </li> </ul> <p><strong>4、生成Fileid</strong></p> <p>选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。 选择两级目录 当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。</p> <p><strong>5、生成文件名</strong></p> <p>当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。</p> <h3>下载机制</h3> <p>客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。</p> <p><img alt="3" class="img-thumbnail" src="/assist/images/blog/d7ee87a725024e76b6080bc76b4d5031.png" /></p> <p>跟upload file一样,在download file时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。由于group内的文件同步时在后台异步进行的,所以有可能出现在读到时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage。</p> <ul> <li> <p>1、该文件上传到的源头storage - 源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。</p> </li> <li> <p>2、文件创建时间戳==storage被同步到的时间戳 且(当前时间-文件创建时间戳) > 文件同步最大时间(如5分钟) - 文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。</p> </li> <li> <p>3、文件创建时间戳 < storage被同步到的时间戳。 - 同步时间戳之前的文件确定已经同步了</p> </li> <li> <p>4、(当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。 - 经过同步延迟阈值时间,认为文件肯定已经同步了。</p> </li> </ul> <h3>同步时间管理</h3> <p>当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢? 其实每个存储服务器都需要定时将自身的信息上报给tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而tracker根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步。同步信息上报如下图:</p> <p><img alt="4" class="img-thumbnail" src="/assist/images/blog/a12c788adede4a28b8e567c88dc7fbc5.png" /></p> <p>写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。</p> <p>每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。</p> <p>storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。 比如一个group内有A、B、C三个storage server,A向C同步到进度为T1 (T1以前写的文件都已经同步到B上了),B向C同步到时间戳为T2(T2 > T1),tracker接收到这些同步进度信息时,就会进行整理,将最小的那个做为C的同步时间戳,本例中T1即为C的同步时间戳为T1(即所有T1以前写的数据都已经同步到C上了);同理,根据上述规则,tracker会为A、B生成一个同步时间戳。</p> <h3>精巧的文件ID-FID</h3> <p>说到下载就不得不提文件索引(又称:FID)的精巧设计了。文件索引结构如下图,是客户端上传文件后存储服务器返回给客户端,用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。</p> <p><img alt="5" class="img-thumbnail" src="/assist/images/blog/4e66f104b1e1430292b2db37a071d885.jpg" /></p> <ul> <li> <p>组名:文件上传后所在的存储组名称,在文件上传成功后有存储服务器返回,需要客户端自行保存。</p> </li> <li> <p>虚拟磁盘路径:存储服务器配置的虚拟路径,与磁盘选项store_path*对应。</p> </li> <li> <p>数据两级目录:存储服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。</p> </li> <li> <p>文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。</p> </li> </ul> <p><strong>快速定位文件</strong></p> <p>知道FastDFS FID的组成后,我们来看看FastDFS是如何通过这个精巧的FID定位到需要访问的文件。</p> <ul> <li> <p>1、通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问;</p> </li> <li> <p>2、存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。</p> </li> </ul> <p><img alt="6" class="img-thumbnail" src="/assist/images/blog/f1febebc58614ab4b71e2ce0dc2e5091.png" /></p> <p>如何搭建FastDFS?参考我博客的这篇文章 <strong>(FastDFS 集群 安装 配置:http://www.ityouknow.com/fastdfs/2017/10/10/cluster-building-fastdfs.html)</strong>,下图为某用户搭建的架构示意图</p> <p><img alt="7" class="img-thumbnail" src="/assist/images/blog/ef960a1f4c574e6f9790895b3974c933.png" /></p> <blockquote> <p>文中图片均来源于网络</p> </blockquote> <br />  
  • java 8 stream 多字段排序

    java 8 stream 多字段排序,本例子主要使用stream进行多个字段的排序,使用了 comparators和Comparator.thenComparing()方法。比较器之间返回一个字典排序。他的排序效果有点像SQL中的group by条件。java 8 stream 多字段排序
  • console对象对IE浏览器/谷歌浏览器/火狐浏览器/Opera浏览器支持情况

    这里主要讲解下在前端开发中常用的调试日志对象console。console对象对目前国内流行的浏览器如:IE/谷歌/火狐的支持情况说明<ul> <li> <h2>1.IE浏览器中的console支持以下几种输出</h2> <pre> <code class="language-html">log info warn error assert dir clear profile profileEnd </code></pre> </li> <li> <h2>2.火狐浏览器</h2> <pre> <code class="language-html">log info warn error debug exception assert dir dirxml trace group groupEnd groupCollapsed time timeEnd profile profileEnd count clear table notifyFirebug firebug </code></pre> </li> <li> <h2>3.谷歌浏览器</h2> <pre> <code class="language-html">profiles memory debug error info log warn dir dirxml trace assert count markTimeline profile profileEnd time timeEnd group groupCollapsed groupEnd </code></pre> </li> <li> <h2>4.Opera浏览器</h2> <pre> <code class="language-html">time timeEnd trace profile profileEnd debug log info warn error assert dir dirxml group groupCollapsed groupEnd count table</code></pre> </li> </ul> <h2>总结:</h2> 四种浏览器对常用的<em><strong>log、info、warn、error</strong></em>四个基本方法都是支持的
  • java编程中正则表达式'并且'的写法

    java编程中正则表达式'并且'的写法java编程中正则表达式'并且'的写法 <pre> <code class="language-java">package com.leftso; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { try { String str1="<a href=\"jjjjkkkkccc\" title='测试'></a><a title='xxx'></a>"; // String reg1="\\s*href\\s*=\\s*['|\"](.*)['|\"]";//字符串中不包含a和d String reg2="\\s*href\\s*=\\s*['|\"]([^('|\"|>)]*)['|\"]";//[^('|\"|>)]代表不是'且不是"且不是> Pattern pattern1=Pattern.compile(reg1); Pattern pattern2=Pattern.compile(reg2); Matcher matcher1=pattern1.matcher(str1); if(matcher1.find()){ System.out.println("不含且关系>>"+matcher1.group(1)); } Matcher matcher2=pattern2.matcher(str1); if(matcher2.find()){ System.out.println("包含且关系>>"+matcher2.group(1)); } } catch (Exception e) { e.printStackTrace(); } } } </code></pre> <br /> 执行结果:<br /> <img alt="执行结果" class="img-thumbnail" src="/assist/images/blog/6cdb040c-f401-40af-a391-32b9ed3363d0.png" /><br /> <span style="color:#FF0000"><strong>多个并且关系就是[^(1|2|3|4|..)]这样达到且的效果,其中1234..表示且的多个条件</strong></span>
  • MySQL索引使用摘录

    mysql索引的使用基础知识摘录。<p><em>互联网总结:</em></p> <h2>一.常见索引类型</h2> <ul> <li>normal 普通</li> <li>unique 唯一索引</li> <li>full text 全文索引</li> </ul> <h2>二.几种常见索引的区别</h2> <p>normal:表示普通索引</p> <p>unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique</p> <p>full text: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。</p> <pre> <code class="language-html">提示: 索引的类别由建立索引的字段内容特性来决定,通常normal最常见。</code></pre> <h2>三.哪些字段作为索引</h2> <h3>3.1.选择唯一性索引</h3>   唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。 <h3>3.2为经常需要排序、分组和联合操作的字段建立索引</h3> 经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。 <h3>3.3为常作为查询条件的字段建立索引</h3> 如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。 <h3>3.4限制索引的数目</h3> 索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。 <h3>3.5尽量使用数据量少的索引</h3> 如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。 <h3>3.6尽量使用前缀来索引</h3> 如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。 <h3>3.7删除不再使用或者很少使用的索引</h3> 表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。 <div>  <pre> <code class="language-html">注意:选择索引的最终目的是为了使查询的速度变快。上面给出的原则是最基本的准则,但不能拘泥于上面的准则。读者要在以后的学习和工作中进行不断的实践。根据应用的实际情况进行分析和判断,选择最合适的索引方式。</code></pre> </div> <h2>四.其他</h2> 除了上面说的MySQL索引知识外还有很多<br /> 例如:<br /> <strong>单列索引,多列索引</strong><br /> 多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。<br /> <strong>组合索引(最左前缀)</strong> <p>平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:</p> <p>–title,time</p> <p>–title</p> <p>为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:<br />  </p> <pre> <code class="language-sql">--使用到上面的索引 SELECT * FROM article WHREE title='测试' AND time=1234567890; SELECT * FROM article WHREE utitle='测试'; --不使用上面的索引 SELECT * FROM article WHREE time=1234567890;</code></pre> <h5><strong>MySQL索引的优化</strong></h5> <p>上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。下面是一些总结以及收藏的MySQL索引的注意事项和优化方法。</p> <h3>最左前缀原则</h3> <p>这两天看《构建高性能Web站点》这本书,感觉写的真是不错,很多实际项目中会碰到的问题都有所提及,今天看到一个最左前缀原则,以前也听说过,不过一直没搞明白,今天查了下。</p> <p> </p> <p>通过实例理解单列索引、多列索引以及最左前缀原则<br /> <br /> 实例:现在我们想查出满足以下条件的用户id:</p> <pre> <code class="language-html">mysql>SELECT `uid` FROM people WHERE lname`='Liu'  AND `fname`='Zhiqun' AND `age`=26</code></pre> <p><br /> 因为我们不想扫描整表,故考虑用索引。<br /> <br /> 单列索引:</p> <pre> <code class="language-html">ALTER TABLE people ADD INDEX lname (lname);</code></pre> <p><br /> 将lname列建索引,这样就把范围限制在lname='Liu'的结果集1上,之后扫描结果集1,产生满足fname='Zhiqun'的结果集2,再扫描结果集2,找到 age=26的结果集3,即最终结果。<br /> <br /> 由 于建立了lname列的索引,与执行表的完全扫描相比,效率提高了很多,但我们要求扫描的记录数量仍旧远远超过了实际所需 要的。虽然我们可以删除lname列上的索引,再创建fname或者age 列的索引,但是,不论在哪个列上创建索引搜索效率仍旧相似。<br /> <br /> 2.多列索引:</p> <pre> <code class="language-html">ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);</code></pre> <p><br /> 为了提高搜索效率,我们需要考虑运用多列索引,由于索引文件以B-Tree格式保存,所以我们不用扫描任何记录,即可得到最终结果。<br /> <br /> 注:在mysql中执行查询时,只能使用一个索引,如果我们在lname,fname,age上分别建索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。<br /> <br /> 3.最左前缀:顾名思义,就是最左优先,上例中我们创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引。<br /> <br /> <span style="color:#ff0000">注:在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。</span></p>