Mysql Cluster实现主从数据同步

配置环境:
操作系统:
    RedHat Enterprise Linux5.2
软件包:
     mysql-cluster-gpl-7.0.9-linux-i686-glibc23.tar.gz(下载地址 http://download.softagency.net/MySQL/Downloads/MySQL-Cluster-7.0/)
 
数据库管理节点: 59.64.28.89
数据库数据节点: 59.64.28.90,59.64.28.89
 
1.管理节点的安装
  #groupadd mysql
  #useradd mysql -g mysql
  #mv mysql-cluster-gpl-7.0.9-linux-i686-glibc23.tar.gz /usr/local/
  #cd /usr/local/
  #tar zxvf mysql-cluster-gpl-7.0.9-linux-i686-glibc23.tar.gz
  #rm -f mysql-cluster-gpl-7.0.9-linux-i686-glibc23.tar.gz
  #mv mysql-cluster-gpl-7.0.9-linux-i686-glibc23 mysql
  #chown -R mysql:mysql mysql
  #cd mysql
  #scripts/mysql_install_db --user=mysql 
  #cp support-files/my-medium.cnf /etc/my.cnf
  #cp support-files/mysql.server /etc/init.d/mysqld
 
2.管理节点的配置
  #mkdir /var/lib/mysql-cluster
  #cd /var/lib/mysql-cluster
  #vi config.ini                //这里需要手动添加如下内容
 
  [ndbd default]
  NoOfReplicas=1
  DataMemory=80M
  IndexMemory=18M                 
//这里有很多参数,大家可以自己找下相关资料
  [ndb_mgmd]
  Id=1
  Hostname=59.64.28.89            //管理节点IP
  datadir=/usr/local/mysql/logs
  [ndbd]
  Id=2
  Hostname=59.64.28.90              //数据节点IP  
  datadir=/usr/local/mysql/data/  
//数据节点的数据目录,这里要与数据节点的配置文件my.cnf
                                     的数据指定相同
 
  [MYSQLD]
 
3.安装和配置数据节点
 
  这里2台机器数据节点安装是相同的.
  #groupadd mysql
  #useradd mysql -g mysql
  #mv mysql-cluster-gpl-7.0.9-linux-i686-glibc23.tar.gz /usr/local/
  #cd /usr/local/
  #tar zxvf mysql-cluster-gpl-7.0.9-linux-i686-glibc23.tar.gz
  #rm -f mysql-cluster-gpl-7.0.9-linux-i686-glibc23.tar.gz
  #mv mysql-cluster-gpl-7.0.9-linux-i686-glibc23 mysql
  #chown -R mysql:mysql mysql
  #cd mysql
  #scripts/mysql_install_db --user=mysql
  #cp support-files/my-medium.cnf /etc/my.cnf
  #cp support-files/mysql.server /etc/init.d/mysqld
  #vi /etc/my.cnf         //这里需要手动添加如下的内容
 
  [mysqld]
  datadir=/usr/local/mysql/data/       //这里要与管理节点的config.ini相同
  ndbcluster
  ndb-connectstring=59.64.28.89
  [mysql_cluster]
  ndb-connectstring=59.64.28.89
  [ndb_mgm]
  connect-string=59.64.28.89
  [ndb_mgmd]
  config-file=/var/lib/mysql-cluster/config.ini 
//这里要指定管理节点配置文件路径
 
4.启动相关服务
 
  在管理节点启动相关服务:
  #/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
  #netstat -lntpu
  tcp        0      0 0.0.0.0:1186            0.0.0.0:*                
  LISTEN   22907/ndb_mgmd
  
  看到1186端口开放了说明启动是正常的.
 
  在数据节点启动相关服务:
  #/usr/local/mysql/bin/ndbd --initial
  #netstat -lntpu
  tcp        0      0 10.10.1.65:32975            0.0.0.0:*                    LISTEN      1901/ndbd                 
tcp        0      0 10.10.1.65:32976            0.0.0.0:*                   LISTEN      1901/ndbd          
tcp        0      0 10.10.1.65:32977            0.0.0.0:*                   LISTEN      1901/ndbd  
 
#service mysqld start
#netstat -lntpu
tcp        0      0 :::3306                     :::*                        LISTEN      2258/mysqld 
 
可以看到相关的ndbd服务以及mysql已经启动ok了.
 
5.功能测试
 
  到管理节点查看下相关服务状态
 # ndb_mgm
 ndb_mgm> show
 Connected to Management Server at: localhost:1186
 Cluster Configuration
 ---------------------
 [ndbd(NDB)]     2 node(s)
 id=2    @59.64.28.90  (mysql-5.1.37 ndb-7.0.8, Nodegroup: 0, Master)
 [ndb_mgmd(MGM)] 1 node(s)
 id=1    @59.64.28.89  (mysql-5.1.37 ndb-7.0.8)
 
 可以看到这里的数据节点、管理节点、sql节点都是正常的.
 
 现在我们在其中一个数据节点上进行相关数据库的创建,然后到另外一个数据节点上看看数据是否同步
 
 # /usr/local/mysql/bin/mysql -u root -p
 mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| ndb_2_fs           |
| test               |
+--------------------+
mysql> create database pubs;
mysql> use pubs
mysql> CREATE TABLE ctest2 (i INT) ENGINE=NDB;  //这里必须指定数据库表的引擎为NDB,否则同 失败
mysql> INSERT INTO ctest2 () VALUES (1);
mysql> SELECT * FROM ctest2;
+------+
| i    |
+------+
|    1 |
+------+
 
现在到另外一个数据节点查看下aa数据库是否同步过来了.
 
#/usr/local/mysql/bin/mysql -u root -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| pubs                 |
| mysql              |
| test               |
+--------------------+
mysql> use pubs
mysql> select * from ctest2;
+------+
| i    |
+------+
|    1 |
+------+
 
从上面可以看到数据已经同步了,mysql集群环境已经搭建完成.
 
在配置运行过程中出现了数据节点无法连接主节点的问题。初始是因为config.ini配置的数据节点IP写错。修改过后。得新启动主节点。还是出现数据节点无法连接主节点的问题。改了很多地方都不行。最后发现
/usr/local/mysql/mysql-cluster下有一个配置文件是主节点启动时对config.ini进行加密和处理的文件。感觉应该是主节点启动后改了配置文件后这个文件不会在生成的原因。所以对这个文件进行了备份后。删除掉。重新启动主节点。启动数据节点正常。
 
附:重启主节点的话可以使用kill [主节点的ndb_mgmd的pid]
 
               http://wiliiwin.blog.51cto.com/928128/259801(根据自身配置情况进行了修改)
 
 
  1. ###########################################################################
  2. ## MySQL CLuster 配置文件
  3. ## 带有 [!]的注释表示该参数有详细说明,建议参考官方描述.
  4. ## 带有 [!!]的注释表示设置该参数时应该详细阅读官方描述.
  5. ## SCI 连接方式的配置请详细阅读官方描述.
  6. ## 官方说明: http://dev.mysql.com/doc/refman/ 5.1/zh/ndbcluster.html
  7. ###########################################################################
  8.  
  9. ###########################################################################
  10. # 定义 MySQL Cluster TCP/IP 连接
  11. # TCP/IP是MySQL集群用于建立连接的默认传输协议.正常情况下不需要定义连接.
  12. # * 可使用 [TCP DEFAULT] 定义.
  13. ###########################################################################
  14. [TCP DEFAULT]
  15. # [TCP]
  16.  
  17. # [!]TCP 传输缓存
  18. # 默认值为 256KB
  19. SendBufferMemory= 256k
  20.  
  21. # [!]通过网络传输消息ID.
  22. # 默认禁止该特性. (取值: Y/N或 1/ 0 )
  23. # SendSignalId= 0
  24.  
  25. # [!]启用该参数将在所有消息置于发送缓冲之前,为所有参数计算校验和.
  26. # 默认禁止该特性. (取值: Y/N或 1/ 0 )
  27. # Checksum= 0
  28.  
  29. # 指定从 TCP/IP Socket 接收数据时所使用的缓冲大小.
  30. # 几乎不需要更改该参数的默认值,默认值为64KB
  31. ReceiveBufferMemory= 64k
  32.  
  33. ###########################################################################
  34. # 定义管理服务器 (MGM )
  35. #
  36. # 用于配置管理服务器行为.下面参数均能被忽略,如果是这样,将使用其默认值.
  37. # 如果没有定义 ExecuteOnComputer 或 HostName 则会指定为 localhost
  38. # * 可使用 [NDB_MGMD DEFAULT] 定义多个管理节点的默认行为
  39. ###########################################################################
  40. [NDB_MGMD DEFAULT]
  41. [NDB_MGMD]
  42.  
  43. # 集群中节点的唯一标识, 取值 1~ 63
  44. id= 1
  45.  
  46. # 指定节点主机名或IP
  47. HostName= 192.168.1.100
  48.  
  49. # 引用在 [COMPUTER]部分中定义的计算机之一
  50. #ExecuteOnComputer=
  51.  
  52. # 管理服务器监听端口 (默认值: 2202 )
  53. PortNumber= 2202
  54.  
  55. # 节点日志出处理方式
  56. #   可取下述值:
  57. #   1. CONSOLE
  58. #         将日志输出到标准输出设备 (stdout ).
  59. #   2. SYSLOG: facility= syslog
  60. #         将日志发送到syslog (系统日志 )软设备.可能值:
  61. #         auth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, syslog
  62. #         , user, uucp, local0, local12~ 7
  63. #   3. FILE: filename= /var/log/mgmd.log,maxsize=1000000,maxfiles=6
  64. #         讲日志输出到文件,可指定一下值:
  65. #         filename: 日志文件名称.
  66. #         maxsize:  日志文件最大尺寸,大于该尺寸时自动创建新日志文件.
  67. #         maxfiles: 日志文件最大数量
  68. LogDestination= FILE:filename=/var/log/mgmd.log
  69.  
  70. # 指定哪个节点扮演决策角色, 只有MGM节点和SQL节点可以使用. (默认值: 1 )
  71. #   通常情况下,应将值设为 1, 并将所有SQL节点设为 0, 以MGM服务器作为决策程序.
  72. #   可取下述值之一:
  73. #   0 : 该节点永远不用作决策.
  74. #   1 : 该节点具有高优先级.
  75. #   2 : 该节点具有低有限级.
  76. ArbitrationRank= 1
  77.  
  78. # 指定管理服务器对决策请求的延迟时间,毫秒为单位,默认为 0.
  79. #   通常情况下不需要改变它.
  80. ArbitrationDelay= 0
  81.  
  82. # 保存管理服务器输出文件的位置,包括日志,进程输出文件,以及程序的pid文件
  83. #   对于日志文件,可通过设置LogDestination的FILE参数覆盖它.
  84. DataDir= /var/lib/mysql-cluster
  85.  
  86. ###########################################################################
  87. # 定义数据节点默认行为 (NDBD DEFAULT )
  88. # NoOfReplicas 为必要参数
  89. ###########################################################################
  90. [NDBD DEFAULT]
  91.  
  92. # 定义集群中每个表保存在拷贝数, 另外还指定节点组的大小.
  93. # 节点组指保存相同信息的节点集合.
  94. # 通常情况下不需要为该参数指定值.
  95. # NoOfReplicas 没有默认值, 最大的可能值为 4.
  96. NoOfReplicas= 1
  97.  
  98. ###########################################################################
  99. # 定义数据节点 (NDBD )
  100. #
  101. # 用于配置数据节点的行为.
  102. # ExecuteOnComputer 或 HostName 为必要参数.
  103. # 对于各种参数, 能够使用后缀 k, M 或 G 指明单位.
  104. ###########################################################################
  105. [NDBD]
  106.  
  107. # 启动节点时, 可在命令行中分配id (即数据节点id ), 也能在配置文件中分配.
  108. id= 11
  109.  
  110. # 指定节点主机名或IP
  111. HostName= 192.168.1.101
  112.  
  113. # 引用在 [COMPUTER]部分中定义的计算机之一
  114. #ExecuteOnComputer=
  115.  
  116. # 指定存放跟踪文件,日志文件,pid文件以及错误日志的目录.
  117. DataDir= /var/lib/mysql-cluster
  118.  
  119. # 该参数指定了存放为元数据创建的所有文件, REDO日志, UNDO日志和数据文件目录.
  120. # 注意: 在 ndbd 进程启动前,该目录必须已存在.
  121. #FileSystemPath=
  122.  
  123. # 指定存放备份的目录, 默认为 {FileSystemPath }/BACKUP
  124. #BackupDataDir=
  125.  
  126. # 指定数据内存, 默认值为 80MB, 最小值 1MB, 无大小限制.
  127. DataMemory= 80M
  128.  
  129. # 指定索引内存, 默认值为 18MB, 最小值 1MB, 无大小限制.
  130. IndexMemory= 18M
  131.  
  132. # [!]用于设定节点内可能的并发事务数.默认值为 4096.
  133. # 对于所有节点,必须将参数设置为相同的值.
  134. # MaxNoOfConcurrentTransactions= 4096
  135.  
  136. # [!]设置能同时出现在更新阶段或同时锁定的记录数.默认值为 32768.
  137. #
  138. # MaxNoOfConcurrentOperations= 32768
  139.  
  140. # [!]默认情况下,将按照 1.1 * MaxNoOfConcurrentOperations计算该参数,
  141. # 它适合于具有很多并发事务但不存在特大事务的系统.
  142. # 如果需要在某一时间处理特大事务而且有很多节点,
  143. # 最好通过明确指定该参数以覆盖默认值
  144. #MaxNoOfLocalOperations=
  145.  
  146. # [!]该参数的默认值为 8192.
  147. # 只有在极其罕见的情况下, 需要使用唯一性哈希索引执行极高的并行操作时,
  148. # 才有必要增大该值.
  149. # 如果确信该集群不需要高的并行操作.可以使用较小的值并节省内存.
  150. # MaxNoOfConcurrentIndexOperations= 8192
  151.  
  152. # [!]默认值是 4000, 它足以应付大多数情况.
  153. # 在某些情况下, 如果认为在集群中对并行操作的要求并不高, 甚至还能降低它.
  154. # MaxNoOfFiredTriggers= 4000
  155.  
  156. # [!]该参数影响的内存用于跟踪更新索引表和读取唯一索引时执行的操作.
  157. # 该内存用于保存关于这类操作的键和列信息.
  158. # 几乎不需要更改该参数的默认值.
  159. # TransactionBufferMemory= 1M
  160.  
  161. # [!]该参数用于控制可在集群中执行的并行扫描的数.
  162. # 默认值为 256, 最大值为 500.
  163. # MaxNoOfConcurrentScans= 256
  164.  
  165. # [!]如果很多扫描不是完全并行化的, 指定本地扫描记录的数.
  166. #MaxNoOfLocalScans=
  167.  
  168. # [!]该参数用于计算锁定记录的数量.
  169. # 要想处理很多并发扫描操作, 需要这类记录.
  170. # 默认值是 64, 该值与SQL节点中定义的 ScanBatchSize 关系密切.
  171. #BatchSizePerLocalScan=
  172.  
  173. # [!]用于在单独节点内和节点之间传递消息的内部缓冲.
  174. # 尽管几乎不需要改变它. 但它仍是可配置的. 默认情况下, 它被设置为1MB.
  175. # LongMessageBuffer= 1M
  176.  
  177. # [!]设置节点的REDO日志文件的大小,默认值为 8.
  178. # NoOfFragmentLogFiles= 8
  179.  
  180. # [!]设置跟踪文件的最大数, 默认值为 25.
  181. # MaxNoOfSavedMessages= 25
  182.  
  183. # [!]设置可在集群中定义的属性数量, 默认值为 1000, 最小值为 32.
  184. # MaxNoOfAttributes= 1000
  185.  
  186. # [!]设置集群中最大表对象数量, 默认值为 128, 最小值为 8, 最大值为 1600.
  187. # MaxNoOfTables= 128
  188.  
  189. # [!]该参数默认值为 128.
  190. # MaxNoOfOrderedIndexes= 128
  191.  
  192. # [!]该参数默认值为 64.
  193. # MaxNoOfUniqueHashIndexes= 64
  194.  
  195. # [!]该参数用于设置集群中触发器的最大数量
  196. # MaxNoOfTriggers= 768
  197.  
  198. # 对于很多操作系统, 能够将进程锁定在内存中, 以避免与磁盘的交换.
  199. # 使用它, 可确保集群的实时特性。
  200. # 默认情况下,该特性是被禁止的 (取值: Y/N或 1/ 0 )
  201. # LockPagesInMainMemory= 0
  202.  
  203. # 出现错误时,该参数指定NDBD进程是退出还是自动重启.
  204. # 默认情况下,该特性是启用的 (取值: Y/N或 1/ 0 )
  205. # StopOnError= 1
  206.  
  207. # [!]指定集群为 "无磁盘".
  208. # 默认情况下,该特性是被禁止的 (取值: Y/N或 1/ 0 )
  209. # Diskless= 0
  210.  
  211. # [!]仅当编译为调试版时才能访问该特性.
  212. # 默认情况下,该特性是被禁止的
  213. # RestartOnErrorInsert= 0
  214.  
  215. # [!]指定监控线程检查的间隔.该参数以毫秒为单位.
  216. # 默认值为 4000 毫秒
  217. # TimeBetweenWatchDogCheck= 4000
  218.  
  219. # [!]该参数指定了在调用集群初始化子程序之前, 集群等待所有存储节点出现的时间.
  220. # 默认值为 30000 毫秒 ( 0 表示无限超时 )
  221. # StartPartialTimeout= 30000
  222.  
  223. # [!]如果集群做好了启动准备但仍可能处于隔离状态,集群将等待该超时时间结束.
  224. # 默认值为 60000 毫秒
  225. # StartPartitionedTimeout= 60000
  226.  
  227. # [!]如果数据节点在该参数指定的时间内未完成其启动序列,
  228. # 节点启动将失败. 如果将该参数设置为 0. 表示不采用数据节点超时.
  229. # 默认值为 60000 毫秒
  230. # StartFailureTimeout= 60000
  231.  
  232. # [!]每个数据节点发送心跳信号到SQL节点的间隔.
  233. # 默认值为 1500 毫秒
  234. # HeartbeatIntervalDbDb= 1500
  235.  
  236. # [!]该参数默认值为 1500 毫秒
  237. # HeartbeatIntervalDbApi= 1500
  238.  
  239. # [!]该参数默认值为 20
  240. # TimeBetweenLocalCheckpoints= 20
  241.  
  242. # [!]该参数定义了全局检查点操作之间的时间间隔.
  243. # 默认值为 2000 毫秒
  244. # TimeBetweenGlobalCheckpoints= 2000
  245.  
  246. # [!]该参数默认值为 1000 毫秒
  247. # TimeBetweenInactiveTransactionAbortCheck= 1000
  248.  
  249. # [!]如果事务目前未执行任何查询, 而是等待进一步的用户输入.
  250. # 该参数指明了放弃事务之前用户能够等待的最长时间.
  251. # 默认值为 0
  252. # TransactionInactiveTimeout= 0
  253.  
  254. # [!]该超时参数指明了放弃事务之前, 事务协调器等候另一节点执行查询的时间.
  255. # TransactionDeadlockDetectionTimeout= 1200
  256.  
  257. # [!]该参数指定了执行本地检查点操作的速度,
  258. # 并能与NoOfFragmentLogFiles、DataMemory和IndexMemory一起使用。
  259. # 默认值是 40 (每秒 3.2MB的数据页 )
  260. # NoOfDiskPagesToDiskAfterRestartTUP= 40
  261.  
  262. # 该参数使用的单位与NoOfDiskPagesToDiskAfterRestartTUP的相同.
  263. # 工作方式也类似,但限制的是从索引内存进行的索引页写入速度。
  264. # 该参数的默认值为每秒 20个索引内存页 ( 1.6MB每秒 )
  265. # NoOfDiskPagesToDiskAfterRestartACC= 20
  266.  
  267. # [!]该参数涉及从数据内存写入的页。
  268. # 默认值是 40 ( 3.2MB每秒 )
  269. # NoOfDiskPagesToDiskDuringRestartTUP= 40
  270.  
  271. # [!]该参数默认值是 20 ( 1.6MB每秒 )
  272. # NoOfDiskPagesToDiskDuringRestartACC= 20
  273.  
  274. # [!]指定数据节点等待决策程序对决策消息的回应的时间.
  275. # 默认值为 1000 毫秒
  276. # ArbitrationTimeout= 1000
  277.  
  278. # [!]指定UNDO索引缓冲区大小.
  279. # 默认值为 2MB, 最小值为1MB.
  280. # UndoIndexBuffer= 2M
  281.  
  282. # [!]指定UNDO数据缓冲区大小.
  283. # 默认值为 16MB, 最小值为1MB.
  284. # UndoDataBuffer= 16M
  285.  
  286. # [!]指定REDO数据缓冲区大小.
  287. # 默认值为 8MB, 最小值为1MB.
  288. # RedoBuffer= 8M
  289.  
  290. # 日志级别,用于进程启动过程中生成的事件.
  291. # 默认级别为 1
  292. # LogLevelStartup= 1
  293.  
  294. # 日志级别,用于作为节点恰当关闭进程组成部分而生成的事件.
  295. # 默认级别为 0
  296. # LogLevelShutdown= 0
  297.  
  298. # 日志级别,用于统计事件,如主键法读取次数,更新数,插入数,
  299. # 与缓冲使用有关的信息等.
  300. # 默认级别为 0
  301. # LogLevelStatistic= 0
  302.  
  303. # 日志级别,用于由本地和全局检查点操作生成的事件.
  304. # 默认级别为 0
  305. # LogLevelCheckpoint= 0
  306.  
  307. # 日志级别,用于在节点重启过程中生成的事件.
  308. # 默认级别为 0
  309. # LogLevelNodeRestart= 0
  310.  
  311. # 日志级别,用于由簇节点间的连接生成的事件.
  312. # 默认级别为 0
  313. # LogLevelConnection= 0
  314.  
  315. # 日志级别,用于由在整个集群内的错误和警告生成的事件.
  316. # 这类错误不会导致任何节点失败.当仍值得记录.
  317. # 默认级别为 0
  318. # LogLevelError= 0
  319.  
  320. # 日志级别,用于为集群的一般状态信息而生成的事件.
  321. # 默认级别为 0
  322. # LogLevelInfo= 0
  323.  
  324. # [!]指定数据备份缓冲区大小.
  325. # 默认值为 2MB
  326. # BackupDataBufferSize= 2M
  327.  
  328. # [!]指定日志备份缓冲区大小.
  329. # 默认值为 2MB
  330. # BackupLogBufferSize= 2M
  331.  
  332. # 该参数是BackupDataBufferSize和BackupLogBufferSize之和。
  333. # 默认值是2MB + 2MB = 4MB
  334. # BackupMemory= 4M
  335.  
  336. # 该参数指定了由备份日志缓冲和备份数据缓冲写入磁盘的消息大小.
  337. # 默认值为 32KB
  338. # BackupWriteSize= 32k
  339.  
  340. ###########################################################################
  341. # 定义MySQL服务器 (MYSQLD )
  342. #
  343. # 定义用于访问集群数据的MySQL服务器 (SQL节点 )的行为
  344. # * 可使用 [NDB_MGMD DEFAULT] 定义多个管理节点的默认行为
  345. ###########################################################################
  346. # [MYSQLD DEFAULT]
  347. [MYSQLD]
  348.  
  349. # 集群中节点的唯一标识, 取值 1~ 63
  350. id= 21
  351.  
  352. # 指定节点主机名或IP
  353. HostName= 192.168.1.102
  354.  
  355. # 引用在 [COMPUTER]部分中定义的计算机之一
  356. #ExecuteOnComputer=
  357.  
  358. # 对于正常配置,使用管理服务器作为决策程序.
  359. # 将它的ArbitrationRank设置为 1 (默认 ),
  360. # 并将所有SQL节点的ArbitrationRank设置为 0.
  361. ArbitrationRank= 0
  362.  
  363. # 指定管理服务器对决策请求的延迟时间,毫秒为单位,默认为 0.
  364. #   通常情况下不需要改变它.
  365. ArbitrationDelay= 0
  366.  
  367. # [!!]该参数以字节为单位,默认值是 32KB.
  368. # BatchByteSize= 32k
  369.  
  370. # [!!]该参数以字节为单位,默认值是 64 ,最大值为 992.
  371. # BatchSize= 64
  372.  
  373. # [!]指定从各数据节点发送的每批数据的大小.
  374. # 默认值是 256KB ,最大值为 16MB.
  375. # MaxScanBatchSize= 256k

转载于:https://www.cnblogs.com/witer666/archive/2010/03/10/1682766.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值