mysql集群之MYSQL CLUSTER
1. 参考文档
http://xuwensong.elastos.org/2014/01/13/ubuntu-%E4%B8%8Bmysql-cluster%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/
2. 简介
MySQL-Cluster是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的簇。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件都有自己的内存和磁盘,所以不存在单点故障。
MySQL簇将标准的MySQL服务器与名为NDB的“内存中”的簇式存储引擎集成了起来。术语NDB指的是与存储引擎相关的设置部分,而术语“MySQL簇”指的是MySQL和NDB存储引擎的组合。
MySQL簇由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB簇的数据节点,管理服务器(MGM),以及(可能)专门的数据访问程序。关于簇中组件的关系,如下图:
所有这些程序一起构成了MySQL簇。将数据保存到NBD簇引擎中时,表将保存在数据节点内。能够从簇中所有其他MySQL服务器直接访问这些表。因此,假如在将数据保存在簇内的工资应用程序中,如果某一应用程序更新了一位雇员的工资,所有查询该数据的其他MySQL 服务器能立刻发现这种变化。
对于MySQL簇,保存在数据节点的数据可被映射,簇能够处理单独数据节点的故障,除了少数事物将因事物状态丢失而被放弃外,不会产生其他影响。由于事物性应用程序能够处理失败事宜,因而它不是问题源。
3. MySQL簇的基本概念
NDB 是一种“内存中”存储引擎,它具有可用性高和数据一致性好的特点。
能够使用多种故障切换和负载平衡选项配置NDB 存储引擎,但以簇层面上的存储引擎开始最简单。MySQL簇的NDB存储引擎包含完整的数据集,仅取决于簇本身内的其他数据。
下面名,我们将介绍设置由NDB存储引擎和一些MySQL服务器构成的MySQL簇的设置方法。
目前,MySQL簇的部分可以独立于MySQL服务器进行配置。在MySQL簇中,簇的每个部分被视为一个节点。
注释:在很多情况下,术语“节点”用于指计算机,但在讨论MySQL簇时,它表示的是进程。在单台计算机上可以有任意数目的节点,所以我们才有可能将多个不同功能的节点配置在同一台计算机上,为此,我们采用术语簇主机。
有三类簇节点,在最低的MySQL簇配置中,至少有三个节点,这三类节点分别是:
管理节点(MGM):这类节点的作用是管理MySQL簇内的其他节点,如提供配置数据,启动并停止节点,运行备份等。由于这类节点负责管理其他节点的配置,所以管理节点应在其他节点之前先启动。MGM节点是用命令ndb_mgm启动的。
数据节点(NDB):这类节点用于保存簇的数据。数据集点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本又两个片段,那么就有4个数据节点。没有必要有一个以上的副本。。数据节点是用命令ndbd来启动的。
SQL节点:这类节点是用来访问簇数据的节点。对于MySQL簇,客户端节点是使用NDB 簇存储引擎的传统MySQL服务器。典型情况下,SQL节点是使用命令mysql -ndbcluster来启动的,或将ndbcluster添加到my.cnf后面使用mysqld启动。
簇配置包括对簇中单独节点的配置,以及设置节点之间的单独通信链路。对于目前设计的MySQL簇,其意图在于,从处理器的能力,内存空间和宽带来讲,存储节点是同质的,此外,为了提供单一的配置点,作为整体,簇的所有配置均位于一个文件中。
管理服务器(MGM节点)负责管理簇配置文件和簇日志。簇中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在的位置的方式。当数据节点内出现有趣的事件时,节点将关于这类事件的信息传输到管理服务器,然后,啊经这类信息写入簇日志。
4. 实现环境
现在,我们计划建立有5个节点的MySQL
CLuster体系,因此需要用到3台机器(sql和数据节点共用),分别做如下用途:
节点(用途) IP地址(主机名)
管理节点(MGM) 10.24.0.101(db1)
nodeid = 1
数据节点1(NDBD1) 10.24.6.4 (db4) nodeid = 11
数据节点2(NDBD2) 10.24.6.6(db5) nodeid =12
SQL节点1(SQL1) 10.24.6.4(db2)
nodeid = 21
SQL节点2(SQL2) 10.24.6.6(db3)
nodeid = 22
5. MySQL-Cluster安装包下载
对于MySQL-Cluster的安装包下载,下载地址见http://dev.mysql.com/downloads/cluster/
mysql-cluster-gpl-7.4.7-debian7-x86_64.deb
6. 安装
6.1. 清除之前的mysql痕迹
此外 如果之前安装过mysql-server,在进行此次实验之前,需要将mysql-server卸载,执行以下指令卸载mysql
sudo apt-get autoremove --purge
mysql-server
sudo apt-get remove
mysql-server
sudo apt-get autoremove
mysql-server
sudo apt-get remove mysql-common
(非常重要)
6.2. 安装deb文件
sudo dpkg -i
mysql-cluster-gpl-7.4.7-debian7-x86_64.deb
安装目录/opt/mysql/server-5.6
6.3. 存储节点/SQL节点安装
SQL节点和数据节点的安装步骤基本相同,所以在设计为存储节点或SQL节点的的每一台机器上,以系统根用户身份执行以下步骤:
mysql组和mysql用户
检查/etc/passwd和/etc/group/文件,查看在系统上是否已经存在mysql组和mysql用户,这时因为某些操作系统会将其作为安装进程的一部分创建。可以使用以下指令查看:
cat show /etc/passwd
cat show /etc/group
如果它们不存在,则需要创建新的mysql用户组,然后为该组添加一个mysql用户
groupadd mysql
useradd -g mysql mysql
6.4. 创建系统数据库的脚本
sudo
/opt/mysql/server-5.6/scripts/mysql_install_db --user=mysql
如果此脚本不能运行,若报错为主机名不匹配的话,则很有可能是下载的版本不对,查看操作系统是32位还是64位,选择正确的版本。若报错找不到默认的文件,则很有可能是因为之前的mysql-server没有卸载,执行上文提供的指令,彻底卸载mysql-server
成功结果:
To start mysqld at boot time you
have to copy
support-files/mysql.server to the
right place for your system
PLEASE REMEMBER TO SET A PASSWORD
FOR THE MySQL root USER !
To do so, start the server,
then issue the following commands:
/opt/mysql/server-5.6/bin/mysqladmin -u root
password 'new-password'
/opt/mysql/server-5.6/bin/mysqladmin -u root
-h drbd01 password 'new-password'
Alternatively you can run:
/opt/mysql/server-5.6/bin/mysql_secure_installation
which will also give you the
option of removing the test
databases and anonymous user
created by default. This is
strongly recommended for
production servers.
See the manual for more
instructions.
You can start the MySQL daemon
with:
cd /opt/mysql/server-5.6 ;
/opt/mysql/server-5.6/bin/mysqld_safe &
You can test the MySQL daemon
with mysql-test-run.pl
cd mysql-test ; perl mysql-test-run.pl
Support MySQL by buying
support/licenses at http://shop.mysql.com
WARNING: Found existing config
file /opt/mysql/server-5.6/my.cnf on the system.
Because this file might be in
use, it was not replaced,
but was used in bootstrap
(unless you used --defaults-file)
and when you later start the
server.
The new default config file was
created as /opt/mysql/server-5.6/my-new.cnf,
please compare it with your
file and take the changes you need.
6.5.设置MySQL服务器和数据目录必要的权限
chown -R root .
chown -R mysql data
3 |
chgrp -R mysql . |
6.6. 拷贝mysql.server
sudo cp /opt/mysql/server-5.6/support-files/mysql.server
/etc/init.d/mysql
chmod +x /etc/init.d/mysql
6.7. 拷贝 my.cnf
sudo cp /opt/mysql/server-5.6/my-new.cnf
/etc/my.cnf
sudo vim /etc/my.cnf
6.8. 设置root密码
sudo apt-get install
mysql-client
mysqladmin -u root
flush-privileges password "123456"
6.9. 管理节点安装
对于管理(MGM)节点,不需要安装mysqld可执行文件,仅需要安装用于MGM服务器和客户端的二进制文件,这类文件可在下载的档案文件中找到。假定将下载的档案文件放在了/var/tmp文件下,以系统管理员的身份执行以下步骤,在簇管理节点主机上安装ndb_mgmd和ndb_mgm
ndb_mgmd:ndb管理服务器
ndb_mgm: ndb管理客户端
6.10. 安装deb文件
sudo dpkg -i
mysql-cluster-gpl-7.4.7-debian7-x86_64.deb
安装目录/opt/mysql/server-5.6
6.11. 创建管理目录
sudo mkdir /usr/local/mysql/
6.12. 拷贝ndb管理程序
sudo cp /opt/mysql/server-5.6/bin/ndb_mgm*
/usr/local/mysql/
6.13. 端口
注释:簇管理节点的默认端口是1186,数据节点的默认端后是2202。
6.14. 配置ndb管理节点
cd /usr/local/mysql/
sudo vim config.ini:
# Options affecting ndbd
processes on all data nodes:
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
# TCP/IP options:
[TCP DEFAULT]
#portnumber=2202
# Management process options:
[NDB_MGMD]
nodeid=1
HostName=10.24.0.101
DataDir=/usr/local/mysql
# Options for data node :
[NDBD]
nodeid=11
HostName=10.24.6.4
DataDir=/opt/mysql/server-5.6/data/
# Options for data node :
[NDBD]
nodeid=12
HostName=10.24.6.6
DataDir=/opt/mysql/server-5.6/data/
# SQL node options:
[MYSQLD]
nodeid=21
HostName=10.24.6.4
[MYSQLD]
nodeid=22
HostName=10.24.6.6
7. 启动
完成配置后,启动簇并不困难。必须在数据节点所在的主机上分别启动每个簇节点进程。尽管能够按任何顺序启动节点,但还是建议,首先启动管理节点,然后启动存储节点,最后启动SQL节点。
7.1. 管理节点启动
可使用nbd_mgm指令登录到ndb_mgm客户端,登录后,可使用show指令来查看簇中个节点情况。
注意,启动MGM时,必须用-f或者–config-file选项,告诉ndb_mgmd到哪里找到配置文件。首次启动时必须选用–initial选项,或者更改了MGM节点的配置信息后,也需选用–initial选项。
sudo /usr/local/mysql/ndb_mgmd -f
/usr/local/mysql/config.ini
Ndb客户端查看:
wiki@zoweewiki:/usr/local/mysql$
/usr/local/mysql/ndb_mgm
-- NDB Cluster -- Management
Client --
ndb_mgm>
ndb_mgm>
ndb_mgm>
ndb_mgm> show
Connected to Management Server
at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=11 @10.24.6.4
(mysql-5.6.25 ndb-7.4.7, Nodegroup: 0, *)
id=12 @10.24.6.6
(mysql-5.6.25 ndb-7.4.7, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.24.0.101 (mysql-5.6.25 ndb-7.4.7)
[mysqld(API)] 2 node(s)
id=21 @10.24.6.4
(mysql-5.6.25 ndb-7.4.7)
id=22 @10.24.6.6
(mysql-5.6.25 ndb-7.4.7)
7.2. 数据节点启动
在每台数据节点主机上,对于首次启动,运行下述命令启动NDBD进程:
sudo
/opt/mysql/server-5.6/bin/ndbd --initial
注意,应仅在首次启动时ndbd时,或者在备份/恢复或者配置变化后重启ndbd时使用“–initial”参数,这很重要,因为该参数会使数据节点删除由早期ndbd实例创建的,用于恢复的任何文件,包括恢复用日志文件。
7.3. MYSQL节点启动
sudo /etc/init.d/mysql restart
启动日志:
/opt/mysql/server-5.6/data/drbd02.err
151015 14:33:19 mysqld_safe
Starting mysqld daemon with databases from /opt/mysql/server-5.6/data
2015-10-15 14:33:22 0 [Warning]
TIMESTAMP with implicit DEFAULT value is deprecated. Please use
--explicit_defaults_for_timestamp server option (see documentation for more
details).
2015-10-15 14:33:22 0 [Note]
/opt/mysql/server-5.6/bin/mysqld (mysqld 5.6.25-ndb-7.4.7-cluster-gpl-log)
starting as process 15192 ...
2015-10-15 14:33:23 15192
[Note] Plugin 'FEDERATED' is disabled.
2015-10-15 14:33:23 15192
[Note] InnoDB: Using atomics to ref count buffer pool pages
2015-10-15 14:33:23 15192
[Note] InnoDB: The InnoDB memory heap is disabled
2015-10-15 14:33:23 15192
[Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-10-15 14:33:23 15192
[Note] InnoDB: Memory barrier is not used
2015-10-15 14:33:23 15192
[Note] InnoDB: Compressed tables use zlib 1.2.3
2015-10-15 14:33:23 15192
[Note] InnoDB: Using Linux native AIO
2015-10-15 14:33:23 15192
[Note] InnoDB: Not using CPU crc32 instructions
2015-10-15 14:33:23 15192
[Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-10-15 14:33:23 15192
[Note] InnoDB: Completed initialization of buffer pool
2015-10-15 14:33:24 15192
[Note] InnoDB: Highest supported file format is Barracuda.
2015-10-15 14:33:24 15192
[Note] InnoDB: 128 rollback segment(s) are active.
2015-10-15 14:33:24 15192
[Note] InnoDB: Waiting for purge to start
2015-10-15 14:33:24 15192
[Note] InnoDB: 5.6.25 started; log sequence number 1626027
2015-10-15 14:33:24 15192
[Note] NDB: Changed global value of binlog_format from STATEMENT to MIXED
2015-10-15 14:33:24 15192
[Note] NDB: NodeID is 22, management server '10.24.0.101:1186'
2015-10-15 14:33:25 15192
[Note] NDB[0]: NodeID: 22, all storage nodes connected
2015-10-15 14:33:25 15192
[Warning] NDB: server id set to zero - changes logged to bin log with server id
zero will be logged with another server id by slave mysqlds
2015-10-15 14:33:25 15192
[Note] NDB Binlog: Starting...
2015-10-15 14:33:25 15192
[Note] NDB Util: Starting...
2015-10-15 14:33:25 15192
[Note] NDB Index Stat: Starting...
2015-10-15 14:33:25 15192
[Note] NDB Index Stat: Wait for server start completed
2015-10-15 14:33:25 15192
[Note] NDB Util: Wait for server start completed
2015-10-15 14:33:25 15192
[Note] NDB Binlog: Started
2015-10-15 14:33:25 15192
[Note] NDB Binlog: Setting up
2015-10-15 14:33:25 15192
[Note] NDB Binlog: Created schema Ndb object, reference: 0x80040016, name: 'Ndb
Binlog schema change monitoring'
2015-10-15 14:33:25 15192
[Note] NDB Binlog: Created injector Ndb object, reference: 0x80050016, name:
'Ndb Binlog data change monitoring'
2015-10-15 14:33:25 15192
[Note] NDB Binlog: Setup completed
2015-10-15 14:33:25 15192
[Note] NDB Binlog: Wait for server start completed
2015-10-15 14:33:25 15192
[Note] Server hostname (bind-address): '*'; port: 3306
2015-10-15 14:33:25 15192
[Note] IPv6 is available.
2015-10-15 14:33:25 15192
[Note] - '::' resolves to '::';
2015-10-15 14:33:25 15192
[Note] Server socket created on IP: '::'.
2015-10-15 14:33:25 15192
[Note] Event Scheduler: Loaded 0 events
2015-10-15 14:33:25 15192
[Note] /opt/mysql/server-5.6/bin/mysqld: ready for connections.
Version:
'5.6.25-ndb-7.4.7-cluster-gpl-log'
socket: '/var/run/mysqld/mysqld.sock'
port: 3306 MySQL Cluster
Community Server (GPL)
2015-10-15 14:33:25 15192
[Note] NDB Util: Wait for cluster to start
2015-10-15 14:33:25 15192
[Note] NDB Util: Started
2015-10-15 14:33:25 15192
[Note] NDB Binlog: Check for incidents
2015-10-15 14:33:25 15192
[Note] NDB Binlog: Wait for cluster to start
2015-10-15 14:33:25 15192
[Note] NDB Index Stat: Wait for cluster to start
2015-10-15 14:33:25 15192
[Note] ndb_index_stat_proc: Created Ndb object, reference: 0x80070016, name:
'Ndb Index Statistics monitoring'
2015-10-15 14:33:25 15192
[Note] NDB Index Stat: Started
2015-10-15 14:33:26 15192
[Note] NDB Binlog: DISCOVER TABLE Event: REPL$mysql/ndb_schema
2015-10-15 14:33:26 15192
[Note] NDB Binlog: logging ./mysql/ndb_schema (UPDATED,USE_WRITE)
2015-10-15 14:33:26 15192
[Note] NDB Binlog: DISCOVER TABLE Event: REPL$mysql/ndb_apply_status
2015-10-15 14:33:26 15192
[Note] NDB Binlog: logging ./mysql/ndb_apply_status (UPDATED,USE_WRITE)
2015-10-15 14:33:26 15192
[Note] NDB: Cleaning stray tables from database 'ndb_12_fs'
2015-10-15 14:33:26 15192
[Note] NDB: Cleaning stray tables from database 'ndbinfo'
2015-10-15 14:33:26 15192
[Note] NDB: Cleaning stray tables from database 'performance_schema'
2015-10-15 14:33:26 15192
[Note] NDB: Cleaning stray tables from database 'test'
2015-10-15 14:33:26 15192
[Note] NDB Binlog: Wait for first event
2015-10-15 14:33:26 [NdbApi]
INFO -- Flushing incomplete GCI:s
< 4554/3
2015-10-15 14:33:26 [NdbApi]
INFO -- Flushing incomplete GCI:s
< 4554/3
2015-10-15 14:33:26 15192
[Note] NDB Binlog: starting log at epoch 4554/3
2015-10-15 14:33:26 15192
[Note] NDB Binlog: Got first event
2015-10-15 14:33:26 15192
[Note] NDB Binlog: ndb tables writable
2015-10-15 14:33:26 15192
[Note] NDB Binlog: Startup and setup completed
2015-10-15 14:33:26 15192
[Note] NDB Schema dist: Data node: 11 reports subscribe from node 21,
subscriber bitmask 0200000
2015-10-15 14:33:26 15192
[Note] NDB Schema dist: Data node: 12 reports subscribe from node 21,
subscriber bitmask 0200000
2015-10-15 14:34:03 15192
[Warning] IP address '10.24.6.170' could not be resolved: Name or service not
known
2015-10-15 14:34:56 15192
[Note] NDB Schema dist: Data node: 11 reports subscribe from node 21,
subscriber bitmask 00
2015-10-15 14:34:56 15192
[Note] NDB Schema dist: Data node: 12 reports subscribe from node 21,
subscriber bitmask 00
2015-10-15 14:35:03 15192
[Note] NDB Schema dist: Data node: 11 reports subscribe from node 21,
subscriber bitmask 0200000
2015-10-15 14:35:03 15192
[Note] NDB Schema dist: Data node: 12 reports subscribe from node 21,
subscriber bitmask 0200000
2015-10-15 14:41:04 15192
[Note] NDB Schema dist: Data node: 11 failed, subscriber bitmask 00
2015-10-15 14:42:36 15192
[Note] NDB Schema dist: Data node: 12 reports subscribe from node 21, subscriber
bitmask 00
8. 测试
8.1. 常规测试
为了让数据表能够在cluster中正常复制,创建数据表时必须指定为ndbcluster引擎(engine=ndb或engine=ndbcluster)。
登录到10.24.64的mysql,然后创建一个新数据库songzi,并创建一个ndbcluster引擎的数据表test(id int,name
char(10)),并向表中插入一条数据(0,songzi)。10.24.6.4上的操作及结果如下图:
然后登录10.24.6.6的mysql,可查看到数据已同步,并且新建的表及数据也存在。10.24.6.6上的操作及结果如下图:
8.2. 模拟NDB节点Crash
终止10.24.6.4上的NDB进程,执行以下指令查看NDB进程情况
ps -ef | grep ndbd
kill 24077
ps -ef | grep ndbd
具体操作及结果见下图:
也可以在ndb_mgm管理节点客户端查看到10.24.0.101上的NDB节点已停掉
然后分别登录到10.24.6.4和10.24.6.6的mysql,可发现依然能够查询到数据。结果如下图
10.24.6.4
10.24.6.6
此结果说明测试成功,即当有一个NDB节点Crash后,整个MySQL环境仍可以正常服务。
8.3. 模拟SQL节点Crash
在上10.24.6.4上终止mysqld进程,可执行以下指令:
killall mysqld
也可以在ndb_mgm管理节点客户端查看到10.24.6.4上的SQL节点已停掉
登录到10.24.6.6上的mysql,可查看到数据依然存在
此结果说明测试成功,及当有一个SQL节点Crash后,整个MySQL-Cluster环境仍可以工作。
至此,整个MySQL-Cluster安装及配置实验已完成。实验结束后,可使用指令shell>
ndb_mgm -e shutdown或者ndb_mgm>shutdown来关闭簇中的所有节点。
9. 遇到问题
10. 总结
- Mysql
cluster是一个统一的共享集群 - 多mysql同时共享
- 一个值多份存储,不是像redis那样根据一致性hash分布存储
- 高并发、高可用、高伸缩性
- share nothing架构
- 通过增加数据节点扩展:通过32个数据节点实现每秒2亿条NoSQL查询,以及通过16个数据节点每秒查询近250万SQL语句
- 推荐使用lvs +
keepalived + mysql cluster 实现集群mysqlMySQL Cluster是一个实时可扩展且符合ACID的事务型内存数据库
mysql集群之MYSQL CLUSTER的更多相关文章
- MySQL集群之Galera Cluster
mysql cluster集群 Galera Cluster:集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别 ...
- MySQL集群Percona XtraDB Cluster安装搭建步骤详解
http://www.linuxidc.com/Linux/2017-05/143501.htm http://blog.csdn.net/thundermeng/article/details/52 ...
- MySQL集群---②Windows平台搭建MySQL CLUSTER集群
原文:http://blog.csdn.net/mazhaojuan/article/details/42211857 本文将通过两台电脑来简单介绍一下Windows平台如何搭建MySQL集群. My ...
- MySQL集群在断网后再启动报"Unable to start missing node group"问题处理
总所周知,MySQL集群又名ndb cluster,而ndb就是network based database的简称,数据库节点之间依靠网络来通信和保证数据分块间的一致性.今天由于机房交换机损坏,导致集 ...
- [原]项目进阶 之 集群环境搭建(二)MySQL集群
上次的博文中我们介绍了一下集群的相关概念,今天的博文我们介绍一下MySQL集群的相关内容. 1.MySQL集群简介 MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单 ...
- mycat+ mysql集群 分库分表
mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...
- MySQL集群安装与配置
MySQL集群安装与配置 文章目录 [隐藏] 一.mysql集群安装 二.节点配置 三.首次启动节点 四.测试服务是否正常 五.安全关闭和重启 MySQL Cluster 是 MySQL 适合于分 ...
- MySQL集群搭建方案(PXC)
服务器快过期了,清一点库存,把运维这块的知识复习下 为什么要搭MySQL集群 技术层面上,传统的单节点数据库,万一宕机了,就凉凉了.容灾性能差.抗并发能力有限,数据量大的时候查询有瓶颈.学习层面上,作 ...
- MySQL Cluster(MySQL 集群) 初试(转)
作/译者:叶金荣(imysql#imysql.com>),来源:http://imysql.com,欢迎转载. 作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请 ...
随机推荐
- 经典设计:30个另类的 404 not found 页面设计
404页面是每个网站必不可少的一部分.我们在网络上能看到很多创意的404错误页面.在这篇文章中,我挑选了30个充满灵感和启发性的404页面设计的例子.Web 设计师们花精力设计一个另类的自定义的404 ...
- Linux基本操作命令总结
1.命令基本格式 root用户:[root@localhost ~] # 或者普通用户:[hadoop@localhost ~] $ 用户@主机名 目录 [#|$]管理员类型 ...
- 性能测试类,让你写法代码养成经常测试的好习惯 -ASP.NET C#
介绍: 可以很方便的在代码里循环执行 需要测试的函数 自动统计出执行时间,支持多线程. 使用方法: PerformanceTest p = new PerformanceTest(); p.SetC ...
- UWP开发入门(十八)——使用ContentControl减少页面元素数量
我们今天学习一下ContentControl,主要介绍如何使用ContentControl搭配DataTemplate来进行界面的复用,以及通过ContentTemplateSelector进一步减少 ...
- Android程序ToDoList增加配置项页面
本文要做的事情就是在前面做的简单的ToDoList程序上增加一个配置项页面(Reference).这个Reference页面也非常简单: 这个ToDoList现在有两个页面,主页面能填写待办事项,然后 ...
- Java魔法堂:自定义和解析注解
一.前言 注解(Annotation)作为元数据的载体,为程序代码本身提供额外的信息,使用过MyBatis等ORM框架的朋友对 @Insert 的注解应该不陌生了,这是MyBatis自定义的注解,显然 ...
- MySQL+Keepalived实现双机HA
host1与host3互为主从,即host1为host3的主机,同时也为host3的从机 host1 192.168.203.131 host2 192.168.203.132 host3 192 ...
- 如何花样展示自己的摄影作品?CSS+JS+Html
注意:Windows平台推荐使用Edge.Chrome.FireFox,部分浏览器打不开 P.S.慢慢用鼠标在图片上拖拽会感觉更神奇 // 0.5 ? 1 : -1; }, ease: fun ...
- Scrum团队成立3.0
博客园 首页 新随笔 联系 订阅 管理 随笔 - 23 文章 - 0 评论 - 26 0428-Scrum团队成立3.0 ------------------------------3.0---- ...
- JavaScript语言知识收藏
接触Web开发也已经有一段时间了,对javascript的认识也比以前有了更加深入的认识了,所以觉得应该整理一下. 一.JavaScript不支持函数(方法)的重载,用一个例子证明如下: functi ...